blob: 82ca49dd83b4ebda9a7c4dce15716cc94800b014 [file] [log] [blame]
/**CFile****************************************************************
FileName [amapInt.h]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Technology mapper for standard cells.]
Synopsis [Internal declarations.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: amapInt.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#ifndef ABC__map__amap__amapInt_h
#define ABC__map__amap__amapInt_h
////////////////////////////////////////////////////////////////////////
/// INCLUDES ///
////////////////////////////////////////////////////////////////////////
#include "misc/extra/extra.h"
#include "aig/aig/aig.h"
#include "amap.h"
////////////////////////////////////////////////////////////////////////
/// PARAMETERS ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_HEADER_START
// the largest gate size in the library
// (gates above this size will be ignored)
#define AMAP_MAXINS 15
#define AMAP_STRING_CONST0 "CONST0"
#define AMAP_STRING_CONST1 "CONST1"
// object types
typedef enum {
AMAP_OBJ_NONE, // 0: non-existent object
AMAP_OBJ_CONST1, // 1: constant 1
AMAP_OBJ_PI, // 2: primary input
AMAP_OBJ_PO, // 3: primary output
AMAP_OBJ_AND, // 4: AND node
AMAP_OBJ_XOR, // 5: XOR node
AMAP_OBJ_MUX, // 6: MUX node
AMAP_OBJ_VOID // 7: unused object
} Amap_Type_t;
////////////////////////////////////////////////////////////////////////
/// BASIC TYPES ///
////////////////////////////////////////////////////////////////////////
typedef struct Amap_Pin_t_ Amap_Pin_t;
typedef struct Amap_Gat_t_ Amap_Gat_t;
typedef struct Amap_Nod_t_ Amap_Nod_t;
typedef struct Amap_Set_t_ Amap_Set_t;
typedef struct Amap_Man_t_ Amap_Man_t;
typedef struct Amap_Obj_t_ Amap_Obj_t;
typedef struct Amap_Cut_t_ Amap_Cut_t;
typedef struct Amap_Mat_t_ Amap_Mat_t;
struct Amap_Man_t_
{
// user data
Amap_Par_t * pPars;
Amap_Lib_t * pLib;
// internal parameters
float fEpsilonInternal;
float fAreaInv;
int fUseXor;
int fUseMux;
// internal AIG with choices
Vec_Ptr_t * vPis;
Vec_Ptr_t * vPos;
Vec_Ptr_t * vObjs;
Aig_MmFixed_t * pMemObj;
Aig_MmFlex_t * pMemCuts;
Aig_MmFlex_t * pMemCutBest;
Aig_MmFlex_t * pMemTemp;
Amap_Obj_t * pConst1;
int nObjs[AMAP_OBJ_VOID];
int nLevelMax;
int nChoicesGiven;
int nChoicesAdded;
// mapping data-structures
Vec_Int_t * vTemp;
int * pMatsTemp;
Amap_Cut_t ** ppCutsTemp;
Amap_Cut_t * pCutsPi;
Vec_Ptr_t * vCuts0;
Vec_Ptr_t * vCuts1;
Vec_Ptr_t * vCuts2;
// statistics
int nCutsUsed;
int nCutsTried;
int nCutsTried3;
int nBytesUsed;
};
struct Amap_Lib_t_
{
char * pName; // library name
Vec_Ptr_t * vGates; // represenation of gates
Vec_Ptr_t * vSorted; // gates sorted for area-only mapping
Vec_Ptr_t * vSelect; // gates selected for area-only mapping
Amap_Gat_t * pGate0; // the constant zero gate
Amap_Gat_t * pGate1; // the constant one gate
Amap_Gat_t * pGateBuf; // the buffer
Amap_Gat_t * pGateInv; // the inverter
Aig_MmFlex_t * pMemGates; // memory manager for objects
int fHasXor; // XOR/NXOR gates are present
int fHasMux; // MUX/NMUX gates are present
// structural representation
int fVerbose; // enable detailed statistics
Amap_Nod_t * pNodes; // representation nodes
int nNodes; // the number of nodes used
int nNodesAlloc; // the number of nodes allocated
Vec_Ptr_t * vRules; // the rule of AND gate
Vec_Ptr_t * vRulesX; // the rule of XOR gate
Vec_Int_t * vRules3; // the rule of MUX gate
int ** pRules; // simplified representation
int ** pRulesX; // simplified representation
Aig_MmFlex_t * pMemSet; // memory manager for sets
int nSets; // the number of sets created
};
struct Amap_Pin_t_
{
char * pName;
int Phase;
double dLoadInput;
double dLoadMax;
double dDelayBlockRise;
double dDelayFanoutRise;
double dDelayBlockFall;
double dDelayFanoutFall;
double dDelayBlockMax;
};
struct Amap_Gat_t_
{
Amap_Lib_t * pLib; // library
Amap_Gat_t * pTwin; // twin gate
char * pName; // the name of the gate
char * pOutName; // name of the output
double dArea; // the area of the gate
char * pForm; // the formula describing functionality
unsigned * pFunc; // truth table
unsigned Id : 23; // unique number of the gate
unsigned fMux : 1; // denotes MUX-gates
unsigned nPins : 8; // number of inputs
Amap_Pin_t Pins[0]; // description of inputs
};
struct Amap_Set_t_
{
Amap_Set_t * pNext;
unsigned iGate : 16;
unsigned fInv : 1;
unsigned nIns : 15;
char Ins[AMAP_MAXINS];// mapping from gate inputs into fanins
};
struct Amap_Nod_t_
{
unsigned Id : 16; // ID of the node
unsigned nSuppSize: 8; // support size
unsigned Type : 8; // the type of node
short iFan0; // fanin0
short iFan1; // fanin1
short iFan2; // fanin2
short Unused; //
Amap_Set_t * pSets; // implementable gates
};
struct Amap_Cut_t_
{
unsigned iMat : 16;
unsigned fInv : 1;
unsigned nFans : 15;
int Fans[0];
};
struct Amap_Mat_t_
{
Amap_Cut_t * pCut; // the cut
Amap_Set_t * pSet; // the set
float Area; // area flow / exact area of the node
float AveFan; // edge flow of the node
float Delay; // delay of the node
};
struct Amap_Obj_t_
{
unsigned Type : 3;
unsigned Id : 29;
unsigned IdPio : 29;
unsigned fPhase : 1;
unsigned fRepr : 1;
unsigned fPolar : 1; // pCutBest->fInv ^ pSetBest->fInv
unsigned Level : 12; // 20 (July 16, 2009)
unsigned nCuts : 20; // 12 (July 16, 2009)
int nRefs;
int Equiv;
int Fan[3];
union {
void * pData;
int iData;
};
// match of the node
float EstRefs; // the number of estimated fanouts
int nFouts[2]; // the number of refs in each polarity
Amap_Mat_t Best; // the best match of the node
};
static inline Amap_Obj_t * Amap_Regular( Amap_Obj_t * p ) { return (Amap_Obj_t *)((ABC_PTRUINT_T)(p) & ~01); }
static inline Amap_Obj_t * Amap_Not( Amap_Obj_t * p ) { return (Amap_Obj_t *)((ABC_PTRUINT_T)(p) ^ 01); }
static inline Amap_Obj_t * Amap_NotCond( Amap_Obj_t * p, int c ) { return (Amap_Obj_t *)((ABC_PTRUINT_T)(p) ^ (c)); }
static inline int Amap_IsComplement( Amap_Obj_t * p ) { return (int )(((ABC_PTRUINT_T)p) & 01); }
static inline int Amap_ManPiNum( Amap_Man_t * p ) { return p->nObjs[AMAP_OBJ_PI]; }
static inline int Amap_ManPoNum( Amap_Man_t * p ) { return p->nObjs[AMAP_OBJ_PO]; }
static inline int Amap_ManAndNum( Amap_Man_t * p ) { return p->nObjs[AMAP_OBJ_AND]; }
static inline int Amap_ManXorNum( Amap_Man_t * p ) { return p->nObjs[AMAP_OBJ_XOR]; }
static inline int Amap_ManMuxNum( Amap_Man_t * p ) { return p->nObjs[AMAP_OBJ_MUX]; }
static inline int Amap_ManObjNum( Amap_Man_t * p ) { return Vec_PtrSize(p->vObjs); }
static inline int Amap_ManNodeNum( Amap_Man_t * p ) { return p->nObjs[AMAP_OBJ_AND] + p->nObjs[AMAP_OBJ_XOR] + p->nObjs[AMAP_OBJ_MUX]; }
static inline Amap_Obj_t * Amap_ManConst1( Amap_Man_t * p ) { return p->pConst1; }
static inline Amap_Obj_t * Amap_ManPi( Amap_Man_t * p, int i ) { return (Amap_Obj_t *)Vec_PtrEntry( p->vPis, i ); }
static inline Amap_Obj_t * Amap_ManPo( Amap_Man_t * p, int i ) { return (Amap_Obj_t *)Vec_PtrEntry( p->vPos, i ); }
static inline Amap_Obj_t * Amap_ManObj( Amap_Man_t * p, int i ) { return (Amap_Obj_t *)Vec_PtrEntry( p->vObjs, i ); }
static inline int Amap_ObjIsConst1( Amap_Obj_t * pObj ) { return pObj->Type == AMAP_OBJ_CONST1; }
static inline int Amap_ObjIsPi( Amap_Obj_t * pObj ) { return pObj->Type == AMAP_OBJ_PI; }
static inline int Amap_ObjIsPo( Amap_Obj_t * pObj ) { return pObj->Type == AMAP_OBJ_PO; }
static inline int Amap_ObjIsAnd( Amap_Obj_t * pObj ) { return pObj->Type == AMAP_OBJ_AND; }
static inline int Amap_ObjIsXor( Amap_Obj_t * pObj ) { return pObj->Type == AMAP_OBJ_XOR; }
static inline int Amap_ObjIsMux( Amap_Obj_t * pObj ) { return pObj->Type == AMAP_OBJ_MUX; }
static inline int Amap_ObjIsNode( Amap_Obj_t * pObj ) { return pObj->Type == AMAP_OBJ_AND || pObj->Type == AMAP_OBJ_XOR || pObj->Type == AMAP_OBJ_MUX; }
static inline int Amap_ObjToLit( Amap_Obj_t * pObj ) { return Abc_Var2Lit( Amap_Regular(pObj)->Id, Amap_IsComplement(pObj) ); }
static inline Amap_Obj_t * Amap_ObjFanin0( Amap_Man_t * p, Amap_Obj_t * pObj ) { return Amap_ManObj(p, Abc_Lit2Var(pObj->Fan[0])); }
static inline Amap_Obj_t * Amap_ObjFanin1( Amap_Man_t * p, Amap_Obj_t * pObj ) { return Amap_ManObj(p, Abc_Lit2Var(pObj->Fan[1])); }
static inline Amap_Obj_t * Amap_ObjFanin2( Amap_Man_t * p, Amap_Obj_t * pObj ) { return Amap_ManObj(p, Abc_Lit2Var(pObj->Fan[2])); }
static inline int Amap_ObjFaninC0( Amap_Obj_t * pObj ) { return Abc_LitIsCompl(pObj->Fan[0]); }
static inline int Amap_ObjFaninC1( Amap_Obj_t * pObj ) { return Abc_LitIsCompl(pObj->Fan[1]); }
static inline int Amap_ObjFaninC2( Amap_Obj_t * pObj ) { return Abc_LitIsCompl(pObj->Fan[2]); }
static inline void * Amap_ObjCopy( Amap_Obj_t * pObj ) { return pObj->pData; }
static inline int Amap_ObjLevel( Amap_Obj_t * pObj ) { return pObj->Level; }
static inline void Amap_ObjSetLevel( Amap_Obj_t * pObj, int Level ) { pObj->Level = Level; }
static inline void Amap_ObjSetCopy( Amap_Obj_t * pObj, void * pCopy ) { pObj->pData = pCopy; }
static inline Amap_Obj_t * Amap_ObjChoice( Amap_Man_t * p, Amap_Obj_t * pObj ) { return pObj->Equiv? Amap_ManObj(p, pObj->Equiv) : NULL; }
static inline void Amap_ObjSetChoice( Amap_Obj_t * pObj, Amap_Obj_t * pEqu){ assert(pObj->Equiv==0); if (pObj->Id != pEqu->Id) pObj->Equiv = pEqu->Id; }
static inline int Amap_ObjPhaseReal( Amap_Obj_t * pObj ) { return Amap_Regular(pObj)->fPhase ^ Amap_IsComplement(pObj); }
static inline int Amap_ObjRefsTotal( Amap_Obj_t * pObj ) { return pObj->nFouts[0] + pObj->nFouts[1]; }
static inline Amap_Gat_t * Amap_LibGate( Amap_Lib_t * p, int i ) { return (Amap_Gat_t *)Vec_PtrEntry(p->vGates, i); }
static inline Amap_Nod_t * Amap_LibNod( Amap_Lib_t * p, int i ) { return p->pNodes + i; }
// returns pointer to the next cut (internal cuts only)
static inline Amap_Cut_t * Amap_ManCutNext( Amap_Cut_t * pCut )
{ return (Amap_Cut_t *)(((int *)pCut)+pCut->nFans+1); }
// returns pointer to the place of the next cut (temporary cuts only)
static inline Amap_Cut_t ** Amap_ManCutNextP( Amap_Cut_t * pCut )
{ return (Amap_Cut_t **)(((int *)pCut)+pCut->nFans+1); }
extern void Kit_DsdPrintFromTruth( unsigned * pTruth, int nVars );
////////////////////////////////////////////////////////////////////////
/// MACRO DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
// iterator over the primary inputs
#define Amap_ManForEachPi( p, pObj, i ) \
Vec_PtrForEachEntry( Amap_Obj_t *, p->vPis, pObj, i )
// iterator over the primary outputs
#define Amap_ManForEachPo( p, pObj, i ) \
Vec_PtrForEachEntry( Amap_Obj_t *, p->vPos, pObj, i )
// iterator over all objects, including those currently not used
#define Amap_ManForEachObj( p, pObj, i ) \
Vec_PtrForEachEntry( Amap_Obj_t *, p->vObjs, pObj, i ) if ( (pObj) == NULL ) {} else
// iterator over all nodes
#define Amap_ManForEachNode( p, pObj, i ) \
Vec_PtrForEachEntry( Amap_Obj_t *, p->vObjs, pObj, i ) if ( (pObj) == NULL || !Amap_ObjIsNode(pObj) ) {} else
// iterator through all gates of the library
#define Amap_LibForEachGate( pLib, pGate, i ) \
Vec_PtrForEachEntry( Amap_Gat_t *, pLib->vGates, pGate, i )
// iterator through all pins of the gate
#define Amap_GateForEachPin( pGate, pPin ) \
for ( pPin = pGate->Pins; pPin < pGate->Pins + pGate->nPins; pPin++ )
// iterator through all cuts of the node
#define Amap_NodeForEachCut( pNode, pCut, i ) \
for ( i = 0, pCut = (Amap_Cut_t *)pNode->pData; i < (int)pNode->nCuts; \
i++, pCut = Amap_ManCutNext(pCut) )
// iterator through all sets of one library node
#define Amap_LibNodeForEachSet( pNod, pSet ) \
for ( pSet = pNod->pSets; pSet; pSet = pSet->pNext )
// iterates through each fanin of the match
#define Amap_MatchForEachFaninCompl( p, pM, pFanin, fCompl, i ) \
for ( i = 0; i < (int)(pM)->pCut->nFans && \
((pFanin = Amap_ManObj((p), Abc_Lit2Var((pM)->pCut->Fans[Abc_Lit2Var((pM)->pSet->Ins[i])]))), 1) && \
((fCompl = Abc_LitIsCompl((pM)->pSet->Ins[i]) ^ Abc_LitIsCompl((pM)->pCut->Fans[Abc_Lit2Var((pM)->pSet->Ins[i])])), 1); \
i++ )
// iterates through each fanin of the match
#define Amap_MatchForEachFanin( p, pM, pFanin, i ) \
for ( i = 0; i < (int)(pM)->pCut->nFans && \
((pFanin = Amap_ManObj((p), Abc_Lit2Var((pM)->pCut->Fans[Abc_Lit2Var((pM)->pSet->Ins[i])]))), 1); \
i++ )
////////////////////////////////////////////////////////////////////////
/// FUNCTION DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
/*=== amapCore.c ==========================================================*/
/*=== amapGraph.c ==========================================================*/
extern Amap_Obj_t * Amap_ManCreatePi( Amap_Man_t * p );
extern Amap_Obj_t * Amap_ManCreatePo( Amap_Man_t * p, Amap_Obj_t * pFan0 );
extern Amap_Obj_t * Amap_ManCreateAnd( Amap_Man_t * p, Amap_Obj_t * pFan0, Amap_Obj_t * pFan1 );
extern Amap_Obj_t * Amap_ManCreateXor( Amap_Man_t * p, Amap_Obj_t * pFan0, Amap_Obj_t * pFan1 );
extern Amap_Obj_t * Amap_ManCreateMux( Amap_Man_t * p, Amap_Obj_t * pFanC, Amap_Obj_t * pFan1, Amap_Obj_t * pFan0 );
extern void Amap_ManCreateChoice( Amap_Man_t * p, Amap_Obj_t * pObj );
extern void Amap_ManCreate( Amap_Man_t * p, Aig_Man_t * pAig );
/*=== amapLib.c ==========================================================*/
extern Amap_Lib_t * Amap_LibAlloc();
extern int Amap_LibNumPinsMax( Amap_Lib_t * p );
extern void Amap_LibWrite( FILE * pFile, Amap_Lib_t * pLib, int fPrintDsd );
extern Vec_Ptr_t * Amap_LibSelectGates( Amap_Lib_t * p, int fVerbose );
/*=== amapMan.c ==========================================================*/
extern Amap_Man_t * Amap_ManStart( int nNodes );
extern void Amap_ManStop( Amap_Man_t * p );
/*=== amapMatch.c ==========================================================*/
extern void Amap_ManMap( Amap_Man_t * p );
/*=== amapMerge.c ==========================================================*/
extern void Amap_ManMerge( Amap_Man_t * p );
/*=== amapOutput.c ==========================================================*/
extern Vec_Ptr_t * Amap_ManProduceMapped( Amap_Man_t * p );
/*=== amapParse.c ==========================================================*/
extern int Amap_LibParseEquations( Amap_Lib_t * p, int fVerbose );
/*=== amapPerm.c ==========================================================*/
/*=== amapRead.c ==========================================================*/
extern Amap_Lib_t * Amap_LibReadBuffer( char * pBuffer, int fVerbose );
extern Amap_Lib_t * Amap_LibReadFile( char * pFileName, int fVerbose );
/*=== amapRule.c ==========================================================*/
extern short * Amap_LibTableFindNode( Amap_Lib_t * p, int iFan0, int iFan1, int fXor );
extern void Amap_LibCreateRules( Amap_Lib_t * p, int fVeryVerbose );
/*=== amapUniq.c ==========================================================*/
extern int Amap_LibFindNode( Amap_Lib_t * pLib, int iFan0, int iFan1, int fXor );
extern int Amap_LibFindMux( Amap_Lib_t * p, int iFan0, int iFan1, int iFan2 );
extern int Amap_LibCreateVar( Amap_Lib_t * p );
extern int Amap_LibCreateNode( Amap_Lib_t * p, int iFan0, int iFan1, int fXor );
extern int Amap_LibCreateMux( Amap_Lib_t * p, int iFan0, int iFan1, int iFan2 );
extern int ** Amap_LibLookupTableAlloc( Vec_Ptr_t * vVec, int fVerbose );
ABC_NAMESPACE_HEADER_END
#endif
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////