summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2012-01-19 21:09:49 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2012-01-19 21:09:49 -0800
commitec1c45fb643fe83154e7a529da780392ab9cffd5 (patch)
treea0a81ba4458535dab5e83bfdad050171289c411d
parent215d62f41f5afee3be1c46819ad05f9997356f46 (diff)
downloadabc-ec1c45fb643fe83154e7a529da780392ab9cffd5.tar.gz
abc-ec1c45fb643fe83154e7a529da780392ab9cffd5.tar.bz2
abc-ec1c45fb643fe83154e7a529da780392ab9cffd5.zip
New hierarchy manager.
-rw-r--r--src/base/abc/abcHieNew.c200
1 files changed, 195 insertions, 5 deletions
diff --git a/src/base/abc/abcHieNew.c b/src/base/abc/abcHieNew.c
index 9a18f104..76644a6d 100644
--- a/src/base/abc/abcHieNew.c
+++ b/src/base/abc/abcHieNew.c
@@ -54,7 +54,8 @@ typedef struct Au_Obj_t_ Au_Obj_t;
struct Au_Obj_t_ // 16 bytes
{
- unsigned Func; // functionality
+ unsigned Func : 30; // functionality
+ unsigned Value : 2; // node value
unsigned Type : 3; // object type
unsigned nFanins : 29; // fanin count (related to AU_MAX_FANIN_NUM)
int Fanins[2]; // fanin literals
@@ -102,6 +103,8 @@ struct Au_Man_t_
int nRefs; // reference counter
// statistics
int nGiaObjMax; // max number of GIA objects
+ double nPortsC; // const ports
+ double nPortsNC; // non-const ports
};
@@ -161,12 +164,15 @@ static inline int Au_ObjFaninNum( Au_Obj_t * p ) { retur
static inline int Au_ObjFaninId( Au_Obj_t * p, int i ) { assert(i >= 0 && i < (int)p->nFanins && p->Fanins[i]); return Au_Lit2Var(p->Fanins[i]); }
static inline int Au_ObjFaninId0( Au_Obj_t * p ) { return Au_ObjFaninId(p, 0); }
static inline int Au_ObjFaninId1( Au_Obj_t * p ) { return Au_ObjFaninId(p, 1); }
+static inline int Au_ObjFaninId2( Au_Obj_t * p ) { return Au_ObjFaninId(p, 2); }
static inline Au_Obj_t * Au_ObjFanin( Au_Obj_t * p, int i ) { return Au_NtkObj(Au_ObjNtk(p), Au_ObjFaninId(p, i)); }
static inline Au_Obj_t * Au_ObjFanin0( Au_Obj_t * p ) { return Au_ObjFanin( p, 0 ); }
static inline Au_Obj_t * Au_ObjFanin1( Au_Obj_t * p ) { return Au_ObjFanin( p, 1 ); }
+static inline Au_Obj_t * Au_ObjFanin2( Au_Obj_t * p ) { return Au_ObjFanin( p, 2 ); }
static inline int Au_ObjFaninC( Au_Obj_t * p, int i ) { assert(i >= 0 && i < (int)p->nFanins && p->Fanins[i]); return Au_LitIsCompl(p->Fanins[i]); }
static inline int Au_ObjFaninC0( Au_Obj_t * p ) { return Au_ObjFaninC(p, 0); }
static inline int Au_ObjFaninC1( Au_Obj_t * p ) { return Au_ObjFaninC(p, 1); }
+static inline int Au_ObjFaninC2( Au_Obj_t * p ) { return Au_ObjFaninC(p, 2); }
static inline int Au_ObjFaninLit( Au_Obj_t * p, int i ) { assert(i >= 0 && i < (int)p->nFanins && p->Fanins[i]); return p->Fanins[i]; }
static inline void Au_ObjSetFanin( Au_Obj_t * p, int i, int f ) { assert(f > 0 && p->Fanins[i] == 0); p->Fanins[i] = Au_Var2Lit(f,0); }
static inline void Au_ObjSetFaninLit( Au_Obj_t * p, int i, int f){ assert(f >= 0 && p->Fanins[i] == 0); p->Fanins[i] = f; }
@@ -216,6 +222,7 @@ static inline int Au_ObjIsTravIdCurrentId( Au_Ntk_t * p, int Id ) { re
for ( i = 0; (i < Vec_IntSize(&p->vObjs)) && (((pObj) = Au_NtkObjI(p, i)), 1); i++ ) if ( !Au_ObjIsBox(pObj) ) {} else
+
extern void Au_ManAddNtk( Au_Man_t * pMan, Au_Ntk_t * p );
extern void Au_ManFree( Au_Man_t * p );
@@ -1161,7 +1168,7 @@ void Au_NtkDeriveFlatGia_rec( Gia_Man_t * pGia, Au_Ntk_t * p )
Lit = Gia_ManHashXor( pGia, Lit0, Lit1 );
else if ( pObj->Func == 3 )
{
- Lit2 = Gia_LitNotCond( Au_ObjCopy(Au_ObjFanin(pObj, 2)), Au_ObjFaninC(pObj, 2) );
+ Lit2 = Gia_LitNotCond( Au_ObjCopy(Au_ObjFanin2(pObj)), Au_ObjFaninC2(pObj) );
Lit = Gia_ManHashMux( pGia, Lit0, Lit1, Lit2 );
}
else assert( 0 );
@@ -1240,6 +1247,178 @@ Gia_Man_t * Au_NtkDeriveFlatGia( Au_Ntk_t * p )
}
+// ternary simulation
+#define AU_VAL0 1
+#define AU_VAL1 2
+#define AU_VALX 3
+
+static inline void Au_ObjSetXsim( Au_Obj_t * pObj, int Value ) { pObj->Value = Value; }
+static inline int Au_ObjGetXsim( Au_Obj_t * pObj ) { return pObj->Value; }
+static inline int Au_XsimInv( int Value )
+{
+ if ( Value == AU_VAL0 )
+ return AU_VAL1;
+ if ( Value == AU_VAL1 )
+ return AU_VAL0;
+ assert( Value == AU_VALX );
+ return AU_VALX;
+}
+static inline int Au_XsimAnd( int Value0, int Value1 )
+{
+ if ( Value0 == AU_VAL0 || Value1 == AU_VAL0 )
+ return AU_VAL0;
+ if ( Value0 == AU_VALX || Value1 == AU_VALX )
+ return AU_VALX;
+ assert( Value0 == AU_VAL1 && Value1 == AU_VAL1 );
+ return AU_VAL1;
+}
+static inline int Au_XsimXor( int Value0, int Value1 )
+{
+ if ( Value0 == AU_VALX || Value1 == AU_VALX )
+ return AU_VALX;
+ if ( (Value0 == AU_VAL0) == (Value1 == AU_VAL0) )
+ return AU_VAL0;
+ return AU_VAL1;
+}
+static inline int Au_XsimMux( int ValueC, int Value1, int Value0 )
+{
+ if ( ValueC == AU_VAL0 )
+ return Value0;
+ if ( ValueC == AU_VAL1 )
+ return Value1;
+ if ( Value0 == AU_VAL0 && Value1 == AU_VAL0 )
+ return AU_VAL0;
+ if ( Value0 == AU_VAL1 && Value1 == AU_VAL1 )
+ return AU_VAL1;
+ return AU_VALX;
+}
+static inline int Au_ObjGetXsimFan0( Au_Obj_t * pObj )
+{
+ int Value = Au_ObjGetXsim( Au_ObjFanin0(pObj) );
+ return Au_ObjFaninC0(pObj) ? Au_XsimInv(Value) : Value;
+}
+static inline int Au_ObjGetXsimFan1( Au_Obj_t * pObj )
+{
+ int Value = Au_ObjGetXsim( Au_ObjFanin1(pObj) );
+ return Au_ObjFaninC1(pObj) ? Au_XsimInv(Value) : Value;
+}
+static inline int Au_ObjGetXsimFan2( Au_Obj_t * pObj )
+{
+ int Value = Au_ObjGetXsim( Au_ObjFanin2(pObj) );
+ return Au_ObjFaninC2(pObj) ? Au_XsimInv(Value) : Value;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Flattens the logic hierarchy of the netlist.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Au_NtkTerSimulate_rec( Au_Ntk_t * p )
+{
+ Au_Obj_t * pObj, * pTerm;
+ int i, k;
+ Au_NtkForEachPi( p, pTerm, i )
+ {
+ assert( Au_ObjGetXsim(pTerm) > 0 );
+ if ( Au_ObjGetXsim(pTerm) == AU_VALX )
+ p->pMan->nPortsNC++;
+ else
+ p->pMan->nPortsC++;
+ }
+ if ( strcmp(Au_NtkName(p), "ref_egcd") == 0 )
+ {
+ printf( "Replacing one instance of recursive model \"%s\" by a black box.\n", "ref_egcd" );
+ Au_NtkForEachPo( p, pTerm, i )
+ Au_ObjSetXsim( pTerm, AU_VALX );
+ return;
+ }
+ Au_NtkForEachObj( p, pObj, i )
+ {
+ if ( Au_ObjIsNode(pObj) )
+ {
+ if ( pObj->Func == 1 )
+ Au_ObjSetXsim( pObj, Au_XsimAnd(Au_ObjGetXsimFan0(pObj), Au_ObjGetXsimFan1(pObj)) );
+ else if ( pObj->Func == 2 )
+ Au_ObjSetXsim( pObj, Au_XsimXor(Au_ObjGetXsimFan0(pObj), Au_ObjGetXsimFan1(pObj)) );
+ else if ( pObj->Func == 3 )
+ Au_ObjSetXsim( pObj, Au_XsimMux(Au_ObjGetXsimFan0(pObj), Au_ObjGetXsimFan1(pObj), Au_ObjGetXsimFan2(pObj)) );
+ else assert( 0 );
+ }
+ else if ( Au_ObjIsBox(pObj) )
+ {
+ Au_Ntk_t * pModel = Au_ObjModel(pObj);
+ // check the match between the number of actual and formal parameters
+ assert( Au_ObjFaninNum(pObj) == Au_NtkPiNum(pModel) );
+ assert( Au_BoxFanoutNum(pObj) == Au_NtkPoNum(pModel) );
+ // assign PIs
+ Au_ObjForEachFanin( pObj, pTerm, k )
+ Au_ObjSetXsim( Au_NtkPi(pModel, k), Au_ObjGetXsim(pTerm) );
+ // call recursively
+ Au_NtkTerSimulate_rec( pModel );
+ // assign POs
+ Au_BoxForEachFanout( pObj, pTerm, k )
+ Au_ObjSetXsim( pTerm, Au_ObjGetXsim(Au_NtkPo(pModel, k)) );
+ }
+ else if ( Au_ObjIsConst0(pObj) )
+ Au_ObjSetXsim( pObj, AU_VAL0 );
+
+ }
+ Au_NtkForEachPo( p, pTerm, i )
+ Au_ObjSetXsim( pTerm, Au_ObjGetXsimFan0(pObj) );
+ Au_NtkForEachPo( p, pTerm, i )
+ {
+ assert( Au_ObjGetXsim(pTerm) > 0 );
+ if ( Au_ObjGetXsim(pTerm) == AU_VALX )
+ p->pMan->nPortsNC++;
+ else
+ p->pMan->nPortsC++;
+ }
+}
+
+/**Function*************************************************************
+
+ Synopsis [Flattens the logic hierarchy of the netlist.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Au_NtkTerSimulate( Au_Ntk_t * p )
+{
+ Au_Obj_t * pTerm;
+ int i, Counter[2] = {0};
+ assert( p->pMan->pFuncs == NULL );
+ printf( "Collapsing model \"%s\"...\n", Au_NtkName(p) );
+ // create PIs
+ Au_NtkForEachPi( p, pTerm, i )
+ Au_ObjSetXsim( pTerm, AU_VALX );
+ // recursively flatten hierarchy
+ p->pMan->nPortsC = 0;
+ p->pMan->nPortsNC = 0;
+ Au_NtkTerSimulate_rec( p );
+ // analyze outputs
+ Au_NtkForEachPo( p, pTerm, i )
+ if ( Au_ObjGetXsim(pTerm) == AU_VAL0 )
+ Counter[0]++;
+ else if ( Au_ObjGetXsim(pTerm) == AU_VAL1 )
+ Counter[1]++;
+ // print results
+ printf( "Const0 outputs =%15d. Const1 outputs =%15d. Total outputs =%15d.\n",
+ Counter[0], Counter[1], Au_NtkPoNum(p) );
+ printf( "Const ports =%15.0f. Non-const ports=%15.0f. Total ports =%15.0f.\n",
+ p->pMan->nPortsC, p->pMan->nPortsNC, p->pMan->nPortsC + p->pMan->nPortsNC );
+}
+
+
/**Function*************************************************************
Synopsis [Duplicates ABC network.]
@@ -1382,6 +1561,7 @@ Gia_Man_t * Au_ManDeriveTest( Abc_Ntk_t * pRoot )
***********************************************************************/
Gia_Man_t * Abc_NtkHieCecTest2( char * pFileName, char * pModelName, int fVerbose )
{
+ int fSimulation = 1;
Gia_Man_t * pGia = NULL;
Au_Ntk_t * pNtk, * pNtkClp = NULL;
int clk1 = 0, clk = clock();
@@ -1402,9 +1582,11 @@ Gia_Man_t * Abc_NtkHieCecTest2( char * pFileName, char * pModelName, int fVerbos
Abc_PrintTime( 1, "Reading file", clock() - clk );
if ( fVerbose )
+ {
Au_ManPrintBoxInfo( pNtk );
// Au_ManPrintBoxInfoSorted( pNtk );
- Au_ManPrintStats( pNtk->pMan );
+ Au_ManPrintStats( pNtk->pMan );
+ }
Au_ManCountThings( pNtk->pMan );
// select network
@@ -1418,8 +1600,16 @@ Gia_Man_t * Abc_NtkHieCecTest2( char * pFileName, char * pModelName, int fVerbos
// collapse
clk1 = clock();
- pGia = Au_NtkDeriveFlatGia( pNtkClp );
- Abc_PrintTime( 1, "Time GIA ", clock() - clk1 );
+ if ( fSimulation )
+ {
+ Au_NtkTerSimulate( pNtkClp );
+ Abc_PrintTime( 1, "Time sim ", clock() - clk1 );
+ }
+ else
+ {
+ pGia = Au_NtkDeriveFlatGia( pNtkClp );
+ Abc_PrintTime( 1, "Time GIA ", clock() - clk1 );
+ }
// delete
Au_ManDelete( pNtk->pMan );