abc-master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
fpgaMatch.c File Reference
#include "fpgaInt.h"

Go to the source code of this file.

Functions

static ABC_NAMESPACE_IMPL_START int Fpga_MatchNode (Fpga_Man_t *p, Fpga_Node_t *pNode, int fDelayOriented)
 DECLARATIONS ///. More...
 
static int Fpga_MatchNodeArea (Fpga_Man_t *p, Fpga_Node_t *pNode)
 
static int Fpga_MatchNodeSwitch (Fpga_Man_t *p, Fpga_Node_t *pNode)
 
static Fpga_Cut_tFpga_MappingAreaWithoutNode (Fpga_Man_t *p, Fpga_Node_t *pFanout, Fpga_Node_t *pNodeNo)
 
static int Fpga_MappingMatchesAreaArray (Fpga_Man_t *p, Fpga_NodeVec_t *vNodes)
 
int Fpga_MappingMatches (Fpga_Man_t *p, int fDelayOriented)
 FUNCTION DEFINITIONS ///. More...
 
int Fpga_MappingMatchesArea (Fpga_Man_t *p)
 
int Fpga_MappingMatchesSwitch (Fpga_Man_t *p)
 
float Fpga_FindBestNode (Fpga_Man_t *p, Fpga_NodeVec_t *vNodes, Fpga_Node_t **ppNode, Fpga_Cut_t **ppCutBest)
 

Function Documentation

float Fpga_FindBestNode ( Fpga_Man_t p,
Fpga_NodeVec_t vNodes,
Fpga_Node_t **  ppNode,
Fpga_Cut_t **  ppCutBest 
)

function*************************************************************

synopsis [Performs area minimization using a heuristic algorithm.]

description []

sideeffects []

seealso []

Definition at line 756 of file fpgaMatch.c.

757 {
758  Fpga_Node_t * pNode;
759  Fpga_Cut_t * pCut;
760  float Gain, CutArea1, CutArea2, CutArea3;
761  int i;
762 
763  Gain = 0;
764  for ( i = 0; i < vNodes->nSize; i++ )
765  {
766  pNode = vNodes->pArray[i];
767  // deref the current cut
768  CutArea1 = Fpga_CutDeref( p, pNode, pNode->pCutBest, 0 );
769 
770  // ref all the cuts
771  for ( pCut = pNode->pCuts->pNext; pCut; pCut = pCut->pNext )
772  {
773  if ( pCut == pNode->pCutBest )
774  continue;
775  if ( pCut->tArrival > pNode->tRequired )
776  continue;
777 
778  CutArea2 = Fpga_CutGetAreaDerefed( p, pCut );
779  if ( Gain < CutArea1 - CutArea2 )
780  {
781  *ppNode = pNode;
782  *ppCutBest = pCut;
783  Gain = CutArea1 - CutArea2;
784  }
785  }
786  // ref the old cut
787  CutArea3 = Fpga_CutRef( p, pNode, pNode->pCutBest, 0 );
788  assert( CutArea1 == CutArea3 );
789  }
790  if ( Gain == 0 )
791  printf( "Returning no gain.\n" );
792 
793  return Gain;
794 }
float Fpga_CutRef(Fpga_Man_t *pMan, Fpga_Node_t *pNode, Fpga_Cut_t *pCut, int fFanouts)
Definition: fpgaCutUtils.c:384
Fpga_Cut_t * pCuts
Definition: fpgaInt.h:224
float Fpga_CutGetAreaDerefed(Fpga_Man_t *pMan, Fpga_Cut_t *pCut)
Definition: fpgaCutUtils.c:362
float Fpga_CutDeref(Fpga_Man_t *pMan, Fpga_Node_t *pNode, Fpga_Cut_t *pCut, int fFanouts)
Definition: fpgaCutUtils.c:421
#define assert(ex)
Definition: util_old.h:213
Fpga_Node_t ** pArray
Definition: fpgaInt.h:252
Fpga_Cut_t * pCutBest
Definition: fpgaInt.h:222
Fpga_Cut_t * pNext
Definition: fpgaInt.h:246
static Fpga_Cut_t* Fpga_MappingAreaWithoutNode ( Fpga_Man_t p,
Fpga_Node_t pFanout,
Fpga_Node_t pNodeNo 
)
static
int Fpga_MappingMatches ( Fpga_Man_t p,
int  fDelayOriented 
)

FUNCTION DEFINITIONS ///.

Function*************************************************************

Synopsis [Finds the best delay assignment of LUTs.]

Description [This procedure iterates through all the nodes of the object graph reachable from the POs and assigns the best match to each of them. If the flag fDelayOriented is set to 1, it tries to minimize the arrival time and uses the area flow as a tie-breaker. If the flag is set to 0, it considers all the cuts, whose arrival times matches the required time at the node, and minimizes the area flow using the arrival time as a tie-breaker.

Before this procedure is called, the required times should be set and the fanout counts should be computed. In the first iteration, the required times are set to very large number (by NodeCreate) and the fanout counts are set to the number of fanouts in the AIG. In the following iterations, the required times are set by the backward traversal, while the fanouts are estimated approximately.

If the arrival times of the PI nodes are given, they should be assigned to the PIs after the cuts are computed and before this procedure is called for the first time.]

SideEffects []

SeeAlso []

Definition at line 67 of file fpgaMatch.c.

68 {
69  ProgressBar * pProgress;
70  Fpga_Node_t * pNode;
71  int i, nNodes;
72 
73  // assign the arrival times of the PIs
74  for ( i = 0; i < p->nInputs; i++ )
75  p->pInputs[i]->pCutBest->tArrival = p->pInputArrivals[i];
76 
77  // match LUTs with nodes in the topological order
78  nNodes = p->vAnds->nSize;
79  pProgress = Extra_ProgressBarStart( stdout, nNodes );
80  for ( i = 0; i < nNodes; i++ )
81  {
82  pNode = p->vAnds->pArray[i];
83  if ( !Fpga_NodeIsAnd( pNode ) )
84  continue;
85  // skip a secondary node
86  if ( pNode->pRepr )
87  continue;
88  // match the node
89  Fpga_MatchNode( p, pNode, fDelayOriented );
90  Extra_ProgressBarUpdate( pProgress, i, "Matches ..." );
91  }
92  Extra_ProgressBarStop( pProgress );
93 /*
94  if ( !fDelayOriented )
95  {
96  float Area = 0.0;
97  for ( i = 0; i < p->nOutputs; i++ )
98  {
99  printf( "%5.2f ", Fpga_Regular(p->pOutputs[i])->pCutBest->aFlow );
100  Area += Fpga_Regular(p->pOutputs[i])->pCutBest->aFlow;
101  }
102  printf( "\nTotal = %5.2f\n", Area );
103  }
104 */
105  return 1;
106 }
float * pInputArrivals
Definition: fpgaInt.h:118
Fpga_Node_t ** pInputs
Definition: fpgaInt.h:104
static ABC_NAMESPACE_IMPL_START int Fpga_MatchNode(Fpga_Man_t *p, Fpga_Node_t *pNode, int fDelayOriented)
DECLARATIONS ///.
Definition: fpgaMatch.c:119
DECLARATIONS ///.
Fpga_Node_t * pRepr
Definition: fpgaInt.h:203
void Extra_ProgressBarStop(ProgressBar *p)
int Fpga_NodeIsAnd(Fpga_Node_t *p)
Definition: fpgaCreate.c:127
ProgressBar * Extra_ProgressBarStart(FILE *pFile, int nItemsTotal)
FUNCTION DEFINITIONS ///.
static void Extra_ProgressBarUpdate(ProgressBar *p, int nItemsCur, char *pString)
Definition: extra.h:243
Fpga_Node_t ** pArray
Definition: fpgaInt.h:252
Fpga_Cut_t * pCutBest
Definition: fpgaInt.h:222
Fpga_NodeVec_t * vAnds
Definition: fpgaInt.h:112
int Fpga_MappingMatchesArea ( Fpga_Man_t p)

Function*************************************************************

Synopsis [Finds the best area assignment of LUTs.]

Description []

SideEffects []

SeeAlso []

Definition at line 196 of file fpgaMatch.c.

197 {
198  ProgressBar * pProgress;
199  Fpga_Node_t * pNode;
200  int i, nNodes;
201 
202  // assign the arrival times of the PIs
203  for ( i = 0; i < p->nInputs; i++ )
204  p->pInputs[i]->pCutBest->tArrival = p->pInputArrivals[i];
205 
206  // match LUTs with nodes in the topological order
207  nNodes = p->vAnds->nSize;
208  pProgress = Extra_ProgressBarStart( stdout, nNodes );
209  for ( i = 0; i < nNodes; i++ )
210  {
211  pNode = p->vAnds->pArray[i];
212  if ( !Fpga_NodeIsAnd( pNode ) )
213  continue;
214  // skip a secondary node
215  if ( pNode->pRepr )
216  continue;
217  // match the node
218  Fpga_MatchNodeArea( p, pNode );
219  Extra_ProgressBarUpdate( pProgress, i, "Matches ..." );
220  }
221  Extra_ProgressBarStop( pProgress );
222  return 1;
223 }
float * pInputArrivals
Definition: fpgaInt.h:118
Fpga_Node_t ** pInputs
Definition: fpgaInt.h:104
static int Fpga_MatchNodeArea(Fpga_Man_t *p, Fpga_Node_t *pNode)
Definition: fpgaMatch.c:268
DECLARATIONS ///.
Fpga_Node_t * pRepr
Definition: fpgaInt.h:203
void Extra_ProgressBarStop(ProgressBar *p)
int Fpga_NodeIsAnd(Fpga_Node_t *p)
Definition: fpgaCreate.c:127
ProgressBar * Extra_ProgressBarStart(FILE *pFile, int nItemsTotal)
FUNCTION DEFINITIONS ///.
static void Extra_ProgressBarUpdate(ProgressBar *p, int nItemsCur, char *pString)
Definition: extra.h:243
Fpga_Node_t ** pArray
Definition: fpgaInt.h:252
Fpga_Cut_t * pCutBest
Definition: fpgaInt.h:222
Fpga_NodeVec_t * vAnds
Definition: fpgaInt.h:112
int Fpga_MappingMatchesAreaArray ( Fpga_Man_t p,
Fpga_NodeVec_t vNodes 
)
static

Function*************************************************************

Synopsis [Finds the best area assignment of LUTs.]

Description []

SideEffects []

SeeAlso []

Definition at line 236 of file fpgaMatch.c.

237 {
238  Fpga_Node_t * pNode;
239  int i;
240 
241  // match LUTs with nodes in the topological order
242  for ( i = 0; i < vNodes->nSize; i++ )
243  {
244  pNode = vNodes->pArray[i];
245  if ( !Fpga_NodeIsAnd( pNode ) )
246  continue;
247  // skip a secondary node
248  if ( pNode->pRepr )
249  continue;
250  // match the node
251  if ( !Fpga_MatchNodeArea( p, pNode ) )
252  return 0;
253  }
254  return 1;
255 }
static int Fpga_MatchNodeArea(Fpga_Man_t *p, Fpga_Node_t *pNode)
Definition: fpgaMatch.c:268
Fpga_Node_t * pRepr
Definition: fpgaInt.h:203
int Fpga_NodeIsAnd(Fpga_Node_t *p)
Definition: fpgaCreate.c:127
Fpga_Node_t ** pArray
Definition: fpgaInt.h:252
int Fpga_MappingMatchesSwitch ( Fpga_Man_t p)

Function*************************************************************

Synopsis [Finds the best area assignment of LUTs.]

Description []

SideEffects []

SeeAlso []

Definition at line 349 of file fpgaMatch.c.

350 {
351  ProgressBar * pProgress;
352  Fpga_Node_t * pNode;
353  int i, nNodes;
354 
355  // assign the arrival times of the PIs
356  for ( i = 0; i < p->nInputs; i++ )
357  p->pInputs[i]->pCutBest->tArrival = p->pInputArrivals[i];
358 
359  // match LUTs with nodes in the topological order
360  nNodes = p->vAnds->nSize;
361  pProgress = Extra_ProgressBarStart( stdout, nNodes );
362  for ( i = 0; i < nNodes; i++ )
363  {
364  pNode = p->vAnds->pArray[i];
365  if ( !Fpga_NodeIsAnd( pNode ) )
366  continue;
367  // skip a secondary node
368  if ( pNode->pRepr )
369  continue;
370  // match the node
371  Fpga_MatchNodeSwitch( p, pNode );
372  Extra_ProgressBarUpdate( pProgress, i, "Matches ..." );
373  }
374  Extra_ProgressBarStop( pProgress );
375  return 1;
376 }
static int Fpga_MatchNodeSwitch(Fpga_Man_t *p, Fpga_Node_t *pNode)
Definition: fpgaMatch.c:389
float * pInputArrivals
Definition: fpgaInt.h:118
Fpga_Node_t ** pInputs
Definition: fpgaInt.h:104
DECLARATIONS ///.
Fpga_Node_t * pRepr
Definition: fpgaInt.h:203
void Extra_ProgressBarStop(ProgressBar *p)
int Fpga_NodeIsAnd(Fpga_Node_t *p)
Definition: fpgaCreate.c:127
ProgressBar * Extra_ProgressBarStart(FILE *pFile, int nItemsTotal)
FUNCTION DEFINITIONS ///.
static void Extra_ProgressBarUpdate(ProgressBar *p, int nItemsCur, char *pString)
Definition: extra.h:243
Fpga_Node_t ** pArray
Definition: fpgaInt.h:252
Fpga_Cut_t * pCutBest
Definition: fpgaInt.h:222
Fpga_NodeVec_t * vAnds
Definition: fpgaInt.h:112
int Fpga_MatchNode ( Fpga_Man_t p,
Fpga_Node_t pNode,
int  fDelayOriented 
)
static

DECLARATIONS ///.

CFile****************************************************************

FileName [fpgaMatch.c]

PackageName [MVSIS 1.3: Multi-valued logic synthesis system.]

Synopsis [Technology mapping for variable-size-LUT FPGAs.]

Author [MVSIS Group]

Affiliation [UC Berkeley]

Date [Ver. 2.0. Started - August 18, 2004.]

Revision [

Id:
fpgaMatch.c,v 1.7 2004/09/30 21:18:10 satrajit Exp

]

Function*************************************************************

Synopsis [Computes the best matching for one node.]

Description []

SideEffects []

SeeAlso []

Definition at line 119 of file fpgaMatch.c.

120 {
121  Fpga_Cut_t * pCut, * pCutBestOld;
122  clock_t clk;
123  // make sure that at least one cut other than the trivial is present
124  if ( pNode->pCuts->pNext == NULL )
125  {
126  printf( "\nError: A node in the mapping graph does not have feasible cuts.\n" );
127  return 0;
128  }
129 
130  // estimate the fanouts of the node
131  if ( pNode->aEstFanouts < 0 )
132  pNode->aEstFanouts = (float)pNode->nRefs;
133  else
134  pNode->aEstFanouts = (float)((2.0 * pNode->aEstFanouts + pNode->nRefs) / 3.0);
135 // pNode->aEstFanouts = (float)pNode->nRefs;
136 
137  pCutBestOld = pNode->pCutBest;
138  pNode->pCutBest = NULL;
139  for ( pCut = pNode->pCuts->pNext; pCut; pCut = pCut->pNext )
140  {
141  // compute the arrival time of the cut and its area flow
142 clk = clock();
143  Fpga_CutGetParameters( p, pCut );
144 //p->time2 += clock() - clk;
145  // drop the cut if it does not meet the required times
146  if ( Fpga_FloatMoreThan(p, pCut->tArrival, pNode->tRequired) )
147  continue;
148  // if no cut is assigned, use the current one
149  if ( pNode->pCutBest == NULL )
150  {
151  pNode->pCutBest = pCut;
152  continue;
153  }
154  // choose the best cut using one of the two criteria:
155  // (1) delay oriented mapping (first traversal), delay first, area-flow as a tie-breaker
156  // (2) area recovery (subsequent traversals), area-flow first, delay as a tie-breaker
157  if ( (fDelayOriented &&
158  (Fpga_FloatMoreThan(p, pNode->pCutBest->tArrival, pCut->tArrival) ||
159  (Fpga_FloatEqual(p, pNode->pCutBest->tArrival, pCut->tArrival) && Fpga_FloatMoreThan(p, pNode->pCutBest->aFlow, pCut->aFlow)) )) ||
160  (!fDelayOriented &&
161  (Fpga_FloatMoreThan(p, pNode->pCutBest->aFlow, pCut->aFlow) ||
162  (Fpga_FloatEqual(p, pNode->pCutBest->aFlow, pCut->aFlow) && Fpga_FloatMoreThan(p, pNode->pCutBest->tArrival, pCut->tArrival)))) )
163  {
164  pNode->pCutBest = pCut;
165  }
166  }
167 
168  // make sure the match is found
169  if ( pNode->pCutBest == NULL )
170  {
171  if ( pCutBestOld == NULL )
172  {
173 // printf( "\nError: Could not match a node in the object graph.\n" );
174  return 0;
175  }
176  pNode->pCutBest = pCutBestOld;
177  }
178  return 1;
179 }
void Fpga_CutGetParameters(Fpga_Man_t *pMan, Fpga_Cut_t *pCut)
Definition: fpgaCutUtils.c:279
static int Fpga_FloatEqual(Fpga_Man_t *p, float Arg1, float Arg2)
Definition: fpgaInt.h:283
Fpga_Cut_t * pCuts
Definition: fpgaInt.h:224
static int Fpga_FloatMoreThan(Fpga_Man_t *p, float Arg1, float Arg2)
Definition: fpgaInt.h:281
Fpga_Cut_t * pCutBest
Definition: fpgaInt.h:222
Fpga_Cut_t * pNext
Definition: fpgaInt.h:246
int Fpga_MatchNodeArea ( Fpga_Man_t p,
Fpga_Node_t pNode 
)
static

Function*************************************************************

Synopsis [Computes the best matching for one node.]

Description []

SideEffects []

SeeAlso []

Definition at line 268 of file fpgaMatch.c.

269 {
270  Fpga_Cut_t * pCut, * pCutBestOld;
271  float aAreaCutBest;
272  clock_t clk;
273  // make sure that at least one cut other than the trivial is present
274  if ( pNode->pCuts->pNext == NULL )
275  {
276  printf( "\nError: A node in the mapping graph does not have feasible cuts.\n" );
277  return 0;
278  }
279 
280  // remember the old cut
281  pCutBestOld = pNode->pCutBest;
282  // deref the old cut
283  if ( pNode->nRefs )
284  aAreaCutBest = Fpga_CutDeref( p, pNode, pNode->pCutBest, 0 );
285 
286  // search for a better cut
287  pNode->pCutBest = NULL;
288  for ( pCut = pNode->pCuts->pNext; pCut; pCut = pCut->pNext )
289  {
290  // compute the arrival time of the cut and its area flow
291 clk = clock();
292  pCut->tArrival = Fpga_TimeCutComputeArrival( p, pCut );
293 //p->time2 += clock() - clk;
294  // drop the cut if it does not meet the required times
295  if ( Fpga_FloatMoreThan( p, pCut->tArrival, pNode->tRequired ) )
296  continue;
297  // get the area of this cut
298  pCut->aFlow = Fpga_CutGetAreaDerefed( p, pCut );
299  // if no cut is assigned, use the current one
300  if ( pNode->pCutBest == NULL )
301  {
302  pNode->pCutBest = pCut;
303  continue;
304  }
305  // choose the best cut as follows: exact area first, delay as a tie-breaker
306  if ( Fpga_FloatMoreThan(p, pNode->pCutBest->aFlow, pCut->aFlow) ||
307  (Fpga_FloatEqual(p, pNode->pCutBest->aFlow, pCut->aFlow) && Fpga_FloatMoreThan(p, pNode->pCutBest->tArrival, pCut->tArrival)) )
308  {
309  pNode->pCutBest = pCut;
310  }
311  }
312 
313  // make sure the match is found
314  if ( pNode->pCutBest == NULL )
315  {
316  pNode->pCutBest = pCutBestOld;
317  // insert the new cut
318  if ( pNode->nRefs )
319  pNode->pCutBest->aFlow = Fpga_CutRef( p, pNode, pNode->pCutBest, 0 );
320 // printf( "\nError: Could not match a node in the object graph.\n" );
321  return 0;
322  }
323 
324  // insert the new cut
325  // make sure the area selected is not worse then the original area
326  if ( pNode->nRefs )
327  {
328  pNode->pCutBest->aFlow = Fpga_CutRef( p, pNode, pNode->pCutBest, 0 );
329 // assert( pNode->pCutBest->aFlow <= aAreaCutBest );
330 // assert( pNode->tRequired < FPGA_FLOAT_LARGE );
331  }
332  return 1;
333 }
float Fpga_CutRef(Fpga_Man_t *pMan, Fpga_Node_t *pNode, Fpga_Cut_t *pCut, int fFanouts)
Definition: fpgaCutUtils.c:384
static int Fpga_FloatEqual(Fpga_Man_t *p, float Arg1, float Arg2)
Definition: fpgaInt.h:283
Fpga_Cut_t * pCuts
Definition: fpgaInt.h:224
static int Fpga_FloatMoreThan(Fpga_Man_t *p, float Arg1, float Arg2)
Definition: fpgaInt.h:281
float Fpga_CutGetAreaDerefed(Fpga_Man_t *pMan, Fpga_Cut_t *pCut)
Definition: fpgaCutUtils.c:362
float Fpga_CutDeref(Fpga_Man_t *pMan, Fpga_Node_t *pNode, Fpga_Cut_t *pCut, int fFanouts)
Definition: fpgaCutUtils.c:421
float Fpga_TimeCutComputeArrival(Fpga_Man_t *pMan, Fpga_Cut_t *pCut)
DECLARATIONS ///.
Definition: fpgaTime.c:44
Fpga_Cut_t * pCutBest
Definition: fpgaInt.h:222
Fpga_Cut_t * pNext
Definition: fpgaInt.h:246
int Fpga_MatchNodeSwitch ( Fpga_Man_t p,
Fpga_Node_t pNode 
)
static

Function*************************************************************

Synopsis [Computes the best matching for one node.]

Description []

SideEffects []

SeeAlso []

Definition at line 389 of file fpgaMatch.c.

390 {
391  Fpga_Cut_t * pCut, * pCutBestOld;
392  float aAreaCutBest = FPGA_FLOAT_LARGE;
393  clock_t clk;
394  // make sure that at least one cut other than the trivial is present
395  if ( pNode->pCuts->pNext == NULL )
396  {
397  printf( "\nError: A node in the mapping graph does not have feasible cuts.\n" );
398  return 0;
399  }
400 
401  // remember the old cut
402  pCutBestOld = pNode->pCutBest;
403  // deref the old cut
404  if ( pNode->nRefs )
405  aAreaCutBest = Fpga_CutDerefSwitch( p, pNode, pNode->pCutBest, 0 );
406 
407  // search for a better cut
408  pNode->pCutBest = NULL;
409  for ( pCut = pNode->pCuts->pNext; pCut; pCut = pCut->pNext )
410  {
411  // compute the arrival time of the cut and its area flow
412 clk = clock();
413  pCut->tArrival = Fpga_TimeCutComputeArrival( p, pCut );
414 //p->time2 += clock() - clk;
415  // drop the cut if it does not meet the required times
416  if ( Fpga_FloatMoreThan( p, pCut->tArrival, pNode->tRequired ) )
417  continue;
418  // get the area of this cut
419  pCut->aFlow = Fpga_CutGetSwitchDerefed( p, pNode, pCut );
420  // if no cut is assigned, use the current one
421  if ( pNode->pCutBest == NULL )
422  {
423  pNode->pCutBest = pCut;
424  continue;
425  }
426  // choose the best cut as follows: exact area first, delay as a tie-breaker
427  if ( Fpga_FloatMoreThan(p, pNode->pCutBest->aFlow, pCut->aFlow) ||
428  (Fpga_FloatEqual(p, pNode->pCutBest->aFlow, pCut->aFlow) && Fpga_FloatMoreThan(p, pNode->pCutBest->tArrival, pCut->tArrival)) )
429  {
430  pNode->pCutBest = pCut;
431  }
432  }
433 
434  // make sure the match is found
435  if ( pNode->pCutBest == NULL )
436  {
437  pNode->pCutBest = pCutBestOld;
438  // insert the new cut
439  if ( pNode->nRefs )
440  pNode->pCutBest->aFlow = Fpga_CutRefSwitch( p, pNode, pNode->pCutBest, 0 );
441 // printf( "\nError: Could not match a node in the object graph.\n" );
442  return 0;
443  }
444 
445  // insert the new cut
446  // make sure the area selected is not worse then the original area
447  if ( pNode->nRefs )
448  {
449  pNode->pCutBest->aFlow = Fpga_CutRefSwitch( p, pNode, pNode->pCutBest, 0 );
450  assert( pNode->pCutBest->aFlow <= aAreaCutBest + 0.001 );
451 // assert( pNode->tRequired < FPGA_FLOAT_LARGE );
452  }
453  return 1;
454 }
#define FPGA_FLOAT_LARGE
Definition: fpgaInt.h:65
float Fpga_CutGetSwitchDerefed(Fpga_Man_t *pMan, Fpga_Node_t *pNode, Fpga_Cut_t *pCut)
DECLARATIONS ///.
Definition: fpgaSwitch.c:43
float Fpga_CutRefSwitch(Fpga_Man_t *pMan, Fpga_Node_t *pNode, Fpga_Cut_t *pCut, int fFanouts)
Definition: fpgaSwitch.c:63
static int Fpga_FloatEqual(Fpga_Man_t *p, float Arg1, float Arg2)
Definition: fpgaInt.h:283
Fpga_Cut_t * pCuts
Definition: fpgaInt.h:224
static int Fpga_FloatMoreThan(Fpga_Man_t *p, float Arg1, float Arg2)
Definition: fpgaInt.h:281
float Fpga_TimeCutComputeArrival(Fpga_Man_t *pMan, Fpga_Cut_t *pCut)
DECLARATIONS ///.
Definition: fpgaTime.c:44
#define assert(ex)
Definition: util_old.h:213
Fpga_Cut_t * pCutBest
Definition: fpgaInt.h:222
Fpga_Cut_t * pNext
Definition: fpgaInt.h:246
float Fpga_CutDerefSwitch(Fpga_Man_t *pMan, Fpga_Node_t *pNode, Fpga_Cut_t *pCut, int fFanouts)
Definition: fpgaSwitch.c:95