598 int fUseOldMultiplierBlasting = 0;
600 Vec_Int_t * vTemp0, * vTemp1, * vTemp2, * vRes;
601 Vec_Str_t * vInit = fSeq ? Vec_StrAlloc(100) : NULL;
604 int * pFans0, * pFans1, * pFans2;
605 int nRange, nRange0, nRange1, nRange2;
606 int Type, iFon, iFon0, iFon1, iFon2, fSigned01;
607 int i, k, b, iFin, iObj, iLit, nAndPrev;
608 Vec_IntClear( vBits );
609 Vec_IntGrow( vBits, nBits );
610 vTemp0 = Vec_IntAlloc( 1000 );
611 vTemp1 = Vec_IntAlloc( 1000 );
612 vTemp2 = Vec_IntAlloc( 1000 );
613 vRes = Vec_IntAlloc( 1000 );
618 pNew->
pName = Abc_UtilStrsav( Cba_ManName(
p->pDesign) );
623 Type = Cba_ObjType(
p, i);
626 assert( Vec_IntSize(vBits) == Cba_FonCopy(
p, Cba_ObjFon0(
p, i)) );
627 nRange = Cba_ObjRangeSize(
p, i);
assert( nRange > 0 );
628 if ( Cba_ObjIsPi(
p, i) || Cba_ObjIsSeq(
p, i) )
630 for ( k = 0; k < nRange; k++ )
631 Vec_IntPush( vBits, Gia_ManAppendCi(pNew) );
635 assert( Cba_ObjFinNum(
p, i) > 0 );
636 iFon0 = Cba_ObjFinNum(
p, i) > 0 ? Cba_ObjFinFon(
p, i, 0) : -1;
637 iFon1 = Cba_ObjFinNum(
p, i) > 1 ? Cba_ObjFinFon(
p, i, 1) : -1;
638 iFon2 = Cba_ObjFinNum(
p, i) > 2 ? Cba_ObjFinFon(
p, i, 2) : -1;
639 nRange0 = Cba_ObjFinNum(
p, i) > 0 ? Cba_FonRangeSize(
p, iFon0) : -1;
640 nRange1 = Cba_ObjFinNum(
p, i) > 1 ? Cba_FonRangeSize(
p, iFon1) : -1;
641 nRange2 = Cba_ObjFinNum(
p, i) > 2 ? Cba_FonRangeSize(
p, iFon2) : -1;
642 pFans0 = (Cba_ObjFinNum(
p, i) > 0 && Cba_FonIsReal(iFon0)) ? Vec_IntEntryP( vBits, Cba_FonCopy(
p, iFon0) ) : NULL;
643 pFans1 = (Cba_ObjFinNum(
p, i) > 1 && Cba_FonIsReal(iFon1)) ? Vec_IntEntryP( vBits, Cba_FonCopy(
p, iFon1) ) : NULL;
644 pFans2 = (Cba_ObjFinNum(
p, i) > 2 && Cba_FonIsReal(iFon2)) ? Vec_IntEntryP( vBits, Cba_FonCopy(
p, iFon2) ) : NULL;
645 fSigned01 = (Cba_ObjFinNum(
p, i) > 1 && Cba_FonSigned(
p, iFon0) && Cba_FonSigned(
p, iFon1));
646 nAndPrev = Gia_ManAndNum(pNew);
647 Vec_IntClear( vRes );
650 int Left = Cba_ObjLeft(
p, i );
651 int Right = Cba_ObjRight(
p, i );
652 int Left0 = Cba_FonLeft(
p, iFon0 );
653 int Right0 = Cba_FonRight(
p, iFon0 );
657 for ( k = Right; k <= Left; k++ )
658 Vec_IntPush( vRes, pFans0[k - Right0] );
662 assert( Left < Right && Left0 < Right0 );
663 for ( k = Right; k >= Left; k-- )
664 Vec_IntPush( vRes, pFans0[k - Right0] );
669 int iFinT, iFonT,
nTotal = 0;
671 nTotal += Cba_FonRangeSize(
p, iFonT );
675 nRange0 = Cba_FonRangeSize(
p, iFonT );
676 pFans0 = Cba_FonIsReal(iFonT) ? Vec_IntEntryP( vBits, Cba_FonCopy(
p, iFonT) ) : NULL;
677 pFans0 =
Cba_VecLoadFanins(
p, vTemp0, iFonT, pFans0, nRange0, nRange0, Cba_FonSigned(
p, iFonT) );
678 for ( b = 0; b < nRange0; b++ )
679 Vec_IntPush( vRes, pFans0[b] );
684 int nRangeMax = Abc_MaxInt( nRange0, nRange );
685 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRangeMax, Cba_FonSigned(
p, iFon0) );
686 for ( k = 0; k < nRange; k++ )
687 Vec_IntPush( vRes, pArg0[k] );
715 int iFinT, iFonT, fSigned = 1;
716 assert( nRange0 >= 1 && Cba_ObjFinNum(
p, i) >= 3 );
717 assert( 1 + (1 << nRange0) == Cba_ObjFinNum(
p, i) );
720 fSigned &= Cba_FonSigned(
p, iFonT);
721 for ( b = 0; b < nRange; b++ )
723 Vec_IntClear( vTemp0 );
727 nRange1 = Cba_FonRangeSize(
p, iFonT );
728 pFans1 = Cba_FonIsReal(iFonT) ? Vec_IntEntryP( vBits, Cba_FonCopy(
p, iFonT) ) : NULL;
729 if ( Cba_ObjFinNum(
p, i) == 3 )
730 Vec_IntPush( vTemp0, k < nRange1 ? pFans1[k] : (fSigned? pFans1[nRange1-1] : 0) );
732 Vec_IntPush( vTemp0, k < nRange1 ? pFans1[k] : (Cba_FonSigned(
p, iFonT)? pFans1[nRange1-1] : 0) );
740 int nRangeMax = Abc_MaxInt( nRange, nRange0 );
741 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRangeMax, Cba_FonSigned(
p, iFon0) );
746 Vec_IntShrink( vRes, nRange );
750 assert( nRange0 == nRange );
755 assert( nRange0 == nRange );
760 int nRangeMax = Abc_MaxInt( nRange, nRange0 );
761 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRangeMax, Cba_FonSigned(
p, iFon0) );
762 for ( k = 0; k < nRange; k++ )
763 Vec_IntPush( vRes, Abc_LitNot(pArg0[k]) );
767 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
768 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRangeMax, fSigned01 );
769 int * pArg1 =
Cba_VecLoadFanins(
p, vTemp1, iFon1, pFans1, nRange1, nRangeMax, fSigned01 );
770 for ( k = 0; k < nRange; k++ )
775 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
776 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRangeMax, fSigned01 );
777 int * pArg1 =
Cba_VecLoadFanins(
p, vTemp1, iFon1, pFans1, nRange1, nRangeMax, fSigned01 );
778 for ( k = 0; k < nRange; k++ )
779 Vec_IntPush( vRes,
Gia_ManHashOr(pNew, pArg0[k], pArg1[k]) );
783 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
784 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRangeMax, fSigned01 );
785 int * pArg1 =
Cba_VecLoadFanins(
p, vTemp1, iFon1, pFans1, nRange1, nRangeMax, fSigned01 );
786 for ( k = 0; k < nRange; k++ )
792 Vec_IntFill( vRes, 1, Abc_LitNot(iLit) );
793 for ( k = 1; k < nRange; k++ )
794 Vec_IntPush( vRes, 0 );
801 for ( k = 1; k < nRange; k++ )
802 Vec_IntPush( vRes, 0 );
809 for ( k = 1; k < nRange; k++ )
810 Vec_IntPush( vRes, 0 );
817 for ( k = 1; k < nRange; k++ )
818 Vec_IntPush( vRes, 0 );
822 int iLit = 0, nRangeMax = Abc_MaxInt( nRange0, nRange1 );
823 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRangeMax, fSigned01 );
824 int * pArg1 =
Cba_VecLoadFanins(
p, vTemp1, iFon1, pFans1, nRange1, nRangeMax, fSigned01 );
825 for ( k = 0; k < nRangeMax; k++ )
827 Vec_IntFill( vRes, 1, Abc_LitNotCond(iLit, Type ==
CBA_BOX_EQU) );
828 for ( k = 1; k < nRange; k++ )
829 Vec_IntPush( vRes, 0 );
834 int nRangeMax = Abc_MaxInt( nRange0, nRange1 );
835 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRangeMax, fSigned01 );
836 int * pArg1 =
Cba_VecLoadFanins(
p, vTemp1, iFon1, pFans1, nRange1, nRangeMax, fSigned01 );
839 if ( fSwap )
ABC_SWAP(
int *, pArg0, pArg1 );
844 iLit = Abc_LitNotCond( iLit, fCompl );
845 Vec_IntFill( vRes, 1, iLit );
846 for ( k = 1; k < nRange; k++ )
847 Vec_IntPush( vRes, 0 );
852 for ( k = 1; k < nRange; k++ )
853 Vec_IntPush( vRes, 0 );
857 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange1, nRange2) );
859 int * pArg1 =
Cba_VecLoadFanins(
p, vRes, iFon1, pFans1, nRange1, nRangeMax, fSigned01 );
860 int * pArg2 =
Cba_VecLoadFanins(
p, vTemp1, iFon2, pFans2, nRange2, nRangeMax, fSigned01 );
861 int Carry =
Cba_BlastAdder( pNew, pArg0[0], pArg1, pArg2, nRange );
863 Vec_IntShrink( vRes, nRange );
864 Vec_IntPush( vRes, Carry );
868 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
869 int * pArg0 =
Cba_VecLoadFanins(
p, vRes, iFon0, pFans0, nRange0, nRangeMax, fSigned01 );
870 int * pArg1 =
Cba_VecLoadFanins(
p, vTemp1, iFon1, pFans1, nRange1, nRangeMax, fSigned01 );
872 Vec_IntShrink( vRes, nRange );
876 if ( fUseOldMultiplierBlasting )
878 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
879 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRangeMax, fSigned01 );
880 int * pArg1 =
Cba_VecLoadFanins(
p, vTemp1, iFon1, pFans1, nRange1, nRangeMax, fSigned01 );
882 Vec_IntShrink( vRes, nRange );
886 int nRangeMax = Abc_MaxInt(nRange0, nRange1);
887 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRangeMax, fSigned01 );
888 int * pArg1 =
Cba_VecLoadFanins(
p, vTemp1, iFon1, pFans1, nRange1, nRangeMax, fSigned01 );
890 if ( nRange > nRangeMax + nRangeMax )
891 Vec_IntFillExtra( vRes, nRange, fSigned01 ? Vec_IntEntryLast(vRes) : 0 );
893 Vec_IntShrink( vRes, nRange );
894 assert( Vec_IntSize(vRes) == nRange );
899 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
900 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRangeMax, fSigned01 );
901 int * pArg1 =
Cba_VecLoadFanins(
p, vTemp1, iFon1, pFans1, nRange1, nRangeMax, fSigned01 );
906 Vec_IntShrink( vRes, nRange );
912 int nRangeMax = Abc_MaxInt( nRange0, nRange );
913 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRangeMax, Cba_FonSigned(
p, iFon0) );
915 Vec_IntShrink( vRes, nRange );
919 int nRangeMax = Abc_MaxInt(nRange0, nRange);
920 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRangeMax, Cba_FonSigned(
p, iFon0) );
921 int * pArg1 =
Cba_VecLoadFanins(
p, vTemp1, iFon1, pFans1, nRange1, nRange1, Cba_FonSigned(
p, iFon1) );
922 Cba_BlastPower( pNew, pArg0, nRangeMax, pArg1, nRange1, vTemp2, vRes );
923 Vec_IntShrink( vRes, nRange );
927 int * pArg0 =
Cba_VecLoadFanins(
p, vTemp0, iFon0, pFans0, nRange0, nRange0 + (nRange0 & 1), 0 );
928 nRange0 += (nRange0 & 1);
930 if ( nRange > Vec_IntSize(vRes) )
931 Vec_IntFillExtra( vRes, nRange, 0 );
933 Vec_IntShrink( vRes, nRange );
941 Vec_IntAppend( vBits, vRes );
942 p->pDesign->nAnds[Type] += Gia_ManAndNum(pNew) - nAndPrev;
944 assert( nBits == Vec_IntSize(vBits) );
945 p->pDesign->nAnds[0] = Gia_ManAndNum(pNew);
951 nRange = Cba_FonRangeSize(
p, iFon );
952 pFans0 = Cba_FonIsReal(iFon) ? Vec_IntEntryP( vBits, Cba_FonCopy(
p, iFon) ) : NULL;
953 pFans0 =
Cba_VecLoadFanins(
p, vTemp0, iFon, pFans0, nRange, nRange, Cba_FonSigned(
p, iFon) );
954 for ( b = 0; b < nRange; b++ )
955 Gia_ManAppendCo( pNew, pFans0[b] );
963 iFon0 = Cba_ObjFinFon(
p, iObj, 0 );
964 iFon1 = Cba_ObjFinFon(
p, iObj, 1 );
965 nRange0 = Cba_FonRangeSize(
p, iFon0 );
966 nRange1 = Cba_FonRangeSize(
p, iFon1 );
967 assert( nRange0 == nRange1 );
970 nRange = Cba_FonRangeSize(
p, iFon );
971 pFans0 = Cba_FonIsReal(iFon) ? Vec_IntEntryP( vBits, Cba_FonCopy(
p, iFon) ) : NULL;
972 pFans0 =
Cba_VecLoadFanins(
p, vTemp0, iFon, pFans0, nRange0, nRange0, Cba_FonSigned(
p, iFon) );
975 for ( b = 0; b < nRange; b++ )
976 Gia_ManAppendCo( pNew, pFans0[b] );
980 for ( b = 0; b < nRange; b++ )
981 if ( pFans0[b] == 0 )
982 Vec_StrPush( vInit,
'0' );
983 else if ( pFans0[b] == 1 )
984 Vec_StrPush( vInit,
'1' );
986 Vec_StrPush( vInit,
'x' );
995 nRange = Cba_FonRangeSize(
p, iFon );
996 pFans0 = Cba_FonIsReal(iFon) ? Vec_IntEntryP( vBits, Cba_FonCopy(
p, iFon) ) : NULL;
997 pFans0 =
Cba_VecLoadFanins(
p, vTemp0, iFon, pFans0, nRange, nRange, Cba_FonSigned(
p, iFon) );
998 for ( b = 0; b < nRange; b++ )
999 Gia_ManAppendCo( pNew, pFans0[b] );
1003 Vec_IntFree( vTemp0 );
1004 Vec_IntFree( vTemp1 );
1005 Vec_IntFree( vTemp2 );
1006 Vec_IntFree( vRes );
1015 Vec_StrPush( vInit,
'\0' );
1019 Vec_StrFreeP( &vInit );