91 float * pDelayTable, * pDelayTableNew;
92 int i, k, nInputs, nOutputs;
118 pNew->vDelayTables = Vec_PtrStart( Vec_PtrSize(
p->vDelayTables) );
121 if ( pDelayTable == NULL )
123 assert( i == (
int)pDelayTable[0] );
124 nInputs = (int)pDelayTable[1];
125 nOutputs = (int)pDelayTable[2];
126 pDelayTableNew =
ABC_ALLOC(
float, 3 + nInputs * nOutputs );
127 pDelayTableNew[0] = (int)pDelayTable[0];
128 pDelayTableNew[1] = (int)pDelayTable[1];
129 pDelayTableNew[2] = (int)pDelayTable[2];
130 for ( k = 0; k < nInputs * nOutputs; k++ )
134 pDelayTableNew[3+k] = fUnitDelay ? (float)fUnitDelay : pDelayTable[3+k];
136 assert( Vec_PtrEntry(pNew->vDelayTables, i) == NULL );
137 Vec_PtrWriteEntry( pNew->vDelayTables, i, pDelayTableNew );
148 pBox->Inouts[pBox->nInputs], pBox->nOutputs, pBox->iDelayTable, pBox->fBlack );
171 float * pDelayTable, * pDelayTableNew;
172 int i, k, nNewCis, nNewCos, nInputs, nOutputs;
179 if ( Vec_IntEntry(vBoxPres, i) )
181 nNewCis += pBox->nOutputs;
182 nNewCos += pBox->nInputs;
203 pNew->vDelayTables = Vec_PtrStart( Vec_PtrSize(
p->vDelayTables) );
206 if ( pDelayTable == NULL )
208 assert( i == (
int)pDelayTable[0] );
209 nInputs = (int)pDelayTable[1];
210 nOutputs = (int)pDelayTable[2];
211 pDelayTableNew =
ABC_ALLOC(
float, 3 + nInputs * nOutputs );
212 pDelayTableNew[0] = (int)pDelayTable[0];
213 pDelayTableNew[1] = (int)pDelayTable[1];
214 pDelayTableNew[2] = (int)pDelayTable[2];
215 for ( k = 0; k < nInputs * nOutputs; k++ )
216 pDelayTableNew[3+k] = pDelayTable[3+k];
218 assert( Vec_PtrEntry(pNew->vDelayTables, i) == NULL );
219 Vec_PtrWriteEntry( pNew->vDelayTables, i, pDelayTableNew );
229 if ( Vec_IntEntry(vBoxPres, i) )
231 Tim_ManCreateBox( pNew, curPo, pBox->nInputs, curPi, pBox->nOutputs, pBox->iDelayTable, pBox->fBlack );
233 curPi += pBox->nOutputs;
234 curPo += pBox->nInputs;
259 float * pDelayTable, * pDelayTableNew;
260 int i, k, iBox, nNewCis, nNewCos, nInputs, nOutputs;
269 pBox = Tim_ManBox(
p, iBox );
270 nNewCis += pBox->nOutputs;
271 nNewCos += pBox->nInputs;
284 memcpy( pNew->pCos + nNewCos - nNewPoNum,
291 pNew->vDelayTables = Vec_PtrStart( Vec_PtrSize(
p->vDelayTables) );
294 if ( pDelayTable == NULL )
296 if ( i != (
int)pDelayTable[0] && fWarning == 0 )
298 printf(
"Warning: Mismatch in delay-table number between the manager and the box.\n" );
302 nInputs = (int)pDelayTable[1];
303 nOutputs = (int)pDelayTable[2];
304 pDelayTableNew =
ABC_ALLOC(
float, 3 + nInputs * nOutputs );
305 pDelayTableNew[0] = i;
306 pDelayTableNew[1] = (int)pDelayTable[1];
307 pDelayTableNew[2] = (int)pDelayTable[2];
308 for ( k = 0; k < nInputs * nOutputs; k++ )
309 pDelayTableNew[3+k] = pDelayTable[3+k];
311 assert( Vec_PtrEntry(pNew->vDelayTables, i) == NULL );
312 Vec_PtrWriteEntry( pNew->vDelayTables, i, pDelayTableNew );
318 int curPi = nNewPiNum;
323 pBox = Tim_ManBox(
p, iBox );
324 Tim_ManCreateBox( pNew, curPo, pBox->nInputs, curPi, pBox->nOutputs, pBox->iDelayTable, pBox->fBlack );
326 curPi += pBox->nOutputs;
327 curPo += pBox->nInputs;
355 if ( pBox->iCopy < 0 || pBox->iCopy >=
Tim_ManBoxNum(pSpec) )
361 assert( !Vec_IntEntry(vBoxPres, pBox->iCopy) );
362 Vec_IntWriteEntry( vBoxPres, pBox->iCopy, 1 );
380 Vec_PtrFreeFree(
p->vDelayTables );
381 Vec_PtrFreeP( &
p->vBoxes );
414 assert(
p->vDelayTables == NULL );
415 p->vDelayTables = pLibBox ? Vec_PtrStart( Vec_PtrSize(pLibBox->
vBoxes) ) : Vec_PtrAlloc( 100 );
419 if ( pBox->iDelayTable == -1 || pLibBox == NULL )
422 pTable =
ABC_ALLOC(
float, 3 + pBox->nInputs * pBox->nOutputs );
423 pTable[0] = pBox->iDelayTable;
424 pTable[1] = pBox->nInputs;
425 pTable[2] = pBox->nOutputs;
426 for ( k = 0; k < pBox->nInputs * pBox->nOutputs; k++ )
429 pBox->iDelayTable = Vec_PtrSize(
p->vDelayTables);
430 Vec_PtrPush(
p->vDelayTables, pTable );
433 assert( pBox->iDelayTable >= 0 && pBox->iDelayTable < Vec_PtrSize(pLibBox->
vBoxes) );
434 pIfBox = (
If_Box_t *)Vec_PtrEntry( pLibBox->
vBoxes, pBox->iDelayTable );
438 pBox->fBlack = pIfBox->
fBlack;
439 if ( Vec_PtrEntry(
p->vDelayTables, pBox->iDelayTable ) != NULL )
442 pTable =
ABC_ALLOC(
float, 3 + pBox->nInputs * pBox->nOutputs );
443 pTable[0] = pBox->iDelayTable;
444 pTable[1] = pBox->nInputs;
445 pTable[2] = pBox->nOutputs;
446 for ( k = 0; k < pBox->nInputs * pBox->nOutputs; k++ )
447 pTable[3 + k] = pIfBox->
pDelays[k];
449 Vec_PtrWriteEntry(
p->vDelayTables, pBox->iDelayTable, pTable );
456 pObj->
timeArr = Vec_FltEntry(vInArrs, i);
465 pObj->
timeReq = Vec_FltEntry(vOutReqs, k++);
531 int i, j, k, TableX, TableY;
534 printf(
"TIMING MANAGER:\n" );
535 printf(
"PI = %d. CI = %d. PO = %d. CO = %d. Box = %d.\n",
544 printf(
"All PIs : arrival = %5.3f required = %5.3f\n", pPrev->
timeArr, pPrev->
timeReq );
547 printf(
"PI%5d : arrival = %5.3f required = %5.3f\n", i, pObj->
timeArr, pObj->
timeReq );
555 printf(
"All POs : arrival = %5.3f required = %5.3f\n", pPrev->
timeArr, pPrev->
timeReq );
560 printf(
"PO%5d : arrival = %5.3f required = %5.3f\n", k++, pObj->
timeArr, pObj->
timeReq );
567 printf(
"*** Box %5d : I =%4d. O =%4d. I1 =%6d. O1 =%6d. Table =%4d. Copy = %d.\n",
568 i, pBox->nInputs, pBox->nOutputs,
570 pBox->iDelayTable, pBox->iCopy );
573 pPrev = Tim_ManBoxInput(
p, pBox, 0 );
578 printf(
"Box inputs : arrival = %5.3f required = %5.3f\n", pPrev->
timeArr, pPrev->
timeReq );
581 printf(
"box-in%4d : arrival = %5.3f required = %5.3f\n", k, pObj->
timeArr, pObj->
timeReq );
584 pPrev = Tim_ManBoxOutput(
p, pBox, 0 );
589 printf(
"Box outputs : arrival = %5.3f required = %5.3f\n", pPrev->
timeArr, pPrev->
timeReq );
592 printf(
"box-out%3d : arrival = %5.3f required = %5.3f\n", k, pObj->
timeArr, pObj->
timeReq );
602 if ( pTable == NULL )
604 printf(
"Delay table %d:\n", i );
605 assert( i == (
int)pTable[0] );
606 TableX = (int)pTable[1];
607 TableY = (int)pTable[2];
608 for ( j = 0; j < TableY; j++, printf(
"\n" ) )
609 for ( k = 0; k < TableX; k++ )
611 printf(
"%5s",
"-" );
613 printf(
"%5.0f", pTable[3+j*TableX+k] );
625 printf(
"TIMING MANAGER:\n" );
626 printf(
"PI = %d. CI = %d. PO = %d. CO = %d. Box = %d.\n",
631 printf(
"%d ", pBox->iCopy );
654 Abc_Print( 1,
"Hierarchy : " );
655 printf(
"PI/CI = %d/%d PO/CO = %d/%d Box = %d ",
660 printf(
"delay(AND2) = %d", nAnd2Delay );
666 IdMax = Abc_MaxInt( IdMax, pBox->iDelayTable );
667 vCounts = Vec_IntStart( IdMax+1 );
668 vBoxes = Vec_PtrStart( IdMax+1 );
671 Vec_IntAddToEntry( vCounts, pBox->iDelayTable, 1 );
672 Vec_PtrWriteEntry( vBoxes, pBox->iDelayTable, pBox );
677 if ( Count == 0 )
continue;
678 pBox = (
Tim_Box_t *)Vec_PtrEntry( vBoxes, i );
679 printf(
" Box %4d ", i );
680 printf(
"Num = %4d ", Count );
681 printf(
"Ins = %4d ", pBox->nInputs );
682 printf(
"Outs = %4d", pBox->nOutputs );
685 Vec_IntFree( vCounts );
686 Vec_PtrFree( vBoxes );
724 return p->vBoxes ? Vec_PtrSize(
p->vBoxes) : 0;
732 Counter += pBox->fBlack;
739 *pnBbIns = *pnBbOuts = 0;
751 return p->vDelayTables ? Vec_PtrSize(
p->vDelayTables) : 0;
767 assert(
p->vDelayTables == NULL );
768 p->vDelayTables = vDelayTables;
#define ABC_FALLOC(type, num)
#define ABC_ALLOC(type, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct If_LibBox_t_ If_LibBox_t
struct If_Box_t_ If_Box_t
Mem_Flex_t * Mem_FlexStart()
void Mem_FlexStop(Mem_Flex_t *p, int fVerbose)
#define Tim_ManForEachCo(p, pObj, i)
#define Tim_ManForEachTable(p, pTable, i)
#define Tim_ManForEachPo(p, pObj, i)
#define Tim_ManBoxForEachInput(p, pBox, pObj, i)
struct Tim_Obj_t_ Tim_Obj_t
#define Tim_ManForEachBox(p, pBox, i)
#define Tim_ManForEachCi(p, pObj, i)
ITERATORS ///.
#define Tim_ManForEachPi(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Tim_Box_t_ Tim_Box_t
INCLUDES ///.
#define Tim_ManBoxForEachOutput(p, pBox, pObj, i)
void Tim_ManStopP(Tim_Man_t **p)
void Tim_ManPrintStats(Tim_Man_t *p, int nAnd2Delay)
int Tim_ManBlackBoxNum(Tim_Man_t *p)
void Tim_ManSetDelayTables(Tim_Man_t *p, Vec_Ptr_t *vDelayTables)
int Tim_ManBoxNum(Tim_Man_t *p)
void Tim_ManTravIdEnable(Tim_Man_t *p)
void Tim_ManBlackBoxIoNum(Tim_Man_t *p, int *pnBbIns, int *pnBbOuts)
void Tim_ManPrintBoxCopy(Tim_Man_t *p)
Vec_Int_t * Tim_ManAlignTwo(Tim_Man_t *pSpec, Tim_Man_t *pImpl)
int Tim_ManCiNum(Tim_Man_t *p)
void Tim_ManTravIdDisable(Tim_Man_t *p)
float * Tim_ManGetArrTimes(Tim_Man_t *p)
int Tim_ManPoNum(Tim_Man_t *p)
void Tim_ManCreate(Tim_Man_t *p, void *pLib, Vec_Flt_t *vInArrs, Vec_Flt_t *vOutReqs)
Tim_Man_t * Tim_ManTrim(Tim_Man_t *p, Vec_Int_t *vBoxPres)
void Tim_ManStop(Tim_Man_t *p)
ABC_NAMESPACE_IMPL_START Tim_Man_t * Tim_ManStart(int nCis, int nCos)
DECLARATIONS ///.
float * Tim_ManGetReqTimes(Tim_Man_t *p)
Tim_Man_t * Tim_ManReduce(Tim_Man_t *p, Vec_Int_t *vBoxesLeft, int nTermsDiff)
Tim_Man_t * Tim_ManDup(Tim_Man_t *p, int fUnitDelay)
int Tim_ManPiNum(Tim_Man_t *p)
int Tim_ManCoNum(Tim_Man_t *p)
void Tim_ManPrint(Tim_Man_t *p)
int Tim_ManDelayTableNum(Tim_Man_t *p)
int Tim_ManBoxOutputNum(Tim_Man_t *p, int iBox)
int Tim_ManBoxNum(Tim_Man_t *p)
void Tim_ManInitPiArrivalAll(Tim_Man_t *p, float Delay)
typedefABC_NAMESPACE_HEADER_START struct Tim_Man_t_ Tim_Man_t
INCLUDES ///.
void Tim_ManCreateBox(Tim_Man_t *p, int firstIn, int nIns, int firstOut, int nOuts, int iDelayTable, int fBlack)
ITERATORS ///.
int Tim_ManPoNum(Tim_Man_t *p)
void Tim_ManBoxSetCopy(Tim_Man_t *p, int iBox, int iCopy)
int Tim_ManBoxInputFirst(Tim_Man_t *p, int iBox)
int Tim_ManBoxInputNum(Tim_Man_t *p, int iBox)
void Tim_ManInitPoRequiredAll(Tim_Man_t *p, float Delay)
#define TIM_ETERNITY
MACRO DEFINITIONS ///.
int Tim_ManPiNum(Tim_Man_t *p)
int Tim_ManCoNum(Tim_Man_t *p)
int Tim_ManBoxCopy(Tim_Man_t *p, int iBox)
int Tim_ManBoxOutputFirst(Tim_Man_t *p, int iBox)
typedefABC_NAMESPACE_HEADER_START struct Vec_Flt_t_ Vec_Flt_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.