fretime.h 5.76 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
/**CFile****************************************************************

  FileName    [fretime.h]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [Flow-based retiming package.]

  Synopsis    [Header file for retiming package.]

  Author      [Aaron Hurst]
  
  Affiliation [UC Berkeley]

  Date        [Ver. 1.0. Started - January 1, 2008.]

  Revision    [$Id: fretime.h,v 1.00 2008/01/01 00:00:00 ahurst Exp $]

***********************************************************************/

#if !defined(RETIME_H_)
#define RETIME_H_


#include "base/abc/abc.h"
#include "misc/vec/vec.h"


ABC_NAMESPACE_HEADER_START


// #define IGNORE_TIMING
// #define DEBUG_PRINT_FLOWS
// #define DEBUG_VISITED
// #define DEBUG_PREORDER
#define DEBUG_CHECK
// #define DEBUG_PRINT_LEVELS

////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////

#define MAX_DIST 30000

// flags in Flow_Data structure...
#define VISITED_E       0x001
#define VISITED_R       0x002
#define VISITED  (VISITED_E | VISITED_R)
#define FLOW            0x004
#define CROSS_BOUNDARY  0x008
#define BLOCK           0x010
#define INIT_0          0x020
#define INIT_1          0x040
#define INIT_CARE (INIT_0 | INIT_1)
#define CONSERVATIVE    0x080
#define BLOCK_OR_CONS (BLOCK | CONSERVATIVE)
#define BIAS_NODE       0x100


#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))


typedef struct Flow_Data_t_ {
  unsigned int mark : 16;

  union {
    Abc_Obj_t   *pred;
    /* unsigned int var; */
    Abc_Obj_t   *pInitObj;
    Abc_Obj_t   *pCopy;
    Vec_Ptr_t   *vNodes;
  };

  unsigned int e_dist : 16;
  unsigned int r_dist : 16;
} Flow_Data_t;

// useful macros for manipulating Flow_Data structure...
#define FDATA( x )     (pManMR->pDataArray+Abc_ObjId(x))
#define FSET( x, y )   FDATA(x)->mark |= y
#define FUNSET( x, y ) FDATA(x)->mark &= ~y
#define FTEST( x, y )  (FDATA(x)->mark & y)
#define FTIMEEDGES( x )  &(pManMR->vTimeEdges[Abc_ObjId( x )])

typedef struct NodeLag_T_ {
  int id;
  int lag;
} NodeLag_t;

typedef struct InitConstraint_t_ {
  Abc_Obj_t *pBiasNode;

  Vec_Int_t  vNodes;
  Vec_Int_t  vLags;

} InitConstraint_t;

typedef struct MinRegMan_t_ {
 
  // problem description:
  int         maxDelay;
  int        fComputeInitState, fGuaranteeInitState, fBlockConst;
  int         nNodes, nLatches;
  int        fForwardOnly, fBackwardOnly;
  int        fConservTimingOnly;
  int         nMaxIters;
  int        fVerbose;
  Abc_Ntk_t  *pNtk;

  int         nPreRefine;

  // problem state
  int        fIsForward;
  int        fSinkDistTerminate;
  int         nExactConstraints, nConservConstraints;
  int         fSolutionIsDc;
  int         constraintMask;
  int         iteration, subIteration;
  Vec_Int_t  *vLags;
  
  // problem data
  Vec_Int_t   *vSinkDistHist;
  Flow_Data_t *pDataArray;
  Vec_Ptr_t   *vTimeEdges;
  Vec_Ptr_t   *vExactNodes;
  Vec_Ptr_t   *vInitConstraints;
  Abc_Ntk_t   *pInitNtk;
  Vec_Ptr_t   *vNodes; // re-useable struct
  
  NodeLag_t   *pInitToOrig;
  int          sizeInitToOrig;
  
} MinRegMan_t ;

extern MinRegMan_t *pManMR;

#define vprintf if (pManMR->fVerbose) printf 

static inline void FSETPRED(Abc_Obj_t *pObj, Abc_Obj_t *pPred) {
  assert(!Abc_ObjIsLatch(pObj)); // must preserve field to maintain init state linkage
  FDATA(pObj)->pred = pPred;
}
static inline Abc_Obj_t * FGETPRED(Abc_Obj_t *pObj) {
  return FDATA(pObj)->pred;
}

/*=== fretMain.c ==========================================================*/

Abc_Ntk_t *    Abc_FlowRetime_MinReg( Abc_Ntk_t * pNtk, int fVerbose,
                                      int fComputeInitState, int fGuaranteeInitState, int fBlockConst,
                                      int fForward, int fBackward, int nMaxIters,
                                      int maxDelay, int fFastButConservative);

void print_node(Abc_Obj_t *pObj);

void Abc_ObjBetterTransferFanout( Abc_Obj_t * pFrom, Abc_Obj_t * pTo, int complement );

int  Abc_FlowRetime_PushFlows( Abc_Ntk_t * pNtk, int fVerbose );
int Abc_FlowRetime_IsAcrossCut( Abc_Obj_t *pCur, Abc_Obj_t *pNext );
void Abc_FlowRetime_ClearFlows( int fClearAll );

int  Abc_FlowRetime_GetLag( Abc_Obj_t *pObj );
void Abc_FlowRetime_SetLag( Abc_Obj_t *pObj, int lag );

void Abc_FlowRetime_UpdateLags( );

void Abc_ObjPrintNeighborhood( Abc_Obj_t *pObj, int depth );

Abc_Ntk_t * Abc_FlowRetime_NtkSilentRestrash( Abc_Ntk_t * pNtk, int fCleanup );

/*=== fretFlow.c ==========================================================*/

int  dfsplain_e( Abc_Obj_t *pObj, Abc_Obj_t *pPred );
int  dfsplain_r( Abc_Obj_t *pObj, Abc_Obj_t *pPred );

void dfsfast_preorder( Abc_Ntk_t *pNtk );
int  dfsfast_e( Abc_Obj_t *pObj, Abc_Obj_t *pPred );
int  dfsfast_r( Abc_Obj_t *pObj, Abc_Obj_t *pPred );

/*=== fretInit.c ==========================================================*/

void Abc_FlowRetime_PrintInitStateInfo( Abc_Ntk_t * pNtk );

void Abc_FlowRetime_InitState( Abc_Ntk_t * pNtk );

void Abc_FlowRetime_UpdateForwardInit( Abc_Ntk_t * pNtk );
void Abc_FlowRetime_UpdateBackwardInit( Abc_Ntk_t * pNtk );

void Abc_FlowRetime_SetupBackwardInit( Abc_Ntk_t * pNtk );
int  Abc_FlowRetime_SolveBackwardInit( Abc_Ntk_t * pNtk );

void Abc_FlowRetime_ConstrainInit(  );
void Abc_FlowRetime_AddInitBias(  );
void Abc_FlowRetime_RemoveInitBias(  );

/*=== fretTime.c ==========================================================*/

void Abc_FlowRetime_InitTiming( Abc_Ntk_t *pNtk );
void Abc_FlowRetime_FreeTiming( Abc_Ntk_t *pNtk );

int Abc_FlowRetime_RefineConstraints( );

void Abc_FlowRetime_ConstrainConserv( Abc_Ntk_t * pNtk );
void Abc_FlowRetime_ConstrainExact( Abc_Obj_t * pObj );
void Abc_FlowRetime_ConstrainExactAll( Abc_Ntk_t * pNtk );



ABC_NAMESPACE_HEADER_END

#endif