FUNCTION DEFINITIONS ///.
Description [Takes the level (lev0) of the plane, which should be swapped with the next plane. Returns the gain using the current cost function.]
47{
48
49 int lev1 = lev0 + 1, lev2 = lev0 + 2;
50
52
53 reo_unit * pNewPlane20 = NULL, * pNewPlane21 = NULL;
55 reo_unit * pUnitE, * pUnitER, * pUnitT;
56
57 reo_unit * pNew1E = NULL, * pNew1T = NULL, * pNew2E = NULL, * pNew2T = NULL;
58 reo_unit * pNew1ER = NULL, * pNew2ER = NULL;
59
60 reo_unit * pListOld0 =
p->pPlanes[lev0].pHead;
61 reo_unit * pListOld1 =
p->pPlanes[lev1].pHead;
62
63 reo_unit * pListNew0 = NULL, ** ppListNew0 = &pListNew0;
64 reo_unit * pListNew1 = NULL, ** ppListNew1 = &pListNew1;
65 reo_unit * pListTemp = NULL, ** ppListTemp = &pListTemp;
66
67 int fComp, fCompT, fFound, HKey, fInteract, temp, c;
68 int nWidthCofs = -1;
69
70 int nNodesUpMovedDown = 0;
71 int nNodesDownMovedUp = 0;
72 int nNodesUnrefRemoved = 0;
73 int nNodesUnrefAdded = 0;
74 int nWidthReduction = 0;
75 double AplWeightTotalLev0 = 0.0;
76 double AplWeightTotalLev1 = 0.0;
77 double AplWeightHalf = 0.0;
78 double AplWeightPrev = 0.0;
79 double AplWeightAfter = 0.0;
80 double nCostGain;
81
82
83 assert( lev0 >= 0 && lev1 < p->nSupp );
84 pListOld0 =
p->pPlanes[lev0].pHead;
85 pListOld1 =
p->pPlanes[lev1].pHead;
86
87
88 assert(
p->pPlanes[lev0].statsNodes &&
p->pPlanes[lev1].statsNodes );
89 assert( pListOld0 && pListOld1 );
90
92 {
93
96
97 nWidthCofs = 0;
98 }
99 else if (
p->fMinApl )
100 {
101 AplWeightPrev =
p->nAplCur;
102 AplWeightAfter =
p->nAplCur;
103 AplWeightTotalLev0 = 0.0;
104 AplWeightTotalLev1 = 0.0;
105 }
106
107
108 fInteract = 0;
109 for ( pUnit = pListOld0; pUnit; pUnit = pUnit->
Next )
110 {
112 {
113 fInteract = 1;
114 break;
115 }
116
118 }
119
120
122 if ( !fInteract )
123
124 {
125
127
128
130 {
131
132 for ( pUnit = pListOld1; pUnit; pUnit = pUnit->
Next )
133 {
135
137 if ( pUnitER->
TopRef > lev0 )
138 {
139 if ( pUnitER->
Sign !=
p->nSwaps )
140 {
141 if ( pUnitER->
TopRef == lev2 )
142 {
144 nWidthReduction--;
145 }
146 else
147 {
149 }
150 pUnitER->
Sign =
p->nSwaps;
151 }
152 }
153
155 if ( pUnitT->
TopRef > lev0 )
156 {
157 if ( pUnitT->
Sign !=
p->nSwaps )
158 {
159 if ( pUnitT->
TopRef == lev2 )
160 {
162 nWidthReduction--;
163 }
164 else
165 {
167 }
168 pUnitT->
Sign =
p->nSwaps;
169 }
170 }
171
172 }
173
174
175 for ( pUnit = pListOld0; pUnit; pUnit = pUnit->
Next )
176 {
178
180 if ( pUnitER->
TopRef > lev0 )
181 {
182 if ( pUnitER->
Sign !=
p->nSwaps )
183 {
186 pUnitER->
Sign =
p->nSwaps;
187 nWidthReduction++;
188 }
189 }
190
192 if ( pUnitT->
TopRef > lev0 )
193 {
194 if ( pUnitT->
Sign !=
p->nSwaps )
195 {
198 pUnitT->
Sign =
p->nSwaps;
199 nWidthReduction++;
200 }
201 }
202 }
203 }
204 else
205 {
206
207
208 for ( pUnit = pListOld1; pUnit; pUnit = pUnit->
Next )
210 }
211
212
213 pListNew0 = pListOld1;
214 pListNew1 = pListOld0;
215
217 {
218 AplWeightTotalLev0 =
p->pPlanes[lev1].statsCost;
219 AplWeightTotalLev1 =
p->pPlanes[lev0].statsCost;
220 }
221
222
223 nNodesUpMovedDown =
p->pPlanes[lev0].statsNodes;
224 nNodesDownMovedUp =
p->pPlanes[lev1].statsNodes;
225 goto finish;
226 }
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243 for ( pLoop = pListOld0; pLoop; )
244 {
245 pUnit = pLoop;
247
251
252 if ( pUnitER->
lev != lev1 && pUnitT->
lev != lev1 )
253 {
254
255
256
257
258
259
260
261
262
263
264
265
266
267
271 AplWeightTotalLev1 += pUnit->
Weight;
272
273
274 for ( HKey =
hashKey3(
p->Signature, pUnitE, pUnitT,
p->nTableSize);
275 p->HTable[HKey].Sign ==
p->Signature;
276 HKey = (HKey+1) %
p->nTableSize );
277 assert(
p->HTable[HKey].Sign !=
p->Signature );
278 p->HTable[HKey].Sign =
p->Signature;
279 p->HTable[HKey].Arg1 = pUnitE;
280 p->HTable[HKey].Arg2 = pUnitT;
281 p->HTable[HKey].Arg3 = pUnit;
282
283 nNodesUpMovedDown++;
284
286 {
287
288 if ( pUnitER->
TopRef > lev0 )
289 {
292 if ( pUnitER->
Sign !=
p->nSwaps )
293 {
294 pUnitER->
Sign =
p->nSwaps;
295 p->pWidthCofs[ nWidthCofs++ ] = pUnitER;
296 }
297 }
298 if ( pUnitT->
TopRef > lev0 )
299 {
302 if ( pUnitT->
Sign !=
p->nSwaps )
303 {
304 pUnitT->
Sign =
p->nSwaps;
305 p->pWidthCofs[ nWidthCofs++ ] = pUnitT;
306 }
307 }
308 }
309 }
310 else
311 {
312
314 }
315 }
316
317
318
319
320 for ( pLoop = pListTemp; pLoop; )
321 {
322 pUnit = pLoop;
324
328 fComp = (int)(pUnitER != pUnitE);
329
330
332 AplWeightHalf = 0.5 * pUnit->
Weight;
333
334
335 if ( pUnitER->
lev == lev1 && pUnitT->
lev == lev1 )
336 {
337 if ( fComp == 0 )
338 {
339
340
341
342
343
344
345
346
347
348
349
350
351
354
357 }
358 else
359 {
360
361
362
363
364
365
366
367
368
369
370
371
372
375
378 }
379
382
383
385 {
386 pUnitER->
Weight -= AplWeightHalf;
387 pUnitT->
Weight -= AplWeightHalf;
388 AplWeightAfter -= pUnit->
Weight;
389 }
390 }
391 else if ( pUnitER->
lev == lev1 )
392 {
393 if ( fComp == 0 )
394 {
395
396
397
398
399
400
401
402
403
404
405
406
407
408 pNew1E = pUnitER->
pE;
409 pNew1T = pUnitT;
410
411 pNew2E = pUnitER->
pT;
412 pNew2T = pUnitT;
413 }
414 else
415 {
416
417
418
419
420
421
422
423
424
425
426
427
428
430 pNew1T = pUnitT;
431
433 pNew2T = pUnitT;
434 }
435
437
439
440
442 {
443 pUnitER->
Weight -= AplWeightHalf;
444 AplWeightAfter -= AplWeightHalf;
445 }
446 }
447 else if ( pUnitT->
lev == lev1 )
448 {
449
450
451
452
453
454
455
456
457
458
459
460
461
462 pNew1E = pUnitE;
464
465 pNew2E = pUnitE;
467
468
470
472
473
475 {
476 pUnitT->
Weight -= AplWeightHalf;
477 AplWeightAfter -= AplWeightHalf;
478 }
479 }
480 else
481 {
483 }
484
485
486
487 if ( pNew1E == pNew1T )
488 {
489 pNewPlane20 = pNew1T;
490
492 {
493
494 if ( pNew1T->TopRef > lev0 )
495 {
496 pNew1T->TopRefNew = lev1;
497 if ( pNew1T->Sign !=
p->nSwaps )
498 {
499 pNew1T->Sign =
p->nSwaps;
500 p->pWidthCofs[ nWidthCofs++ ] = pNew1T;
501 }
502 }
503 }
504 }
505 else
506 {
507
508 fCompT = Cudd_IsComplement(pNew1T);
509 if ( fCompT )
510 {
513 }
514
515
516 fFound = 0;
517 for ( HKey =
hashKey3(
p->Signature, pNew1E, pNew1T,
p->nTableSize);
518 p->HTable[HKey].Sign ==
p->Signature;
519 HKey = (HKey+1) %
p->nTableSize )
520 if (
p->HTable[HKey].Arg1 == pNew1E &&
p->HTable[HKey].Arg2 == pNew1T )
521 {
522
523 pNewPlane20 =
p->HTable[HKey].Arg3;
525 fFound = 1;
527 break;
528 }
529
530 if ( !fFound )
531 {
533 pNewPlane20->
pE = pNew1E;
534 pNewPlane20->
pT = pNew1T;
536 pNewPlane20->
lev = lev1;
538 {
539 pNewPlane20->
TopRef = lev1;
540 pNewPlane20->
Sign = 0;
541 }
542
544 pNewPlane20->
Weight = 0.0;
545
546
549 pNew1T->n++;
550
551
553
554
555 assert(
p->HTable[HKey].Sign !=
p->Signature );
556 p->HTable[HKey].Sign =
p->Signature;
557 p->HTable[HKey].Arg1 = pNew1E;
558 p->HTable[HKey].Arg2 = pNew1T;
559 p->HTable[HKey].Arg3 = pNewPlane20;
560
561 nNodesUnrefAdded++;
562
564 {
565
566 if ( pNew1ER->
TopRef > lev0 )
567 {
568 if ( pNew1ER->
Sign !=
p->nSwaps )
569 {
571 if ( pNew1ER->
Sign !=
p->nSwaps )
572 {
573 pNew1ER->
Sign =
p->nSwaps;
574 p->pWidthCofs[ nWidthCofs++ ] = pNew1ER;
575 }
576 }
577
578 else
579 {
581 }
582 }
583
584 if ( pNew1T->TopRef > lev0 )
585 {
586 if ( pNew1T->Sign !=
p->nSwaps )
587 {
588 pNew1T->TopRefNew = lev2;
589 if ( pNew1T->Sign !=
p->nSwaps )
590 {
591 pNew1T->Sign =
p->nSwaps;
592 p->pWidthCofs[ nWidthCofs++ ] = pNew1T;
593 }
594 }
595
596 else
597 {
598 assert( pNew1T->TopRefNew == lev1 || pNew1T->TopRefNew == lev2 );
599 }
600 }
601 }
602 }
603
605 {
606
607 pNewPlane20->
Weight += AplWeightHalf;
608
609 AplWeightAfter += AplWeightHalf;
610
611 AplWeightTotalLev1 += AplWeightHalf;
612 }
613
614 if ( fCompT )
615 pNewPlane20 =
Unit_Not(pNewPlane20);
616 }
617
618 if ( pNew2E == pNew2T )
619 {
620 pNewPlane21 = pNew2T;
621
623 {
624
625 if ( pNew2T->TopRef > lev0 )
626 {
627 pNew2T->TopRefNew = lev1;
628 if ( pNew2T->Sign !=
p->nSwaps )
629 {
630 pNew2T->Sign =
p->nSwaps;
631 p->pWidthCofs[ nWidthCofs++ ] = pNew2T;
632 }
633 }
634 }
635 }
636 else
637 {
638 assert( !Cudd_IsComplement(pNew2T) );
639
640
641 fFound = 0;
642 for ( HKey =
hashKey3(
p->Signature, pNew2E, pNew2T,
p->nTableSize);
643 p->HTable[HKey].Sign ==
p->Signature;
644 HKey = (HKey+1) %
p->nTableSize )
645 if (
p->HTable[HKey].Arg1 == pNew2E &&
p->HTable[HKey].Arg2 == pNew2T )
646 {
647
648 pNewPlane21 =
p->HTable[HKey].Arg3;
649 assert( pNewPlane21->lev == lev1 );
650 fFound = 1;
652 break;
653 }
654
655 if ( !fFound )
656 {
658 pNewPlane21->pE = pNew2E;
659 pNewPlane21->pT = pNew2T;
660 pNewPlane21->n = 0;
661 pNewPlane21->lev = lev1;
663 {
664 pNewPlane21->TopRef = lev1;
665 pNewPlane21->Sign = 0;
666 }
667
669 pNewPlane21->Weight = 0.0;
670
671
673 pNew2ER->n++;
674 pNew2T->n++;
675
676
677
679
680
681 assert(
p->HTable[HKey].Sign !=
p->Signature );
682 p->HTable[HKey].Sign =
p->Signature;
683 p->HTable[HKey].Arg1 = pNew2E;
684 p->HTable[HKey].Arg2 = pNew2T;
685 p->HTable[HKey].Arg3 = pNewPlane21;
686
687 nNodesUnrefAdded++;
688
689
691 {
692
693 if ( pNew2ER->TopRef > lev0 )
694 {
695 if ( pNew2ER->Sign !=
p->nSwaps )
696 {
697 pNew2ER->TopRefNew = lev2;
698 if ( pNew2ER->Sign !=
p->nSwaps )
699 {
700 pNew2ER->Sign =
p->nSwaps;
701 p->pWidthCofs[ nWidthCofs++ ] = pNew2ER;
702 }
703 }
704
705 else
706 {
707 assert( pNew2ER->TopRefNew == lev1 || pNew2ER->TopRefNew == lev2 );
708 }
709 }
710
711 if ( pNew2T->TopRef > lev0 )
712 {
713 if ( pNew2T->Sign !=
p->nSwaps )
714 {
715 pNew2T->TopRefNew = lev2;
716 if ( pNew2T->Sign !=
p->nSwaps )
717 {
718 pNew2T->Sign =
p->nSwaps;
719 p->pWidthCofs[ nWidthCofs++ ] = pNew2T;
720 }
721 }
722
723 else
724 {
725 assert( pNew2T->TopRefNew == lev1 || pNew2T->TopRefNew == lev2 );
726 }
727 }
728 }
729 }
730
732 {
733
734 pNewPlane21->Weight += AplWeightHalf;
735
736 AplWeightAfter += AplWeightHalf;
737
738 AplWeightTotalLev1 += AplWeightHalf;
739 }
740 }
741
742
743
744
745 assert( !Cudd_IsComplement(pNewPlane21) );
746
747
748 pUnit->
pE = pNewPlane20;
749 pUnit->
pT = pNewPlane21;
751
752
753
756 pNewPlane21->n++;
757
758
761 AplWeightTotalLev0 += pUnit->
Weight;
762 }
763
764
765
766 for ( pLoop = pListOld1; pLoop; )
767 {
768 pUnit = pLoop;
771 {
773
774
778 AplWeightTotalLev0 += pUnit->
Weight;
779
780 nNodesDownMovedUp++;
781
783 {
786
787
788 if ( pUnitER->
TopRef > lev0 )
789 {
791 if ( pUnitER->
Sign !=
p->nSwaps )
792 {
793 pUnitER->
Sign =
p->nSwaps;
794 p->pWidthCofs[ nWidthCofs++ ] = pUnitER;
795 }
796 }
797 if ( pUnitT->
TopRef > lev0 )
798 {
800 if ( pUnitT->
Sign !=
p->nSwaps )
801 {
802 pUnitT->
Sign =
p->nSwaps;
803 p->pWidthCofs[ nWidthCofs++ ] = pUnitT;
804 }
805 }
806 }
807 }
808 else
809 {
811
816
818 nNodesUnrefRemoved++;
819 }
820 }
821
822finish:
823
824
825 p->pPlanes[lev0].pHead = pListNew0;
826 p->pPlanes[lev1].pHead = pListNew1;
827
828
829 temp =
p->pPlanes[lev0].fSifted;
830 p->pPlanes[lev0].fSifted =
p->pPlanes[lev1].fSifted;
831 p->pPlanes[lev1].fSifted = temp;
832
833
835 {
836 temp =
p->pOrderInt[lev0];
837 p->pOrderInt[lev0] =
p->pOrderInt[lev1];
838 p->pOrderInt[lev1] = temp;
839 }
840
841
842 p->pPlanes[lev0].statsNodes -= (nNodesUpMovedDown - nNodesDownMovedUp);
843 p->pPlanes[lev1].statsNodes -= (nNodesDownMovedUp - nNodesUpMovedDown) + nNodesUnrefRemoved - nNodesUnrefAdded;
844 p->nNodesCur -= nNodesUnrefRemoved - nNodesUnrefAdded;
845
846
848 {
849 for ( c = 0; c < nWidthCofs; c++ )
850 {
851 if (
p->pWidthCofs[c]->TopRefNew <
p->pWidthCofs[c]->TopRef )
852 {
853 p->pWidthCofs[c]->TopRef =
p->pWidthCofs[c]->TopRefNew;
854 nWidthReduction--;
855 }
856 else if (
p->pWidthCofs[c]->TopRefNew >
p->pWidthCofs[c]->TopRef )
857 {
858 p->pWidthCofs[c]->TopRef =
p->pWidthCofs[c]->TopRefNew;
859 nWidthReduction++;
860 }
861 }
862
865
866
867 nCostGain = (nNodesDownMovedUp - nNodesUpMovedDown + nNodesUnrefRemoved - nNodesUnrefAdded) + nWidthReduction;
868
869 p->pPlanes[lev1].statsWidth -= (int)nCostGain;
870
871 p->pPlanes[lev1].statsCost =
p->pPlanes[lev1].statsWidth;
872 }
873 else if (
p->fMinApl )
874 {
875
876 nCostGain = AplWeightPrev - AplWeightAfter;
877
878
879
880
881 p->pPlanes[lev0].statsApl = AplWeightTotalLev0;
882 p->pPlanes[lev1].statsApl = AplWeightTotalLev1;
883
884 p->pPlanes[lev0].statsCost =
p->pPlanes[lev0].statsApl;
885 p->pPlanes[lev1].statsCost =
p->pPlanes[lev1].statsApl;
886 }
887 else
888 {
889
890 nCostGain = nNodesUnrefRemoved - nNodesUnrefAdded;
891
892
893 p->pPlanes[lev0].statsCost =
p->pPlanes[lev0].statsNodes;
894 p->pPlanes[lev1].statsCost =
p->pPlanes[lev1].statsNodes;
895 }
896
897 return nCostGain;
898}
#define AddToLinkedList(ppList, pLink)
DECLARATIONS ///.
void reoProfileWidthVerifyLevel(reo_plane *pPlane, int Level)
void reoUnitsRecycleUnit(reo_man *p, reo_unit *pUnit)
reo_unit * reoUnitsGetNextUnit(reo_man *p)
FUNCTION DEFINITIONS ///.
struct _reo_unit reo_unit
DATA STRUCTURES ///.