1350{
1351 int fVerbose = 0;
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 );
1376
1378
1380 pNew->
pName = Abc_UtilStrsav(
p->pName );
1385 vAddOutputs = Vec_IntAlloc( 100 );
1387 vAddObjs = Vec_IntAlloc( 100 );
1388
1390 {
1391 int nNewCis = 0, nNewCos = 0;
1392 assert( Vec_IntSize(&
p->vFfs2) == 0 );
1395
1397 nBitCis += Wlc_ObjRange( pObj );
1399 nBitCos += Wlc_ObjRange( pObj );
1400
1403 {
1404
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) );
1412 }
1413
1414 pManTime =
Tim_ManStart( nBitCis + nNewCis, nBitCos + nNewCos );
1415 curPi = nBitCis;
1416 curPo = 0;
1417
1421
1423 }
1424 if ( Vec_IntSize(&
p->vFfs2) > 0 )
1425 {
1427 int nNewCis = 0, nNewCos = 0;
1429
1431 nBitCis += Wlc_ObjRange( pObj );
1433 nBitCos += Wlc_ObjRange( pObj );
1434
1436 {
1437
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);
1443 }
1444
1445 pManTime =
Tim_ManStart( nBitCis + nNewCis + nFf2Regs, nBitCos + nNewCos + nFf2Regs );
1446 curPi = nBitCis + nFf2Regs;
1447 curPo = 0;
1448
1452
1453 vRegClasses = Vec_IntAlloc(0);
1454 vSignature = Vec_IntAlloc( 100 );
1455 Vec_IntPushTwo( vSignature, -1, -1 );
1457 {
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 )
1463 {
1464 for ( b = 0; b < nRange; b++ )
1465 Vec_IntPush( vRegClasses, k/2 );
1466 break;
1467 }
1468 if ( k < Vec_IntSize(vSignature) )
1469 continue;
1470 for ( b = 0; b < nRange; b++ )
1471 Vec_IntPush( vRegClasses, k/2 );
1472 Vec_IntPushTwo( vSignature, iClk, iAsyn );
1473 }
1474 assert( Vec_IntSize(vRegClasses) == nFf2Regs );
1475 Vec_IntFree( vSignature );
1476
1478 }
1479
1480
1481
1483 {
1484
1485
1486
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 );
1500 {
1502 char Buffer[100];
1503 float * pTable;
1504 int CarryIn = 0;
1505
1508
1509
1510 if ( Wlc_ObjFaninNum(pObj) == 3 )
1512 else
1513 nRange2 = 0;
1514
1515
1516 if ( vTables == NULL ) {
1518 Vec_PtrPush( vTables, NULL );
1519 }
1520 Tim_ManCreateBox( pManTime, curPo, nRange0 + nRange1 + nRange2, curPi, nRange, Vec_PtrSize(vTables), 0 );
1522 curPi += nRange;
1523 curPo += nRange0 + nRange1 + nRange2;
1524
1525
1526 pTable =
ABC_ALLOC(
float, 3 + nRange * (nRange0 + nRange1 + nRange2) );
1527 pTable[0] = Vec_PtrSize(vTables);
1528 pTable[1] = nRange0 + nRange1 + nRange2;
1529 pTable[2] = nRange;
1530 for ( k = 0; k < nRange * (nRange0 + nRange1 + nRange2); k++ )
1531 pTable[3 + k] = 1.0;
1532 Vec_PtrPush( vTables, pTable );
1533
1534
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] );
1541
1542
1543 for ( k = Gia_ManPiNum(pExtra); k < nRange0 + nRange1 + nRange2; k++ )
1544 Gia_ManAppendCi( pExtra );
1545
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)) );
1552 if ( nRange2 == 1 )
1553 CarryIn = Gia_Obj2Lit(pExtra, Gia_ManPi(pExtra, nRange0+nRange1));
1554
1555
1556 pFans0 = Vec_IntArray( vTemp0 );
1557 pFans1 = Vec_IntArray( vTemp1 );
1558
1559
1561 {
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) );
1567 else
1569 Vec_IntShrink( vRes, nRange );
1570 }
1571 else if ( fUseOldMultiplierBlasting )
1572 {
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 );
1578 }
1579 else
1580 {
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 );
1588 else
1589 Vec_IntShrink( vRes, nRange );
1590 assert( Vec_IntSize(vRes) == nRange );
1591 }
1592
1593 for ( k = 0; k < nRange; k++ )
1594 Gia_ManAppendCo( pExtra, Vec_IntEntry(vRes, k) );
1595
1596
1597 Vec_IntClear( vRes );
1598 for ( k = 0; k < nRange; k++ )
1599 Vec_IntPush( vRes, Gia_ManAppendCi(pNew) );
1600
1601
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++ )
1607 }
1609 {
1611 Vec_IntPush( vFf2Ci, Gia_ManCiNum(pNew) );
1612 if ( Wlc_ObjRangeIsReversed(pObj) )
1613 {
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) );
1618 }
1619 else
1620 {
1621 for ( k = 0; k < nRange; k++ )
1622 Vec_IntPush( vRes, Gia_ManAppendCi(pNew) );
1623 }
1625 nFFouts += Vec_IntSize(vRes);
1627 {
1628
1629 }
1630 }
1632 {
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] );
1637 }
1639 {
1640 word * pTruth = (
word *)Wlc_ObjFanins(pObj);
1641 for ( k = 0; k < nRange; k++ )
1642 Vec_IntPush( vRes, Abc_TtGetBit(pTruth, k) );
1643 }
1645 {
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663 int fSigned = 1;
1664 assert( nRange0 >= 1 && Wlc_ObjFaninNum(pObj) >= 3 );
1665 assert( 1 + (1 << nRange0) == Wlc_ObjFaninNum(pObj) );
1667 if ( k > 0 )
1668 fSigned &= Wlc_NtkObj(
p, iFanin)->Signed;
1669 if ( pParIn->
fBlastNew && nRange0 <= 16 )
1670 {
1673 for ( b = 0; b < nRange; b++ )
1674 {
1675 Vec_IntClear( vTemp0 );
1677 if ( k > 0 )
1678 {
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) );
1683 else
1684 Vec_IntPush( vTemp0, b < nRange1 ? pFans1[b] : (Wlc_NtkObj(
p, iFanin)->Signed? pFans1[nRange1-1] : 0) );
1685 }
1686 }
1687 assert( (1 << nRange0) == Vec_IntSize(vTemp0) );
1689 }
1691 }
1692 else
1693 {
1694 Vec_IntClear( vTemp1 );
1696 {
1697 for ( k = 0; k < (1 << nRange0); k++ )
1698 {
1699 int iLitAnd = 1;
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 );
1703 }
1704 }
1705 for ( b = 0; b < nRange; b++ )
1706 {
1707 Vec_IntClear( vTemp0 );
1709 if ( k > 0 )
1710 {
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) );
1715 else
1716 Vec_IntPush( vTemp0, b < nRange1 ? pFans1[b] : (Wlc_NtkObj(
p, iFanin)->Signed? pFans1[nRange1-1] : 0) );
1717 }
1719 Vec_IntPush( vRes,
Wlc_NtkMuxTree2(pNew, pFans0, nRange0, vTemp0, vTemp1, vTemp2) );
1720 else
1722 }
1723 }
1724 }
1726 {
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++ )
1732 {
1733 Vec_IntClear( vTemp0 );
1735 if ( k > 0 )
1736 {
1738 assert( nRange == Wlc_ObjRange(pFanin) );
1739 pFans1 = Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, iFanin) );
1740 Vec_IntPush( vTemp0, pFans1[b] );
1741 }
1742 Vec_IntPush( vRes,
Wlc_NtkMuxTree2(pNew, NULL, 0, vTemp0, vTemp1, vTemp2) );
1743 }
1744 }
1747 {
1748 int nRangeMax = Abc_MaxInt( nRange, nRange0 );
1749 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRangeMax, Wlc_ObjIsSignedFanin0(
p, pObj) );
1752 else
1754 Vec_IntShrink( vRes, nRange );
1755 }
1757 {
1758 assert( nRange0 == nRange );
1760 }
1762 {
1763 assert( nRange0 == nRange );
1765 }
1767 {
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]) );
1772 }
1774 {
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++ )
1780 }
1782 {
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++ )
1788 }
1790 {
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++ )
1796 }
1798 {
1800 int End = Wlc_ObjRangeEnd(pObj);
1801 int Beg = Wlc_ObjRangeBeg(pObj);
1802 if ( End >= Beg )
1803 {
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] );
1808 }
1809 else
1810 {
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] );
1815 }
1816 }
1818 {
1821 nTotal += Wlc_ObjRange( Wlc_NtkObj(
p, iFanin) );
1824 {
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] );
1829 }
1830 }
1832 {
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 );
1839 }
1841 {
1843 Vec_IntFill( vRes, 1, Abc_LitNot(iLit) );
1844 for ( k = 1; k < nRange; k++ )
1845 Vec_IntPush( vRes, 0 );
1846 }
1848 {
1851 Vec_IntFill( vRes, 1,
Gia_ManHashOr(pNew, Abc_LitNot(iLit0), iLit1) );
1852 for ( k = 1; k < nRange; k++ )
1853 Vec_IntPush( vRes, 0 );
1854 }
1856 {
1860 for ( k = 1; k < nRange; k++ )
1861 Vec_IntPush( vRes, 0 );
1862 }
1864 {
1868 for ( k = 1; k < nRange; k++ )
1869 Vec_IntPush( vRes, 0 );
1870 }
1872 {
1876 for ( k = 1; k < nRange; k++ )
1877 Vec_IntPush( vRes, 0 );
1878 }
1880 {
1881
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)) ) );
1885
1886 for ( a = 0; a < Wlc_ObjFaninNum(pObj); a++ )
1887 for ( b = a+1; b < Wlc_ObjFaninNum(pObj); b++ )
1888 {
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)) );
1895 int iLit = 0;
1896 for ( k = 0; k < nRangeMax; k++ )
1899 }
1900 Vec_IntFill( vRes, 1, iRes );
1901 for ( k = 1; k < nRange; k++ )
1902 Vec_IntPush( vRes, 0 );
1903 }
1905 {
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 );
1914 }
1917 {
1918 int nRangeMax = Abc_MaxInt( nRange0, nRange1 );
1919 int fSigned = Wlc_ObjIsSignedFanin01(
p, pObj);
1924 if ( fSwap )
ABC_SWAP(
int *, pArg0, pArg1 );
1925 if ( fSigned )
1927 else
1929 iLit = Abc_LitNotCond( iLit, fCompl );
1930 Vec_IntFill( vRes, 1, iLit );
1931 for ( k = 1; k < nRange; k++ )
1932 Vec_IntPush( vRes, 0 );
1933 }
1936 {
1938 for ( k = 1; k < nRange; k++ )
1939 Vec_IntPush( vRes, 0 );
1940 }
1942 {
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;
1948 {
1950 Wlc_BlastAdderCLA( pNew, pArg0, pArg1, nRangeMax, Wlc_ObjIsSignedFanin01(
p, pObj), CarryIn );
1951
1952 else
1954 }
1955 else
1957 Vec_IntShrink( vRes, nRange );
1958 }
1960 {
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]) );
1972 }
1974 {
1975 if ( fUseOldMultiplierBlasting )
1976 {
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 );
1982 }
1983 else
1984 {
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 );
1995 else
1997
1998 if ( nRange > Vec_IntSize(vRes) )
1999 Vec_IntFillExtra( vRes, nRange, fSigned ? Vec_IntEntryLast(vRes) : 0 );
2000 else
2001 Vec_IntShrink( vRes, nRange );
2002 assert( Vec_IntSize(vRes) == nRange );
2003 }
2004 }
2006 {
2007 int nRangeMax = Abc_MaxInt( nRange, Abc_MaxInt(nRange0, nRange1) );
2008 int fSigned = Wlc_ObjIsSignedFanin01(
p, pObj);
2011 if ( fSigned )
2013 else
2015 Vec_IntShrink( vRes, nRange );
2018 }
2020 {
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 );
2025 }
2027 {
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 );
2033 }
2035 {
2036 int * pArg0 =
Wlc_VecLoadFanins( vTemp0, pFans0, nRange0, nRange0 + (nRange0 & 1), 0 );
2037 nRange0 += (nRange0 & 1);
2040 else
2042 if ( nRange > Vec_IntSize(vRes) )
2043 Vec_IntFillExtra( vRes, nRange, 0 );
2044 else
2045 Vec_IntShrink( vRes, nRange );
2046 }
2048 {
2051 if ( nRange > Vec_IntSize(vRes) )
2052 Vec_IntFillExtra( vRes, nRange, 0 );
2053 else
2054 Vec_IntShrink( vRes, nRange );
2055 }
2057 {
2061 else
2063 if ( nRange > Vec_IntSize(vRes) )
2064 Vec_IntFillExtra( vRes, nRange, 0 );
2065 else
2066 Vec_IntShrink( vRes, nRange );
2067 }
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) &&
2076 (
2080 )
2081 )
2082 {
2083 Vec_IntAppend( vAddOutputs, vRes );
2084 Vec_IntPush( vAddObjs, Wlc_ObjId(
p, pObj) );
2085 }
2086 p->nAnds[pObj->
Type] += Gia_ManAndNum(pNew) - nAndPrev;
2087 }
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 );
2094
2096 {
2098 char Buffer[100];
2099 float * pTable;
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);
2107
2109
2110
2111 if ( vTables == NULL ) {
2113 Vec_PtrPush( vTables, NULL );
2114 }
2115 Tim_ManCreateBox( pManTime, curPo, nRangeIn, curPi, nRange, Vec_PtrSize(vTables), 0 );
2116 curPi += nRange;
2117 curPo += nRangeIn;
2118
2119
2120 pTable =
ABC_ALLOC(
float, 3 + nRange * nRangeIn );
2121 pTable[0] = Vec_PtrSize(vTables);
2122 pTable[1] = nRangeIn;
2123 pTable[2] = nRange;
2124 for ( k = 0; k < nRange * nRangeIn; k++ )
2125 pTable[3 + k] = 1.0;
2126 Vec_PtrPush( vTables, pTable );
2127
2128
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)) );
2140
2141
2142 for ( k = Gia_ManPiNum(pExtra); k < nRangeIn; k++ )
2143 Gia_ManAppendCi( pExtra );
2144
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)) );
2152
2153
2154 for ( k = 0; k < nRange; k++ )
2155 {
2156
2157
2158
2159 iLit =
Gia_ManHashMux( pExtra, iEnable, Vec_IntEntry(vTemp0, k), Vec_IntEntry(vTemp1, k) );
2160 if ( iSre )
2161 {
2162
2163
2165
2166
2168 }
2169 else
2170 {
2171
2172
2174
2175
2177 }
2178
2179 Gia_ManAppendCo( pExtra, iLit );
2180 }
2181
2182
2186 for ( k = 0; k < pBox->
nPis * pBox->
nPos; k++ )
2188 Vec_IntFree( vTemp0 );
2189 Vec_IntFree( vTemp1 );
2190 }
2191 Vec_IntFree( vFf2Ci );
2192
2194 {
2195 int nPairs = 0, nBits = 0;
2196 Vec_Int_t * vOuts = Vec_IntAlloc( 100 );
2197 assert( Wlc_NtkPoNum(
p) % 2 == 0 );
2199 {
2201 {
2202 nRange = Wlc_ObjRange( pObj );
2203 pFans0 = Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjId(
p, pObj)) );
2204 if ( Wlc_ObjRangeIsReversed(pObj) )
2205 {
2206 for ( k = 0; k < nRange; k++ )
2207 Gia_ManAppendCo( pNew, pFans0[nRange-1-k] );
2208 }
2209 else
2210 {
2211 for ( k = 0; k < nRange; k++ )
2212 Gia_ManAppendCo( pNew, pFans0[k] );
2213 }
2214 nFFins += nRange;
2215 continue;
2216 }
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)) );
2224 {
2225 Vec_IntClear( vOuts );
2226 if ( Wlc_ObjRangeIsReversed(pObj) )
2227 {
2228 for ( k = 0; k < nRange1; k++ )
2229 Vec_IntPushTwo( vOuts, pFans1[nRange1-1-k], pFans2[nRange2-1-k] );
2230 }
2231 else
2232 {
2233 for ( k = 0; k < nRange1; k++ )
2234 Vec_IntPushTwo( vOuts, pFans1[k], pFans2[k] );
2235 }
2237 }
2238 else
2239 {
2240 if ( Wlc_ObjRangeIsReversed(pObj) )
2241 {
2242 for ( k = 0; k < nRange1; k++ )
2243 {
2244 Gia_ManAppendCo( pNew, pFans1[nRange1-1-k] );
2245 Gia_ManAppendCo( pNew, pFans2[nRange2-1-k] );
2246 }
2247 }
2248 else
2249 {
2250 for ( k = 0; k < nRange1; k++ )
2251 {
2252 Gia_ManAppendCo( pNew, pFans1[k] );
2253 Gia_ManAppendCo( pNew, pFans2[k] );
2254 }
2255 }
2256 }
2257 nPairs++;
2258 nBits += nRange1;
2259 }
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 );
2263 else
2264 printf( "Derived a dual-output miter with %d pairs of bits belonging to %d pairs of word-level outputs.\n", nBits, nPairs );
2265 }
2266 else
2267 {
2269 {
2270
2272 continue;
2273
2274 if ( vAddOutputs && pObj->
fIsFi )
2275 {
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 );
2280 }
2281 nRange = Wlc_ObjRange( pObj );
2282 pFans0 = Vec_IntEntryP( vBits, Wlc_ObjCopy(
p, Wlc_ObjId(
p, pObj)) );
2283 if ( fVerbose )
2284 printf(
"%s(%d) ",
Wlc_ObjName(
p, Wlc_ObjId(
p, pObj)), Gia_ManCoNum(pNew) );
2285 if ( Wlc_ObjRangeIsReversed(pObj) )
2286 {
2287 for ( k = 0; k < nRange; k++ )
2288 Gia_ManAppendCo( pNew, pFans0[nRange-1-k] );
2289 }
2290 else
2291 {
2292 for ( k = 0; k < nRange; k++ )
2293 Gia_ManAppendCo( pNew, pFans0[k] );
2294 }
2296 nFFins += nRange;
2297 }
2298 if ( fVerbose )
2299 printf( "\n" );
2300 }
2301
2302
2303
2304 if ( Vec_IntSize(&
p->vFfs2) > 0 )
2305 {
2306 assert( nFFins == 0 && nFFouts == 0 );
2307
2308 for ( i = 0; i < nFf2Regs; i++ )
2309 Gia_ManAppendCo( pNew, Gia_ManAppendCi(pNew) );
2311 }
2312 else
2313 {
2314 assert( nFFins == nFFouts );
2316 }
2317
2319 {
2322
2324 }
2325
2327 {
2328 if ( (
int)
strlen(
p->pInits) != Gia_ManRegNum(pNew) )
2329 {
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" );
2332 }
2333 else
2334 {
2338 }
2339 }
2340
2341 if ( Vec_IntSize(&
p->vFfs2) > 0 )
2342 {
2343 curPo += nBitCos + nFf2Regs;
2346
2349 assert( Gia_ManPoNum(pExtra) == Gia_ManCiNum(pNew) - nBitCis - nFf2Regs );
2350
2353
2357
2358 }
2360 {
2361 curPo += nBitCos;
2364
2367 assert( Gia_ManPoNum(pExtra) == Gia_ManCiNum(pNew) - nBitCis - nFf2Regs );
2368
2371
2375
2376 }
2377
2378 pNew->
vNamesIn = Vec_PtrAlloc( Gia_ManCiNum(pNew) );
2380 if ( Wlc_ObjIsPi(pObj) )
2381 {
2383 nRange = Wlc_ObjRange( pObj );
2384 if ( fSkipBitRange && nRange == 1 )
2385 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(pName) );
2386 else
2387 for ( k = 0; k < nRange; k++ )
2388 {
2389 char Buffer[1000];
2391 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2392
2393 }
2394 }
2396 {
2397 int Length =
strlen(
p->pInits);
2398 for ( i = 0; i < Length; i++ )
2399 if (
p->pInits[i] ==
'x' ||
p->pInits[i] ==
'X' )
2400 {
2401 char Buffer[100];
2402 sprintf( Buffer,
"_%s_abc_%d_",
"init", i );
2403 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2404 fAdded = 1;
2405 }
2407 for ( i = 0; i < 1+Length; i++ )
2408 Vec_PtrPush( pNew->
vNamesIn, NULL );
2409 }
2411 if ( !Wlc_ObjIsPi(pObj) )
2412 {
2414 nRange = Wlc_ObjRange( pObj );
2415 if ( fSkipBitRange && nRange == 1 )
2416 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(pName) );
2417 else
2418 for ( k = 0; k < nRange; k++ )
2419 {
2420 char Buffer[1000];
2422 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2423 }
2424 }
2426 {
2428 nRange = Wlc_ObjRange( pObj );
2429 if ( fSkipBitRange && nRange == 1 )
2430 {
2431 char Buffer[1000];
2432 sprintf( Buffer,
"%s_fo", pName );
2433 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2434 }
2435 else
2436 for ( k = 0; k < nRange; k++ )
2437 {
2438 char Buffer[1000];
2440 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2441 }
2442 }
2444 {
2446 nRange = Wlc_ObjRange( pObj );
2447 if ( fSkipBitRange && nRange == 1 )
2448 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(pName) );
2449 else
2450 for ( k = 0; k < nRange; k++ )
2451 {
2452 char Buffer[1000];
2454 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2455 }
2456 }
2458 {
2459 char * pName;
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++ )
2467 {
2468 char Buffer[100];
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) );
2472 }
2475 }
2476 if (
p->pInits && fAdded )
2477 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(
"abc_reset_flop") );
2479 {
2481 {
2483 nRange = Wlc_ObjRange( pObj );
2485 for ( k = 0; k < nRange; k++ )
2486 {
2487 char Buffer[1000];
2489 Vec_PtrPush( pNew->
vNamesIn, Abc_UtilStrsav(Buffer) );
2490 }
2491 }
2492 }
2494
2495 pNew->
vNamesOut = Vec_PtrAlloc( Gia_ManCoNum(pNew) );
2497 {
2498 int iFanin;
2500 {
2502 nRange = Wlc_ObjRange( Wlc_NtkObj(
p, iFanin) );
2503 if ( fSkipBitRange && nRange == 1 )
2504 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(pName) );
2505 else
2506 for ( k = 0; k < nRange; k++ )
2507 {
2508 char Buffer[1000];
2510 sprintf( Buffer,
"%s[%d]", pName, pFanin->
Beg < pFanin->
End ? pFanin->
Beg+k : pFanin->
Beg-k );
2511 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2512 }
2513 if ( b == 3 )
2514 break;
2515 }
2516 {
2518 nRange = Wlc_ObjRange( pObj );
2519 if ( fSkipBitRange && nRange == 1 )
2520 {
2521 char Buffer[1000];
2522 sprintf( Buffer,
"%s_in", pName );
2523 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2524 }
2525 else
2526 for ( k = 0; k < nRange; k++ )
2527 {
2528 char Buffer[1000];
2530 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2531 }
2532 }
2533 }
2535 {
2537 {
2538 int iFanin, f;
2540 {
2542 nRange = Wlc_ObjRange( Wlc_NtkObj(
p, iFanin) );
2544 for ( k = 0; k < nRange; k++ )
2545 {
2546 char Buffer[1000];
2548 sprintf( Buffer,
"%s[%d]", pName, pFanin->
Beg < pFanin->
End ? pFanin->
Beg+k : pFanin->
Beg-k );
2549 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2550 }
2551 }
2552 }
2553 }
2554
2556 if ( Wlc_ObjIsPo(pObj) )
2557 {
2559 nRange = Wlc_ObjRange( pObj );
2561 {
2564 char Buffer[1000];
2565 sprintf( Buffer,
"%s_xor_%s", pName, pName2 );
2566 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2567
2568 }
2570 {
2573 int nRange1 = Wlc_ObjRange( pObj );
2574 assert( nRange == nRange1 );
2575 for ( k = 0; k < nRange; k++ )
2576 {
2577 char Buffer[1000];
2579 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2581 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2582 }
2583 }
2584 else
2585 {
2586 if ( fSkipBitRange && nRange == 1 )
2587 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(pName) );
2588 else
2589 for ( k = 0; k < nRange; k++ )
2590 {
2591 char Buffer[1000];
2593 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2594 }
2595 }
2596 }
2597 if ( vAddObjs )
2598 {
2599
2601 {
2603 nRange = Wlc_ObjRange( pObj );
2604 if ( fSkipBitRange && nRange == 1 )
2605 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(pName) );
2606 else
2607 for ( k = 0; k < nRange; k++ )
2608 {
2609 char Buffer[1000];
2611 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2612 }
2613 }
2614 Vec_IntFreeP( &vAddObjs );
2615 }
2616
2617 if ( fAdded )
2618 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(
"abc_reset_flop_in") );
2620 if ( !Wlc_ObjIsPo(pObj) )
2621 {
2623 nRange = Wlc_ObjRange( pObj );
2624 if ( fSkipBitRange && nRange == 1 )
2625 {
2626 char Buffer[1000];
2627 sprintf( Buffer,
"%s_fi", pName );
2628 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2629 }
2630 else
2631 for ( k = 0; k < nRange; k++ )
2632 {
2633 char Buffer[1000];
2635 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2636 }
2637 }
2639 {
2641 nRange = Wlc_ObjRange( pObj );
2642 if ( fSkipBitRange && nRange == 1 )
2643 {
2644 char Buffer[1000];
2645 sprintf( Buffer,
"%s_fi", pName );
2646 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2647 }
2648 else
2649 for ( k = 0; k < nRange; k++ )
2650 {
2651 char Buffer[1000];
2653 Vec_PtrPush( pNew->
vNamesOut, Abc_UtilStrsav(Buffer) );
2654 }
2655 }
2657
2658
2659 if ( pBoxLib )
2660 {
2663 }
2664
2665
2666
2667 if ( 0 )
2668 {
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 );
2684 }
2685
2686
2688 {
2691 }
2693 return pNew;
2694}
#define ABC_SWAP(Type, a, b)
#define ABC_ALLOC(type, num)
int nTotal
DECLARATIONS ///.
ABC_DLL void Abc_FrameSetLibBox(void *pLib)
ABC_DLL void * Abc_FrameReadLibBox()
int Gia_ManHashDualMiter(Gia_Man_t *p, Vec_Int_t *vOuts)
void Gia_ManSetRegNum(Gia_Man_t *p, int nRegs)
void Gia_ManHashAlloc(Gia_Man_t *p)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
int Gia_ManHashOr(Gia_Man_t *p, int iLit0, int iLit1)
int Gia_ManHashXor(Gia_Man_t *p, int iLit0, int iLit1)
void Gia_ManDupRemapLiterals(Vec_Int_t *vLits, Gia_Man_t *p)
FUNCTION DEFINITIONS ///.
int Gia_ManHashMux(Gia_Man_t *p, int iCtrl, int iData1, int iData0)
Gia_Man_t * Gia_ManDupCones(Gia_Man_t *p, int *pPos, int nPos, int fTrimPis)
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
void Gia_ManTransferTiming(Gia_Man_t *p, Gia_Man_t *pGia)
Gia_Man_t * Gia_ManDupNormalize(Gia_Man_t *p, int fHashMapping)
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
Gia_Man_t * Gia_ManDupZeroUndc(Gia_Man_t *p, char *pInit, int nNewPis, int fGiaSimple, int fVerbose)
void Gia_AigerWrite(Gia_Man_t *p, char *pFileName, int fWriteSymbols, int fCompact, int fWriteNewLine)
struct If_LibBox_t_ If_LibBox_t
If_Box_t * If_BoxStart(char *pName, int Id, int nPis, int nPos, int fSeq, int fBlack, int fOuter)
FUNCTION DEFINITIONS ///.
int If_LibBoxNum(If_LibBox_t *p)
void If_LibBoxAdd(If_LibBox_t *p, If_Box_t *pBox)
struct If_Box_t_ If_Box_t
void If_LibBoxFree(If_LibBox_t *p)
If_LibBox_t * If_LibBoxStart()
unsigned __int64 word
DECLARATIONS ///.
void Tim_ManSetDelayTables(Tim_Man_t *p, Vec_Ptr_t *vDelayTables)
int Tim_ManBoxNum(Tim_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Tim_Man_t_ Tim_Man_t
INCLUDES ///.
int Tim_ManCiNum(Tim_Man_t *p)
void Tim_ManCreateBox(Tim_Man_t *p, int firstIn, int nIns, int firstOut, int nOuts, int iDelayTable, int fBlack)
ITERATORS ///.
void Tim_ManBoxSetCopy(Tim_Man_t *p, int iBox, int iCopy)
Tim_Man_t * Tim_ManStart(int nCis, int nCos)
DECLARATIONS ///.
int Tim_ManCoNum(Tim_Man_t *p)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
int Wlc_BlastAdder(Gia_Man_t *pNew, int *pAdd0, int *pAdd1, int nBits, int Carry)
void Wlc_BlastDividerSigned(Gia_Man_t *pNew, int *pNum, int nNum, int *pDiv, int nDiv, int fQuo, Vec_Int_t *vRes, int fNonRest)
int Wlc_NtkPrepareBits(Wlc_Ntk_t *p)
Vec_Int_t * Wlc_BlastDecoder2(Gia_Man_t *pNew, int *pNum, int nNum, Vec_Int_t *vTmp, Vec_Int_t *vRes)
void Wlc_BlastMultiplier2(Gia_Man_t *pNew, int *pArg0, int *pArg1, int nBits, Vec_Int_t *vTemp, Vec_Int_t *vRes)
char * Wlc_NtkMuxTreeString(int nIns)
int Wlc_NtkMuxTree2(Gia_Man_t *pNew, int *pCtrl, int nCtrl, Vec_Int_t *vData, Vec_Int_t *vAnds, Vec_Int_t *vTemp)
void Wlc_BlastPower(Gia_Man_t *pNew, int *pNum, int nNum, int *pExp, int nExp, Vec_Int_t *vTemp, Vec_Int_t *vRes)
void Wlc_BlastZeroCondition(Gia_Man_t *pNew, int *pDiv, int nDiv, Vec_Int_t *vRes)
void Wlc_BlastShiftRight(Gia_Man_t *pNew, int *pNum, int nNum, int *pShift, int nShift, int fSticky, Vec_Int_t *vRes)
ABC_NAMESPACE_IMPL_START int Wlc_NtkCountConstBits(int *pArray, int nSize)
DECLARATIONS ///.
void Wlc_BlastRotateLeft(Gia_Man_t *pNew, int *pNum, int nNum, int *pShift, int nShift, Vec_Int_t *vRes)
void Wlc_BlastBooth(Gia_Man_t *pNew, int *pArgA, int *pArgB, int nArgA, int nArgB, Vec_Int_t *vRes, int fSigned, int fCla, Vec_Wec_t **pvProds, int fVerbose)
int Wlc_BlastLessSigned(Gia_Man_t *pNew, int *pArg0, int *pArg1, int nBits)
void Wlc_BlastSquare(Gia_Man_t *pNew, int *pNum, int nNum, Vec_Int_t *vTmp, Vec_Int_t *vRes)
void Wlc_BlastMinus(Gia_Man_t *pNew, int *pNum, int nNum, Vec_Int_t *vRes)
void Wlc_NtkMuxTree3DecsFree(Vec_Int_t **pvDecs, char *pNums)
void Wlc_BlastSqrtNR(Gia_Man_t *pNew, int *pNum, int nNum, Vec_Int_t *vTmp, Vec_Int_t *vRes)
void Wlc_BlastRotateRight(Gia_Man_t *pNew, int *pNum, int nNum, int *pShift, int nShift, Vec_Int_t *vRes)
void Wlc_BlastMultiplier3(Gia_Man_t *pNew, int *pArgA, int *pArgB, int nArgA, int nArgB, Vec_Int_t *vRes, int fSigned, int fCla, Vec_Wec_t **pvProds, int fVerbose)
void Wlc_BlastLut(Gia_Man_t *pNew, word Truth, int *pFans, int nFans, int nOuts, Vec_Int_t *vRes)
void Wlc_BlastShiftLeft(Gia_Man_t *pNew, int *pNum, int nNum, int *pShift, int nShift, int fSticky, Vec_Int_t *vRes)
void Wlc_BlastSqrt(Gia_Man_t *pNew, int *pNum, int nNum, Vec_Int_t *vTmp, Vec_Int_t *vRes)
Vec_Int_t ** Wlc_NtkMuxTree3DecsDerive(Gia_Man_t *p, int *pIns, int nIns, char *pNums)
int Wlc_NtkMuxTree_rec(Gia_Man_t *pNew, int *pCtrl, int nCtrl, Vec_Int_t *vData, int Shift)
int Wlc_NtkMuxTree3(Gia_Man_t *p, Vec_Int_t *vData, char *pNums, Vec_Int_t **pvDecs)
void Wlc_BlastDividerTop(Gia_Man_t *pNew, int *pNum, int nNum, int *pDiv, int nDiv, int fQuo, Vec_Int_t *vRes, int fNonRest)
void Wlc_BlastSubtract(Gia_Man_t *pNew, int *pAdd0, int *pAdd1, int nBits, int Carry)
void Wlc_BlastTable(Gia_Man_t *pNew, word *pTable, int *pFans, int nFans, int nOuts, Vec_Int_t *vRes)
void Wlc_BlastMultiplier(Gia_Man_t *pNew, int *pArgA, int *pArgB, int nArgA, int nArgB, Vec_Int_t *vTemp, Vec_Int_t *vRes, int fSigned)
int Wlc_BlastLess(Gia_Man_t *pNew, int *pArg0, int *pArg1, int nBits)
int Wlc_BlastLess3(Gia_Man_t *p, int *pArg1, int *pArg0, int nBits)
int Wlc_BlastLessSigned3(Gia_Man_t *pNew, int *pArg0, int *pArg1, int nBits)
int Wlc_BlastReduction(Gia_Man_t *pNew, int *pFans, int nFans, int Type)
int * Wlc_VecLoadFanins(Vec_Int_t *vOut, int *pFanins, int nFanins, int nTotal, int fSigned)
void Wlc_BlastAdderCLA(Gia_Man_t *pNew, int *pAdd0, int *pAdd1, int nBits, int fSign, int CarryIn)
void Wlc_BlastDecoder(Gia_Man_t *pNew, int *pNum, int nNum, Vec_Int_t *vTmp, Vec_Int_t *vRes)
#define Wlc_NtkForEachFf2(p, pFf, i)
char * Wlc_ObjName(Wlc_Ntk_t *p, int iObj)
#define Wlc_ObjForEachFaninReverse(pObj, iFanin, i)
struct Wlc_BstPar_t_ Wlc_BstPar_t