1352 int fUseOldMultiplierBlasting = 0;
1353 int fSkipBitRange = 0;
1357 Vec_Int_t * vFf2Ci = Vec_IntAlloc( 100 );
1359 Gia_Man_t * pTemp, * pNew, * pExtra = NULL;
1361 Vec_Int_t * vBits = &
p->vBits, * vTemp0, * vTemp1, * vTemp2, * vRes, * vAddOutputs = NULL, * vAddObjs = NULL;
1363 int nRange, nRange0, nRange1, nRange2, nRange3;
1364 int i, k, b, iFanin, iLit, nAndPrev, * pFans0, * pFans1, * pFans2, * pFans3;
1365 int nFFins = 0, nFFouts = 0, curPi = 0, curPo = 0, nFf2Regs = 0;
1366 int nBitCis = 0, nBitCos = 0, fAdded = 0;
1368 Wlc_BstParDefault( pPar );
1369 pPar = pParIn ? pParIn : pPar;
1370 Vec_IntClear( vBits );
1371 Vec_IntGrow( vBits, nBits );
1372 vTemp0 = Vec_IntAlloc( 1000 );
1373 vTemp1 = Vec_IntAlloc( 1000 );
1374 vTemp2 = Vec_IntAlloc( 1000 );
1375 vRes = Vec_IntAlloc( 1000 );
1380 pNew->
pName = Abc_UtilStrsav(
p->pName );
1385 vAddOutputs = Vec_IntAlloc( 100 );
1387 vAddObjs = Vec_IntAlloc( 100 );
1391 int nNewCis = 0, nNewCos = 0;
1392 assert( Vec_IntSize(&
p->vFfs2) == 0 );
1397 nBitCis += Wlc_ObjRange( pObj );
1399 nBitCos += Wlc_ObjRange( pObj );
1406 nNewCis += Wlc_ObjRange( pObj );
1407 nNewCos += Wlc_ObjRange( Wlc_ObjFanin0(
p, pObj) );
1408 nNewCos += Wlc_ObjRange( Wlc_ObjFanin1(
p, pObj) );
1409 if ( Wlc_ObjFaninNum(pObj) > 2 )
1410 nNewCos += Wlc_ObjRange( Wlc_ObjFanin2(
p, pObj) );
1414 pManTime =
Tim_ManStart( nBitCis + nNewCis, nBitCos + nNewCos );
1424 if ( Vec_IntSize(&
p->vFfs2) > 0 )
1427 int nNewCis = 0, nNewCos = 0;
1431 nBitCis += Wlc_ObjRange( pObj );
1433 nBitCos += Wlc_ObjRange( pObj );
1439 assert( Wlc_ObjRange(pObj) == Wlc_ObjRange(Wlc_ObjFanin0(
p, pObj)) );
1440 nNewCis += Wlc_ObjRange(pObj);
1441 nNewCos += 2*Wlc_ObjRange(pObj) + 3;
1442 nFf2Regs+= Wlc_ObjRange(pObj);
1445 pManTime =
Tim_ManStart( nBitCis + nNewCis + nFf2Regs, nBitCos + nNewCos + nFf2Regs );
1446 curPi = nBitCis + nFf2Regs;
1453 vRegClasses = Vec_IntAlloc(0);
1454 vSignature = Vec_IntAlloc( 100 );
1455 Vec_IntPushTwo( vSignature, -1, -1 );
1458 int iClk0, iClk = Wlc_ObjFaninId( pObj, 1 );
1459 int iAsyn0, iAsyn = Wlc_ObjFaninId( pObj, 5 );
1460 nRange = Wlc_ObjRange(pObj);
1462 if ( iClk == iClk0 && iAsyn == iAsyn0 )
1464 for ( b = 0; b < nRange; b++ )
1465 Vec_IntPush( vRegClasses, k/2 );
1468 if ( k < Vec_IntSize(vSignature) )
1470 for ( b = 0; b < nRange; b++ )
1471 Vec_IntPush( vRegClasses, k/2 );
1472 Vec_IntPushTwo( vSignature, iClk, iAsyn );
1474 assert( Vec_IntSize(vRegClasses) == nFf2Regs );
1475 Vec_IntFree( vSignature );
1487 nAndPrev = Gia_ManAndNum(pNew);
1488 nRange = Wlc_ObjRange( pObj );
1489 nRange0 = Wlc_ObjFaninNum(pObj) > 0 ? Wlc_ObjRange( Wlc_ObjFanin0(
p, pObj) ) : -1;
1490 nRange1 = Wlc_ObjFaninNum(pObj) > 1 ? Wlc_ObjRange( Wlc_ObjFanin1(
p, pObj) ) : -1;
1491 nRange2 = Wlc_ObjFaninNum(pObj) > 2 ? Wlc_ObjRange( Wlc_ObjFanin2(
p, pObj) ) : -1;
1492 nRange3 = Wlc_ObjFaninNum(pObj) > 3 ? Wlc_ObjRange( Wlc_ObjFanin(
p, pObj, 3) ) : -1;
1493 pFans0 = pObj->
Type !=
WLC_OBJ_FF && Wlc_ObjFaninNum(pObj) > 0 ? Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjFaninId0(pObj)) ) : NULL;
1494 pFans1 = pObj->
Type !=
WLC_OBJ_FF && Wlc_ObjFaninNum(pObj) > 1 ? Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjFaninId1(pObj)) ) : NULL;
1495 pFans2 = pObj->
Type !=
WLC_OBJ_FF && Wlc_ObjFaninNum(pObj) > 2 ? Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjFaninId2(pObj)) ) : NULL;
1496 pFans3 = pObj->
Type !=
WLC_OBJ_FF && Wlc_ObjFaninNum(pObj) > 3 ? Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjFaninId(pObj,3)) ) : NULL;
1497 Vec_IntClear( vRes );
1510 if ( Wlc_ObjFaninNum(pObj) == 3 )
1516 if ( vTables == NULL ) {
1518 Vec_PtrPush( vTables, NULL );
1520 Tim_ManCreateBox( pManTime, curPo, nRange0 + nRange1 + nRange2, curPi, nRange, Vec_PtrSize(vTables), 0 );
1523 curPo += nRange0 + nRange1 + nRange2;
1526 pTable =
ABC_ALLOC(
float, 3 + nRange * (nRange0 + nRange1 + nRange2) );
1527 pTable[0] = Vec_PtrSize(vTables);
1528 pTable[1] = nRange0 + nRange1 + nRange2;
1530 for ( k = 0; k < nRange * (nRange0 + nRange1 + nRange2); k++ )
1531 pTable[3 + k] = 1.0;
1532 Vec_PtrPush( vTables, pTable );
1535 for ( k = 0; k < nRange0; k++ )
1536 Gia_ManAppendCo( pNew, pFans0[k] );
1537 for ( k = 0; k < nRange1; k++ )
1538 Gia_ManAppendCo( pNew, pFans1[k] );
1539 for ( k = 0; k < nRange2; k++ )
1540 Gia_ManAppendCo( pNew, pFans2[0] );
1543 for ( k = Gia_ManPiNum(pExtra); k < nRange0 + nRange1 + nRange2; k++ )
1544 Gia_ManAppendCi( pExtra );
1546 Vec_IntClear( vTemp0 );
1547 for ( k = 0; k < nRange0; k++ )
1548 Vec_IntPush( vTemp0, Gia_Obj2Lit(pExtra, Gia_ManPi(pExtra, k)) );
1549 Vec_IntClear( vTemp1 );
1550 for ( k = 0; k < nRange1; k++ )
1551 Vec_IntPush( vTemp1, Gia_Obj2Lit(pExtra, Gia_ManPi(pExtra, nRange0+k)) );
1553 CarryIn = Gia_Obj2Lit(pExtra, Gia_ManPi(pExtra, nRange0+nRange1));
1556 pFans0 = Vec_IntArray( vTemp0 );
1557 pFans1 = Vec_IntArray( vTemp1 );
1562 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
1563 int * pArg0 =
Wlc_VecLoadFanins( vRes, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1564 int * pArg1 =
Wlc_VecLoadFanins( vTemp1, pFans1, nRange1, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1569 Vec_IntShrink( vRes, nRange );
1571 else if ( fUseOldMultiplierBlasting )
1573 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
1574 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1575 int * pArg1 =
Wlc_VecLoadFanins( vTemp1, pFans1, nRange1, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1577 Vec_IntShrink( vRes, nRange );
1581 int fSigned = Wlc_ObjIsSignedFanin01(
p, pObj);
1582 int nRangeMax = Abc_MaxInt(nRange0, nRange1);
1586 if ( nRange > nRangeMax + nRangeMax )
1587 Vec_IntFillExtra( vRes, nRange, fSigned ? Vec_IntEntryLast(vRes) : 0 );
1589 Vec_IntShrink( vRes, nRange );
1590 assert( Vec_IntSize(vRes) == nRange );
1593 for ( k = 0; k < nRange; k++ )
1594 Gia_ManAppendCo( pExtra, Vec_IntEntry(vRes, k) );
1597 Vec_IntClear( vRes );
1598 for ( k = 0; k < nRange; k++ )
1599 Vec_IntPush( vRes, Gia_ManAppendCi(pNew) );
1603 pBox =
If_BoxStart( Abc_UtilStrsav(Buffer), 1+
If_LibBoxNum(pBoxLib), nRange0 + nRange1 + nRange2, nRange, 0, 0, 0 );
1605 for ( k = 0; k < pBox->
nPis * pBox->
nPos; k++ )
1611 Vec_IntPush( vFf2Ci, Gia_ManCiNum(pNew) );
1612 if ( Wlc_ObjRangeIsReversed(pObj) )
1614 for ( k = 0; k < nRange; k++ )
1615 Vec_IntPush( vRes, -1 );
1616 for ( k = 0; k < nRange; k++ )
1617 Vec_IntWriteEntry( vRes, Vec_IntSize(vRes)-1-k, Gia_ManAppendCi(pNew) );
1621 for ( k = 0; k < nRange; k++ )
1622 Vec_IntPush( vRes, Gia_ManAppendCi(pNew) );
1625 nFFouts += Vec_IntSize(vRes);
1633 int nRangeMax = Abc_MaxInt( nRange0, nRange );
1634 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin0(
p, pObj) );
1635 for ( k = 0; k < nRange; k++ )
1636 Vec_IntPush( vRes, pArg0[k] );
1640 word * pTruth = (
word *)Wlc_ObjFanins(pObj);
1641 for ( k = 0; k < nRange; k++ )
1642 Vec_IntPush( vRes, Abc_TtGetBit(pTruth, k) );
1664 assert( nRange0 >= 1 && Wlc_ObjFaninNum(pObj) >= 3 );
1665 assert( 1 + (1 << nRange0) == Wlc_ObjFaninNum(pObj) );
1668 fSigned &= Wlc_NtkObj(
p, iFanin)->Signed;
1669 if ( pParIn->
fBlastNew && nRange0 <= 16 )
1673 for ( b = 0; b < nRange; b++ )
1675 Vec_IntClear( vTemp0 );
1679 nRange1 = Wlc_ObjRange( Wlc_NtkObj(
p, iFanin) );
1680 pFans1 = Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, iFanin) );
1681 if ( Wlc_ObjFaninNum(pObj) == 3 )
1682 Vec_IntPush( vTemp0, b < nRange1 ? pFans1[b] : (fSigned? pFans1[nRange1-1] : 0) );
1684 Vec_IntPush( vTemp0, b < nRange1 ? pFans1[b] : (Wlc_NtkObj(
p, iFanin)->Signed? pFans1[nRange1-1] : 0) );
1687 assert( (1 << nRange0) == Vec_IntSize(vTemp0) );
1694 Vec_IntClear( vTemp1 );
1697 for ( k = 0; k < (1 << nRange0); k++ )
1700 for ( b = 0; b < nRange0; b++ )
1701 iLitAnd =
Gia_ManHashAnd( pNew, iLitAnd, Abc_LitNotCond(pFans0[b], ((k >> b) & 1) == 0) );
1702 Vec_IntPush( vTemp1, iLitAnd );
1705 for ( b = 0; b < nRange; b++ )
1707 Vec_IntClear( vTemp0 );
1711 nRange1 = Wlc_ObjRange( Wlc_NtkObj(
p, iFanin) );
1712 pFans1 = Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, iFanin) );
1713 if ( Wlc_ObjFaninNum(pObj) == 3 )
1714 Vec_IntPush( vTemp0, b < nRange1 ? pFans1[b] : (fSigned? pFans1[nRange1-1] : 0) );
1716 Vec_IntPush( vTemp0, b < nRange1 ? pFans1[b] : (Wlc_NtkObj(
p, iFanin)->Signed? pFans1[nRange1-1] : 0) );
1719 Vec_IntPush( vRes,
Wlc_NtkMuxTree2(pNew, pFans0, nRange0, vTemp0, vTemp1, vTemp2) );
1727 assert( nRange0 == Wlc_ObjFaninNum(pObj)-1 );
1728 Vec_IntClear( vTemp1 );
1729 for ( k = 0; k < nRange0; k++ )
1730 Vec_IntPush( vTemp1, pFans0[k] );
1731 for ( b = 0; b < nRange; b++ )
1733 Vec_IntClear( vTemp0 );
1738 assert( nRange == Wlc_ObjRange(pFanin) );
1739 pFans1 = Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, iFanin) );
1740 Vec_IntPush( vTemp0, pFans1[b] );
1742 Vec_IntPush( vRes,
Wlc_NtkMuxTree2(pNew, NULL, 0, vTemp0, vTemp1, vTemp2) );
1748 int nRangeMax = Abc_MaxInt( nRange, nRange0 );
1749 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin0(
p, pObj) );
1754 Vec_IntShrink( vRes, nRange );
1758 assert( nRange0 == nRange );
1763 assert( nRange0 == nRange );
1768 int nRangeMax = Abc_MaxInt( nRange, nRange0 );
1769 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin0(
p, pObj) );
1770 for ( k = 0; k < nRange; k++ )
1771 Vec_IntPush( vRes, Abc_LitNot(pArg0[k]) );
1775 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
1776 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1777 int * pArg1 =
Wlc_VecLoadFanins( vTemp1, pFans1, nRange1, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1778 for ( k = 0; k < nRange; k++ )
1783 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
1784 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1785 int * pArg1 =
Wlc_VecLoadFanins( vTemp1, pFans1, nRange1, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1786 for ( k = 0; k < nRange; k++ )
1791 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
1792 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1793 int * pArg1 =
Wlc_VecLoadFanins( vTemp1, pFans1, nRange1, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1794 for ( k = 0; k < nRange; k++ )
1800 int End = Wlc_ObjRangeEnd(pObj);
1801 int Beg = Wlc_ObjRangeBeg(pObj);
1804 assert( nRange == End - Beg + 1 );
1805 assert( pFanin->
Beg <= Beg && End <= pFanin->End );
1806 for ( k = Beg; k <= End; k++ )
1807 Vec_IntPush( vRes, pFans0[k - pFanin->
Beg] );
1811 assert( nRange == Beg - End + 1 );
1812 assert( pFanin->
End <= End && Beg <= pFanin->Beg );
1813 for ( k = End; k <= Beg; k++ )
1814 Vec_IntPush( vRes, pFans0[k - pFanin->
End] );
1821 nTotal += Wlc_ObjRange( Wlc_NtkObj(
p, iFanin) );
1825 nRange0 = Wlc_ObjRange( Wlc_NtkObj(
p, iFanin) );
1826 pFans0 = Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, iFanin) );
1827 for ( b = 0; b < nRange0; b++ )
1828 Vec_IntPush( vRes, pFans0[b] );
1834 assert( nRange0 <= nRange );
1835 for ( k = 0; k < nRange0; k++ )
1836 Vec_IntPush( vRes, pFans0[k] );
1837 for ( ; k < nRange; k++ )
1838 Vec_IntPush( vRes, Pad );
1843 Vec_IntFill( vRes, 1, Abc_LitNot(iLit) );
1844 for ( k = 1; k < nRange; k++ )
1845 Vec_IntPush( vRes, 0 );
1851 Vec_IntFill( vRes, 1,
Gia_ManHashOr(pNew, Abc_LitNot(iLit0), iLit1) );
1852 for ( k = 1; k < nRange; k++ )
1853 Vec_IntPush( vRes, 0 );
1860 for ( k = 1; k < nRange; k++ )
1861 Vec_IntPush( vRes, 0 );
1868 for ( k = 1; k < nRange; k++ )
1869 Vec_IntPush( vRes, 0 );
1876 for ( k = 1; k < nRange; k++ )
1877 Vec_IntPush( vRes, 0 );
1882 int a, b, iRes = 1, nRangeMax = Abc_MaxInt( nRange0, nRange1 );
1883 for ( k = 2; k < Wlc_ObjFaninNum(pObj); k++ )
1884 nRangeMax = Abc_MaxInt( nRangeMax, Wlc_ObjRange( Wlc_NtkObj(
p, Wlc_ObjFaninId(pObj, k)) ) );
1886 for ( a = 0; a < Wlc_ObjFaninNum(pObj); a++ )
1887 for ( b = a+1; b < Wlc_ObjFaninNum(pObj); b++ )
1889 int nRange0 = Wlc_ObjRange( Wlc_NtkObj(
p, Wlc_ObjFaninId(pObj, a)) );
1890 int nRange1 = Wlc_ObjRange( Wlc_NtkObj(
p, Wlc_ObjFaninId(pObj, b)) );
1891 int * pFans0 = Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjFaninId(pObj, a)) );
1892 int * pFans1 = Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjFaninId(pObj, b)) );
1896 for ( k = 0; k < nRangeMax; k++ )
1900 Vec_IntFill( vRes, 1, iRes );
1901 for ( k = 1; k < nRange; k++ )
1902 Vec_IntPush( vRes, 0 );
1906 int iLit = 0, nRangeMax = Abc_MaxInt( nRange0, nRange1 );
1907 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1908 int * pArg1 =
Wlc_VecLoadFanins( vTemp1, pFans1, nRange1, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1909 for ( k = 0; k < nRangeMax; k++ )
1912 for ( k = 1; k < nRange; k++ )
1913 Vec_IntPush( vRes, 0 );
1918 int nRangeMax = Abc_MaxInt( nRange0, nRange1 );
1919 int fSigned = Wlc_ObjIsSignedFanin01(
p, pObj);
1924 if ( fSwap )
ABC_SWAP(
int *, pArg0, pArg1 );
1929 iLit = Abc_LitNotCond( iLit, fCompl );
1930 Vec_IntFill( vRes, 1, iLit );
1931 for ( k = 1; k < nRange; k++ )
1932 Vec_IntPush( vRes, 0 );
1938 for ( k = 1; k < nRange; k++ )
1939 Vec_IntPush( vRes, 0 );
1943 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
1944 int * pArg0 =
Wlc_VecLoadFanins( vRes, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1945 int * pArg1 =
Wlc_VecLoadFanins( vTemp1, pFans1, nRange1, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1946 int CarryIn = Wlc_ObjFaninNum(pObj) == 3 ? pFans2[0] : 0;
1950 Wlc_BlastAdderCLA( pNew, pArg0, pArg1, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj), CarryIn );
1957 Vec_IntShrink( vRes, nRange );
1961 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange2, nRange3) );
1962 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans2, nRange2, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1963 int * pArg1 =
Wlc_VecLoadFanins( vTemp1, pFans2, nRange2, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1964 int * pArg2 =
Wlc_VecLoadFanins( vTemp2, pFans3, nRange3, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1965 int ModeIn = pFans0[0];
1966 int CarryIn = pFans1[0];
int j;
1969 Vec_IntClear( vRes );
1970 for ( j = 0; j < nRange; j++ )
1971 Vec_IntPush( vRes,
Gia_ManHashMux(pNew, ModeIn, pArg0[j], pArg1[j]) );
1975 if ( fUseOldMultiplierBlasting )
1977 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
1978 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1979 int * pArg1 =
Wlc_VecLoadFanins( vTemp1, pFans1, nRange1, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj) );
1981 Vec_IntShrink( vRes, nRange );
1985 int fSigned = Wlc_ObjIsSignedFanin01(
p, pObj);
1986 int nRangeMax = Abc_MaxInt(nRange0, nRange1);
1993 else if ( pPar->
fCla )
1994 Wlc_BlastMultiplier3( pNew, pArg0, pArg1, nRange0, nRange1, vRes, Wlc_ObjIsSignedFanin01(
p, pObj), pPar->
fCla, NULL, pParIn->
fVerbose );
1998 if ( nRange > Vec_IntSize(vRes) )
1999 Vec_IntFillExtra( vRes, nRange, fSigned ? Vec_IntEntryLast(vRes) : 0 );
2001 Vec_IntShrink( vRes, nRange );
2002 assert( Vec_IntSize(vRes) == nRange );
2007 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
2008 int fSigned = Wlc_ObjIsSignedFanin01(
p, pObj);
2015 Vec_IntShrink( vRes, nRange );
2021 int nRangeMax = Abc_MaxInt( nRange0, nRange );
2022 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin0(
p, pObj) );
2024 Vec_IntShrink( vRes, nRange );
2028 int nRangeMax = Abc_MaxInt(nRange0, nRange);
2029 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin0(
p, pObj) );
2030 int * pArg1 =
Wlc_VecLoadFanins( vTemp1, pFans1, nRange1, nRange1, Wlc_ObjIsSignedFanin1(
p, pObj) );
2031 Wlc_BlastPower( pNew, pArg0, nRangeMax, pArg1, nRange1, vTemp2, vRes );
2032 Vec_IntShrink( vRes, nRange );
2036 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRange0 + (nRange0 & 1), 0 );
2037 nRange0 += (nRange0 & 1);
2042 if ( nRange > Vec_IntSize(vRes) )
2043 Vec_IntFillExtra( vRes, nRange, 0 );
2045 Vec_IntShrink( vRes, nRange );
2051 if ( nRange > Vec_IntSize(vRes) )
2052 Vec_IntFillExtra( vRes, nRange, 0 );
2054 Vec_IntShrink( vRes, nRange );
2063 if ( nRange > Vec_IntSize(vRes) )
2064 Vec_IntFillExtra( vRes, nRange, 0 );
2066 Vec_IntShrink( vRes, nRange );
2069 Wlc_BlastTable( pNew, Wlc_ObjTable(
p, pObj), pFans0, nRange0, nRange, vRes );
2071 Wlc_BlastLut( pNew, Vec_WrdEntry(
p->vLutTruths, Wlc_ObjId(
p, pObj)), pFans0, nRange0, nRange, vRes );
2073 assert( Vec_IntSize(vBits) == Wlc_ObjCopy(
p, i) );
2074 Vec_IntAppend( vBits, vRes );
2075 if ( vAddOutputs && !Wlc_ObjIsCo(pObj) &&
2083 Vec_IntAppend( vAddOutputs, vRes );
2084 Vec_IntPush( vAddObjs, Wlc_ObjId(
p, pObj) );
2086 p->nAnds[pObj->
Type] += Gia_ManAndNum(pNew) - nAndPrev;
2088 p->nAnds[0] = Gia_ManAndNum(pNew);
2089 assert( nBits == Vec_IntSize(vBits) );
2090 Vec_IntFree( vTemp0 );
2091 Vec_IntFree( vTemp1 );
2092 Vec_IntFree( vTemp2 );
2093 Vec_IntFree( vRes );
2100 Vec_Int_t * vTemp0 = Vec_IntAlloc( 100 );
2101 Vec_Int_t * vTemp1 = Vec_IntAlloc( 100 );
2102 int iLit, nRange = Wlc_ObjRange(pObj);
2103 int * pFans0, * pFans1, * pFans2, * pFans3;
2104 int iReset, iSet, iEnable;
2105 int nRangeIn = 2*nRange + 3;
2106 int iSre = Wlc_ObjFaninId(pObj, 6);
2111 if ( vTables == NULL ) {
2113 Vec_PtrPush( vTables, NULL );
2115 Tim_ManCreateBox( pManTime, curPo, nRangeIn, curPi, nRange, Vec_PtrSize(vTables), 0 );
2120 pTable =
ABC_ALLOC(
float, 3 + nRange * nRangeIn );
2121 pTable[0] = Vec_PtrSize(vTables);
2122 pTable[1] = nRangeIn;
2124 for ( k = 0; k < nRange * nRangeIn; k++ )
2125 pTable[3 + k] = 1.0;
2126 Vec_PtrPush( vTables, pTable );
2129 pFans0 = Wlc_ObjFaninNum(pObj) > 0 ? Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjFaninId0(pObj)) ) : NULL;
2130 pFans1 = Wlc_ObjFaninNum(pObj) > 2 ? Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjFaninId(pObj,2)) ) : NULL;
2131 pFans2 = Wlc_ObjFaninNum(pObj) > 3 ? Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjFaninId(pObj,3)) ) : NULL;
2132 pFans3 = Wlc_ObjFaninNum(pObj) > 4 ? Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjFaninId(pObj,4)) ) : NULL;
2133 for ( k = 0; k < nRange; k++ )
2134 Gia_ManAppendCo( pNew, pFans0[k] );
2135 Gia_ManAppendCo( pNew, pFans1[0] );
2136 Gia_ManAppendCo( pNew, pFans2[0] );
2137 Gia_ManAppendCo( pNew, pFans3[0] );
2138 for ( k = 0; k < nRange; k++ )
2139 Gia_ManAppendCo( pNew, Gia_Obj2Lit(pNew, Gia_ManCi(pNew, Vec_IntEntry(vFf2Ci, i)+k)) );
2142 for ( k = Gia_ManPiNum(pExtra); k < nRangeIn; k++ )
2143 Gia_ManAppendCi( pExtra );
2145 for ( k = 0; k < nRange; k++ )
2146 Vec_IntPush( vTemp0, Gia_Obj2Lit(pExtra, Gia_ManPi(pExtra, k)) );
2147 iReset = Gia_Obj2Lit(pExtra, Gia_ManPi(pExtra, nRange+0));
2148 iSet = Gia_Obj2Lit(pExtra, Gia_ManPi(pExtra, nRange+1));
2149 iEnable = Gia_Obj2Lit(pExtra, Gia_ManPi(pExtra, nRange+2));
2150 for ( k = 0; k < nRange; k++ )
2151 Vec_IntPush( vTemp1, Gia_Obj2Lit(pExtra, Gia_ManPi(pExtra, nRangeIn-nRange+k)) );
2154 for ( k = 0; k < nRange; k++ )
2159 iLit =
Gia_ManHashMux( pExtra, iEnable, Vec_IntEntry(vTemp0, k), Vec_IntEntry(vTemp1, k) );
2179 Gia_ManAppendCo( pExtra, iLit );
2186 for ( k = 0; k < pBox->
nPis * pBox->
nPos; k++ )
2188 Vec_IntFree( vTemp0 );
2189 Vec_IntFree( vTemp1 );
2191 Vec_IntFree( vFf2Ci );
2195 int nPairs = 0, nBits = 0;
2196 Vec_Int_t * vOuts = Vec_IntAlloc( 100 );
2197 assert( Wlc_NtkPoNum(
p) % 2 == 0 );
2202 nRange = Wlc_ObjRange( pObj );
2203 pFans0 = Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjId(
p, pObj)) );
2204 if ( Wlc_ObjRangeIsReversed(pObj) )
2206 for ( k = 0; k < nRange; k++ )
2207 Gia_ManAppendCo( pNew, pFans0[nRange-1-k] );
2211 for ( k = 0; k < nRange; k++ )
2212 Gia_ManAppendCo( pNew, pFans0[k] );
2217 pObj2 = Wlc_NtkCo(
p, ++i );
2218 nRange1 = Wlc_ObjRange( pObj );
2219 nRange2 = Wlc_ObjRange( pObj2 );
2220 assert( nRange1 == nRange2 );
2221 pFans1 = Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjId(
p, pObj)) );
2222 pFans2 = Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjId(
p, pObj2)) );
2225 Vec_IntClear( vOuts );
2226 if ( Wlc_ObjRangeIsReversed(pObj) )
2228 for ( k = 0; k < nRange1; k++ )
2229 Vec_IntPushTwo( vOuts, pFans1[nRange1-1-k], pFans2[nRange2-1-k] );
2233 for ( k = 0; k < nRange1; k++ )
2234 Vec_IntPushTwo( vOuts, pFans1[k], pFans2[k] );
2240 if ( Wlc_ObjRangeIsReversed(pObj) )
2242 for ( k = 0; k < nRange1; k++ )
2244 Gia_ManAppendCo( pNew, pFans1[nRange1-1-k] );
2245 Gia_ManAppendCo( pNew, pFans2[nRange2-1-k] );
2250 for ( k = 0; k < nRange1; k++ )
2252 Gia_ManAppendCo( pNew, pFans1[k] );
2253 Gia_ManAppendCo( pNew, pFans2[k] );
2260 Vec_IntFree( vOuts );
2262 printf(
"Derived an ordinary miter with %d bit-level outputs, one for each pair of word-level outputs.\n", nPairs );
2264 printf(
"Derived a dual-output miter with %d pairs of bits belonging to %d pairs of word-level outputs.\n", nBits, nPairs );
2274 if ( vAddOutputs && pObj->
fIsFi )
2277 Gia_ManAppendCo( pNew, iLit );
2278 printf(
"Created %d additional POs for %d interesting internal word-level variables.\n", Vec_IntSize(vAddOutputs), Vec_IntSize(vAddObjs) );
2279 Vec_IntFreeP( &vAddOutputs );
2281 nRange = Wlc_ObjRange( pObj );
2282 pFans0 = Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjId(
p, pObj)) );
2284 printf(
"%s(%d) ",
Wlc_ObjName(
p, Wlc_ObjId(
p, pObj)), Gia_ManCoNum(pNew) );
2285 if ( Wlc_ObjRangeIsReversed(pObj) )
2287 for ( k = 0; k < nRange; k++ )
2288 Gia_ManAppendCo( pNew, pFans0[nRange-1-k] );
2292 for ( k = 0; k < nRange; k++ )
2293 Gia_ManAppendCo( pNew, pFans0[k] );
2304 if ( Vec_IntSize(&
p->vFfs2) > 0 )
2306 assert( nFFins == 0 && nFFouts == 0 );
2308 for ( i = 0; i < nFf2Regs; i++ )
2309 Gia_ManAppendCo( pNew, Gia_ManAppendCi(pNew) );
2314 assert( nFFins == nFFouts );
2328 if ( (
int)
strlen(
p->pInits) != Gia_ManRegNum(pNew) )
2330 printf(
"The number of init values (%d) does not match the number of flops (%d).\n", (
int)
strlen(
p->pInits), Gia_ManRegNum(pNew) );
2331 printf(
"It is assumed that the AIG has constant 0 initial state.\n" );
2341 if ( Vec_IntSize(&
p->vFfs2) > 0 )
2343 curPo += nBitCos + nFf2Regs;
2349 assert( Gia_ManPoNum(pExtra) == Gia_ManCiNum(pNew) - nBitCis - nFf2Regs );
2367 assert( Gia_ManPoNum(pExtra) == Gia_ManCiNum(pNew) - nBitCis - nFf2Regs );
2378 pNew->
vNamesIn = Vec_PtrAlloc( Gia_ManCiNum(pNew) );
2380 if ( Wlc_ObjIsPi(pObj) )
2383 nRange = Wlc_ObjRange( pObj );
2384 if ( fSkipBitRange && nRange == 1 )
2385 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(pName) );
2387 for ( k = 0; k < nRange; k++ )
2391 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2397 int Length =
strlen(
p->pInits);
2398 for ( i = 0; i < Length; i++ )
2399 if (
p->pInits[i] ==
'x' ||
p->pInits[i] ==
'X' )
2402 sprintf( Buffer,
"_%s_abc_%d_",
"init", i );
2403 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2407 for ( i = 0; i < 1+Length; i++ )
2408 Vec_PtrPush( pNew->
vNamesIn, NULL );
2411 if ( !Wlc_ObjIsPi(pObj) )
2414 nRange = Wlc_ObjRange( pObj );
2415 if ( fSkipBitRange && nRange == 1 )
2416 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(pName) );
2418 for ( k = 0; k < nRange; k++ )
2422 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2428 nRange = Wlc_ObjRange( pObj );
2429 if ( fSkipBitRange && nRange == 1 )
2432 sprintf( Buffer,
"%s_fo", pName );
2433 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2436 for ( k = 0; k < nRange; k++ )
2440 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2446 nRange = Wlc_ObjRange( pObj );
2447 if ( fSkipBitRange && nRange == 1 )
2448 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(pName) );
2450 for ( k = 0; k < nRange; k++ )
2454 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2460 int Length = (int)
strlen(
p->pInits);
2461 int NameStart = Vec_PtrSize(pNew->
vNamesIn)-Length;
2462 int NullStart = Vec_PtrSize(pNew->
vNamesIn)-2*Length;
2463 int SepStart = Vec_PtrSize(pNew->
vNamesIn)-2*Length-1;
2465 Vec_PtrWriteEntry( pNew->
vNamesIn, SepStart, Abc_UtilStrsav(
"_abc_190121_abc_") );
2466 for ( i = 0; i < Length; i++ )
2469 sprintf( Buffer,
"%c%s",
p->pInits[i], (
char *)Vec_PtrEntry(pNew->
vNamesIn, NameStart+i) );
2471 Vec_PtrWriteEntry( pNew->
vNamesIn, NullStart+i, Abc_UtilStrsav(Buffer) );
2476 if (
p->pInits && fAdded )
2477 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(
"abc_reset_flop") );
2483 nRange = Wlc_ObjRange( pObj );
2485 for ( k = 0; k < nRange; k++ )
2489 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2495 pNew->
vNamesOut = Vec_PtrAlloc( Gia_ManCoNum(pNew) );
2502 nRange = Wlc_ObjRange( Wlc_NtkObj(
p, iFanin) );
2503 if ( fSkipBitRange && nRange == 1 )
2504 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(pName) );
2506 for ( k = 0; k < nRange; k++ )
2510 sprintf( Buffer,
"%s[%d]", pName, pFanin->
Beg < pFanin->
End ? pFanin->
Beg+k : pFanin->
Beg-k );
2511 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2518 nRange = Wlc_ObjRange( pObj );
2519 if ( fSkipBitRange && nRange == 1 )
2522 sprintf( Buffer,
"%s_in", pName );
2523 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2526 for ( k = 0; k < nRange; k++ )
2530 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2542 nRange = Wlc_ObjRange( Wlc_NtkObj(
p, iFanin) );
2544 for ( k = 0; k < nRange; k++ )
2548 sprintf( Buffer,
"%s[%d]", pName, pFanin->
Beg < pFanin->
End ? pFanin->
Beg+k : pFanin->
Beg-k );
2549 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2556 if ( Wlc_ObjIsPo(pObj) )
2559 nRange = Wlc_ObjRange( pObj );
2565 sprintf( Buffer,
"%s_xor_%s", pName, pName2 );
2566 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2573 int nRange1 = Wlc_ObjRange( pObj );
2574 assert( nRange == nRange1 );
2575 for ( k = 0; k < nRange; k++ )
2579 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2581 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2586 if ( fSkipBitRange && nRange == 1 )
2587 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(pName) );
2589 for ( k = 0; k < nRange; k++ )
2593 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2603 nRange = Wlc_ObjRange( pObj );
2604 if ( fSkipBitRange && nRange == 1 )
2605 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(pName) );
2607 for ( k = 0; k < nRange; k++ )
2611 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2614 Vec_IntFreeP( &vAddObjs );
2618 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(
"abc_reset_flop_in") );
2620 if ( !Wlc_ObjIsPo(pObj) )
2623 nRange = Wlc_ObjRange( pObj );
2624 if ( fSkipBitRange && nRange == 1 )
2627 sprintf( Buffer,
"%s_fi", pName );
2628 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2631 for ( k = 0; k < nRange; k++ )
2635 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2641 nRange = Wlc_ObjRange( pObj );
2642 if ( fSkipBitRange && nRange == 1 )
2645 sprintf( Buffer,
"%s_fi", pName );
2646 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2649 for ( k = 0; k < nRange; k++ )
2653 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2669 char pFileName0[1000], pFileName1[1000];
2671 Vec_Int_t * vOrder = Vec_IntStartNatural( Gia_ManPoNum(pNew) );
2673 Gia_Man_t * pGia1 =
Gia_ManDupCones( pNew, Vec_IntArray(vOrder) + Vec_IntSize(vOrder)/2, Vec_IntSize(vOrder)/2, 0 );
2674 assert( Gia_ManPoNum(pNew) % 2 == 0 );
2675 sprintf( pFileName0,
"%s_lhs_.aig", pNameGeneric );
2676 sprintf( pFileName1,
"%s_rhs_.aig", pNameGeneric );
2681 Vec_IntFree( vOrder );
2683 printf(
"Dumped two parts of the miter into files \"%s\" and \"%s\".\n", pFileName0, pFileName1 );