diff options
35 files changed, 2277 insertions, 1144 deletions
| @@ -1113,7 +1113,7 @@ SOURCE=.\src\opt\rwr\rwr.h  # End Source File  # Begin Source File -SOURCE=.\src\opt\rwr\rwrCut.c +SOURCE=.\src\opt\rwr\rwrDec.c  # End Source File  # Begin Source File @@ -3,579 +3,1136 @@  <pre>  <h1>Build Log</h1>  <h3> ---------------------Configuration: abc - Win32 Debug-------------------- +--------------------Configuration: abc - Win32 Release--------------------  </h3>  <h3>Command Lines</h3> -Creating temporary file "C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP2765.tmp" with contents +Creating temporary file "C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP2D56.tmp" with contents  [ -/nologo /MLd /W3 /Gm /GX /ZI /Od /I "src\base\abc" /I "src\base\cmd" /I "src\base\io" /I "src\base\main" /I "src\bdd\cudd" /I "src\bdd\epd" /I "src\bdd\mtr" /I "src\bdd\parse" /I "src\bdd\dsd" /I "src\bdd\reo" /I "src\sop\mvc" /I "src\sop\ft" /I "src\sat\asat" /I "src\sat\msat" /I "src\sat\fraig" /I "src\opt\fxa" /I "src\opt\fxu" /I "src\opt\rwr" /I "src\opt\cut" /I "src\map\fpga" /I "src\map\mapper" /I "src\map\mio" /I "src\map\super" /I "src\misc\extra" /I "src\misc\st" /I "src\misc\util" /I "src\misc\vec" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "__STDC__" /D "HAVE_ASSERT_H" /FR"Debug/" /Fp"Debug/abc.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c  +/nologo /ML /W3 /GX /O2 /I "src\base\abc" /I "src\base\cmd" /I "src\base\io" /I "src\base\main" /I "src\bdd\cudd" /I "src\bdd\epd" /I "src\bdd\mtr" /I "src\bdd\parse" /I "src\bdd\dsd" /I "src\bdd\reo" /I "src\sop\mvc" /I "src\sop\ft" /I "src\sat\asat" /I "src\sat\msat" /I "src\sat\fraig" /I "src\opt\fxa" /I "src\opt\fxu" /I "src\opt\rwr" /I "src\opt\cut" /I "src\map\fpga" /I "src\map\mapper" /I "src\map\mio" /I "src\map\super" /I "src\misc\extra" /I "src\misc\st" /I "src\misc\util" /I "src\misc\vec" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "__STDC__" /D "HAVE_ASSERT_H" /FR"Release/" /Fp"Release/abc.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c  +"C:\_projects\abc\src\base\abc\abc.c" +"C:\_projects\abc\src\base\abc\abcAig.c" +"C:\_projects\abc\src\base\abc\abcAttach.c" +"C:\_projects\abc\src\base\abc\abcBalance.c" +"C:\_projects\abc\src\base\abc\abcCheck.c" +"C:\_projects\abc\src\base\abc\abcCollapse.c" +"C:\_projects\abc\src\base\abc\abcCreate.c" +"C:\_projects\abc\src\base\abc\abcCut.c" +"C:\_projects\abc\src\base\abc\abcDfs.c" +"C:\_projects\abc\src\base\abc\abcDsd.c" +"C:\_projects\abc\src\base\abc\abcFanio.c" +"C:\_projects\abc\src\base\abc\abcFpga.c" +"C:\_projects\abc\src\base\abc\abcFraig.c" +"C:\_projects\abc\src\base\abc\abcFunc.c" +"C:\_projects\abc\src\base\abc\abcFxu.c" +"C:\_projects\abc\src\base\abc\abcLatch.c" +"C:\_projects\abc\src\base\abc\abcMap.c" +"C:\_projects\abc\src\base\abc\abcMinBase.c" +"C:\_projects\abc\src\base\abc\abcMiter.c" +"C:\_projects\abc\src\base\abc\abcNames.c" +"C:\_projects\abc\src\base\abc\abcNetlist.c" +"C:\_projects\abc\src\base\abc\abcPrint.c" +"C:\_projects\abc\src\base\abc\abcReconv.c"  "C:\_projects\abc\src\base\abc\abcRefactor.c" +"C:\_projects\abc\src\base\abc\abcRefs.c" +"C:\_projects\abc\src\base\abc\abcRenode.c" +"C:\_projects\abc\src\base\abc\abcRewrite.c" +"C:\_projects\abc\src\base\abc\abcSat.c" +"C:\_projects\abc\src\base\abc\abcSeq.c" +"C:\_projects\abc\src\base\abc\abcSeqRetime.c" +"C:\_projects\abc\src\base\abc\abcShow.c" +"C:\_projects\abc\src\base\abc\abcSop.c" +"C:\_projects\abc\src\base\abc\abcStrash.c" +"C:\_projects\abc\src\base\abc\abcSweep.c" +"C:\_projects\abc\src\base\abc\abcTiming.c" +"C:\_projects\abc\src\base\abc\abcUnreach.c" +"C:\_projects\abc\src\base\abc\abcUtil.c" +"C:\_projects\abc\src\base\abc\abcVerify.c" +"C:\_projects\abc\src\base\cmd\cmd.c" +"C:\_projects\abc\src\base\cmd\cmdAlias.c" +"C:\_projects\abc\src\base\cmd\cmdApi.c" +"C:\_projects\abc\src\base\cmd\cmdFlag.c" +"C:\_projects\abc\src\base\cmd\cmdHist.c" +"C:\_projects\abc\src\base\cmd\cmdUtils.c" +"C:\_projects\abc\src\base\io\io.c" +"C:\_projects\abc\src\base\io\ioRead.c" +"C:\_projects\abc\src\base\io\ioReadBench.c" +"C:\_projects\abc\src\base\io\ioReadBlif.c" +"C:\_projects\abc\src\base\io\ioReadEdif.c" +"C:\_projects\abc\src\base\io\ioReadPla.c" +"C:\_projects\abc\src\base\io\ioReadVerilog.c" +"C:\_projects\abc\src\base\io\ioUtil.c" +"C:\_projects\abc\src\base\io\ioWriteBench.c" +"C:\_projects\abc\src\base\io\ioWriteBlif.c" +"C:\_projects\abc\src\base\io\ioWriteCnf.c" +"C:\_projects\abc\src\base\io\ioWritePla.c" +"C:\_projects\abc\src\base\main\main.c" +"C:\_projects\abc\src\base\main\mainFrame.c" +"C:\_projects\abc\src\base\main\mainInit.c" +"C:\_projects\abc\src\base\main\mainUtils.c" +"C:\_projects\abc\src\bdd\cudd\cuddAddAbs.c" +"C:\_projects\abc\src\bdd\cudd\cuddAddApply.c" +"C:\_projects\abc\src\bdd\cudd\cuddAddFind.c" +"C:\_projects\abc\src\bdd\cudd\cuddAddInv.c" +"C:\_projects\abc\src\bdd\cudd\cuddAddIte.c" +"C:\_projects\abc\src\bdd\cudd\cuddAddNeg.c" +"C:\_projects\abc\src\bdd\cudd\cuddAddWalsh.c" +"C:\_projects\abc\src\bdd\cudd\cuddAndAbs.c" +"C:\_projects\abc\src\bdd\cudd\cuddAnneal.c" +"C:\_projects\abc\src\bdd\cudd\cuddApa.c" +"C:\_projects\abc\src\bdd\cudd\cuddAPI.c" +"C:\_projects\abc\src\bdd\cudd\cuddApprox.c" +"C:\_projects\abc\src\bdd\cudd\cuddBddAbs.c" +"C:\_projects\abc\src\bdd\cudd\cuddBddCorr.c" +"C:\_projects\abc\src\bdd\cudd\cuddBddIte.c" +"C:\_projects\abc\src\bdd\cudd\cuddBridge.c" +"C:\_projects\abc\src\bdd\cudd\cuddCache.c" +"C:\_projects\abc\src\bdd\cudd\cuddCheck.c" +"C:\_projects\abc\src\bdd\cudd\cuddClip.c" +"C:\_projects\abc\src\bdd\cudd\cuddCof.c" +"C:\_projects\abc\src\bdd\cudd\cuddCompose.c" +"C:\_projects\abc\src\bdd\cudd\cuddDecomp.c" +"C:\_projects\abc\src\bdd\cudd\cuddEssent.c" +"C:\_projects\abc\src\bdd\cudd\cuddExact.c" +"C:\_projects\abc\src\bdd\cudd\cuddExport.c" +"C:\_projects\abc\src\bdd\cudd\cuddGenCof.c" +"C:\_projects\abc\src\bdd\cudd\cuddGenetic.c" +"C:\_projects\abc\src\bdd\cudd\cuddGroup.c" +"C:\_projects\abc\src\bdd\cudd\cuddHarwell.c" +"C:\_projects\abc\src\bdd\cudd\cuddInit.c" +"C:\_projects\abc\src\bdd\cudd\cuddInteract.c" +"C:\_projects\abc\src\bdd\cudd\cuddLCache.c" +"C:\_projects\abc\src\bdd\cudd\cuddLevelQ.c" +"C:\_projects\abc\src\bdd\cudd\cuddLinear.c" +"C:\_projects\abc\src\bdd\cudd\cuddLiteral.c" +"C:\_projects\abc\src\bdd\cudd\cuddMatMult.c" +"C:\_projects\abc\src\bdd\cudd\cuddPriority.c" +"C:\_projects\abc\src\bdd\cudd\cuddRead.c" +"C:\_projects\abc\src\bdd\cudd\cuddRef.c" +"C:\_projects\abc\src\bdd\cudd\cuddReorder.c" +"C:\_projects\abc\src\bdd\cudd\cuddSat.c" +"C:\_projects\abc\src\bdd\cudd\cuddSign.c" +"C:\_projects\abc\src\bdd\cudd\cuddSolve.c" +"C:\_projects\abc\src\bdd\cudd\cuddSplit.c" +"C:\_projects\abc\src\bdd\cudd\cuddSubsetHB.c" +"C:\_projects\abc\src\bdd\cudd\cuddSubsetSP.c" +"C:\_projects\abc\src\bdd\cudd\cuddSymmetry.c" +"C:\_projects\abc\src\bdd\cudd\cuddTable.c" +"C:\_projects\abc\src\bdd\cudd\cuddUtil.c" +"C:\_projects\abc\src\bdd\cudd\cuddWindow.c" +"C:\_projects\abc\src\bdd\cudd\cuddZddCount.c" +"C:\_projects\abc\src\bdd\cudd\cuddZddFuncs.c" +"C:\_projects\abc\src\bdd\cudd\cuddZddGroup.c" +"C:\_projects\abc\src\bdd\cudd\cuddZddIsop.c" +"C:\_projects\abc\src\bdd\cudd\cuddZddLin.c" +"C:\_projects\abc\src\bdd\cudd\cuddZddMisc.c" +"C:\_projects\abc\src\bdd\cudd\cuddZddPort.c" +"C:\_projects\abc\src\bdd\cudd\cuddZddReord.c" +"C:\_projects\abc\src\bdd\cudd\cuddZddSetop.c" +"C:\_projects\abc\src\bdd\cudd\cuddZddSymm.c" +"C:\_projects\abc\src\bdd\cudd\cuddZddUtil.c" +"C:\_projects\abc\src\bdd\epd\epd.c" +"C:\_projects\abc\src\bdd\mtr\mtrBasic.c" +"C:\_projects\abc\src\bdd\mtr\mtrGroup.c" +"C:\_projects\abc\src\bdd\parse\parseCore.c" +"C:\_projects\abc\src\bdd\parse\parseStack.c" +"C:\_projects\abc\src\bdd\dsd\dsdApi.c" +"C:\_projects\abc\src\bdd\dsd\dsdCheck.c" +"C:\_projects\abc\src\bdd\dsd\dsdLocal.c" +"C:\_projects\abc\src\bdd\dsd\dsdMan.c" +"C:\_projects\abc\src\bdd\dsd\dsdProc.c" +"C:\_projects\abc\src\bdd\dsd\dsdTree.c" +"C:\_projects\abc\src\bdd\reo\reoApi.c" +"C:\_projects\abc\src\bdd\reo\reoCore.c" +"C:\_projects\abc\src\bdd\reo\reoProfile.c" +"C:\_projects\abc\src\bdd\reo\reoSift.c" +"C:\_projects\abc\src\bdd\reo\reoSwap.c" +"C:\_projects\abc\src\bdd\reo\reoTest.c" +"C:\_projects\abc\src\bdd\reo\reoTransfer.c" +"C:\_projects\abc\src\bdd\reo\reoUnits.c" +"C:\_projects\abc\src\sop\mvc\mvc.c" +"C:\_projects\abc\src\sop\mvc\mvcApi.c" +"C:\_projects\abc\src\sop\mvc\mvcCompare.c" +"C:\_projects\abc\src\sop\mvc\mvcContain.c" +"C:\_projects\abc\src\sop\mvc\mvcCover.c" +"C:\_projects\abc\src\sop\mvc\mvcCube.c" +"C:\_projects\abc\src\sop\mvc\mvcDivide.c" +"C:\_projects\abc\src\sop\mvc\mvcDivisor.c" +"C:\_projects\abc\src\sop\mvc\mvcList.c" +"C:\_projects\abc\src\sop\mvc\mvcLits.c" +"C:\_projects\abc\src\sop\mvc\mvcMan.c" +"C:\_projects\abc\src\sop\mvc\mvcOpAlg.c" +"C:\_projects\abc\src\sop\mvc\mvcOpBool.c" +"C:\_projects\abc\src\sop\mvc\mvcPrint.c" +"C:\_projects\abc\src\sop\mvc\mvcSort.c" +"C:\_projects\abc\src\sop\mvc\mvcUtils.c" +"C:\_projects\abc\src\sop\ft\ftFactor.c" +"C:\_projects\abc\src\sop\ft\ftPrint.c" +"C:\_projects\abc\src\sat\asat\added.c" +"C:\_projects\abc\src\sat\asat\solver.c" +"C:\_projects\abc\src\sat\msat\msatActivity.c" +"C:\_projects\abc\src\sat\msat\msatClause.c" +"C:\_projects\abc\src\sat\msat\msatClauseVec.c" +"C:\_projects\abc\src\sat\msat\msatMem.c" +"C:\_projects\abc\src\sat\msat\msatOrderJ.c" +"C:\_projects\abc\src\sat\msat\msatQueue.c" +"C:\_projects\abc\src\sat\msat\msatRead.c" +"C:\_projects\abc\src\sat\msat\msatSolverApi.c" +"C:\_projects\abc\src\sat\msat\msatSolverCore.c" +"C:\_projects\abc\src\sat\msat\msatSolverIo.c" +"C:\_projects\abc\src\sat\msat\msatSolverSearch.c" +"C:\_projects\abc\src\sat\msat\msatSort.c" +"C:\_projects\abc\src\sat\msat\msatVec.c" +"C:\_projects\abc\src\sat\fraig\fraigApi.c" +"C:\_projects\abc\src\sat\fraig\fraigCanon.c" +"C:\_projects\abc\src\sat\fraig\fraigFanout.c" +"C:\_projects\abc\src\sat\fraig\fraigFeed.c" +"C:\_projects\abc\src\sat\fraig\fraigMan.c" +"C:\_projects\abc\src\sat\fraig\fraigMem.c" +"C:\_projects\abc\src\sat\fraig\fraigNode.c" +"C:\_projects\abc\src\sat\fraig\fraigPrime.c" +"C:\_projects\abc\src\sat\fraig\fraigSat.c" +"C:\_projects\abc\src\sat\fraig\fraigTable.c" +"C:\_projects\abc\src\sat\fraig\fraigUtil.c" +"C:\_projects\abc\src\sat\fraig\fraigVec.c" +"C:\_projects\abc\src\sat\sim\simMan.c" +"C:\_projects\abc\src\sat\sim\simSat.c" +"C:\_projects\abc\src\sat\sim\simSupp.c" +"C:\_projects\abc\src\sat\sim\simSym.c" +"C:\_projects\abc\src\sat\sim\simUnate.c" +"C:\_projects\abc\src\sat\sim\simUtils.c" +"C:\_projects\abc\src\opt\fxu\fxu.c" +"C:\_projects\abc\src\opt\fxu\fxuCreate.c" +"C:\_projects\abc\src\opt\fxu\fxuHeapD.c" +"C:\_projects\abc\src\opt\fxu\fxuHeapS.c" +"C:\_projects\abc\src\opt\fxu\fxuList.c" +"C:\_projects\abc\src\opt\fxu\fxuMatrix.c" +"C:\_projects\abc\src\opt\fxu\fxuPair.c" +"C:\_projects\abc\src\opt\fxu\fxuPrint.c" +"C:\_projects\abc\src\opt\fxu\fxuReduce.c" +"C:\_projects\abc\src\opt\fxu\fxuSelect.c" +"C:\_projects\abc\src\opt\fxu\fxuSingle.c" +"C:\_projects\abc\src\opt\fxu\fxuUpdate.c" +"C:\_projects\abc\src\opt\rwr\rwrEva.c" +"C:\_projects\abc\src\opt\rwr\rwrExp.c" +"C:\_projects\abc\src\opt\rwr\rwrLib.c" +"C:\_projects\abc\src\opt\rwr\rwrMan.c" +"C:\_projects\abc\src\opt\rwr\rwrPrint.c" +"C:\_projects\abc\src\opt\rwr\rwrUtil.c" +"C:\_projects\abc\src\opt\cut\cutMan.c" +"C:\_projects\abc\src\opt\cut\cutMerge.c" +"C:\_projects\abc\src\opt\cut\cutNode.c" +"C:\_projects\abc\src\opt\cut\cutSeq.c" +"C:\_projects\abc\src\opt\cut\cutTable.c" +"C:\_projects\abc\src\opt\cut\cutTruth.c" +"C:\_projects\abc\src\map\fpga\fpga.c" +"C:\_projects\abc\src\map\fpga\fpgaCore.c" +"C:\_projects\abc\src\map\fpga\fpgaCreate.c" +"C:\_projects\abc\src\map\fpga\fpgaCut.c" +"C:\_projects\abc\src\map\fpga\fpgaCutUtils.c" +"C:\_projects\abc\src\map\fpga\fpgaFanout.c" +"C:\_projects\abc\src\map\fpga\fpgaLib.c" +"C:\_projects\abc\src\map\fpga\fpgaMatch.c" +"C:\_projects\abc\src\map\fpga\fpgaTime.c" +"C:\_projects\abc\src\map\fpga\fpgaTruth.c" +"C:\_projects\abc\src\map\fpga\fpgaUtils.c" +"C:\_projects\abc\src\map\fpga\fpgaVec.c" +"C:\_projects\abc\src\map\mapper\mapper.c" +"C:\_projects\abc\src\map\mapper\mapperCanon.c" +"C:\_projects\abc\src\map\mapper\mapperCore.c" +"C:\_projects\abc\src\map\mapper\mapperCreate.c" +"C:\_projects\abc\src\map\mapper\mapperCut.c" +"C:\_projects\abc\src\map\mapper\mapperCutUtils.c" +"C:\_projects\abc\src\map\mapper\mapperFanout.c" +"C:\_projects\abc\src\map\mapper\mapperLib.c" +"C:\_projects\abc\src\map\mapper\mapperMatch.c" +"C:\_projects\abc\src\map\mapper\mapperRefs.c" +"C:\_projects\abc\src\map\mapper\mapperSuper.c" +"C:\_projects\abc\src\map\mapper\mapperTable.c" +"C:\_projects\abc\src\map\mapper\mapperTime.c" +"C:\_projects\abc\src\map\mapper\mapperTree.c" +"C:\_projects\abc\src\map\mapper\mapperTruth.c" +"C:\_projects\abc\src\map\mapper\mapperUtils.c" +"C:\_projects\abc\src\map\mapper\mapperVec.c" +"C:\_projects\abc\src\map\mio\mio.c" +"C:\_projects\abc\src\map\mio\mioApi.c" +"C:\_projects\abc\src\map\mio\mioFunc.c" +"C:\_projects\abc\src\map\mio\mioRead.c" +"C:\_projects\abc\src\map\mio\mioUtils.c" +"C:\_projects\abc\src\map\super\super.c" +"C:\_projects\abc\src\map\super\superAnd.c" +"C:\_projects\abc\src\map\super\superGate.c" +"C:\_projects\abc\src\map\super\superWrite.c" +"C:\_projects\abc\src\misc\extra\extraUtilBdd.c" +"C:\_projects\abc\src\misc\extra\extraUtilBitMatrix.c" +"C:\_projects\abc\src\misc\extra\extraUtilCanon.c" +"C:\_projects\abc\src\misc\extra\extraUtilFile.c" +"C:\_projects\abc\src\misc\extra\extraUtilMemory.c" +"C:\_projects\abc\src\misc\extra\extraUtilMisc.c" +"C:\_projects\abc\src\misc\extra\extraUtilProgress.c" +"C:\_projects\abc\src\misc\extra\extraUtilReader.c" +"C:\_projects\abc\src\misc\st\st.c" +"C:\_projects\abc\src\misc\st\stmm.c" +"C:\_projects\abc\src\misc\util\cpu_stats.c" +"C:\_projects\abc\src\misc\util\cpu_time.c" +"C:\_projects\abc\src\misc\util\datalimit.c" +"C:\_projects\abc\src\misc\util\getopt.c" +"C:\_projects\abc\src\misc\util\pathsearch.c" +"C:\_projects\abc\src\misc\util\safe_mem.c" +"C:\_projects\abc\src\misc\util\strsav.c" +"C:\_projects\abc\src\misc\util\texpand.c" +"C:\_projects\abc\src\opt\rwr\rwrDec.c"  ] -Creating command line "cl.exe @C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP2765.tmp"  -Creating temporary file "C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP2766.tmp" with contents +Creating command line "cl.exe @C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP2D56.tmp"  +Creating temporary file "C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP2D57.tmp" with contents  [ -kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/abc.pdb" /debug /machine:I386 /out:"_TEST/abc.exe" /pdbtype:sept  -.\Debug\abc.obj -.\Debug\abcAig.obj -.\Debug\abcAttach.obj -.\Debug\abcCheck.obj -.\Debug\abcCollapse.obj -.\Debug\abcCreate.obj -.\Debug\abcCut.obj -.\Debug\abcDfs.obj -.\Debug\abcDsd.obj -.\Debug\abcFanio.obj -.\Debug\abcFpga.obj -.\Debug\abcFraig.obj -.\Debug\abcFunc.obj -.\Debug\abcFxu.obj -.\Debug\abcLatch.obj -.\Debug\abcMap.obj -.\Debug\abcMinBase.obj -.\Debug\abcMiter.obj -.\Debug\abcNames.obj -.\Debug\abcNetlist.obj -.\Debug\abcPrint.obj -.\Debug\abcReconv.obj -.\Debug\abcRefactor.obj -.\Debug\abcRefs.obj -.\Debug\abcRenode.obj -.\Debug\abcRewrite.obj -.\Debug\abcSat.obj -.\Debug\abcSeq.obj -.\Debug\abcSeqRetime.obj -.\Debug\abcShow.obj -.\Debug\abcSop.obj -.\Debug\abcStrash.obj -.\Debug\abcSweep.obj -.\Debug\abcTiming.obj -.\Debug\abcUnreach.obj -.\Debug\abcUtil.obj -.\Debug\abcVerify.obj -.\Debug\cmd.obj -.\Debug\cmdAlias.obj -.\Debug\cmdApi.obj -.\Debug\cmdFlag.obj -.\Debug\cmdHist.obj -.\Debug\cmdUtils.obj -.\Debug\io.obj -.\Debug\ioRead.obj -.\Debug\ioReadBench.obj -.\Debug\ioReadBlif.obj -.\Debug\ioReadEdif.obj -.\Debug\ioReadPla.obj -.\Debug\ioReadVerilog.obj -.\Debug\ioUtil.obj -.\Debug\ioWriteBench.obj -.\Debug\ioWriteBlif.obj -.\Debug\ioWriteCnf.obj -.\Debug\ioWritePla.obj -.\Debug\main.obj -.\Debug\mainFrame.obj -.\Debug\mainInit.obj -.\Debug\mainUtils.obj -.\Debug\cuddAddAbs.obj -.\Debug\cuddAddApply.obj -.\Debug\cuddAddFind.obj -.\Debug\cuddAddInv.obj -.\Debug\cuddAddIte.obj -.\Debug\cuddAddNeg.obj -.\Debug\cuddAddWalsh.obj -.\Debug\cuddAndAbs.obj -.\Debug\cuddAnneal.obj -.\Debug\cuddApa.obj -.\Debug\cuddAPI.obj -.\Debug\cuddApprox.obj -.\Debug\cuddBddAbs.obj -.\Debug\cuddBddCorr.obj -.\Debug\cuddBddIte.obj -.\Debug\cuddBridge.obj -.\Debug\cuddCache.obj -.\Debug\cuddCheck.obj -.\Debug\cuddClip.obj -.\Debug\cuddCof.obj -.\Debug\cuddCompose.obj -.\Debug\cuddDecomp.obj -.\Debug\cuddEssent.obj -.\Debug\cuddExact.obj -.\Debug\cuddExport.obj -.\Debug\cuddGenCof.obj -.\Debug\cuddGenetic.obj -.\Debug\cuddGroup.obj -.\Debug\cuddHarwell.obj -.\Debug\cuddInit.obj -.\Debug\cuddInteract.obj -.\Debug\cuddLCache.obj -.\Debug\cuddLevelQ.obj -.\Debug\cuddLinear.obj -.\Debug\cuddLiteral.obj -.\Debug\cuddMatMult.obj -.\Debug\cuddPriority.obj -.\Debug\cuddRead.obj -.\Debug\cuddRef.obj -.\Debug\cuddReorder.obj -.\Debug\cuddSat.obj -.\Debug\cuddSign.obj -.\Debug\cuddSolve.obj -.\Debug\cuddSplit.obj -.\Debug\cuddSubsetHB.obj -.\Debug\cuddSubsetSP.obj -.\Debug\cuddSymmetry.obj -.\Debug\cuddTable.obj -.\Debug\cuddUtil.obj -.\Debug\cuddWindow.obj -.\Debug\cuddZddCount.obj -.\Debug\cuddZddFuncs.obj -.\Debug\cuddZddGroup.obj -.\Debug\cuddZddIsop.obj -.\Debug\cuddZddLin.obj -.\Debug\cuddZddMisc.obj -.\Debug\cuddZddPort.obj -.\Debug\cuddZddReord.obj -.\Debug\cuddZddSetop.obj -.\Debug\cuddZddSymm.obj -.\Debug\cuddZddUtil.obj -.\Debug\epd.obj -.\Debug\mtrBasic.obj -.\Debug\mtrGroup.obj -.\Debug\parseCore.obj -.\Debug\parseStack.obj -.\Debug\dsdApi.obj -.\Debug\dsdCheck.obj -.\Debug\dsdLocal.obj -.\Debug\dsdMan.obj -.\Debug\dsdProc.obj -.\Debug\dsdTree.obj -.\Debug\reoApi.obj -.\Debug\reoCore.obj -.\Debug\reoProfile.obj -.\Debug\reoSift.obj -.\Debug\reoSwap.obj -.\Debug\reoTest.obj -.\Debug\reoTransfer.obj -.\Debug\reoUnits.obj -.\Debug\mvc.obj -.\Debug\mvcApi.obj -.\Debug\mvcCompare.obj -.\Debug\mvcContain.obj -.\Debug\mvcCover.obj -.\Debug\mvcCube.obj -.\Debug\mvcDivide.obj -.\Debug\mvcDivisor.obj -.\Debug\mvcList.obj -.\Debug\mvcLits.obj -.\Debug\mvcMan.obj -.\Debug\mvcOpAlg.obj -.\Debug\mvcOpBool.obj -.\Debug\mvcPrint.obj -.\Debug\mvcSort.obj -.\Debug\mvcUtils.obj -.\Debug\ftFactor.obj -.\Debug\ftPrint.obj -.\Debug\added.obj -.\Debug\solver.obj -.\Debug\msatActivity.obj -.\Debug\msatClause.obj -.\Debug\msatClauseVec.obj -.\Debug\msatMem.obj -.\Debug\msatOrderJ.obj -.\Debug\msatQueue.obj -.\Debug\msatRead.obj -.\Debug\msatSolverApi.obj -.\Debug\msatSolverCore.obj -.\Debug\msatSolverIo.obj -.\Debug\msatSolverSearch.obj -.\Debug\msatSort.obj -.\Debug\msatVec.obj -.\Debug\fraigApi.obj -.\Debug\fraigCanon.obj -.\Debug\fraigFanout.obj -.\Debug\fraigFeed.obj -.\Debug\fraigMan.obj -.\Debug\fraigMem.obj -.\Debug\fraigNode.obj -.\Debug\fraigPrime.obj -.\Debug\fraigSat.obj -.\Debug\fraigTable.obj -.\Debug\fraigUtil.obj -.\Debug\fraigVec.obj -.\Debug\simMan.obj -.\Debug\simSat.obj -.\Debug\simSupp.obj -.\Debug\simSym.obj -.\Debug\simUnate.obj -.\Debug\simUtils.obj -.\Debug\fxu.obj -.\Debug\fxuCreate.obj -.\Debug\fxuHeapD.obj -.\Debug\fxuHeapS.obj -.\Debug\fxuList.obj -.\Debug\fxuMatrix.obj -.\Debug\fxuPair.obj -.\Debug\fxuPrint.obj -.\Debug\fxuReduce.obj -.\Debug\fxuSelect.obj -.\Debug\fxuSingle.obj -.\Debug\fxuUpdate.obj -.\Debug\rwrCut.obj -.\Debug\rwrEva.obj -.\Debug\rwrExp.obj -.\Debug\rwrLib.obj -.\Debug\rwrMan.obj -.\Debug\rwrPrint.obj -.\Debug\rwrUtil.obj -.\Debug\cutMan.obj -.\Debug\cutMerge.obj -.\Debug\cutNode.obj -.\Debug\cutSeq.obj -.\Debug\cutTable.obj -.\Debug\cutTruth.obj -.\Debug\fpga.obj -.\Debug\fpgaCore.obj -.\Debug\fpgaCreate.obj -.\Debug\fpgaCut.obj -.\Debug\fpgaCutUtils.obj -.\Debug\fpgaFanout.obj -.\Debug\fpgaLib.obj -.\Debug\fpgaMatch.obj -.\Debug\fpgaTime.obj -.\Debug\fpgaTruth.obj -.\Debug\fpgaUtils.obj -.\Debug\fpgaVec.obj -.\Debug\mapper.obj -.\Debug\mapperCanon.obj -.\Debug\mapperCore.obj -.\Debug\mapperCreate.obj -.\Debug\mapperCut.obj -.\Debug\mapperCutUtils.obj -.\Debug\mapperFanout.obj -.\Debug\mapperLib.obj -.\Debug\mapperMatch.obj -.\Debug\mapperRefs.obj -.\Debug\mapperSuper.obj -.\Debug\mapperTable.obj -.\Debug\mapperTime.obj -.\Debug\mapperTree.obj -.\Debug\mapperTruth.obj -.\Debug\mapperUtils.obj -.\Debug\mapperVec.obj -.\Debug\mio.obj -.\Debug\mioApi.obj -.\Debug\mioFunc.obj -.\Debug\mioRead.obj -.\Debug\mioUtils.obj -.\Debug\super.obj -.\Debug\superAnd.obj -.\Debug\superGate.obj -.\Debug\superWrite.obj -.\Debug\extraUtilBdd.obj -.\Debug\extraUtilBitMatrix.obj -.\Debug\extraUtilCanon.obj -.\Debug\extraUtilFile.obj -.\Debug\extraUtilMemory.obj -.\Debug\extraUtilMisc.obj -.\Debug\extraUtilProgress.obj -.\Debug\extraUtilReader.obj -.\Debug\st.obj -.\Debug\stmm.obj -.\Debug\cpu_stats.obj -.\Debug\cpu_time.obj -.\Debug\datalimit.obj -.\Debug\getopt.obj -.\Debug\pathsearch.obj -.\Debug\safe_mem.obj -.\Debug\strsav.obj -.\Debug\texpand.obj -.\Debug\abcBalance.obj +kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"Release/abc.pdb" /machine:I386 /out:"_TEST/abc.exe"  +.\Release\abc.obj +.\Release\abcAig.obj +.\Release\abcAttach.obj +.\Release\abcBalance.obj +.\Release\abcCheck.obj +.\Release\abcCollapse.obj +.\Release\abcCreate.obj +.\Release\abcCut.obj +.\Release\abcDfs.obj +.\Release\abcDsd.obj +.\Release\abcFanio.obj +.\Release\abcFpga.obj +.\Release\abcFraig.obj +.\Release\abcFunc.obj +.\Release\abcFxu.obj +.\Release\abcLatch.obj +.\Release\abcMap.obj +.\Release\abcMinBase.obj +.\Release\abcMiter.obj +.\Release\abcNames.obj +.\Release\abcNetlist.obj +.\Release\abcPrint.obj +.\Release\abcReconv.obj +.\Release\abcRefactor.obj +.\Release\abcRefs.obj +.\Release\abcRenode.obj +.\Release\abcRewrite.obj +.\Release\abcSat.obj +.\Release\abcSeq.obj +.\Release\abcSeqRetime.obj +.\Release\abcShow.obj +.\Release\abcSop.obj +.\Release\abcStrash.obj +.\Release\abcSweep.obj +.\Release\abcTiming.obj +.\Release\abcUnreach.obj +.\Release\abcUtil.obj +.\Release\abcVerify.obj +.\Release\cmd.obj +.\Release\cmdAlias.obj +.\Release\cmdApi.obj +.\Release\cmdFlag.obj +.\Release\cmdHist.obj +.\Release\cmdUtils.obj +.\Release\io.obj +.\Release\ioRead.obj +.\Release\ioReadBench.obj +.\Release\ioReadBlif.obj +.\Release\ioReadEdif.obj +.\Release\ioReadPla.obj +.\Release\ioReadVerilog.obj +.\Release\ioUtil.obj +.\Release\ioWriteBench.obj +.\Release\ioWriteBlif.obj +.\Release\ioWriteCnf.obj +.\Release\ioWritePla.obj +.\Release\main.obj +.\Release\mainFrame.obj +.\Release\mainInit.obj +.\Release\mainUtils.obj +.\Release\cuddAddAbs.obj +.\Release\cuddAddApply.obj +.\Release\cuddAddFind.obj +.\Release\cuddAddInv.obj +.\Release\cuddAddIte.obj +.\Release\cuddAddNeg.obj +.\Release\cuddAddWalsh.obj +.\Release\cuddAndAbs.obj +.\Release\cuddAnneal.obj +.\Release\cuddApa.obj +.\Release\cuddAPI.obj +.\Release\cuddApprox.obj +.\Release\cuddBddAbs.obj +.\Release\cuddBddCorr.obj +.\Release\cuddBddIte.obj +.\Release\cuddBridge.obj +.\Release\cuddCache.obj +.\Release\cuddCheck.obj +.\Release\cuddClip.obj +.\Release\cuddCof.obj +.\Release\cuddCompose.obj +.\Release\cuddDecomp.obj +.\Release\cuddEssent.obj +.\Release\cuddExact.obj +.\Release\cuddExport.obj +.\Release\cuddGenCof.obj +.\Release\cuddGenetic.obj +.\Release\cuddGroup.obj +.\Release\cuddHarwell.obj +.\Release\cuddInit.obj +.\Release\cuddInteract.obj +.\Release\cuddLCache.obj +.\Release\cuddLevelQ.obj +.\Release\cuddLinear.obj +.\Release\cuddLiteral.obj +.\Release\cuddMatMult.obj +.\Release\cuddPriority.obj +.\Release\cuddRead.obj +.\Release\cuddRef.obj +.\Release\cuddReorder.obj +.\Release\cuddSat.obj +.\Release\cuddSign.obj +.\Release\cuddSolve.obj +.\Release\cuddSplit.obj +.\Release\cuddSubsetHB.obj +.\Release\cuddSubsetSP.obj +.\Release\cuddSymmetry.obj +.\Release\cuddTable.obj +.\Release\cuddUtil.obj +.\Release\cuddWindow.obj +.\Release\cuddZddCount.obj +.\Release\cuddZddFuncs.obj +.\Release\cuddZddGroup.obj +.\Release\cuddZddIsop.obj +.\Release\cuddZddLin.obj +.\Release\cuddZddMisc.obj +.\Release\cuddZddPort.obj +.\Release\cuddZddReord.obj +.\Release\cuddZddSetop.obj +.\Release\cuddZddSymm.obj +.\Release\cuddZddUtil.obj +.\Release\epd.obj +.\Release\mtrBasic.obj +.\Release\mtrGroup.obj +.\Release\parseCore.obj +.\Release\parseStack.obj +.\Release\dsdApi.obj +.\Release\dsdCheck.obj +.\Release\dsdLocal.obj +.\Release\dsdMan.obj +.\Release\dsdProc.obj +.\Release\dsdTree.obj +.\Release\reoApi.obj +.\Release\reoCore.obj +.\Release\reoProfile.obj +.\Release\reoSift.obj +.\Release\reoSwap.obj +.\Release\reoTest.obj +.\Release\reoTransfer.obj +.\Release\reoUnits.obj +.\Release\mvc.obj +.\Release\mvcApi.obj +.\Release\mvcCompare.obj +.\Release\mvcContain.obj +.\Release\mvcCover.obj +.\Release\mvcCube.obj +.\Release\mvcDivide.obj +.\Release\mvcDivisor.obj +.\Release\mvcList.obj +.\Release\mvcLits.obj +.\Release\mvcMan.obj +.\Release\mvcOpAlg.obj +.\Release\mvcOpBool.obj +.\Release\mvcPrint.obj +.\Release\mvcSort.obj +.\Release\mvcUtils.obj +.\Release\ftFactor.obj +.\Release\ftPrint.obj +.\Release\added.obj +.\Release\solver.obj +.\Release\msatActivity.obj +.\Release\msatClause.obj +.\Release\msatClauseVec.obj +.\Release\msatMem.obj +.\Release\msatOrderJ.obj +.\Release\msatQueue.obj +.\Release\msatRead.obj +.\Release\msatSolverApi.obj +.\Release\msatSolverCore.obj +.\Release\msatSolverIo.obj +.\Release\msatSolverSearch.obj +.\Release\msatSort.obj +.\Release\msatVec.obj +.\Release\fraigApi.obj +.\Release\fraigCanon.obj +.\Release\fraigFanout.obj +.\Release\fraigFeed.obj +.\Release\fraigMan.obj +.\Release\fraigMem.obj +.\Release\fraigNode.obj +.\Release\fraigPrime.obj +.\Release\fraigSat.obj +.\Release\fraigTable.obj +.\Release\fraigUtil.obj +.\Release\fraigVec.obj +.\Release\simMan.obj +.\Release\simSat.obj +.\Release\simSupp.obj +.\Release\simSym.obj +.\Release\simUnate.obj +.\Release\simUtils.obj +.\Release\fxu.obj +.\Release\fxuCreate.obj +.\Release\fxuHeapD.obj +.\Release\fxuHeapS.obj +.\Release\fxuList.obj +.\Release\fxuMatrix.obj +.\Release\fxuPair.obj +.\Release\fxuPrint.obj +.\Release\fxuReduce.obj +.\Release\fxuSelect.obj +.\Release\fxuSingle.obj +.\Release\fxuUpdate.obj +.\Release\rwrEva.obj +.\Release\rwrExp.obj +.\Release\rwrLib.obj +.\Release\rwrMan.obj +.\Release\rwrPrint.obj +.\Release\rwrUtil.obj +.\Release\cutMan.obj +.\Release\cutMerge.obj +.\Release\cutNode.obj +.\Release\cutSeq.obj +.\Release\cutTable.obj +.\Release\cutTruth.obj +.\Release\fpga.obj +.\Release\fpgaCore.obj +.\Release\fpgaCreate.obj +.\Release\fpgaCut.obj +.\Release\fpgaCutUtils.obj +.\Release\fpgaFanout.obj +.\Release\fpgaLib.obj +.\Release\fpgaMatch.obj +.\Release\fpgaTime.obj +.\Release\fpgaTruth.obj +.\Release\fpgaUtils.obj +.\Release\fpgaVec.obj +.\Release\mapper.obj +.\Release\mapperCanon.obj +.\Release\mapperCore.obj +.\Release\mapperCreate.obj +.\Release\mapperCut.obj +.\Release\mapperCutUtils.obj +.\Release\mapperFanout.obj +.\Release\mapperLib.obj +.\Release\mapperMatch.obj +.\Release\mapperRefs.obj +.\Release\mapperSuper.obj +.\Release\mapperTable.obj +.\Release\mapperTime.obj +.\Release\mapperTree.obj +.\Release\mapperTruth.obj +.\Release\mapperUtils.obj +.\Release\mapperVec.obj +.\Release\mio.obj +.\Release\mioApi.obj +.\Release\mioFunc.obj +.\Release\mioRead.obj +.\Release\mioUtils.obj +.\Release\super.obj +.\Release\superAnd.obj +.\Release\superGate.obj +.\Release\superWrite.obj +.\Release\extraUtilBdd.obj +.\Release\extraUtilBitMatrix.obj +.\Release\extraUtilCanon.obj +.\Release\extraUtilFile.obj +.\Release\extraUtilMemory.obj +.\Release\extraUtilMisc.obj +.\Release\extraUtilProgress.obj +.\Release\extraUtilReader.obj +.\Release\st.obj +.\Release\stmm.obj +.\Release\cpu_stats.obj +.\Release\cpu_time.obj +.\Release\datalimit.obj +.\Release\getopt.obj +.\Release\pathsearch.obj +.\Release\safe_mem.obj +.\Release\strsav.obj +.\Release\texpand.obj +.\Release\rwrDec.obj  ] -Creating command line "link.exe @C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP2766.tmp" +Creating command line "link.exe @C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP2D57.tmp"  <h3>Output Window</h3>  Compiling... +abc.c +abcAig.c +abcAttach.c +abcBalance.c +abcCheck.c +abcCollapse.c +abcCreate.c +abcCut.c +abcDfs.c +abcDsd.c +abcFanio.c +abcFpga.c +abcFraig.c +abcFunc.c +abcFxu.c +abcLatch.c +abcMap.c +abcMinBase.c +abcMiter.c +abcNames.c +abcNetlist.c +abcPrint.c +abcReconv.c  abcRefactor.c +abcRefs.c +abcRenode.c +abcRewrite.c +abcSat.c +abcSeq.c +abcSeqRetime.c +abcShow.c +abcSop.c +abcStrash.c +abcSweep.c +abcTiming.c +abcUnreach.c +abcUtil.c +abcVerify.c +cmd.c +cmdAlias.c +cmdApi.c +cmdFlag.c +cmdHist.c +cmdUtils.c +io.c +ioRead.c +ioReadBench.c +ioReadBlif.c +ioReadEdif.c +ioReadPla.c +ioReadVerilog.c +ioUtil.c +ioWriteBench.c +ioWriteBlif.c +ioWriteCnf.c +ioWritePla.c +main.c +mainFrame.c +mainInit.c +mainUtils.c +cuddAddAbs.c +cuddAddApply.c +cuddAddFind.c +cuddAddInv.c +cuddAddIte.c +cuddAddNeg.c +cuddAddWalsh.c +cuddAndAbs.c +cuddAnneal.c +cuddApa.c +C:\_projects\abc\src\bdd\cudd\cuddApa.c(181) : warning C4244: 'return' : conversion from 'unsigned long ' to 'unsigned short ', possible loss of data +C:\_projects\abc\src\bdd\cudd\cuddApa.c(213) : warning C4244: 'return' : conversion from 'unsigned long ' to 'unsigned short ', possible loss of data +C:\_projects\abc\src\bdd\cudd\cuddApa.c(530) : warning C4244: '=' : conversion from 'unsigned short ' to 'unsigned char ', possible loss of data +C:\_projects\abc\src\bdd\cudd\cuddApa.c(588) : warning C4244: '=' : conversion from 'unsigned short ' to 'unsigned char ', possible loss of data +cuddAPI.c +cuddApprox.c +cuddBddAbs.c +cuddBddCorr.c +cuddBddIte.c +cuddBridge.c +cuddCache.c +C:\_projects\abc\src\bdd\cudd\cuddCache.c(902) : warning C4146: unary minus operator applied to unsigned type, result still unsigned +cuddCheck.c +cuddClip.c +cuddCof.c +cuddCompose.c +cuddDecomp.c +cuddEssent.c +cuddExact.c +cuddExport.c +cuddGenCof.c +cuddGenetic.c +cuddGroup.c +C:\_projects\abc\src\bdd\cudd\cuddGroup.c(2062) : warning C4018: '<=' : signed/unsigned mismatch +cuddHarwell.c +cuddInit.c +cuddInteract.c +cuddLCache.c +C:\_projects\abc\src\bdd\cudd\cuddLCache.c(1387) : warning C4146: unary minus operator applied to unsigned type, result still unsigned +cuddLevelQ.c +cuddLinear.c +cuddLiteral.c +cuddMatMult.c +cuddPriority.c +cuddRead.c +cuddRef.c +cuddReorder.c +C:\_projects\abc\src\bdd\cudd\cuddReorder.c(395) : warning C4146: unary minus operator applied to unsigned type, result still unsigned +cuddSat.c +C:\_projects\abc\src\bdd\cudd\cuddReorder.c(2016) : warning C4700: local variable 'minLevel' used without having been initialized +C:\_projects\abc\src\bdd\cudd\cuddReorder.c(2020) : warning C4700: local variable 'maxLevel' used without having been initialized +cuddSign.c +cuddSolve.c +cuddSplit.c +cuddSubsetHB.c +cuddSubsetSP.c +cuddSymmetry.c +cuddTable.c +C:\_projects\abc\src\bdd\cudd\cuddTable.c(1822) : warning C4018: '<' : signed/unsigned mismatch +C:\_projects\abc\src\bdd\cudd\cuddTable.c(1927) : warning C4018: '<' : signed/unsigned mismatch +C:\_projects\abc\src\bdd\cudd\cuddTable.c(2235) : warning C4018: '<' : signed/unsigned mismatch +C:\_projects\abc\src\bdd\cudd\cuddTable.c(2303) : warning C4018: '<' : signed/unsigned mismatch +C:\_projects\abc\src\bdd\cudd\cuddTable.c(2358) : warning C4146: unary minus operator applied to unsigned type, result still unsigned +cuddUtil.c +cuddWindow.c +cuddZddCount.c +cuddZddFuncs.c +cuddZddGroup.c +cuddZddIsop.c +cuddZddLin.c +cuddZddMisc.c +cuddZddPort.c +cuddZddReord.c +cuddZddSetop.c +cuddZddSymm.c +cuddZddUtil.c +epd.c +mtrBasic.c +mtrGroup.c +parseCore.c +parseStack.c +dsdApi.c +dsdCheck.c +dsdLocal.c +dsdMan.c +dsdProc.c +dsdTree.c +reoApi.c +reoCore.c +reoProfile.c +reoSift.c +reoSwap.c +reoTest.c +reoTransfer.c +reoUnits.c +mvc.c +mvcApi.c +mvcCompare.c +mvcContain.c +mvcCover.c +mvcCube.c +mvcDivide.c +mvcDivisor.c +mvcList.c +mvcLits.c +mvcMan.c +mvcOpAlg.c +mvcOpBool.c +mvcPrint.c +mvcSort.c +mvcUtils.c +ftFactor.c +ftPrint.c +added.c +solver.c +msatActivity.c +msatClause.c +msatClauseVec.c +msatMem.c +msatOrderJ.c +msatQueue.c +msatRead.c +msatSolverApi.c +msatSolverCore.c +msatSolverIo.c +msatSolverSearch.c +msatSort.c +msatVec.c +fraigApi.c +fraigCanon.c +fraigFanout.c +fraigFeed.c +fraigMan.c +fraigMem.c +fraigNode.c +fraigPrime.c +fraigSat.c +fraigTable.c +fraigUtil.c +fraigVec.c +simMan.c +simSat.c +simSupp.c +simSym.c +simUnate.c +simUtils.c +fxu.c +fxuCreate.c +fxuHeapD.c +fxuHeapS.c +fxuList.c +fxuMatrix.c +fxuPair.c +fxuPrint.c +fxuReduce.c +fxuSelect.c +fxuSingle.c +fxuUpdate.c +rwrEva.c +rwrExp.c +rwrLib.c +rwrMan.c +rwrPrint.c +rwrUtil.c +cutMan.c +cutMerge.c +cutNode.c +cutSeq.c +cutTable.c +cutTruth.c +fpga.c +fpgaCore.c +fpgaCreate.c +fpgaCut.c +fpgaCutUtils.c +fpgaFanout.c +fpgaLib.c +fpgaMatch.c +fpgaTime.c +fpgaTruth.c +fpgaUtils.c +fpgaVec.c +mapper.c +mapperCanon.c +mapperCore.c +mapperCreate.c +mapperCut.c +mapperCutUtils.c +mapperFanout.c +mapperLib.c +mapperMatch.c +mapperRefs.c +mapperSuper.c +mapperTable.c +mapperTime.c +mapperTree.c +mapperTruth.c +mapperUtils.c +mapperVec.c +mio.c +mioApi.c +mioFunc.c +mioRead.c +mioUtils.c +super.c +superAnd.c +superGate.c +superWrite.c +extraUtilBdd.c +extraUtilBitMatrix.c +extraUtilCanon.c +extraUtilFile.c +extraUtilMemory.c +extraUtilMisc.c +extraUtilProgress.c +extraUtilReader.c +st.c +stmm.c +cpu_stats.c +cpu_time.c +datalimit.c +getopt.c +pathsearch.c +safe_mem.c +strsav.c +texpand.c +rwrDec.c  Linking... -Creating temporary file "C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP2767.tmp" with contents +Creating temporary file "C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP2D59.tmp" with contents  [ -/nologo /o"Debug/abc.bsc"  -.\Debug\abc.sbr -.\Debug\abcAig.sbr -.\Debug\abcAttach.sbr -.\Debug\abcCheck.sbr -.\Debug\abcCollapse.sbr -.\Debug\abcCreate.sbr -.\Debug\abcCut.sbr -.\Debug\abcDfs.sbr -.\Debug\abcDsd.sbr -.\Debug\abcFanio.sbr -.\Debug\abcFpga.sbr -.\Debug\abcFraig.sbr -.\Debug\abcFunc.sbr -.\Debug\abcFxu.sbr -.\Debug\abcLatch.sbr -.\Debug\abcMap.sbr -.\Debug\abcMinBase.sbr -.\Debug\abcMiter.sbr -.\Debug\abcNames.sbr -.\Debug\abcNetlist.sbr -.\Debug\abcPrint.sbr -.\Debug\abcReconv.sbr -.\Debug\abcRefactor.sbr -.\Debug\abcRefs.sbr -.\Debug\abcRenode.sbr -.\Debug\abcRewrite.sbr -.\Debug\abcSat.sbr -.\Debug\abcSeq.sbr -.\Debug\abcSeqRetime.sbr -.\Debug\abcShow.sbr -.\Debug\abcSop.sbr -.\Debug\abcStrash.sbr -.\Debug\abcSweep.sbr -.\Debug\abcTiming.sbr -.\Debug\abcUnreach.sbr -.\Debug\abcUtil.sbr -.\Debug\abcVerify.sbr -.\Debug\cmd.sbr -.\Debug\cmdAlias.sbr -.\Debug\cmdApi.sbr -.\Debug\cmdFlag.sbr -.\Debug\cmdHist.sbr -.\Debug\cmdUtils.sbr -.\Debug\io.sbr -.\Debug\ioRead.sbr -.\Debug\ioReadBench.sbr -.\Debug\ioReadBlif.sbr -.\Debug\ioReadEdif.sbr -.\Debug\ioReadPla.sbr -.\Debug\ioReadVerilog.sbr -.\Debug\ioUtil.sbr -.\Debug\ioWriteBench.sbr -.\Debug\ioWriteBlif.sbr -.\Debug\ioWriteCnf.sbr -.\Debug\ioWritePla.sbr -.\Debug\main.sbr -.\Debug\mainFrame.sbr -.\Debug\mainInit.sbr -.\Debug\mainUtils.sbr -.\Debug\cuddAddAbs.sbr -.\Debug\cuddAddApply.sbr -.\Debug\cuddAddFind.sbr -.\Debug\cuddAddInv.sbr -.\Debug\cuddAddIte.sbr -.\Debug\cuddAddNeg.sbr -.\Debug\cuddAddWalsh.sbr -.\Debug\cuddAndAbs.sbr -.\Debug\cuddAnneal.sbr -.\Debug\cuddApa.sbr -.\Debug\cuddAPI.sbr -.\Debug\cuddApprox.sbr -.\Debug\cuddBddAbs.sbr -.\Debug\cuddBddCorr.sbr -.\Debug\cuddBddIte.sbr -.\Debug\cuddBridge.sbr -.\Debug\cuddCache.sbr -.\Debug\cuddCheck.sbr -.\Debug\cuddClip.sbr -.\Debug\cuddCof.sbr -.\Debug\cuddCompose.sbr -.\Debug\cuddDecomp.sbr -.\Debug\cuddEssent.sbr -.\Debug\cuddExact.sbr -.\Debug\cuddExport.sbr -.\Debug\cuddGenCof.sbr -.\Debug\cuddGenetic.sbr -.\Debug\cuddGroup.sbr -.\Debug\cuddHarwell.sbr -.\Debug\cuddInit.sbr -.\Debug\cuddInteract.sbr -.\Debug\cuddLCache.sbr -.\Debug\cuddLevelQ.sbr -.\Debug\cuddLinear.sbr -.\Debug\cuddLiteral.sbr -.\Debug\cuddMatMult.sbr -.\Debug\cuddPriority.sbr -.\Debug\cuddRead.sbr -.\Debug\cuddRef.sbr -.\Debug\cuddReorder.sbr -.\Debug\cuddSat.sbr -.\Debug\cuddSign.sbr -.\Debug\cuddSolve.sbr -.\Debug\cuddSplit.sbr -.\Debug\cuddSubsetHB.sbr -.\Debug\cuddSubsetSP.sbr -.\Debug\cuddSymmetry.sbr -.\Debug\cuddTable.sbr -.\Debug\cuddUtil.sbr -.\Debug\cuddWindow.sbr -.\Debug\cuddZddCount.sbr -.\Debug\cuddZddFuncs.sbr -.\Debug\cuddZddGroup.sbr -.\Debug\cuddZddIsop.sbr -.\Debug\cuddZddLin.sbr -.\Debug\cuddZddMisc.sbr -.\Debug\cuddZddPort.sbr -.\Debug\cuddZddReord.sbr -.\Debug\cuddZddSetop.sbr -.\Debug\cuddZddSymm.sbr -.\Debug\cuddZddUtil.sbr -.\Debug\epd.sbr -.\Debug\mtrBasic.sbr -.\Debug\mtrGroup.sbr -.\Debug\parseCore.sbr -.\Debug\parseStack.sbr -.\Debug\dsdApi.sbr -.\Debug\dsdCheck.sbr -.\Debug\dsdLocal.sbr -.\Debug\dsdMan.sbr -.\Debug\dsdProc.sbr -.\Debug\dsdTree.sbr -.\Debug\reoApi.sbr -.\Debug\reoCore.sbr -.\Debug\reoProfile.sbr -.\Debug\reoSift.sbr -.\Debug\reoSwap.sbr -.\Debug\reoTest.sbr -.\Debug\reoTransfer.sbr -.\Debug\reoUnits.sbr -.\Debug\mvc.sbr -.\Debug\mvcApi.sbr -.\Debug\mvcCompare.sbr -.\Debug\mvcContain.sbr -.\Debug\mvcCover.sbr -.\Debug\mvcCube.sbr -.\Debug\mvcDivide.sbr -.\Debug\mvcDivisor.sbr -.\Debug\mvcList.sbr -.\Debug\mvcLits.sbr -.\Debug\mvcMan.sbr -.\Debug\mvcOpAlg.sbr -.\Debug\mvcOpBool.sbr -.\Debug\mvcPrint.sbr -.\Debug\mvcSort.sbr -.\Debug\mvcUtils.sbr -.\Debug\ftFactor.sbr -.\Debug\ftPrint.sbr -.\Debug\added.sbr -.\Debug\solver.sbr -.\Debug\msatActivity.sbr -.\Debug\msatClause.sbr -.\Debug\msatClauseVec.sbr -.\Debug\msatMem.sbr -.\Debug\msatOrderJ.sbr -.\Debug\msatQueue.sbr -.\Debug\msatRead.sbr -.\Debug\msatSolverApi.sbr -.\Debug\msatSolverCore.sbr -.\Debug\msatSolverIo.sbr -.\Debug\msatSolverSearch.sbr -.\Debug\msatSort.sbr -.\Debug\msatVec.sbr -.\Debug\fraigApi.sbr -.\Debug\fraigCanon.sbr -.\Debug\fraigFanout.sbr -.\Debug\fraigFeed.sbr -.\Debug\fraigMan.sbr -.\Debug\fraigMem.sbr -.\Debug\fraigNode.sbr -.\Debug\fraigPrime.sbr -.\Debug\fraigSat.sbr -.\Debug\fraigTable.sbr -.\Debug\fraigUtil.sbr -.\Debug\fraigVec.sbr -.\Debug\simMan.sbr -.\Debug\simSat.sbr -.\Debug\simSupp.sbr -.\Debug\simSym.sbr -.\Debug\simUnate.sbr -.\Debug\simUtils.sbr -.\Debug\fxu.sbr -.\Debug\fxuCreate.sbr -.\Debug\fxuHeapD.sbr -.\Debug\fxuHeapS.sbr -.\Debug\fxuList.sbr -.\Debug\fxuMatrix.sbr -.\Debug\fxuPair.sbr -.\Debug\fxuPrint.sbr -.\Debug\fxuReduce.sbr -.\Debug\fxuSelect.sbr -.\Debug\fxuSingle.sbr -.\Debug\fxuUpdate.sbr -.\Debug\rwrCut.sbr -.\Debug\rwrEva.sbr -.\Debug\rwrExp.sbr -.\Debug\rwrLib.sbr -.\Debug\rwrMan.sbr -.\Debug\rwrPrint.sbr -.\Debug\rwrUtil.sbr -.\Debug\cutMan.sbr -.\Debug\cutMerge.sbr -.\Debug\cutNode.sbr -.\Debug\cutSeq.sbr -.\Debug\cutTable.sbr -.\Debug\cutTruth.sbr -.\Debug\fpga.sbr -.\Debug\fpgaCore.sbr -.\Debug\fpgaCreate.sbr -.\Debug\fpgaCut.sbr -.\Debug\fpgaCutUtils.sbr -.\Debug\fpgaFanout.sbr -.\Debug\fpgaLib.sbr -.\Debug\fpgaMatch.sbr -.\Debug\fpgaTime.sbr -.\Debug\fpgaTruth.sbr -.\Debug\fpgaUtils.sbr -.\Debug\fpgaVec.sbr -.\Debug\mapper.sbr -.\Debug\mapperCanon.sbr -.\Debug\mapperCore.sbr -.\Debug\mapperCreate.sbr -.\Debug\mapperCut.sbr -.\Debug\mapperCutUtils.sbr -.\Debug\mapperFanout.sbr -.\Debug\mapperLib.sbr -.\Debug\mapperMatch.sbr -.\Debug\mapperRefs.sbr -.\Debug\mapperSuper.sbr -.\Debug\mapperTable.sbr -.\Debug\mapperTime.sbr -.\Debug\mapperTree.sbr -.\Debug\mapperTruth.sbr -.\Debug\mapperUtils.sbr -.\Debug\mapperVec.sbr -.\Debug\mio.sbr -.\Debug\mioApi.sbr -.\Debug\mioFunc.sbr -.\Debug\mioRead.sbr -.\Debug\mioUtils.sbr -.\Debug\super.sbr -.\Debug\superAnd.sbr -.\Debug\superGate.sbr -.\Debug\superWrite.sbr -.\Debug\extraUtilBdd.sbr -.\Debug\extraUtilBitMatrix.sbr -.\Debug\extraUtilCanon.sbr -.\Debug\extraUtilFile.sbr -.\Debug\extraUtilMemory.sbr -.\Debug\extraUtilMisc.sbr -.\Debug\extraUtilProgress.sbr -.\Debug\extraUtilReader.sbr -.\Debug\st.sbr -.\Debug\stmm.sbr -.\Debug\cpu_stats.sbr -.\Debug\cpu_time.sbr -.\Debug\datalimit.sbr -.\Debug\getopt.sbr -.\Debug\pathsearch.sbr -.\Debug\safe_mem.sbr -.\Debug\strsav.sbr -.\Debug\texpand.sbr -.\Debug\abcBalance.sbr] -Creating command line "bscmake.exe @C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP2767.tmp" +/nologo /o"Release/abc.bsc"  +.\Release\abc.sbr +.\Release\abcAig.sbr +.\Release\abcAttach.sbr +.\Release\abcBalance.sbr +.\Release\abcCheck.sbr +.\Release\abcCollapse.sbr +.\Release\abcCreate.sbr +.\Release\abcCut.sbr +.\Release\abcDfs.sbr +.\Release\abcDsd.sbr +.\Release\abcFanio.sbr +.\Release\abcFpga.sbr +.\Release\abcFraig.sbr +.\Release\abcFunc.sbr +.\Release\abcFxu.sbr +.\Release\abcLatch.sbr +.\Release\abcMap.sbr +.\Release\abcMinBase.sbr +.\Release\abcMiter.sbr +.\Release\abcNames.sbr +.\Release\abcNetlist.sbr +.\Release\abcPrint.sbr +.\Release\abcReconv.sbr +.\Release\abcRefactor.sbr +.\Release\abcRefs.sbr +.\Release\abcRenode.sbr +.\Release\abcRewrite.sbr +.\Release\abcSat.sbr +.\Release\abcSeq.sbr +.\Release\abcSeqRetime.sbr +.\Release\abcShow.sbr +.\Release\abcSop.sbr +.\Release\abcStrash.sbr +.\Release\abcSweep.sbr +.\Release\abcTiming.sbr +.\Release\abcUnreach.sbr +.\Release\abcUtil.sbr +.\Release\abcVerify.sbr +.\Release\cmd.sbr +.\Release\cmdAlias.sbr +.\Release\cmdApi.sbr +.\Release\cmdFlag.sbr +.\Release\cmdHist.sbr +.\Release\cmdUtils.sbr +.\Release\io.sbr +.\Release\ioRead.sbr +.\Release\ioReadBench.sbr +.\Release\ioReadBlif.sbr +.\Release\ioReadEdif.sbr +.\Release\ioReadPla.sbr +.\Release\ioReadVerilog.sbr +.\Release\ioUtil.sbr +.\Release\ioWriteBench.sbr +.\Release\ioWriteBlif.sbr +.\Release\ioWriteCnf.sbr +.\Release\ioWritePla.sbr +.\Release\main.sbr +.\Release\mainFrame.sbr +.\Release\mainInit.sbr +.\Release\mainUtils.sbr +.\Release\cuddAddAbs.sbr +.\Release\cuddAddApply.sbr +.\Release\cuddAddFind.sbr +.\Release\cuddAddInv.sbr +.\Release\cuddAddIte.sbr +.\Release\cuddAddNeg.sbr +.\Release\cuddAddWalsh.sbr +.\Release\cuddAndAbs.sbr +.\Release\cuddAnneal.sbr +.\Release\cuddApa.sbr +.\Release\cuddAPI.sbr +.\Release\cuddApprox.sbr +.\Release\cuddBddAbs.sbr +.\Release\cuddBddCorr.sbr +.\Release\cuddBddIte.sbr +.\Release\cuddBridge.sbr +.\Release\cuddCache.sbr +.\Release\cuddCheck.sbr +.\Release\cuddClip.sbr +.\Release\cuddCof.sbr +.\Release\cuddCompose.sbr +.\Release\cuddDecomp.sbr +.\Release\cuddEssent.sbr +.\Release\cuddExact.sbr +.\Release\cuddExport.sbr +.\Release\cuddGenCof.sbr +.\Release\cuddGenetic.sbr +.\Release\cuddGroup.sbr +.\Release\cuddHarwell.sbr +.\Release\cuddInit.sbr +.\Release\cuddInteract.sbr +.\Release\cuddLCache.sbr +.\Release\cuddLevelQ.sbr +.\Release\cuddLinear.sbr +.\Release\cuddLiteral.sbr +.\Release\cuddMatMult.sbr +.\Release\cuddPriority.sbr +.\Release\cuddRead.sbr +.\Release\cuddRef.sbr +.\Release\cuddReorder.sbr +.\Release\cuddSat.sbr +.\Release\cuddSign.sbr +.\Release\cuddSolve.sbr +.\Release\cuddSplit.sbr +.\Release\cuddSubsetHB.sbr +.\Release\cuddSubsetSP.sbr +.\Release\cuddSymmetry.sbr +.\Release\cuddTable.sbr +.\Release\cuddUtil.sbr +.\Release\cuddWindow.sbr +.\Release\cuddZddCount.sbr +.\Release\cuddZddFuncs.sbr +.\Release\cuddZddGroup.sbr +.\Release\cuddZddIsop.sbr +.\Release\cuddZddLin.sbr +.\Release\cuddZddMisc.sbr +.\Release\cuddZddPort.sbr +.\Release\cuddZddReord.sbr +.\Release\cuddZddSetop.sbr +.\Release\cuddZddSymm.sbr +.\Release\cuddZddUtil.sbr +.\Release\epd.sbr +.\Release\mtrBasic.sbr +.\Release\mtrGroup.sbr +.\Release\parseCore.sbr +.\Release\parseStack.sbr +.\Release\dsdApi.sbr +.\Release\dsdCheck.sbr +.\Release\dsdLocal.sbr +.\Release\dsdMan.sbr +.\Release\dsdProc.sbr +.\Release\dsdTree.sbr +.\Release\reoApi.sbr +.\Release\reoCore.sbr +.\Release\reoProfile.sbr +.\Release\reoSift.sbr +.\Release\reoSwap.sbr +.\Release\reoTest.sbr +.\Release\reoTransfer.sbr +.\Release\reoUnits.sbr +.\Release\mvc.sbr +.\Release\mvcApi.sbr +.\Release\mvcCompare.sbr +.\Release\mvcContain.sbr +.\Release\mvcCover.sbr +.\Release\mvcCube.sbr +.\Release\mvcDivide.sbr +.\Release\mvcDivisor.sbr +.\Release\mvcList.sbr +.\Release\mvcLits.sbr +.\Release\mvcMan.sbr +.\Release\mvcOpAlg.sbr +.\Release\mvcOpBool.sbr +.\Release\mvcPrint.sbr +.\Release\mvcSort.sbr +.\Release\mvcUtils.sbr +.\Release\ftFactor.sbr +.\Release\ftPrint.sbr +.\Release\added.sbr +.\Release\solver.sbr +.\Release\msatActivity.sbr +.\Release\msatClause.sbr +.\Release\msatClauseVec.sbr +.\Release\msatMem.sbr +.\Release\msatOrderJ.sbr +.\Release\msatQueue.sbr +.\Release\msatRead.sbr +.\Release\msatSolverApi.sbr +.\Release\msatSolverCore.sbr +.\Release\msatSolverIo.sbr +.\Release\msatSolverSearch.sbr +.\Release\msatSort.sbr +.\Release\msatVec.sbr +.\Release\fraigApi.sbr +.\Release\fraigCanon.sbr +.\Release\fraigFanout.sbr +.\Release\fraigFeed.sbr +.\Release\fraigMan.sbr +.\Release\fraigMem.sbr +.\Release\fraigNode.sbr +.\Release\fraigPrime.sbr +.\Release\fraigSat.sbr +.\Release\fraigTable.sbr +.\Release\fraigUtil.sbr +.\Release\fraigVec.sbr +.\Release\simMan.sbr +.\Release\simSat.sbr +.\Release\simSupp.sbr +.\Release\simSym.sbr +.\Release\simUnate.sbr +.\Release\simUtils.sbr +.\Release\fxu.sbr +.\Release\fxuCreate.sbr +.\Release\fxuHeapD.sbr +.\Release\fxuHeapS.sbr +.\Release\fxuList.sbr +.\Release\fxuMatrix.sbr +.\Release\fxuPair.sbr +.\Release\fxuPrint.sbr +.\Release\fxuReduce.sbr +.\Release\fxuSelect.sbr +.\Release\fxuSingle.sbr +.\Release\fxuUpdate.sbr +.\Release\rwrEva.sbr +.\Release\rwrExp.sbr +.\Release\rwrLib.sbr +.\Release\rwrMan.sbr +.\Release\rwrPrint.sbr +.\Release\rwrUtil.sbr +.\Release\cutMan.sbr +.\Release\cutMerge.sbr +.\Release\cutNode.sbr +.\Release\cutSeq.sbr +.\Release\cutTable.sbr +.\Release\cutTruth.sbr +.\Release\fpga.sbr +.\Release\fpgaCore.sbr +.\Release\fpgaCreate.sbr +.\Release\fpgaCut.sbr +.\Release\fpgaCutUtils.sbr +.\Release\fpgaFanout.sbr +.\Release\fpgaLib.sbr +.\Release\fpgaMatch.sbr +.\Release\fpgaTime.sbr +.\Release\fpgaTruth.sbr +.\Release\fpgaUtils.sbr +.\Release\fpgaVec.sbr +.\Release\mapper.sbr +.\Release\mapperCanon.sbr +.\Release\mapperCore.sbr +.\Release\mapperCreate.sbr +.\Release\mapperCut.sbr +.\Release\mapperCutUtils.sbr +.\Release\mapperFanout.sbr +.\Release\mapperLib.sbr +.\Release\mapperMatch.sbr +.\Release\mapperRefs.sbr +.\Release\mapperSuper.sbr +.\Release\mapperTable.sbr +.\Release\mapperTime.sbr +.\Release\mapperTree.sbr +.\Release\mapperTruth.sbr +.\Release\mapperUtils.sbr +.\Release\mapperVec.sbr +.\Release\mio.sbr +.\Release\mioApi.sbr +.\Release\mioFunc.sbr +.\Release\mioRead.sbr +.\Release\mioUtils.sbr +.\Release\super.sbr +.\Release\superAnd.sbr +.\Release\superGate.sbr +.\Release\superWrite.sbr +.\Release\extraUtilBdd.sbr +.\Release\extraUtilBitMatrix.sbr +.\Release\extraUtilCanon.sbr +.\Release\extraUtilFile.sbr +.\Release\extraUtilMemory.sbr +.\Release\extraUtilMisc.sbr +.\Release\extraUtilProgress.sbr +.\Release\extraUtilReader.sbr +.\Release\st.sbr +.\Release\stmm.sbr +.\Release\cpu_stats.sbr +.\Release\cpu_time.sbr +.\Release\datalimit.sbr +.\Release\getopt.sbr +.\Release\pathsearch.sbr +.\Release\safe_mem.sbr +.\Release\strsav.sbr +.\Release\texpand.sbr +.\Release\rwrDec.sbr] +Creating command line "bscmake.exe @C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP2D59.tmp"  Creating browse info file...  <h3>Output Window</h3>  <h3>Results</h3> -abc.exe - 0 error(s), 0 warning(s) +abc.exe - 0 error(s), 15 warning(s)  </pre>  </body>  </html> @@ -20,6 +20,7 @@ alias rv read_verilog  alias rsup read_super mcnc5_old.super  alias rlib read_library  alias rw rewrite +alias rwz rewrite -z  alias rf refactor  alias rfz refactor -z  alias sa set autoexec ps @@ -31,7 +32,7 @@ alias wl write_blif  alias wp write_pla  alias cnf   "st; renode -c; write_cnf"  alias prove "st; renode -c; sat" -alias opt   "st; b; renode; sop; ps" -alias opts  "st; b; renode; sop; st; b; ps" -alias share "st; b; renode -m; fx; st; b; ps" +alias opt   "b; renode; sop; b; ps" +alias share "b; renode -m; fx; b; ps" +alias resyn "b; rwz; rfz; b; rwz; rfz; b; ps" diff --git a/src/base/abc/abc.c b/src/base/abc/abc.c index 7d9f9725..c2b739b5 100644 --- a/src/base/abc/abc.c +++ b/src/base/abc/abc.c @@ -848,7 +848,7 @@ usage:  int Abc_CommandBalance( Abc_Frame_t * pAbc, int argc, char ** argv )  {      FILE * pOut, * pErr; -    Abc_Ntk_t * pNtk, * pNtkRes; +    Abc_Ntk_t * pNtk, * pNtkRes, * pNtkTemp;      int c;      int fDuplicate; @@ -878,14 +878,25 @@ int Abc_CommandBalance( Abc_Frame_t * pAbc, int argc, char ** argv )          fprintf( pErr, "Empty network.\n" );          return 1;      } -    if ( !Abc_NtkIsAig(pNtk) ) + +    // get the new network +    if ( Abc_NtkIsAig(pNtk) )      { -        fprintf( pErr, "Cannot balance a network that is not an AIG.\n" ); -        return 1; +        pNtkRes = Abc_NtkBalance( pNtk, fDuplicate ); +    } +    else +    { +        pNtkTemp = Abc_NtkStrash( pNtk, 0 ); +        if ( pNtkTemp == NULL ) +        { +            fprintf( pErr, "Strashing before balancing has failed.\n" ); +            return 1; +        } +        pNtkRes = Abc_NtkBalance( pNtkTemp, fDuplicate ); +        Abc_NtkDelete( pNtkTemp );      } -    // get the new network -    pNtkRes = Abc_NtkBalance( pNtk, fDuplicate ); +    // check if balancing worked      if ( pNtkRes == NULL )      {          fprintf( pErr, "Balancing has failed.\n" ); @@ -897,7 +908,7 @@ int Abc_CommandBalance( Abc_Frame_t * pAbc, int argc, char ** argv )  usage:      fprintf( pErr, "usage: balance [-dh]\n" ); -    fprintf( pErr, "\t        transforms an AIG into a well-balanced AIG\n" ); +    fprintf( pErr, "\t        transforms the current network into a well-balanced AIG\n" );      fprintf( pErr, "\t-d    : toggle duplication of logic [default = %s]\n", fDuplicate? "yes": "no" );      fprintf( pErr, "\t-h    : print the command usage\n");      return 1; @@ -1327,27 +1338,32 @@ int Abc_CommandRewrite( Abc_Frame_t * pAbc, int argc, char ** argv )      FILE * pOut, * pErr;      Abc_Ntk_t * pNtk;      int c; -    bool fVerbose;      bool fPrecompute; +    bool fUseZeros; +    bool fVerbose;      // external functions      extern void   Rwr_Precompute(); -    extern int    Abc_NtkRewrite( Abc_Ntk_t * pNtk ); +    extern int    Abc_NtkRewrite( Abc_Ntk_t * pNtk, int fUseZeros, int fVerbose );      pNtk = Abc_FrameReadNet(pAbc);      pOut = Abc_FrameReadOut(pAbc);      pErr = Abc_FrameReadErr(pAbc);      // set defaults -    fVerbose    = 0;      fPrecompute = 0; +    fUseZeros   = 0; +    fVerbose    = 0;      util_getopt_reset(); -    while ( ( c = util_getopt( argc, argv, "zvh" ) ) != EOF ) +    while ( ( c = util_getopt( argc, argv, "xzvh" ) ) != EOF )      {          switch ( c )          { -        case 'z': +        case 'x':              fPrecompute ^= 1;              break; +        case 'z': +            fUseZeros ^= 1; +            break;          case 'v':              fVerbose ^= 1;              break; @@ -1381,7 +1397,7 @@ int Abc_CommandRewrite( Abc_Frame_t * pAbc, int argc, char ** argv )      }      // modify the current network -    if ( !Abc_NtkRewrite( pNtk ) ) +    if ( !Abc_NtkRewrite( pNtk, fUseZeros, fVerbose ) )      {          fprintf( pErr, "Rewriting has failed.\n" );          return 1; @@ -1389,8 +1405,9 @@ int Abc_CommandRewrite( Abc_Frame_t * pAbc, int argc, char ** argv )      return 0;  usage: -    fprintf( pErr, "usage: rewrite [-vh]\n" ); +    fprintf( pErr, "usage: rewrite [-zvh]\n" );      fprintf( pErr, "\t         performs technology-independent rewriting of the AIG\n" ); +    fprintf( pErr, "\t-z     : toggle using zero-cost replacements [default = %s]\n", fUseZeros? "yes": "no" );      fprintf( pErr, "\t-v     : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" );      fprintf( pErr, "\t-h     : print the command usage\n");      return 1; @@ -1428,7 +1445,7 @@ int Abc_CommandRefactor( Abc_Frame_t * pAbc, int argc, char ** argv )      nConeSizeMax = 16;      fUseZeros    =  0;      fUseDcs      =  0; -    fVerbose     =  1; +    fVerbose     =  0;      util_getopt_reset();      while ( ( c = util_getopt( argc, argv, "NCzdvh" ) ) != EOF )      { diff --git a/src/base/abc/abc.h b/src/base/abc/abc.h index ff1252c1..200d2501 100644 --- a/src/base/abc/abc.h +++ b/src/base/abc/abc.h @@ -144,8 +144,13 @@ struct Abc_Ntk_t_      int              nPos;          // the number of primary outputs      // the functionality manager       void *           pManFunc;      // AIG manager, BDD manager, or memory manager for SOPs -    // the timing manager +    // the timing manager (for mapped networks)      Abc_ManTime_t *  pManTime;      // stores arrival/required times for all nodes +    // the cut manager (for AIGs) +    void *           pManCut;       // stores information about the cuts computed for the nodes +    // level information (for AIGs) +    int              LevelMax;      // maximum number of levels +    Vec_Int_t *      vLevelsR;       // level in the reverse topological order       // the external don't-care if given      Abc_Ntk_t *      pExdc;         // the EXDC network      // miscellaneous data members @@ -423,6 +428,11 @@ extern Abc_Obj_t *        Abc_NodeCreateAnd( Abc_Ntk_t * pNtk, Vec_Ptr_t * vFani  extern Abc_Obj_t *        Abc_NodeCreateOr( Abc_Ntk_t * pNtk, Vec_Ptr_t * vFanins );  extern Abc_Obj_t *        Abc_NodeCreateMux( Abc_Ntk_t * pNtk, Abc_Obj_t * pNodeC, Abc_Obj_t * pNode1, Abc_Obj_t * pNode0 );  extern Abc_Obj_t *        Abc_NodeClone( Abc_Obj_t * pNode ); +/*=== abcCut.c ==========================================================*/ +extern void *             Abc_NodeGetCutsRecursive( void * p, Abc_Obj_t * pObj ); +extern void *             Abc_NodeGetCuts( void * p, Abc_Obj_t * pObj ); +extern void *             Abc_NodeReadCuts( void * p, Abc_Obj_t * pObj ); +extern void               Abc_NodeFreeCuts( void * p, Abc_Obj_t * pObj );  /*=== abcDfs.c ==========================================================*/  extern Vec_Ptr_t *        Abc_NtkDfs( Abc_Ntk_t * pNtk, int fCollectAll );  extern Vec_Ptr_t *        Abc_NtkDfsNodes( Abc_Ntk_t * pNtk, Abc_Obj_t ** ppNodes, int nNodes ); @@ -572,7 +582,11 @@ extern void               Abc_NtkSetNodeLevelsArrival( Abc_Ntk_t * pNtk );  extern float *            Abc_NtkGetCiArrivalFloats( Abc_Ntk_t * pNtk );  extern Abc_Time_t *       Abc_NtkGetCiArrivalTimes( Abc_Ntk_t * pNtk );  extern float              Abc_NtkDelayTrace( Abc_Ntk_t * pNtk ); -extern Vec_Int_t *        Abc_NtkGetRequiredLevels( Abc_Ntk_t * pNtk ); +extern void               Abc_NtkStartReverseLevels( Abc_Ntk_t * pNtk ); +extern void               Abc_NtkStopReverseLevels( Abc_Ntk_t * pNtk ); +extern void               Abc_NodeSetReverseLevel( Abc_Obj_t * pObj, int LevelR ); +extern int                Abc_NodeReadReverseLevel( Abc_Obj_t * pObj ); +extern int                Abc_NodeReadRequiredLevel( Abc_Obj_t * pObj );  /*=== abcTravId.c ==========================================================*/  extern void               Abc_NtkIncrementTravId( Abc_Ntk_t * pNtk );  extern void               Abc_NodeSetTravId( Abc_Obj_t * pObj, int TravId ); @@ -609,6 +623,7 @@ extern void               Abc_NodeFreeFaninNames( Vec_Ptr_t * vNames );  extern char **            Abc_NtkCollectCioNames( Abc_Ntk_t * pNtk, int fCollectCos );  extern void               Abc_NtkAlphaOrderSignals( Abc_Ntk_t * pNtk, int fComb );  extern void               Abc_NtkShortNames( Abc_Ntk_t * pNtk ); +extern Vec_Int_t *        Abc_NtkFanoutCounts( Abc_Ntk_t * pNtk );  ////////////////////////////////////////////////////////////////////////  ///                       END OF FILE                                /// diff --git a/src/base/abc/abcAig.c b/src/base/abc/abcAig.c index 883c544f..d42fdac0 100644 --- a/src/base/abc/abcAig.c +++ b/src/base/abc/abcAig.c @@ -58,6 +58,7 @@ struct Abc_Aig_t_      Vec_Ptr_t *       vStackReplaceOld;  // the nodes to be replaced      Vec_Ptr_t *       vStackReplaceNew;  // the nodes to be used for replacement      Vec_Vec_t *       vLevels;           // the nodes to be updated +    Vec_Vec_t *       vLevelsR;          // the nodes to be updated  };  // iterators through the entries in the linked lists of nodes @@ -85,6 +86,9 @@ static void        Abc_AigResize( Abc_Aig_t * pMan );  static void        Abc_AigReplace_int( Abc_Aig_t * pMan );  static void        Abc_AigDelete_int( Abc_Aig_t * pMan );  static void        Abc_AigUpdateLevel_int( Abc_Aig_t * pMan ); +static void        Abc_AigUpdateLevelR_int( Abc_Aig_t * pMan ); +static void        Abc_AigRemoveFromLevelStructure( Vec_Vec_t * vStruct, Abc_Obj_t * pNode ); +static void        Abc_AigRemoveFromLevelStructureR( Vec_Vec_t * vStruct, Abc_Obj_t * pNode );  ////////////////////////////////////////////////////////////////////////  ///                     FUNCTION DEFITIONS                           /// @@ -116,6 +120,7 @@ Abc_Aig_t * Abc_AigAlloc( Abc_Ntk_t * pNtkAig )      pMan->vStackReplaceOld = Vec_PtrAlloc( 100 );      pMan->vStackReplaceNew = Vec_PtrAlloc( 100 );      pMan->vLevels          = Vec_VecAlloc( 100 ); +    pMan->vLevelsR         = Vec_VecAlloc( 100 );      // save the current network      pMan->pNtkAig = pNtkAig;      // allocate constant nodes @@ -199,6 +204,7 @@ void Abc_AigFree( Abc_Aig_t * pMan )      assert( Vec_PtrSize( pMan->vStackReplaceNew ) == 0 );      // free the table      Vec_VecFree( pMan->vLevels ); +    Vec_VecFree( pMan->vLevelsR );      Vec_PtrFree( pMan->vStackDelete );      Vec_PtrFree( pMan->vStackReplaceOld );      Vec_PtrFree( pMan->vStackReplaceNew ); @@ -381,6 +387,9 @@ Abc_Obj_t * Abc_AigAndCreate( Abc_Aig_t * pMan, Abc_Obj_t * p0, Abc_Obj_t * p1 )      pAnd->pNext      = pMan->pBins[Key];      pMan->pBins[Key] = pAnd;      pMan->nEntries++; +    // create the cuts if defined +//    if ( pAnd->pNtk->pManCut ) +//        Abc_NodeGetCuts( pAnd->pNtk->pManCut, pAnd );      return pAnd;  } @@ -399,6 +408,7 @@ Abc_Obj_t * Abc_AigAndCreateFrom( Abc_Aig_t * pMan, Abc_Obj_t * p0, Abc_Obj_t *  {      Abc_Obj_t * pTemp;      unsigned Key; +    assert( !Abc_ObjIsComplement(pAnd) );      // order the arguments      if ( Abc_ObjRegular(p0)->Id > Abc_ObjRegular(p1)->Id )          pTemp = p0, p0 = p1, p1 = pTemp; @@ -412,6 +422,9 @@ Abc_Obj_t * Abc_AigAndCreateFrom( Abc_Aig_t * pMan, Abc_Obj_t * p0, Abc_Obj_t *      Key = Abc_HashKey2( p0, p1, pMan->nBins );      pAnd->pNext      = pMan->pBins[Key];      pMan->pBins[Key] = pAnd; +    // create the cuts if defined +//    if ( pAnd->pNtk->pManCut ) +//        Abc_NodeGetCuts( pAnd->pNtk->pManCut, pAnd );      return pAnd;  } @@ -494,6 +507,9 @@ void Abc_AigAndDelete( Abc_Aig_t * pMan, Abc_Obj_t * pThis )      }      assert( pAnd == pThis );      pMan->nEntries--; +    // delete the cuts if defined +    if ( pThis->pNtk->pManCut ) +        Abc_NodeFreeCuts( pThis->pNtk->pManCut, pThis );  }  /**Function************************************************************* @@ -644,9 +660,8 @@ void Abc_AigReplace( Abc_Aig_t * pMan, Abc_Obj_t * pOld, Abc_Obj_t * pNew )      Vec_PtrPush( pMan->vStackReplaceNew, pNew );      while ( Vec_PtrSize(pMan->vStackReplaceOld) )          Abc_AigReplace_int( pMan ); -//    while ( Vec_PtrSize(pMan->vStackDelete) ) -//        Abc_AigDelete_int( pMan );      Abc_AigUpdateLevel_int( pMan ); +    Abc_AigUpdateLevelR_int( pMan );  }  /**Function************************************************************* @@ -705,8 +720,14 @@ void Abc_AigReplace_int( Abc_Aig_t * pMan )          Abc_ObjRemoveFanins( pFanout );          // recreate the old fanout with new fanins and add it to the table          Abc_AigAndCreateFrom( pMan, pFanin1, pFanin2, pFanout ); -        // schedule the updated fanout for updating level +        // schedule the updated fanout for updating direct level +        assert( pFanout->fMarkA == 0 ); +        pFanout->fMarkA = 1;          Vec_VecPush( pMan->vLevels, pFanout->Level, pFanout ); +        // schedule the updated fanout for updating reverse level +        assert( pFanout->fMarkB == 0 ); +        pFanout->fMarkB = 1; +        Vec_VecPush( pMan->vLevelsR, Abc_NodeReadReverseLevel(pFanout), pFanout );          // the fanout has changed, update EXOR status of its fanouts          Abc_ObjForEachFanout( pFanout, pFanoutFanout, v )              if ( Abc_NodeIsAigAnd(pFanoutFanout) ) @@ -764,15 +785,47 @@ void Abc_AigDelete_int( Abc_Aig_t * pMan )      // collect the MFFC      vNodes = Abc_NodeMffcCollect( pRoot ); + +    // if reverse levels are specified, schedule fanins of MFFC for updating +    // currently, we do not do it because we do not know the correct level of the fanins +    // also, it is unlikely that this will make a difference since we are +    // processing the network forward while at this point fanins are left behind... +/* +    if ( pObj->pNtk->vLevelsR ) +        Vec_PtrForEachEntry( vNodes, pObj, k ) +        { +            Abc_Obj_t * pFanin; +            if ( Abc_ObjIsCi(pObj) ) +                continue; +            pFanin = Abc_ObjFanin0(pObj); +            if ( pFanin->fMarkB == 0 ) +            { +                pFanin->fMarkB = 1; +                Vec_VecPush( pMan->vLevelsR, Abc_NodeReadReverseLevel(pFanin), pFanin ); +            } +            pFanin = Abc_ObjFanin1(pObj); +            if ( pFanin->fMarkB == 0 ) +            { +                pFanin->fMarkB = 1; +                Vec_VecPush( pMan->vLevelsR, Abc_NodeReadReverseLevel(pFanin), pFanin ); +            } +        } +*/ + +    // delete the nodes in MFFC      Vec_PtrForEachEntry( vNodes, pObj, k )      {          if ( Abc_ObjIsCi(pObj) )              continue; -        assert( pObj->fMarkA == 0 ); +        assert( Abc_ObjFanoutNum(pObj) == 0 );          // remove the node from the table          Abc_AigAndDelete( pMan, pObj ); +        // if the node is in the level structure, remove it +        if ( pObj->fMarkA ) +            Abc_AigRemoveFromLevelStructure( pMan->vLevels, pObj ); +        if ( pObj->fMarkB ) +            Abc_AigRemoveFromLevelStructureR( pMan->vLevelsR, pObj );          // remove the node from the network -//printf( "Removing " );  Abc_AigPrintNode( pObj );          Abc_NtkDeleteObj( pObj );      }      Vec_PtrFree( vNodes ); @@ -782,7 +835,11 @@ void Abc_AigDelete_int( Abc_Aig_t * pMan )    Synopsis    [Updates the level of the node after it has changed.] -  Description [] +  Description [This procedure is based on the observation that +  after the node's level has changed, the fanouts levels can change too,  +  but the new fanout levels are always larger than the node's level. +  As a result, we can accumulate the nodes to be updated in the queue +  and process them in the increasing order of levels.]    SideEffects [] @@ -793,8 +850,7 @@ void Abc_AigUpdateLevel_int( Abc_Aig_t * pMan )  {      Abc_Obj_t * pNode, * pFanout;      Vec_Ptr_t * vVec; -    unsigned LevelNew; -    int i, k, v; +    int LevelNew, i, k, v;      // go through the nodes and update the level of their fanouts      Vec_VecForEachLevel( pMan->vLevels, vVec, i ) @@ -803,10 +859,12 @@ void Abc_AigUpdateLevel_int( Abc_Aig_t * pMan )              continue;          Vec_PtrForEachEntry( vVec, pNode, k )          { -//            assert( Abc_ObjIsNode(pNode) ); -            // for some reason, deleted nodes are encountered here!!! -            if ( !Abc_ObjIsNode(pNode) ) +            if ( pNode == NULL )                  continue; +            assert( Abc_ObjIsNode(pNode) ); +            // clean the mark +            assert( pNode->fMarkA == 1 ); +            pNode->fMarkA = 0;              // iterate through the fanouts              Abc_ObjForEachFanout( pNode, pFanout, v )              { @@ -814,11 +872,17 @@ void Abc_AigUpdateLevel_int( Abc_Aig_t * pMan )                      continue;                  // get the new level of this fanout                  LevelNew = 1 + ABC_MAX( Abc_ObjFanin0(pFanout)->Level, Abc_ObjFanin1(pFanout)->Level ); -                if ( pFanout->Level == LevelNew ) // no change +                assert( LevelNew > i ); +                if ( (int)pFanout->Level == LevelNew ) // no change                      continue; +                // if the fanout is present in the data structure, pull it out +                if ( pFanout->fMarkA ) +                    Abc_AigRemoveFromLevelStructure( pMan->vLevels, pFanout );                  // update the fanout level                  pFanout->Level = LevelNew; -                // add the fanout to be updated +                // add the fanout to the data structure to update its fanouts +                assert( pFanout->fMarkA == 0 ); +                pFanout->fMarkA = 1;                  Vec_VecPush( pMan->vLevels, pFanout->Level, pFanout );              }          } @@ -826,7 +890,122 @@ void Abc_AigUpdateLevel_int( Abc_Aig_t * pMan )      }  } +/**Function************************************************************* + +  Synopsis    [Updates the level of the node after it has changed.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Abc_AigUpdateLevelR_int( Abc_Aig_t * pMan ) +{ +    Abc_Obj_t * pNode, * pFanin, * pFanout; +    Vec_Ptr_t * vVec; +    int LevelNew, i, k, v, j; + +    // go through the nodes and update the level of their fanouts +    Vec_VecForEachLevel( pMan->vLevelsR, vVec, i ) +    { +        if ( Vec_PtrSize(vVec) == 0 ) +            continue; +        Vec_PtrForEachEntry( vVec, pNode, k ) +        { +            if ( pNode == NULL ) +                continue; +            assert( Abc_ObjIsNode(pNode) ); +            // clean the mark +            assert( pNode->fMarkB == 1 ); +            pNode->fMarkB = 0; +            // iterate through the fanins +            Abc_ObjForEachFanin( pNode, pFanin, v ) +            { +                if ( Abc_ObjIsCi(pFanin) ) +                    continue; +                // get the new reverse level of this fanin +                LevelNew = 0; +                Abc_ObjForEachFanout( pFanin, pFanout, j ) +                    if ( LevelNew < Abc_NodeReadReverseLevel(pFanout) ) +                        LevelNew = Abc_NodeReadReverseLevel(pFanout); +                LevelNew += 1; +                assert( LevelNew > i ); +                if ( Abc_NodeReadReverseLevel(pFanin) == LevelNew ) // no change +                    continue; +                // if the fanin is present in the data structure, pull it out +                if ( pFanin->fMarkB ) +                    Abc_AigRemoveFromLevelStructureR( pMan->vLevelsR, pFanin ); +                // update the reverse level +                Abc_NodeSetReverseLevel( pFanin, LevelNew ); +                // add the fanin to the data structure to update its fanins +                assert( pFanin->fMarkB == 0 ); +                pFanin->fMarkB = 1; +                Vec_VecPush( pMan->vLevelsR, LevelNew, pFanin ); +            } +        } +        Vec_PtrClear( vVec ); +    } +} + +/**Function************************************************************* + +  Synopsis    [Removes the node from the level structure.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Abc_AigRemoveFromLevelStructure( Vec_Vec_t * vStruct, Abc_Obj_t * pNode ) +{ +    Vec_Ptr_t * vVecTemp; +    Abc_Obj_t * pTemp; +    int m; +    assert( pNode->fMarkA ); +    vVecTemp = Vec_VecEntry( vStruct, pNode->Level ); +    Vec_PtrForEachEntry( vVecTemp, pTemp, m ) +    { +        if ( pTemp != pNode ) +            continue; +        Vec_PtrWriteEntry( vVecTemp, m, NULL ); +        break; +    } +    assert( m < Vec_PtrSize(vVecTemp) ); // found +    pNode->fMarkA = 0; +} + +/**Function************************************************************* + +  Synopsis    [Removes the node from the level structure.] +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Abc_AigRemoveFromLevelStructureR( Vec_Vec_t * vStruct, Abc_Obj_t * pNode ) +{ +    Vec_Ptr_t * vVecTemp; +    Abc_Obj_t * pTemp; +    int m; +    assert( pNode->fMarkB ); +    vVecTemp = Vec_VecEntry( vStruct, Abc_NodeReadReverseLevel(pNode) ); +    Vec_PtrForEachEntry( vVecTemp, pTemp, m ) +    { +        if ( pTemp != pNode ) +            continue; +        Vec_PtrWriteEntry( vVecTemp, m, NULL ); +        break; +    } +    assert( m < Vec_PtrSize(vVecTemp) ); // found +    pNode->fMarkB = 0; +} diff --git a/src/base/abc/abcCheck.c b/src/base/abc/abcCheck.c index ead24663..ee77cd02 100644 --- a/src/base/abc/abcCheck.c +++ b/src/base/abc/abcCheck.c @@ -404,6 +404,11 @@ bool Abc_NtkCheckObj( Abc_Ntk_t * pNtk, Abc_Obj_t * pObj )                  printf( "Warning: Node %s has", Abc_ObjName(pObj) );                  printf( " duplicated fanin %s.\n", Abc_ObjName(Abc_ObjFanin(pObj,k)) );              } + +    // save time: do not check large fanout lists +    if ( pObj->vFanouts.nSize > 20 ) +        return Value; +      // make sure fanouts are not duplicated      for ( i = 0; i < pObj->vFanouts.nSize; i++ )          for ( k = i + 1; k < pObj->vFanouts.nSize; k++ ) diff --git a/src/base/abc/abcCut.c b/src/base/abc/abcCut.c index 424d7561..b7d83af0 100644 --- a/src/base/abc/abcCut.c +++ b/src/base/abc/abcCut.c @@ -24,8 +24,6 @@  ////////////////////////////////////////////////////////////////////////  ///                        DECLARATIONS                              ///  //////////////////////////////////////////////////////////////////////// -  -static Vec_Int_t * Abc_NtkFanoutCounts( Abc_Ntk_t * pNtk );  ////////////////////////////////////////////////////////////////////////  ///                     FUNCTION DEFITIONS                           /// @@ -78,8 +76,7 @@ Cut_Man_t * Abc_NtkCuts( Abc_Ntk_t * pNtk, Cut_Params_t * pParams )          if ( Abc_NodeIsConst(pObj) )              continue;          // compute the cuts to the internal node -        Cut_NodeComputeCuts( p, pObj->Id, Abc_ObjFaninId0(pObj), Abc_ObjFaninId1(pObj),   -            Abc_ObjFaninC0(pObj), Abc_ObjFaninC1(pObj) );   +        Abc_NodeGetCuts( p, pObj );            // add cuts due to choices          if ( Abc_NodeIsAigChoice(pObj) )          { @@ -118,7 +115,7 @@ PRT( "Total", clock() - clk );  /**Function************************************************************* -  Synopsis    [Creates the array of fanout counters.] +  Synopsis    [Computes the cuts for the network.]    Description [] @@ -127,27 +124,63 @@ PRT( "Total", clock() - clk );    SeeAlso     []  ***********************************************************************/ -Vec_Int_t * Abc_NtkFanoutCounts( Abc_Ntk_t * pNtk ) +void * Abc_NodeGetCutsRecursive( void * p, Abc_Obj_t * pObj )  { -    Vec_Int_t * vFanNums; -    Abc_Obj_t * pObj;//, * pFanout; -    int i;//, k, nFanouts; -    vFanNums = Vec_IntAlloc( 0 ); -    Vec_IntFill( vFanNums, Abc_NtkObjNumMax(pNtk), -1 ); -    Abc_NtkForEachObj( pNtk, pObj, i ) -        if ( Abc_ObjIsCi(pObj) || Abc_ObjIsNode(pObj) ) -        { -            Vec_IntWriteEntry( vFanNums, i, Abc_ObjFanoutNum(pObj) ); -/* -            // get the number of non-CO fanouts -            nFanouts = 0; -            Abc_ObjForEachFanout( pObj, pFanout, k ) -                if ( !Abc_ObjIsCo(pFanout) ) -                    nFanouts++; -            Vec_IntWriteEntry( vFanNums, i, nFanouts ); -*/ -        } -    return vFanNums; +    void * pList; +    if ( pList = Abc_NodeReadCuts( p, pObj ) ) +        return pList; +    Abc_NodeGetCutsRecursive( p, Abc_ObjFanin0(pObj) ); +    Abc_NodeGetCutsRecursive( p, Abc_ObjFanin1(pObj) ); +    return Abc_NodeGetCuts( p, pObj ); +} + +/**Function************************************************************* + +  Synopsis    [Computes the cuts for the network.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void * Abc_NodeGetCuts( void * p, Abc_Obj_t * pObj ) +{ +    return Cut_NodeComputeCuts( p, pObj->Id, Abc_ObjFaninId0(pObj), Abc_ObjFaninId1(pObj),   +        Abc_ObjFaninC0(pObj), Abc_ObjFaninC1(pObj) );   +} + +/**Function************************************************************* + +  Synopsis    [Computes the cuts for the network.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void * Abc_NodeReadCuts( void * p, Abc_Obj_t * pObj ) +{ +    return Cut_NodeReadCuts( p, pObj->Id );   +} + +/**Function************************************************************* + +  Synopsis    [Computes the cuts for the network.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Abc_NodeFreeCuts( void * p, Abc_Obj_t * pObj ) +{ +    Cut_NodeFreeCuts( p, pObj->Id );  }  //////////////////////////////////////////////////////////////////////// diff --git a/src/base/abc/abcRefactor.c b/src/base/abc/abcRefactor.c index 2667cba5..95454668 100644 --- a/src/base/abc/abcRefactor.c +++ b/src/base/abc/abcRefactor.c @@ -34,7 +34,7 @@ struct Abc_ManRef_t_      int              fVerbose;          // the verbosity flag      // internal data structures      DdManager *      dd;                // the BDD manager -    Vec_Int_t *      vReqTimes;         // required times for each node +//    Vec_Int_t *      vReqTimes;         // required times for each node      Vec_Str_t *      vCube;             // temporary      Vec_Int_t *      vForm;             // temporary      Vec_Int_t *      vLevNums;          // temporary @@ -51,6 +51,7 @@ struct Abc_ManRef_t_      int              timeDcs;      int              timeSop;      int              timeFact; +    int              timeEval;      int              timeRes;      int              timeNtk;      int              timeTotal; @@ -98,7 +99,7 @@ int Abc_NtkRefactor( Abc_Ntk_t * pNtk, int nNodeSizeMax, int nConeSizeMax, bool      pManCut = Abc_NtkManCutStart( nNodeSizeMax, nConeSizeMax );      pManRef = Abc_NtkManRefStart( nNodeSizeMax, nConeSizeMax, fUseDcs, fVerbose );      pManRef->vLeaves   = Abc_NtkManCutReadLeaves( pManCut ); -    pManRef->vReqTimes = Abc_NtkGetRequiredLevels( pNtk ); +    Abc_NtkStartReverseLevels( pNtk );      // resynthesize each node once      nNodes = Abc_NtkObjNumMax(pNtk); @@ -137,6 +138,7 @@ pManRef->timeTotal = clock() - clkStart;      // delete the managers      Abc_NtkManCutStop( pManCut );      Abc_NtkManRefStop( pManRef ); +    Abc_NtkStopReverseLevels( pNtk );      // check      if ( fCheck && !Abc_NtkCheck( pNtk ) )      { @@ -165,10 +167,13 @@ Vec_Int_t * Abc_NodeRefactor( Abc_ManRef_t * p, Abc_Obj_t * pNode, Vec_Ptr_t * v      DdNode * bNodeFunc, * bNodeDc, * bNodeOn, * bNodeOnDc;      char * pSop;      int nBddNodes, nFtNodes, nNodesSaved, nNodesAdded; -    int i, clk; +    int i, Required, clk;      p->nNodesConsidered++; +    // get the required level of this node +    Required = Abc_NodeReadRequiredLevel( pNode ); +      // get the function of the cut  clk = clock();      bNodeFunc = Abc_NodeConeBdd( p->dd, p->dd->vars, pNode, vFanins, p->vVisited );  Cudd_Ref( bNodeFunc ); @@ -186,7 +191,7 @@ clk = clock();          nMints = (1 << vFanins->nSize);          nMintsDc = (int)Cudd_CountMinterm( p->dd, bNodeDc, vFanins->nSize ); -        printf( "Percentage of minterms = %5.2f.\n", 100.0 * nMintsDc / nMints ); +//        printf( "Percentage of minterms = %5.2f.\n", 100.0 * nMintsDc / nMints );          // get the ISF          bNodeOn   = Cudd_bddAnd( p->dd, bNodeFunc, Cudd_Not(bNodeDc) );   Cudd_Ref( bNodeOn ); @@ -204,13 +209,16 @@ p->timeDcs += clock() - clk;      // always accept the case of constant node      if ( Cudd_IsConstant(bNodeFunc) )      { -        p->nNodesGained += Abc_NodeMffcSize( pNode ); +        p->nLastGain = Abc_NodeMffcSize( pNode ); +        p->nNodesGained += p->nLastGain;          p->nNodesRefactored++; -        // get the costant node -        pFanin = Abc_ObjNotCond( Abc_AigConst1(pNode->pNtk->pManFunc), Cudd_IsComplement(bNodeFunc) ); -        Abc_AigReplace( pNode->pNtk->pManFunc, pNode, pFanin ); +        // get the constant node +//        pFanin = Abc_ObjNotCond( Abc_AigConst1(pNode->pNtk->pManFunc), Cudd_IsComplement(bNodeFunc) ); +//        Abc_AigReplace( pNode->pNtk->pManFunc, pNode, pFanin ); +//        Cudd_RecursiveDeref( p->dd, bNodeFunc ); +//printf( "Gain = %d.\n", p->nLastGain );          Cudd_RecursiveDeref( p->dd, bNodeFunc ); -        return NULL; +        return Ft_FactorConst( !Cudd_IsComplement(bNodeFunc) );      }      // get the SOP of the cut @@ -241,8 +249,10 @@ p->timeFact += clock() - clk;          pFanin->vFanouts.nSize--;      // detect how many new nodes will be added (while taking into account reused nodes) +clk = clock();      nNodesAdded = Abc_NodeStrashDecCount( pNode->pNtk->pManFunc, pNode, vFanins, vForm,  -        p->vLevNums, nNodesSaved, Vec_IntEntry( p->vReqTimes, pNode->Id ) ); +        p->vLevNums, nNodesSaved, Required ); +p->timeEval += clock() - clk;      // quit if there is no improvement      if ( nNodesAdded == -1 || nNodesAdded == nNodesSaved && !fUseZeros )      { @@ -316,7 +326,7 @@ Abc_ManRef_t * Abc_NtkManRefStart( int nNodeSizeMax, int nConeSizeMax, bool fUse  void Abc_NtkManRefStop( Abc_ManRef_t * p )  {      Extra_StopManager( p->dd ); -    Vec_IntFree( p->vReqTimes ); +//    Vec_IntFree( p->vReqTimes );      Vec_PtrFree( p->vVisited );      Vec_IntFree( p->vLevNums );      Vec_StrFree( p->vCube    ); @@ -337,15 +347,16 @@ void Abc_NtkManRefStop( Abc_ManRef_t * p )  void Abc_NtkManRefPrintStats( Abc_ManRef_t * p )  {      printf( "Refactoring statistics:\n" ); -    printf( "Nodes considered  = %6d.\n", p->nNodesConsidered ); -    printf( "Nodes refactored  = %6d.\n", p->nNodesRefactored ); -    printf( "Calculated gain   = %6d.\n", p->nNodesGained     ); +    printf( "Nodes considered  = %8d.\n", p->nNodesConsidered ); +    printf( "Nodes refactored  = %8d.\n", p->nNodesRefactored ); +    printf( "Calculated gain   = %8d.\n", p->nNodesGained     );      PRT( "Cuts       ", p->timeCut );      PRT( "Resynthesis", p->timeRes );      PRT( "    BDD    ", p->timeBdd );      PRT( "    DCs    ", p->timeDcs );      PRT( "    SOP    ", p->timeSop );      PRT( "    FF     ", p->timeFact ); +    PRT( "    Eval   ", p->timeEval );      PRT( "AIG update ", p->timeNtk );      PRT( "TOTAL      ", p->timeTotal );  } diff --git a/src/base/abc/abcRefs.c b/src/base/abc/abcRefs.c index ea7aeff4..1a8f7966 100644 --- a/src/base/abc/abcRefs.c +++ b/src/base/abc/abcRefs.c @@ -124,10 +124,7 @@ int Abc_NodeRefDeref( Abc_Obj_t * pNode, bool fReference, bool fLabel, Vec_Ptr_t      int Counter;      // label visited nodes      if ( fLabel ) -    {          Abc_NodeSetTravIdCurrent( pNode ); -//printf( "Labeling " );  Abc_AigPrintNode( pNode ); -    }      // collect visited nodes      if ( vNodes )          Vec_PtrPush( vNodes, pNode ); diff --git a/src/base/abc/abcRewrite.c b/src/base/abc/abcRewrite.c index 0cd56349..0b573bac 100644 --- a/src/base/abc/abcRewrite.c +++ b/src/base/abc/abcRewrite.c @@ -20,11 +20,15 @@  #include "abc.h"  #include "rwr.h" +#include "ft.h"  ////////////////////////////////////////////////////////////////////////  ///                        DECLARATIONS                              ///  //////////////////////////////////////////////////////////////////////// +static Cut_Man_t * Abc_NtkStartCutManForRewrite( Abc_Ntk_t * pNtk, int fDrop ); +static void        Abc_NodePrintCuts( Abc_Obj_t * pNode ); +  ////////////////////////////////////////////////////////////////////////  ///                     FUNCTION DEFITIONS                           ///  //////////////////////////////////////////////////////////////////////// @@ -40,20 +44,28 @@    SeeAlso     []  ***********************************************************************/ -int Abc_NtkRewrite( Abc_Ntk_t * pNtk ) +int Abc_NtkRewrite( Abc_Ntk_t * pNtk, int fUseZeros, int fVerbose )  {      int fCheck = 1; +    int fDrop = 0;      ProgressBar * pProgress; -    Rwr_Man_t * p; +    Cut_Man_t * pManCut; +    Rwr_Man_t * pManRwr;      Abc_Obj_t * pNode;      int i, nNodes, nGain; +    int clk, clkStart = clock();      assert( Abc_NtkIsAig(pNtk) );      // start the rewriting manager -    p = Rwr_ManStart( 0 ); -    if ( p == NULL ) +    pManRwr = Rwr_ManStart( 0 ); +    if ( pManRwr == NULL )          return 0; -    Rwr_ManPrepareNetwork( p, pNtk ); +    Abc_NtkStartReverseLevels( pNtk ); +    // start the cut manager +clk = clock(); +    pManCut = Abc_NtkStartCutManForRewrite( pNtk, fDrop ); +Rwr_ManAddTimeCuts( pManRwr, clock() - clk ); +    pNtk->pManCut = pManCut;      // resynthesize each node once      nNodes = Abc_NtkObjNumMax(pNtk); @@ -68,12 +80,28 @@ int Abc_NtkRewrite( Abc_Ntk_t * pNtk )          if ( Abc_NodeIsConst(pNode) )              continue;          // for each cut, try to resynthesize it -        if ( (nGain = Rwr_NodeRewrite( p, pNode )) >= 0 ) -            Abc_NodeUpdate( pNode, Rwr_ManReadFanins(p), Rwr_ManReadDecs(p), nGain ); +        nGain = Rwr_NodeRewrite( pManRwr, pManCut, pNode, fUseZeros ); +        if ( nGain > 0 || nGain == 0 && fUseZeros ) +        { +            Vec_Int_t * vForm   = Rwr_ManReadDecs(pManRwr); +            Vec_Ptr_t * vFanins = Rwr_ManReadFanins(pManRwr); +            int fCompl          = Rwr_ManReadCompl(pManRwr); +            // complement the FF if needed +            if ( fCompl ) Ft_FactorComplement( vForm ); +            Abc_NodeUpdate( pNode, vFanins, vForm, nGain ); +            if ( fCompl ) Ft_FactorComplement( vForm ); +        }      }      Extra_ProgressBarStop( pProgress ); -    // delete the manager -    Rwr_ManStop( p ); +Rwr_ManAddTimeTotal( pManRwr, clock() - clkStart ); +    // print stats +    if ( fVerbose ) +        Rwr_ManPrintStats( pManRwr ); +    // delete the managers +    Rwr_ManStop( pManRwr ); +    Cut_ManStop( pManCut ); +    pNtk->pManCut = NULL; +    Abc_NtkStopReverseLevels( pNtk );      // check      if ( fCheck && !Abc_NtkCheck( pNtk ) )      { @@ -84,6 +112,70 @@ int Abc_NtkRewrite( Abc_Ntk_t * pNtk )  } +/**Function************************************************************* + +  Synopsis    [Starts the cut manager for rewriting.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +Cut_Man_t * Abc_NtkStartCutManForRewrite( Abc_Ntk_t * pNtk, int fDrop ) +{ +    static Cut_Params_t Params, * pParams = &Params; +    Cut_Man_t * pManCut; +    Abc_Obj_t * pObj; +    int i; +    // start the cut manager +    memset( pParams, 0, sizeof(Cut_Params_t) ); +    pParams->nVarsMax  = 4;     // the max cut size ("k" of the k-feasible cuts) +    pParams->nKeepMax  = 250;   // the max number of cuts kept at a node +    pParams->fTruth    = 1;     // compute truth tables +    pParams->fHash     = 1;     // hash cuts to detect unique +    pParams->fFilter   = 0;     // filter dominated cuts +    pParams->fSeq      = 0;     // compute sequential cuts +    pParams->fDrop     = fDrop; // drop cuts on the fly +    pParams->fVerbose  = 0;     // the verbosiness flag +    pParams->nIdsMax   = Abc_NtkObjNumMax( pNtk ); +    pManCut = Cut_ManStart( pParams ); +    if ( pParams->fDrop ) +        Cut_ManSetFanoutCounts( pManCut, Abc_NtkFanoutCounts(pNtk) ); +    // set cuts for PIs +    Abc_NtkForEachCi( pNtk, pObj, i ) +        if ( Abc_ObjFanoutNum(pObj) > 0 ) +            Cut_NodeSetTriv( pManCut, pObj->Id ); +    return pManCut; +} + +/**Function************************************************************* + +  Synopsis    [Prints the cuts at the nodes.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Abc_NodePrintCuts( Abc_Obj_t * pNode ) +{ +    Cut_Cut_t * pCut; +    unsigned uTruth; +    printf( "\nNode %s\n", Abc_ObjName(pNode) ); +    for ( pCut = (Cut_Cut_t *)pNode->pCopy; pCut; pCut = pCut->pNext ) +    { +        uTruth = pCut->uTruth; +        Extra_PrintBinary( stdout, &uTruth, 16 );  +        printf( "   " ); +        Cut_CutPrint( pCut );    +        printf( "\n" ); +    } +} +  ////////////////////////////////////////////////////////////////////////  ///                       END OF FILE                                ///  //////////////////////////////////////////////////////////////////////// diff --git a/src/base/abc/abcStrash.c b/src/base/abc/abcStrash.c index 1c4134d0..961e6c5f 100644 --- a/src/base/abc/abcStrash.c +++ b/src/base/abc/abcStrash.c @@ -318,12 +318,12 @@ Abc_Obj_t * Abc_NodeStrashDec( Abc_Aig_t * pMan, Vec_Ptr_t * vFanins, Vec_Int_t      nVars = Ft_FactorGetNumVars( vForm );      assert( nVars >= 0 );      assert( vForm->nSize > nVars ); -    assert( nVars == vFanins->nSize );      // check for constant function      pFtNode = Ft_NodeRead( vForm, 0 );      if ( pFtNode->fConst )          return Abc_ObjNotCond( Abc_AigConst1(pMan), pFtNode->fCompl ); +    assert( nVars == vFanins->nSize );      // compute the function of other nodes      for ( i = nVars; i < vForm->nSize; i++ ) @@ -365,17 +365,17 @@ int Abc_NodeStrashDecCount( Abc_Aig_t * pMan, Abc_Obj_t * pRoot, Vec_Ptr_t * vFa      nVars = Ft_FactorGetNumVars( vForm );      assert( nVars >= 0 );      assert( vForm->nSize > nVars ); -    assert( nVars == vFanins->nSize ); // set the fanin number to nVars???      // check for constant function      pFtNode = Ft_NodeRead( vForm, 0 );      if ( pFtNode->fConst )          return 0; +    assert( nVars == vFanins->nSize );       // set the levels      Vec_IntClear( vLevels );      Vec_PtrForEachEntry( vFanins, pAnd, i ) -        Vec_IntPush( vLevels, pAnd->Level ); +        Vec_IntPush( vLevels, Abc_ObjRegular(pAnd)->Level );      // compute the function of other nodes      Counter = 0; @@ -422,9 +422,17 @@ int Abc_NodeStrashDecCount( Abc_Aig_t * pMan, Abc_Obj_t * pRoot, Vec_Ptr_t * vFa          }          // count the number of new levels -        if ( pAnd && Abc_ObjRegular(pAnd) == Abc_AigConst1(pMan) ) -            LevelNew = 0; -        else +        LevelNew = -1; +        if ( pAnd ) +        { +            if ( Abc_ObjRegular(pAnd) == Abc_AigConst1(pMan) ) +                LevelNew = 0; +            else if ( Abc_ObjRegular(pAnd) == Abc_ObjRegular(pAnd0) ) +                LevelNew = (int)Abc_ObjRegular(pAnd0)->Level; +            else if ( Abc_ObjRegular(pAnd) == Abc_ObjRegular(pAnd1) ) +                LevelNew = (int)Abc_ObjRegular(pAnd1)->Level; +        } +        if ( LevelNew == -1 )              LevelNew = 1 + ABC_MAX( Vec_IntEntry(vLevels, pFtNode->iFanin0), Vec_IntEntry(vLevels, pFtNode->iFanin1) );  //        assert( pAnd == NULL || LevelNew == LevelOld ); @@ -433,7 +441,11 @@ int Abc_NodeStrashDecCount( Abc_Aig_t * pMan, Abc_Obj_t * pRoot, Vec_Ptr_t * vFa              LevelOld = (int)Abc_ObjRegular(pAnd)->Level;              if ( LevelNew != LevelOld )               { -               int x = 0; +                int x = 0; +                Abc_Obj_t * pFanin0, * pFanin1; +                pFanin0 = Abc_ObjFanin0( Abc_ObjRegular(pAnd) ); +                pFanin1 = Abc_ObjFanin1( Abc_ObjRegular(pAnd) ); +                x = 0;              }          } diff --git a/src/base/abc/abcTiming.c b/src/base/abc/abcTiming.c index 10f8ae98..9d71ace5 100644 --- a/src/base/abc/abcTiming.c +++ b/src/base/abc/abcTiming.c @@ -626,47 +626,126 @@ void Abc_NodeDelayTraceArrival( Abc_Obj_t * pNode )      pTimeOut->Worst = ABC_MAX( pTimeOut->Rise, pTimeOut->Fall );  } + + +  /**Function************************************************************* -  Synopsis    [Creates the array of required times.] +  Synopsis    [Prepares the AIG for the comptuation of required levels.] -  Description [] +  Description [This procedure should be called before the required times +  are used. It starts internal data structures, which records the level  +  from the COs of the AIG nodes in reverse topologogical order.]    SideEffects []    SeeAlso     []  ***********************************************************************/ -Vec_Int_t * Abc_NtkGetRequiredLevels( Abc_Ntk_t * pNtk ) +void Abc_NtkStartReverseLevels( Abc_Ntk_t * pNtk )  { -    Vec_Int_t * vReqTimes;      Vec_Ptr_t * vNodes;      Abc_Obj_t * pObj, * pFanout; -    int i, k, nLevelsMax, nLevelsCur; -    // start the required times -    vReqTimes = Vec_IntAlloc( 0 ); -    Vec_IntFill( vReqTimes, Abc_NtkObjNumMax(pNtk), ABC_INFINITY ); +    int i, k, nLevelsCur; +    assert( Abc_NtkIsAig(pNtk) ); +    // remember the maximum number of direct levels +    pNtk->LevelMax = Abc_AigGetLevelNum(pNtk); +    // start the reverse levels +    pNtk->vLevelsR = Vec_IntAlloc( 0 ); +    Vec_IntFill( pNtk->vLevelsR, Abc_NtkObjNumMax(pNtk), 0 );      // compute levels in reverse topological order -    Abc_NtkForEachCo( pNtk, pObj, i ) -        Vec_IntWriteEntry( vReqTimes, pObj->Id, 0 );      vNodes = Abc_NtkDfsReverse( pNtk );      Vec_PtrForEachEntry( vNodes, pObj, i )      {          nLevelsCur = 0;          Abc_ObjForEachFanout( pObj, pFanout, k ) -            if ( nLevelsCur < Vec_IntEntry(vReqTimes, pFanout->Id) ) -                nLevelsCur = Vec_IntEntry(vReqTimes, pFanout->Id); -        Vec_IntWriteEntry( vReqTimes, pObj->Id, nLevelsCur + 1 ); +            if ( nLevelsCur < Vec_IntEntry(pNtk->vLevelsR, pFanout->Id) ) +                nLevelsCur = Vec_IntEntry(pNtk->vLevelsR, pFanout->Id); +        Vec_IntWriteEntry( pNtk->vLevelsR, pObj->Id, nLevelsCur + 1 );      }      Vec_PtrFree( vNodes ); -    // convert levels into required times: RetTime = NumLevels + 1 - Level -    nLevelsMax = Abc_AigGetLevelNum(pNtk) + 1; -    Abc_NtkForEachNode( pNtk, pObj, i ) -        Vec_IntWriteEntry( vReqTimes, pObj->Id, nLevelsMax - Vec_IntEntry(vReqTimes, pObj->Id) ); -//    Abc_NtkForEachNode( pNtk, pObj, i ) -//        printf( "(%d,%d)", pObj->Level, Vec_IntEntry(vReqTimes, pObj->Id) ); -//    printf( "\n" ); -    return vReqTimes; +} + +/**Function************************************************************* + +  Synopsis    [Cleans the data structures used to compute required levels.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Abc_NtkStopReverseLevels( Abc_Ntk_t * pNtk ) +{ +    assert( pNtk->vLevelsR ); +    Vec_IntFree( pNtk->vLevelsR ); +    pNtk->vLevelsR = NULL; +    pNtk->LevelMax = 0; + +} + +/**Function************************************************************* + +  Synopsis    [Sets the reverse level of the node.] + +  Description [The reverse level is the level of the node in reverse +  topological order, starting from the COs.] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Abc_NodeSetReverseLevel( Abc_Obj_t * pObj, int LevelR ) +{ +    Abc_Ntk_t * pNtk = pObj->pNtk; +    assert( Abc_NtkIsAig(pNtk) ); +    assert( pNtk->vLevelsR ); +    Vec_IntFillExtra( pNtk->vLevelsR, pObj->Id + 1, 0 ); +    Vec_IntWriteEntry( pNtk->vLevelsR, pObj->Id, LevelR ); +} + +/**Function************************************************************* + +  Synopsis    [Returns the reverse level of the node.] + +  Description [The reverse level is the level of the node in reverse +  topological order, starting from the COs.] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +int Abc_NodeReadReverseLevel( Abc_Obj_t * pObj ) +{ +    Abc_Ntk_t * pNtk = pObj->pNtk; +    assert( Abc_NtkIsAig(pNtk) ); +    assert( pNtk->vLevelsR ); +    Vec_IntFillExtra( pNtk->vLevelsR, pObj->Id + 1, 0 ); +    return Vec_IntEntry(pNtk->vLevelsR, pObj->Id); +} + +/**Function************************************************************* + +  Synopsis    [Returns required level of the node.] + +  Description [Converts the reverse levels of the node into its required  +  level as follows: ReqLevel(Node) = MaxLevels(Ntk) + 1 - LevelR(Node).] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +int Abc_NodeReadRequiredLevel( Abc_Obj_t * pObj ) +{ +    Abc_Ntk_t * pNtk = pObj->pNtk; +    assert( Abc_NtkIsAig(pNtk) ); +    assert( pNtk->vLevelsR ); +    return pNtk->LevelMax + 1 - Vec_IntEntry(pNtk->vLevelsR, pObj->Id);  }  //////////////////////////////////////////////////////////////////////// diff --git a/src/base/abc/abcUtil.c b/src/base/abc/abcUtil.c index d62cec11..87d57947 100644 --- a/src/base/abc/abcUtil.c +++ b/src/base/abc/abcUtil.c @@ -1021,6 +1021,30 @@ void Abc_NtkShortNames( Abc_Ntk_t * pNtk )      pNtk->tObj2Name = tObj2NameNew;  } +/**Function************************************************************* + +  Synopsis    [Creates the array of fanout counters.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +Vec_Int_t * Abc_NtkFanoutCounts( Abc_Ntk_t * pNtk ) +{ +    Vec_Int_t * vFanNums; +    Abc_Obj_t * pObj; +    int i; +    vFanNums = Vec_IntAlloc( 0 ); +    Vec_IntFill( vFanNums, Abc_NtkObjNumMax(pNtk), -1 ); +    Abc_NtkForEachObj( pNtk, pObj, i ) +        if ( Abc_ObjIsCi(pObj) || Abc_ObjIsNode(pObj) ) +            Vec_IntWriteEntry( vFanNums, i, Abc_ObjFanoutNum(pObj) ); +    return vFanNums; +} +  ////////////////////////////////////////////////////////////////////////  ///                       END OF FILE                                ///  //////////////////////////////////////////////////////////////////////// diff --git a/src/misc/extra/extraUtilMisc.c b/src/misc/extra/extraUtilMisc.c index a12fbce4..d5b0330f 100644 --- a/src/misc/extra/extraUtilMisc.c +++ b/src/misc/extra/extraUtilMisc.c @@ -674,7 +674,7 @@ void Extra_Truth4VarNPN( unsigned short ** puCanons, char ** puPhases, char ** p          if ( uCanons[uTruth] )          {              assert( uTruth > uCanons[uTruth] ); -            uMap[uTruth] = uMap[uCanons[uTruth]]; +            uMap[~uTruth & 0xFFFF] = uMap[uTruth] = uMap[uCanons[uTruth]];              continue;          }          uMap[uTruth] = nClasses++; diff --git a/src/misc/vec/vecFan.h b/src/misc/vec/vecFan.h index 8698a1b7..08d1d734 100644 --- a/src/misc/vec/vecFan.h +++ b/src/misc/vec/vecFan.h @@ -47,8 +47,8 @@ struct Abc_Fan_t_ // 1 word  typedef struct Vec_Fan_t_       Vec_Fan_t;  struct Vec_Fan_t_   { -    int              nSize;      int              nCap; +    int              nSize;      Abc_Fan_t *      pArray;  }; diff --git a/src/misc/vec/vecInt.h b/src/misc/vec/vecInt.h index 919b7e5a..793dd567 100644 --- a/src/misc/vec/vecInt.h +++ b/src/misc/vec/vecInt.h @@ -39,8 +39,8 @@  typedef struct Vec_Int_t_       Vec_Int_t;  struct Vec_Int_t_   { -    int              nSize;      int              nCap; +    int              nSize;      int *            pArray;  }; @@ -322,9 +322,31 @@ static inline void Vec_IntFill( Vec_Int_t * p, int nSize, int Entry )  {      int i;      Vec_IntGrow( p, nSize ); +    for ( i = 0; i < nSize; i++ ) +        p->pArray[i] = Entry;      p->nSize = nSize; -    for ( i = 0; i < p->nSize; i++ ) +} + +/**Function************************************************************* + +  Synopsis    [Fills the vector with given number of entries.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +static inline void Vec_IntFillExtra( Vec_Int_t * p, int nSize, int Entry ) +{ +    int i; +    if ( p->nSize >= nSize ) +        return; +    Vec_IntGrow( p, nSize ); +    for ( i = p->nSize; i < nSize; i++ )          p->pArray[i] = Entry; +    p->nSize = nSize;  }  /**Function************************************************************* diff --git a/src/misc/vec/vecPtr.h b/src/misc/vec/vecPtr.h index ed78c8c2..1d3e0633 100644 --- a/src/misc/vec/vecPtr.h +++ b/src/misc/vec/vecPtr.h @@ -39,8 +39,8 @@  typedef struct Vec_Ptr_t_       Vec_Ptr_t;  struct Vec_Ptr_t_   { -    int              nSize;      int              nCap; +    int              nSize;      void **          pArray;  }; @@ -323,9 +323,31 @@ static inline void Vec_PtrFill( Vec_Ptr_t * p, int nSize, void * Entry )  {      int i;      Vec_PtrGrow( p, nSize ); +    for ( i = 0; i < nSize; i++ ) +        p->pArray[i] = Entry;      p->nSize = nSize; -    for ( i = 0; i < p->nSize; i++ ) +} + +/**Function************************************************************* + +  Synopsis    [Fills the vector with given number of entries.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +static inline void Vec_PtrFillExtra( Vec_Ptr_t * p, int nSize, void * Entry ) +{ +    int i; +    if ( p->nSize >= nSize ) +        return; +    Vec_PtrGrow( p, nSize ); +    for ( i = p->nSize; i < nSize; i++ )          p->pArray[i] = Entry; +    p->nSize = nSize;  }  /**Function************************************************************* diff --git a/src/misc/vec/vecStr.h b/src/misc/vec/vecStr.h index 2a9dc7a0..4b8e6a1c 100644 --- a/src/misc/vec/vecStr.h +++ b/src/misc/vec/vecStr.h @@ -39,8 +39,8 @@  typedef struct Vec_Str_t_       Vec_Str_t;  struct Vec_Str_t_   { -    int              nSize;      int              nCap; +    int              nSize;      char *           pArray;  }; diff --git a/src/misc/vec/vecVec.h b/src/misc/vec/vecVec.h index 4ee62080..bb911bfe 100644 --- a/src/misc/vec/vecVec.h +++ b/src/misc/vec/vecVec.h @@ -39,9 +39,9 @@  typedef struct Vec_Vec_t_       Vec_Vec_t;  struct Vec_Vec_t_   { -    int         nSize; -    int         nCap; -    void **     pArray; +    int              nCap; +    int              nSize; +    void **          pArray;  };  //////////////////////////////////////////////////////////////////////// @@ -55,6 +55,8 @@ struct Vec_Vec_t_      for ( i = LevelStart; (i < Vec_PtrSize(vGlob)) && (((vVec) = Vec_VecEntry(vGlob, i)), 1); i++ )  #define Vec_VecForEachLevelStartStop( vGlob, vVec, i, LevelStart, LevelStop )                 \      for ( i = LevelStart; (i <= LevelStop) && (((vVec) = Vec_VecEntry(vGlob, i)), 1); i++ ) +#define Vec_VecForEachLevelReverse( vGlob, vVec, i )                                          \ +    for ( i = Vec_VecSize(vGlob) - 1; (i >= 0) && (((vVec) = Vec_VecEntry(vGlob, i)), 1); i-- )  // iteratores through entries  #define Vec_VecForEachEntry( vGlob, pEntry, i, k )                                            \ @@ -96,6 +98,28 @@ static inline Vec_Vec_t * Vec_VecAlloc( int nCap )  /**Function************************************************************* +  Synopsis    [Allocates a vector with the given capacity.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +static inline Vec_Vec_t * Vec_VecStart( int nSize ) +{ +    Vec_Vec_t * p; +    int i; +    p = Vec_VecAlloc( nSize ); +    for ( i = 0; i < nSize; i++ ) +        p->pArray[i] = Vec_PtrAlloc( 0 ); +    p->nSize = nSize; +    return p; +} + +/**Function************************************************************* +    Synopsis    []    Description [] diff --git a/src/opt/cut/cut.h b/src/opt/cut/cut.h index 0b4c4535..f3a0f743 100644 --- a/src/opt/cut/cut.h +++ b/src/opt/cut/cut.h @@ -99,6 +99,7 @@ extern void             Cut_NodeWriteCuts( Cut_Man_t * p, int Node, Cut_Cut_t *  extern void             Cut_NodeFreeCuts( Cut_Man_t * p, int Node );  extern void             Cut_NodeSetComputedAsNew( Cut_Man_t * p, int Node );  extern void             Cut_NodeTryDroppingCuts( Cut_Man_t * p, int Node ); +extern void             Cut_CutPrint( Cut_Cut_t * pCut );  ////////////////////////////////////////////////////////////////////////  ///                       END OF FILE                                /// diff --git a/src/opt/cut/cutInt.h b/src/opt/cut/cutInt.h index da54a188..fe5080b4 100644 --- a/src/opt/cut/cutInt.h +++ b/src/opt/cut/cutInt.h @@ -70,6 +70,7 @@ struct Cut_ManStruct_t_      int                nCutsPeak;      int                nCutsTriv;      int                nCutsNode; +    int                nNodes;      // runtime      int                timeMerge;      int                timeUnion; diff --git a/src/opt/cut/cutMan.c b/src/opt/cut/cutMan.c index a96f8173..4ad3a66a 100644 --- a/src/opt/cut/cutMan.c +++ b/src/opt/cut/cutMan.c @@ -141,8 +141,9 @@ void Cut_ManPrintStats( Cut_Man_t * p )      printf( "Peak cuts         = %8d.\n", p->nCutsPeak );      printf( "Total allocated   = %8d.\n", p->nCutsAlloc );      printf( "Total deallocated = %8d.\n", p->nCutsDealloc ); -    printf( "The cut size      = %3d bytes.\n", p->EntrySize ); -    printf( "Peak memory       = %.2f Mb.\n", (float)p->nCutsPeak * p->EntrySize / (1<<20) ); +    printf( "Cuts per node     = %8.1f\n", ((float)(p->nCutsCur-p->nCutsTriv))/p->nNodes ); +    printf( "The cut size      = %8d bytes.\n", p->EntrySize ); +    printf( "Peak memory       = %8.2f Mb.\n", (float)p->nCutsPeak * p->EntrySize / (1<<20) );      PRT( "Merge ", p->timeMerge );      PRT( "Union ", p->timeUnion );      PRT( "Hash  ", Cut_TableReadTime(p->tTable) ); diff --git a/src/opt/cut/cutNode.c b/src/opt/cut/cutNode.c index 6ce3b983..8d16ac8a 100644 --- a/src/opt/cut/cutNode.c +++ b/src/opt/cut/cutNode.c @@ -65,6 +65,8 @@ static void               Cut_CutFilter( Cut_Man_t * p, Cut_Cut_t * pList );  ***********************************************************************/  Cut_Cut_t * Cut_NodeReadCuts( Cut_Man_t * p, int Node )  { +    if ( Node >= p->vCuts->nSize ) +        return NULL;      return Vec_PtrEntry( p->vCuts, Node );  } @@ -209,6 +211,7 @@ Cut_Cut_t * Cut_NodeComputeCuts( Cut_Man_t * p, int Node, int Node0, int Node1,      }  finish :      // set the list at the node +    Vec_PtrFillExtra( p->vCuts, Node + 1, NULL );      assert( Cut_NodeReadCuts(p, Node) == NULL );      pList0 = Cut_ListFinish( &SuperList );      Cut_NodeWriteCuts( p, Node, pList0 ); @@ -227,6 +230,7 @@ clk = clock();      if ( p->pParams->fFilter )          Cut_CutFilter( p, pList0 );  p->timeFilter += clock() - clk; +    p->nNodes++;      return pList0;  } @@ -387,6 +391,7 @@ clk = clock();      if ( p->pParams->fFilter )          Cut_CutFilter( p, pList );  p->timeFilter += clock() - clk; +    p->nNodes -= vNodes->nSize - 1;      return pList;  } @@ -498,7 +503,7 @@ void Cut_NodeTryDroppingCuts( Cut_Man_t * p, int Node )  void Cut_CutPrint( Cut_Cut_t * pCut )  {      int i; -    assert( pCut->nLeaves > 1 ); +    assert( pCut->nLeaves > 0 );      printf( "%d : {", pCut->nLeaves );      for ( i = 0; i < (int)pCut->nLeaves; i++ )          printf( " %d", pCut->pLeaves[i] ); diff --git a/src/opt/rwr/module.make b/src/opt/rwr/module.make index fc72630f..077a3c01 100644 --- a/src/opt/rwr/module.make +++ b/src/opt/rwr/module.make @@ -1,4 +1,4 @@ -SRC +=  src/opt/rwr/rwrCut.c \ +SRC +=  src/opt/rwr/rwrDec.c \      src/opt/rwr/rwrEva.c \      src/opt/rwr/rwrExp.c \      src/opt/rwr/rwrLib.c \ diff --git a/src/opt/rwr/rwr.h b/src/opt/rwr/rwr.h index 5d190745..6e127b27 100644 --- a/src/opt/rwr/rwr.h +++ b/src/opt/rwr/rwr.h @@ -26,6 +26,7 @@  ////////////////////////////////////////////////////////////////////////  #include "abc.h" +#include "cut.h"  ////////////////////////////////////////////////////////////////////////  ///                         PARAMETERS                               /// @@ -39,7 +40,6 @@  typedef struct Rwr_Man_t_   Rwr_Man_t;  typedef struct Rwr_Node_t_  Rwr_Node_t; -typedef struct Rwr_Cut_t_   Rwr_Cut_t;  struct Rwr_Man_t_  { @@ -50,7 +50,7 @@ struct Rwr_Man_t_      char *             pPerms;           // canonical permutations      unsigned char *    pMap;             // mapping of functions into class numbers      char *             pPractical;       // practical NPN classes -    unsigned short **  puPerms43;        // four-var permutations for three var functions +    char **            pPerms4;          // four-var permutations      // node space      Vec_Ptr_t *        vForest;          // all the nodes      Rwr_Node_t **      pTable;           // the hash table of nodes by their canonical form @@ -61,19 +61,26 @@ struct Rwr_Man_t_      int                nConsidered;      // the number of nodes considered      int                nAdded;           // the number of nodes added to lists      int                nClasses;         // the number of NN classes -    // intermediate data -    Vec_Int_t *        vFanNums;         // the number of fanouts of each node (used to free cuts) -    Vec_Int_t *        vReqTimes;        // the required times for each node (used for delay-driven evalution)      // the result of resynthesis +    int                fCompl;           // indicates if the output of FF should be complemented      Vec_Int_t *        vForm;            // the decomposition tree (temporary) -    Vec_Int_t *        vLevNums;         // the array of levels (temporary)      Vec_Ptr_t *        vFanins;          // the fanins array (temporary) -    int                nGainMax; +    Vec_Ptr_t *        vFaninsCur;       // the fanins array (temporary) +    Vec_Int_t *        vLevNums;         // the array of levels (temporary) +    // node statistics +    int                nNodesConsidered; +    int                nNodesRewritten; +    int                nNodesGained; +    int                nScores[222]; +    int                nCutsGood; +    int                nCutsBad; +    int                nSubgraphs;      // runtime statistics -    int                time1; -    int                time2; -    int                time3; -    int                time4; +    int                timeStart; +    int                timeCut; +    int                timeRes; +    int                timeEval; +    int                timeTotal;  };  struct Rwr_Node_t_ // 24 bytes @@ -90,18 +97,6 @@ struct Rwr_Node_t_ // 24 bytes      Rwr_Node_t *       pNext;            // next in the table  }; -struct Rwr_Cut_t_ // 24 bytes -{ -    unsigned           nLeaves : 3;      // the number of leaves -    unsigned           fTime  :  1;      // set to 1 if meets the required times -    unsigned           fGain  :  1;      // set to 1 if does not increase nodes -    unsigned           Volume : 11;      // the gain in the number of nodes -    unsigned           uTruth : 16;      // the truth table -    Abc_Obj_t *        ppLeaves[4];      // the leaves -    Rwr_Cut_t *        pNext;            // the next cut in the list -}; - -  // manipulation of complemented attributes  static inline bool         Rwr_IsComplement( Rwr_Node_t * p )    { return (bool)(((unsigned)p) & 01);           }  static inline Rwr_Node_t * Rwr_Regular( Rwr_Node_t * p )         { return (Rwr_Node_t *)((unsigned)(p) & ~01);  } @@ -116,12 +111,10 @@ static inline Rwr_Node_t * Rwr_NotCond( Rwr_Node_t * p, int c )  { return (Rwr_N  ///                    FUNCTION DECLARATIONS                         ///  //////////////////////////////////////////////////////////////////////// -/*=== rwrCut.c ========================================================*/ -extern void              Rwr_NtkStartCuts( Rwr_Man_t * p, Abc_Ntk_t * pNtk ); -extern void              Rwr_NodeComputeCuts( Rwr_Man_t * p, Abc_Obj_t * pNode ); -/*=== rwrEva.c ========================================================*/ -extern int               Rwr_NodeRewrite( Rwr_Man_t * p, Abc_Obj_t * pNode ); +/*=== rwrDec.c ========================================================*/  extern void              Rwr_ManPreprocess( Rwr_Man_t * p ); +/*=== rwrEva.c ========================================================*/ +extern int               Rwr_NodeRewrite( Rwr_Man_t * p, Cut_Man_t * pManCut, Abc_Obj_t * pNode, int fUseZeros );  /*=== rwrLib.c ========================================================*/  extern void              Rwr_ManPrecompute( Rwr_Man_t * p );  extern Rwr_Node_t *      Rwr_ManAddVar( Rwr_Man_t * p, unsigned uTruth, int fPrecompute ); @@ -131,14 +124,18 @@ extern void              Rwr_ManIncTravId( Rwr_Man_t * p );  /*=== rwrMan.c ========================================================*/  extern Rwr_Man_t *       Rwr_ManStart( bool fPrecompute );  extern void              Rwr_ManStop( Rwr_Man_t * p ); +extern void              Rwr_ManPrintStats( Rwr_Man_t * p );  extern void              Rwr_ManPrepareNetwork( Rwr_Man_t * p, Abc_Ntk_t * pNtk );  extern Vec_Ptr_t *       Rwr_ManReadFanins( Rwr_Man_t * p );  extern Vec_Int_t *       Rwr_ManReadDecs( Rwr_Man_t * p ); +extern int               Rwr_ManReadCompl( Rwr_Man_t * p ); +extern void              Rwr_ManAddTimeCuts( Rwr_Man_t * p, int Time ); +extern void              Rwr_ManAddTimeTotal( Rwr_Man_t * p, int Time );  /*=== rwrPrint.c ========================================================*/  extern void              Rwr_ManPrint( Rwr_Man_t * p );  /*=== rwrUtil.c ========================================================*/  extern void              Rwr_ManWriteToArray( Rwr_Man_t * p ); -extern void              Rwr_ManLoadFromArray( Rwr_Man_t * p ); +extern void              Rwr_ManLoadFromArray( Rwr_Man_t * p, int fVerbose );  extern void              Rwr_ManWriteToFile( Rwr_Man_t * p, char * pFileName );  extern void              Rwr_ManLoadFromFile( Rwr_Man_t * p, char * pFileName );  extern Vec_Int_t *       Rwt_NtkFanoutCounters( Abc_Ntk_t * pNtk ); diff --git a/src/opt/rwr/rwrCut.c b/src/opt/rwr/rwrCut.c deleted file mode 100644 index be512963..00000000 --- a/src/opt/rwr/rwrCut.c +++ /dev/null @@ -1,254 +0,0 @@ -/**CFile**************************************************************** - -  FileName    [rwrCut.c] - -  SystemName  [ABC: Logic synthesis and verification system.] - -  PackageName [DAG-aware AIG rewriting package.] - -  Synopsis    [Cut computation.] - -  Author      [Alan Mishchenko] -   -  Affiliation [UC Berkeley] - -  Date        [Ver. 1.0. Started - June 20, 2005.] - -  Revision    [$Id: rwrCut.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "rwr.h" - -//////////////////////////////////////////////////////////////////////// -///                        DECLARATIONS                              /// -//////////////////////////////////////////////////////////////////////// - -static Rwr_Cut_t * Rwr_CutAlloc( Rwr_Man_t * p ); -static Rwr_Cut_t * Rwr_CutCreateTriv( Rwr_Man_t * p, Abc_Obj_t * pNode ); -static Rwr_Cut_t * Rwr_CutsMerge( Rwr_Man_t * p, Rwr_Cut_t * pCut0, Rwr_Cut_t * pCut1, int fCompl0, int fCompl1 ); - -//////////////////////////////////////////////////////////////////////// -///                     FUNCTION DEFITIONS                           /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - -  Synopsis    [Computes cuts for one node.] - -  Description [] -                -  SideEffects [] - -  SeeAlso     [] - -***********************************************************************/ -void Rwr_NtkStartCuts( Rwr_Man_t * p, Abc_Ntk_t * pNtk ) -{ -    Abc_Obj_t * pNode; -    int i; -    // set the trivial cuts -    Abc_NtkCleanCopy( pNtk ); -    Abc_NtkForEachCi( pNtk, pNode, i ) -        pNode->pCopy = (Abc_Obj_t *)Rwr_CutCreateTriv( p, pNode ); -} - -/**Function************************************************************* - -  Synopsis    [Computes cuts for one node.] - -  Description [] -                -  SideEffects [] - -  SeeAlso     [] - -***********************************************************************/ -void Rwr_NodeComputeCuts( Rwr_Man_t * p, Abc_Obj_t * pNode ) -{ -    Rwr_Cut_t * pCuts0, * pCuts1, * pTemp0, * pTemp1, * pCut; -    Rwr_Cut_t * pList = NULL, ** ppPlace = &pList; // linked list of cuts -    assert( Abc_ObjIsNode(pNode) ); -    if ( Abc_NodeIsConst(pNode) ) -        return; -    // create the elementary cut -    pCut = Rwr_CutCreateTriv( p, pNode ); -    // add it to the linked list -    *ppPlace = pCut;  ppPlace  = &pCut->pNext; -    // create cuts by merging pairwise -    pCuts0 = (Rwr_Cut_t *)Abc_ObjFanin0(pNode)->pCopy; -    pCuts1 = (Rwr_Cut_t *)Abc_ObjFanin1(pNode)->pCopy; -    assert( pCuts0 && pCuts1 ); -    for ( pTemp0 = pCuts0; pTemp0; pTemp0 = pTemp0->pNext ) -    for ( pTemp1 = pCuts1; pTemp1; pTemp1 = pTemp1->pNext ) -    { -        pCut = Rwr_CutsMerge( p, pTemp0, pTemp1, Abc_ObjFaninC0(pNode), Abc_ObjFaninC1(pNode) ); -        if ( pCut == NULL ) -            continue; -        // add it to the linked list -        *ppPlace = pCut;  ppPlace  = &pCut->pNext; -    } -    // set the linked list -    pNode->pCopy = (Abc_Obj_t *)pList; -} - -/**Function************************************************************* - -  Synopsis    [Start the cut computation.] - -  Description [] -                -  SideEffects [] - -  SeeAlso     [] - -***********************************************************************/ -Rwr_Cut_t * Rwr_CutsMerge( Rwr_Man_t * p, Rwr_Cut_t * pCut0, Rwr_Cut_t * pCut1, int fCompl0, int fCompl1 ) -{ -    Abc_Obj_t * ppNodes[4], * pNodeTemp; -    Rwr_Cut_t * pCut; -    unsigned uPhase, uTruth0, uTruth1; -    int i, k, min, nTotal; - -    // solve the most typical case: both cuts are four input -    if ( pCut0->nLeaves == 4 && pCut1->nLeaves == 4 ) -    { -        for ( i = 0; i < 4; i++ ) -            if ( pCut0->ppLeaves[i] != pCut1->ppLeaves[i] ) -                return NULL; -        // create the cut -        pCut = Rwr_CutAlloc( p ); -        pCut->nLeaves = 4; -        for ( i = 0; i < 4; i++ ) -            pCut->ppLeaves[i] = pCut0->ppLeaves[i]; -        pCut->uTruth = (fCompl0? ~pCut0->uTruth : pCut0->uTruth) & (fCompl1? ~pCut1->uTruth : pCut1->uTruth) & 0xFFFF; -        return pCut; -    } - -    // create the set of new nodes -    // count the number of unique entries in pCut1 -    nTotal = pCut0->nLeaves; -    for ( i = 0; i < (int)pCut1->nLeaves; i++ ) -    { -        // try to find this entry among the leaves of pCut0 -        for ( k = 0; k < (int)pCut0->nLeaves; k++ ) -            if ( pCut1->ppLeaves[i] == pCut0->ppLeaves[k] ) -                break; -        if ( k < (int)pCut0->nLeaves ) // found -            continue; -        // we found a new entry to add -        if ( nTotal == 4 ) -            return NULL; -        ppNodes[nTotal++] = pCut1->ppLeaves[i]; -    } -    // we know that the feasible cut exists - -    // add the starting entries -    for ( k = 0; k < (int)pCut0->nLeaves; k++ ) -        ppNodes[k] = pCut0->ppLeaves[k]; - -    // selection-sort the entries -    for ( i = 0; i < nTotal - 1; i++ ) -    { -        min = i; -        for ( k = i+1; k < nTotal; k++ ) -            if ( ppNodes[k]->Id < ppNodes[min]->Id ) -                min = k; -        pNodeTemp    = ppNodes[i]; -        ppNodes[i]   = ppNodes[min]; -        ppNodes[min] = pNodeTemp; -    } - -    // find the mapping from the old nodes to the new -    if ( pCut0->nLeaves == 4 ) -        uTruth0 = pCut0->uTruth; -    else -    { -        uPhase = 0; -        for ( i = 0; i < (int)pCut0->nLeaves; i++ ) -        { -            for ( k = 0; k < nTotal; k++ ) -                if ( pCut0->ppLeaves[i] == ppNodes[k] ) -                    break; -            uPhase |= (1 << k); -        } -        assert( uPhase < 16 ); -        assert( pCut0->uTruth < 256 ); -        uTruth0 = p->puPerms43[pCut0->uTruth][uPhase]; -    } - -    // find the mapping from the old nodes to the new -    if ( pCut1->nLeaves == 4 ) -        uTruth1 = pCut1->uTruth; -    else -    { -        uPhase = 0; -        for ( i = 0; i < (int)pCut1->nLeaves; i++ ) -        { -            for ( k = 0; k < nTotal; k++ ) -                if ( pCut1->ppLeaves[i] == ppNodes[k] ) -                    break; -            uPhase |= (1 << k); -        } -        assert( uPhase < 16 ); -        assert( pCut1->uTruth < 256 ); -        uTruth1 = p->puPerms43[pCut1->uTruth][uPhase]; -    } - -    // create the cut -    pCut = Rwr_CutAlloc( p ); -    pCut->nLeaves = nTotal; -    for ( i = 0; i < nTotal; i++ ) -        pCut->ppLeaves[i] = ppNodes[i]; -    pCut->uTruth = (fCompl0? ~uTruth0 : uTruth0) & (fCompl1? ~uTruth1 : uTruth1) & 0xFFFF; -    return pCut; -} - -/**Function************************************************************* - -  Synopsis    [Start the cut computation.] - -  Description [] -                -  SideEffects [] - -  SeeAlso     [] - -***********************************************************************/ -Rwr_Cut_t * Rwr_CutAlloc( Rwr_Man_t * p ) -{ -    Rwr_Cut_t * pCut; -    pCut = (Rwr_Cut_t *)Extra_MmFixedEntryFetch( p->pMmNode ); -    memset( pCut, 0, sizeof(Rwr_Cut_t) ); -    return pCut; -} - -/**Function************************************************************* - -  Synopsis    [Start the cut computation.] - -  Description [] -                -  SideEffects [] - -  SeeAlso     [] - -***********************************************************************/ -Rwr_Cut_t * Rwr_CutCreateTriv( Rwr_Man_t * p, Abc_Obj_t * pNode ) -{ -    Rwr_Cut_t * pCut; -    pCut = Rwr_CutAlloc( p ); -    pCut->nLeaves = 1; -    pCut->ppLeaves[0] = pNode; -    pCut->uTruth = 0xAAAA; -    return pCut; -} - - - - -//////////////////////////////////////////////////////////////////////// -///                       END OF FILE                                /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/opt/rwr/rwrDec.c b/src/opt/rwr/rwrDec.c new file mode 100644 index 00000000..9cfc9659 --- /dev/null +++ b/src/opt/rwr/rwrDec.c @@ -0,0 +1,231 @@ +/**CFile**************************************************************** + +  FileName    [rwrDec.c] + +  SystemName  [ABC: Logic synthesis and verification system.] + +  PackageName [DAG-aware AIG rewriting package.] + +  Synopsis    [Evaluation and decomposition procedures.] + +  Author      [Alan Mishchenko] +   +  Affiliation [UC Berkeley] + +  Date        [Ver. 1.0. Started - June 20, 2005.] + +  Revision    [$Id: rwrDec.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "rwr.h" +#include "ft.h" + +//////////////////////////////////////////////////////////////////////// +///                        DECLARATIONS                              /// +//////////////////////////////////////////////////////////////////////// + +static Vec_Int_t * Rwr_NodePreprocess( Rwr_Man_t * p, Rwr_Node_t * pNode ); +static int         Rwr_TravCollect_rec( Rwr_Man_t * p, Rwr_Node_t * pNode, Vec_Int_t * vForm ); +static void        Rwr_FactorVerify( Vec_Int_t * vForm, unsigned uTruth ); + +//////////////////////////////////////////////////////////////////////// +///                     FUNCTION DEFITIONS                           /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + +  Synopsis    [Preprocesses computed library of subgraphs.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Rwr_ManPreprocess( Rwr_Man_t * p ) +{ +    Rwr_Node_t * pNode; +    int i, k; +    // put the nodes into the structure +    p->vClasses = Vec_VecStart( 222 ); +    for ( i = 0; i < p->nFuncs; i++ ) +    { +        if ( p->pTable[i] == NULL ) +            continue; +        // consider all implementations of this function +        for ( pNode = p->pTable[i]; pNode; pNode = pNode->pNext ) +        { +            assert( pNode->uTruth == p->pTable[i]->uTruth ); +            assert( p->pMap[pNode->uTruth] >= 0 && p->pMap[pNode->uTruth] < 222 ); +            Vec_VecPush( p->vClasses, p->pMap[pNode->uTruth], pNode ); +        } +    } +    // compute decomposition forms for each node +    Vec_VecForEachEntry( p->vClasses, pNode, i, k ) +        pNode->pNext = (Rwr_Node_t *)Rwr_NodePreprocess( p, pNode ); +} + +/**Function************************************************************* + +  Synopsis    [Preprocesses subgraphs rooted at this node.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +Vec_Int_t * Rwr_NodePreprocess( Rwr_Man_t * p, Rwr_Node_t * pNode ) +{ +    Vec_Int_t * vForm; +    int i, Root; +    // consider constant +    if ( pNode->uTruth == 0 ) +        return Ft_FactorConst( 0 ); +    // consider the case of elementary var +    if ( pNode->uTruth == 0x00FF ) +        return Ft_FactorVar( 3, 4, 1 ); +    // start the factored form +    vForm = Vec_IntAlloc( 10 ); +    for ( i = 0; i < 4; i++ ) +        Vec_IntPush( vForm, 0 ); +    // collect the nodes +    Rwr_ManIncTravId( p ); +    Root = Rwr_TravCollect_rec( p, pNode, vForm ); +    if ( Root & 1 ) +        Ft_FactorComplement( vForm ); +    // verify the factored form +    Rwr_FactorVerify( vForm, pNode->uTruth ); +    return vForm; +} + +/**Function************************************************************* + +  Synopsis    [Adds one node.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +int Rwr_TravCollect_rec( Rwr_Man_t * p, Rwr_Node_t * pNode, Vec_Int_t * vForm ) +{ +    Ft_Node_t Node, NodeA, NodeB; +    int Node0, Node1; +    // elementary variable +    if ( pNode->fUsed ) +        return ((pNode->Id - 1) << 1);  +    // previously visited node +    if ( pNode->TravId == p->nTravIds ) +        return pNode->Volume; +    pNode->TravId = p->nTravIds; +    // solve for children +    Node0 = Rwr_TravCollect_rec( p, Rwr_Regular(pNode->p0), vForm ); +    Node1 = Rwr_TravCollect_rec( p, Rwr_Regular(pNode->p1), vForm ); +    // create the decomposition node(s) +    if ( pNode->fExor ) +    { +        assert( !Rwr_IsComplement(pNode->p0) ); +        assert( !Rwr_IsComplement(pNode->p1) ); +        NodeA.fIntern = 1; +        NodeA.fConst  = 0; +        NodeA.fCompl  = 0; +        NodeA.fCompl0 = !(Node0 & 1); +        NodeA.fCompl1 =  (Node1 & 1); +        NodeA.iFanin0 = (Node0 >> 1); +        NodeA.iFanin1 = (Node1 >> 1); +        Vec_IntPush( vForm, Ft_Node2Int(NodeA) ); + +        NodeB.fIntern = 1; +        NodeB.fConst  = 0; +        NodeB.fCompl  = 0; +        NodeB.fCompl0 =  (Node0 & 1); +        NodeB.fCompl1 = !(Node1 & 1); +        NodeB.iFanin0 = (Node0 >> 1); +        NodeB.iFanin1 = (Node1 >> 1); +        Vec_IntPush( vForm, Ft_Node2Int(NodeB) ); + +        Node.fIntern = 1; +        Node.fConst  = 0; +        Node.fCompl  = 0; +        Node.fCompl0 = 1; +        Node.fCompl1 = 1; +        Node.iFanin0 = vForm->nSize - 2; +        Node.iFanin1 = vForm->nSize - 1; +        Vec_IntPush( vForm, Ft_Node2Int(Node) ); +    } +    else +    { +        Node.fIntern = 1; +        Node.fConst  = 0; +        Node.fCompl  = 0; +        Node.fCompl0 = Rwr_IsComplement(pNode->p0) ^ (Node0 & 1); +        Node.fCompl1 = Rwr_IsComplement(pNode->p1) ^ (Node1 & 1); +        Node.iFanin0 = (Node0 >> 1); +        Node.iFanin1 = (Node1 >> 1); +        Vec_IntPush( vForm, Ft_Node2Int(Node) ); +    } +    // save the number of this node +    pNode->Volume = ((vForm->nSize - 1) << 1) | pNode->fExor; +    return pNode->Volume; +} + +/**Function************************************************************* + +  Synopsis    [Verifies the factored form.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Rwr_FactorVerify( Vec_Int_t * vForm, unsigned uTruthGold ) +{ +    Ft_Node_t * pFtNode; +    Vec_Int_t * vTruths; +    unsigned uTruth, uTruth0, uTruth1; +    int i; + +    vTruths = Vec_IntAlloc( vForm->nSize ); +    Vec_IntPush( vTruths, 0xAAAA ); +    Vec_IntPush( vTruths, 0xCCCC ); +    Vec_IntPush( vTruths, 0xF0F0 ); +    Vec_IntPush( vTruths, 0xFF00 ); + +    assert( Ft_FactorGetNumVars( vForm ) == 4 ); +    for ( i = 4; i < vForm->nSize; i++ ) +    { +        pFtNode = Ft_NodeRead( vForm, i ); +        // make sure there are no elementary variables +        assert( pFtNode->iFanin0 != pFtNode->iFanin1 ); + +        uTruth0 = vTruths->pArray[pFtNode->iFanin0]; +        uTruth0 = pFtNode->fCompl0? ~uTruth0 : uTruth0; + +        uTruth1 = vTruths->pArray[pFtNode->iFanin1]; +        uTruth1 = pFtNode->fCompl1? ~uTruth1 : uTruth1; + +        uTruth = uTruth0 & uTruth1; +        Vec_IntPush( vTruths, uTruth ); +    } +    // complement if necessary +    if ( pFtNode->fCompl ) +        uTruth = ~uTruth; +    uTruth &= 0xFFFF; +    if ( uTruth != uTruthGold ) +        printf( "Verification failed\n" ); +    Vec_IntFree( vTruths ); +} + +//////////////////////////////////////////////////////////////////////// +///                       END OF FILE                                /// +//////////////////////////////////////////////////////////////////////// + + diff --git a/src/opt/rwr/rwrEva.c b/src/opt/rwr/rwrEva.c index b486785f..735232af 100644 --- a/src/opt/rwr/rwrEva.c +++ b/src/opt/rwr/rwrEva.c @@ -25,7 +25,7 @@  ///                        DECLARATIONS                              ///  //////////////////////////////////////////////////////////////////////// -static Vec_Int_t * Rwr_CutEvaluate( Rwr_Man_t * p, Abc_Obj_t * pRoot, Rwr_Cut_t * pCut, int NodeMax, int LevelMax ); +static Vec_Int_t * Rwr_CutEvaluate( Rwr_Man_t * p, Abc_Obj_t * pRoot, Cut_Cut_t * pCut, Vec_Ptr_t * vFaninsCur, int nNodesSaved, int LevelMax, int * pGainBest );  ////////////////////////////////////////////////////////////////////////  ///                     FUNCTION DEFITIONS                           /// @@ -49,37 +49,101 @@ static Vec_Int_t * Rwr_CutEvaluate( Rwr_Man_t * p, Abc_Obj_t * pRoot, Rwr_Cut_t    SeeAlso     []  ***********************************************************************/ -int Rwr_NodeRewrite( Rwr_Man_t * p, Abc_Obj_t * pNode ) +int Rwr_NodeRewrite( Rwr_Man_t * p, Cut_Man_t * pManCut, Abc_Obj_t * pNode, int fUseZeros )  { +    int fVeryVerbose = 0;      Vec_Int_t * vForm; -    Rwr_Cut_t * pCut; +    Cut_Cut_t * pCut; +    Abc_Obj_t * pFanin; +    unsigned uPhase, uTruthBest; +    char * pPerm;      int Required, nNodesSaved; -    int i, BestGain = -1; -    // compute the cuts for this node -    Rwr_NodeComputeCuts( p, pNode ); +    int i, GainCur, GainBest = -1; +    int clk; + +    p->nNodesConsidered++;      // get the required times -    Required = Vec_IntEntry( p->vReqTimes, pNode->Id ); -    // label MFFC with current ID -    nNodesSaved = Abc_NodeMffcLabel( pNode ); +    Required = Abc_NodeReadRequiredLevel( pNode ); +    // get the node's cuts +clk = clock(); +    pCut = (Cut_Cut_t *)Abc_NodeGetCutsRecursive( pManCut, pNode ); +    assert( pCut != NULL ); +p->timeCut += clock() - clk; +      // go through the cuts -    for ( pCut = (Rwr_Cut_t *)pNode->pCopy, pCut = pCut->pNext; pCut; pCut = pCut->pNext ) +clk = clock(); +    for ( pCut = pCut->pNext; pCut; pCut = pCut->pNext )      { +        // consider only 4-input cuts +        if ( pCut->nLeaves < 4 ) +            continue; +        // get the fanin permutation +        pPerm = p->pPerms4[ p->pPerms[pCut->uTruth] ]; +        uPhase = p->pPhases[pCut->uTruth]; +        // collect fanins with the corresponding permutation/phase +        Vec_PtrClear( p->vFaninsCur ); +        Vec_PtrFill( p->vFaninsCur, (int)pCut->nLeaves, 0 ); +        for ( i = 0; i < (int)pCut->nLeaves; i++ ) +        { +            pFanin = Abc_NtkObj( pNode->pNtk, pCut->pLeaves[pPerm[i]] ); +            if ( pFanin == NULL ) +                break; +            pFanin = Abc_ObjNotCond(pFanin, ((uPhase & (1<<i)) > 0) ); +            Vec_PtrWriteEntry( p->vFaninsCur, i, pFanin ); +        } +        if ( i != (int)pCut->nLeaves ) +        { +            p->nCutsBad++; +            continue; +        } +        p->nCutsGood++; + +        // mark the fanin boundary  +        Vec_PtrForEachEntry( p->vFaninsCur, pFanin, i ) +            Abc_ObjRegular(pFanin)->vFanouts.nSize++; +        // label MFFC with current ID +        Abc_NtkIncrementTravId( pNode->pNtk ); +        nNodesSaved = Abc_NodeMffcLabel( pNode ); +        // unmark the fanin boundary +        Vec_PtrForEachEntry( p->vFaninsCur, pFanin, i ) +            Abc_ObjRegular(pFanin)->vFanouts.nSize--; +          // evaluate the cut -        vForm = Rwr_CutEvaluate( p, pNode, pCut, nNodesSaved, Required ); -        // check if the cut is better than the currently best one -        if ( vForm != NULL && BestGain < (int)pCut->Volume ) +        vForm = Rwr_CutEvaluate( p, pNode, pCut, p->vFaninsCur, nNodesSaved, Required, &GainCur ); + +        // check if the cut is better than the current best one +        if ( vForm != NULL && GainBest < GainCur )          { -            assert( pCut->Volume >= 0 ); -            BestGain  = pCut->Volume;              // save this form -            p->vForm = vForm; -            // collect fanins +            GainBest  = GainCur; +            p->vForm  = vForm; +            p->fCompl = ((uPhase & (1<<4)) > 0); +            uTruthBest = pCut->uTruth; +            // collect fanins in the              Vec_PtrClear( p->vFanins ); -            for ( i = 0; i < (int)pCut->nLeaves; i++ ) -                Vec_PtrPush( p->vFanins, pCut->ppLeaves[i] ); +            Vec_PtrForEachEntry( p->vFaninsCur, pFanin, i ) +                Vec_PtrPush( p->vFanins, pFanin );          }      } -    return BestGain; +p->timeRes += clock() - clk; + +    if ( GainBest == -1 || GainBest == 0 && !fUseZeros ) +        return GainBest; + +    p->nScores[p->pMap[uTruthBest]]++; +    p->nNodesRewritten++; +    p->nNodesGained += GainBest; + +    // report the progress +    if ( fVeryVerbose ) +    { +        printf( "Node %6s :   ", Abc_ObjName(pNode) ); +        printf( "Fanins = %d. ", p->vFanins->nSize ); +        printf( "Cone = %2d.  ", p->vForm->nSize - 4 ); +        printf( "GAIN = %2d.  ", GainBest ); +        printf( "\n" ); +    } +    return GainBest;  }  /**Function************************************************************* @@ -93,161 +157,39 @@ int Rwr_NodeRewrite( Rwr_Man_t * p, Abc_Obj_t * pNode )    SeeAlso     []  ***********************************************************************/ -Vec_Int_t * Rwr_CutEvaluate( Rwr_Man_t * p, Abc_Obj_t * pRoot, Rwr_Cut_t * pCut, int NodeMax, int LevelMax ) +Vec_Int_t * Rwr_CutEvaluate( Rwr_Man_t * p, Abc_Obj_t * pRoot, Cut_Cut_t * pCut, Vec_Ptr_t * vFaninsCur, int nNodesSaved, int LevelMax, int * pGainBest )  { -    Vec_Ptr_t Vector = {0,0,0}, * vFanins = &Vector;      Vec_Ptr_t * vSubgraphs;      Vec_Int_t * vFormBest;      Rwr_Node_t * pNode; -    int GainCur, GainBest = -1, i; +    int nNodesAdded, GainBest = -1, i; +    int clk = clock();      // find the matching class of subgraphs      vSubgraphs = Vec_VecEntry( p->vClasses, p->pMap[pCut->uTruth] ); +    p->nSubgraphs += vSubgraphs->nSize;      // determine the best subgraph      Vec_PtrForEachEntry( vSubgraphs, pNode, i )      { -        // create the fanin array -        vFanins->nSize  = pCut->nLeaves; -        vFanins->pArray = pCut->ppLeaves;          // detect how many unlabeled nodes will be reused -        GainCur = Abc_NodeStrashDecCount( pRoot->pNtk->pManFunc,  pRoot, vFanins, (Vec_Int_t *)pNode->pNext,  -            p->vLevNums, NodeMax, LevelMax ); -        if ( GainBest < GainCur ) +        nNodesAdded = Abc_NodeStrashDecCount( pRoot->pNtk->pManFunc, pRoot, vFaninsCur,  +            (Vec_Int_t *)pNode->pNext, p->vLevNums, nNodesSaved, LevelMax ); +        if ( nNodesAdded == -1 ) +            continue; +        assert( nNodesSaved >= nNodesAdded ); +        // count the gain at this node +        if ( GainBest < nNodesSaved - nNodesAdded )          { -            GainBest  = GainCur; +            GainBest  = nNodesSaved - nNodesAdded;              vFormBest = (Vec_Int_t *)pNode->pNext;          }      } +p->timeEval += clock() - clk;      if ( GainBest == -1 )          return NULL; -    pCut->Volume = GainBest; +    *pGainBest = GainBest;      return vFormBest;  } - -/**Function************************************************************* - -  Synopsis    [Adds one node.] - -  Description [] -                -  SideEffects [] - -  SeeAlso     [] - -***********************************************************************/ -int Rwr_TravCollect_rec( Rwr_Man_t * p, Rwr_Node_t * pNode, Vec_Int_t * vForm ) -{ -    Ft_Node_t Node, NodeA, NodeB; -    int Node0, Node1; -    // elementary variable -    if ( pNode->fUsed ) -        return ((pNode->Id - 1) << 1);  -    // previously visited node -    if ( pNode->TravId == p->nTravIds ) -        return pNode->Volume; -    pNode->TravId = p->nTravIds; -    // solve for children -    Node0 = Rwr_TravCollect_rec( p, Rwr_Regular(pNode->p0), vForm ); -    Node1 = Rwr_TravCollect_rec( p, Rwr_Regular(pNode->p1), vForm ); -    // create the decomposition node(s) -    if ( pNode->fExor ) -    { -        assert( !Rwr_IsComplement(pNode->p0) ); -        assert( !Rwr_IsComplement(pNode->p1) ); -        NodeA.fIntern = 1; -        NodeA.fConst  = 0; -        NodeA.fCompl  = 0; -        NodeA.fCompl0 = !(Node0 & 1); -        NodeA.fCompl1 =  (Node1 & 1); -        NodeA.iFanin0 = (Node0 >> 1); -        NodeA.iFanin1 = (Node1 >> 1); -        Vec_IntPush( vForm, Ft_Node2Int(NodeA) ); - -        NodeB.fIntern = 1; -        NodeB.fConst  = 0; -        NodeB.fCompl  = 0; -        NodeB.fCompl0 =  (Node0 & 1); -        NodeB.fCompl1 = !(Node1 & 1); -        NodeB.iFanin0 = (Node0 >> 1); -        NodeB.iFanin1 = (Node1 >> 1); -        Vec_IntPush( vForm, Ft_Node2Int(NodeB) ); - -        Node.fIntern = 1; -        Node.fConst  = 0; -        Node.fCompl  = 0; -        Node.fCompl0 = 1; -        Node.fCompl1 = 1; -        Node.iFanin0 = vForm->nSize - 2; -        Node.iFanin1 = vForm->nSize - 1; -        Vec_IntPush( vForm, Ft_Node2Int(Node) ); -    } -    else -    { -        Node.fIntern = 1; -        Node.fConst  = 0; -        Node.fCompl  = 0; -        Node.fCompl0 = Rwr_IsComplement(pNode->p0) ^ (Node0 & 1); -        Node.fCompl1 = Rwr_IsComplement(pNode->p1) ^ (Node1 & 1); -        Node.iFanin0 = (Node0 >> 1); -        Node.iFanin1 = (Node1 >> 1); -        Vec_IntPush( vForm, Ft_Node2Int(Node) ); -    } -    // save the number of this node -    pNode->Volume = ((vForm->nSize - 1) << 1) | pNode->fExor; -    return pNode->Volume; -} - -/**Function************************************************************* - -  Synopsis    [Preprocesses subgraphs rooted at this node.] - -  Description [] -                -  SideEffects [] - -  SeeAlso     [] - -***********************************************************************/ -void Rwr_NodePreprocess( Rwr_Man_t * p, Rwr_Node_t * pNode ) -{ -    Vec_Int_t * vForm; -    int i, Root; -    vForm = Vec_IntAlloc( 10 ); -    for ( i = 0; i < 5; i++ ) -        Vec_IntPush( vForm, 0 ); -    // collect the nodes -    Rwr_ManIncTravId( p ); -    Root = Rwr_TravCollect_rec( p, pNode, vForm ); -    if ( Root & 1 ) -        Ft_FactorComplement( vForm ); -    pNode->pNext = (Rwr_Node_t *)vForm; -} - -/**Function************************************************************* - -  Synopsis    [Preprocesses computed library of subgraphs.] - -  Description [] -                -  SideEffects [] - -  SeeAlso     [] - -***********************************************************************/ -void Rwr_ManPreprocess( Rwr_Man_t * p ) -{ -    Rwr_Node_t * pNode; -    int i, k; -    // put the nodes into the structure -    p->vClasses = Vec_VecAlloc( 222 ); -    for ( i = 0; i < p->nFuncs; i++ ) -        for ( pNode = p->pTable[i]; pNode; pNode = pNode->pNext ) -            Vec_VecPush( p->vClasses, p->pMap[pNode->uTruth], pNode ); -    // compute decomposition forms for each node -    Vec_VecForEachEntry( p->vClasses, pNode, i, k ) -        Rwr_NodePreprocess( p, pNode ); -} -  ////////////////////////////////////////////////////////////////////////  ///                       END OF FILE                                ///  //////////////////////////////////////////////////////////////////////// diff --git a/src/opt/rwr/rwrMan.c b/src/opt/rwr/rwrMan.c index ead86b4e..71db4b20 100644 --- a/src/opt/rwr/rwrMan.c +++ b/src/opt/rwr/rwrMan.c @@ -49,14 +49,13 @@ Rwr_Man_t * Rwr_ManStart( bool fPrecompute )      // canonical forms, phases, perms  clk = clock();      Extra_Truth4VarNPN( &p->puCanons, &p->pPhases, &p->pPerms, &p->pMap ); -PRT( "NPN classes precomputation time", clock() - clk );  +//PRT( "NPN classes precomputation time", clock() - clk );       // initialize practical NPN classes      p->pPractical  = Rwr_ManGetPractical( p );      // create the table      p->pTable = ALLOC( Rwr_Node_t *, p->nFuncs );      memset( p->pTable, 0, sizeof(Rwr_Node_t *) * p->nFuncs );      // create the elementary nodes -    assert( sizeof(Rwr_Node_t) == sizeof(Rwr_Cut_t) );      p->pMmNode  = Extra_MmFixedStart( sizeof(Rwr_Node_t) );      p->vForest  = Vec_PtrAlloc( 100 );      Rwr_ManAddVar( p, 0x0000, fPrecompute ); // constant 0 @@ -66,10 +65,11 @@ PRT( "NPN classes precomputation time", clock() - clk );      Rwr_ManAddVar( p, 0xFF00, fPrecompute ); // var D      p->nClasses = 5;      // other stuff -    p->nTravIds = 1; -    p->puPerms43 = Extra_TruthPerm43(); -    p->vLevNums  = Vec_IntAlloc( 50 ); -    p->vFanins   = Vec_PtrAlloc( 50 ); +    p->nTravIds   = 1; +    p->pPerms4    = Extra_Permutations( 4 ); +    p->vLevNums   = Vec_IntAlloc( 50 ); +    p->vFanins    = Vec_PtrAlloc( 50 ); +    p->vFaninsCur = Vec_PtrAlloc( 50 );      if ( fPrecompute )      {   // precompute subgraphs          Rwr_ManPrecompute( p ); @@ -78,11 +78,11 @@ PRT( "NPN classes precomputation time", clock() - clk );      }      else      {   // load saved subgraphs -        Rwr_ManLoadFromArray( p ); -//        Rwr_ManPrint( p ); +        Rwr_ManLoadFromArray( p, 0 ); +        Rwr_ManPrint( p );          Rwr_ManPreprocess( p ); -        return NULL;      } +p->timeStart = clock() - clk;      return p;  } @@ -106,16 +106,15 @@ void Rwr_ManStop( Rwr_Man_t * p )          Vec_VecForEachEntry( p->vClasses, pNode, i, k )              Vec_IntFree( (Vec_Int_t *)pNode->pNext );      } -    if ( p->vFanNums )  Vec_IntFree( p->vFanNums ); -    if ( p->vReqTimes ) Vec_IntFree( p->vReqTimes );      if ( p->vClasses )  Vec_VecFree( p->vClasses );      Vec_PtrFree( p->vForest );      Vec_IntFree( p->vLevNums );      Vec_PtrFree( p->vFanins ); +    Vec_PtrFree( p->vFaninsCur );      Extra_MmFixedStop( p->pMmNode, 0 );      free( p->pTable );      free( p->pPractical ); -    free( p->puPerms43 ); +    free( p->pPerms4 );      free( p->puCanons );      free( p->pPhases );      free( p->pPerms ); @@ -125,6 +124,46 @@ void Rwr_ManStop( Rwr_Man_t * p )  /**Function************************************************************* +  Synopsis    [Stops the resynthesis manager.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Rwr_ManPrintStats( Rwr_Man_t * p ) +{ +    int i, Counter = 0; +    for ( i = 0; i < 222; i++ ) +        Counter += (p->nScores[i] > 0); + +    printf( "Rewriting statistics:\n" ); +    printf( "Total cuts tries  = %8d.\n", p->nCutsGood ); +    printf( "Bad cuts found    = %8d.\n", p->nCutsBad ); +    printf( "Total subgraphs   = %8d.\n", p->nSubgraphs ); +    printf( "Used NPN classes  = %8d.\n", Counter ); +    printf( "Nodes considered  = %8d.\n", p->nNodesConsidered ); +    printf( "Nodes rewritten   = %8d.\n", p->nNodesRewritten ); +    printf( "Calculated gain   = %8d.\n", p->nNodesGained     ); +    PRT( "Start       ", p->timeStart ); +    PRT( "Cuts        ", p->timeCut ); +    PRT( "Resynthesis ", p->timeRes ); +    PRT( "    Eval    ", p->timeEval ); +    PRT( "TOTAL       ", p->timeTotal ); + +/* +    printf( "The scores are : " ); +    for ( i = 0; i < 222; i++ ) +        if ( p->nScores[i] > 0 ) +            printf( "%d=%d ", i, p->nScores[i] ); +    printf( "\n" ); +*/ +} + +/**Function************************************************************* +    Synopsis    [Assigns elementary cuts to the PIs.]    Description [] @@ -137,11 +176,11 @@ void Rwr_ManStop( Rwr_Man_t * p )  void Rwr_ManPrepareNetwork( Rwr_Man_t * p, Abc_Ntk_t * pNtk )  {      // save the fanout counters for all internal nodes -    p->vFanNums = Rwt_NtkFanoutCounters( pNtk ); +//    p->vFanNums = Rwt_NtkFanoutCounters( pNtk );      // precompute the required times for all internal nodes -    p->vReqTimes = Abc_NtkGetRequiredLevels( pNtk ); +//    p->vReqTimes = Abc_NtkGetRequiredLevels( pNtk );      // start the cut computation -    Rwr_NtkStartCuts( p, pNtk ); +//    Rwr_NtkStartCuts( p, pNtk );  }  /**Function************************************************************* @@ -176,6 +215,54 @@ Vec_Int_t * Rwr_ManReadDecs( Rwr_Man_t * p )      return p->vForm;  } +/**Function************************************************************* + +  Synopsis    [Stops the resynthesis manager.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +int Rwr_ManReadCompl( Rwr_Man_t * p ) +{ +    return p->fCompl; +} + +/**Function************************************************************* + +  Synopsis    [Stops the resynthesis manager.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Rwr_ManAddTimeCuts( Rwr_Man_t * p, int Time ) +{ +    p->timeCut += Time; +} + +/**Function************************************************************* + +  Synopsis    [Stops the resynthesis manager.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Rwr_ManAddTimeTotal( Rwr_Man_t * p, int Time ) +{ +    p->timeTotal += Time; +} +  /**Function************************************************************* diff --git a/src/opt/rwr/rwrPrint.c b/src/opt/rwr/rwrPrint.c index 7c0bc212..30c99f00 100644 --- a/src/opt/rwr/rwrPrint.c +++ b/src/opt/rwr/rwrPrint.c @@ -209,17 +209,17 @@ void Rwr_ManPrint( Rwr_Man_t * p )      FILE * pFile;      Rwr_Node_t * pNode;      unsigned uTruth; -    int Counter, Volume, nFuncs, i; +    int Limit, Counter, Volume, nFuncs, i;      pFile = fopen( "graph_lib.txt", "w" );      Counter = 0; -    nFuncs = (1 << 16); -    for ( i = 0; i < nFuncs; i++ ) +    Limit = (1 << 16); +    for ( i = 0; i < Limit; i++ )      {          if ( p->pTable[i] == NULL )              continue;          if ( i != p->puCanons[i] )              continue; -        fprintf( pFile, "\nClass %3d  ", Counter++ ); +        fprintf( pFile, "\nClass %3d.  Func %6d.  ", p->pMap[i], Counter++ );          Rwr_GetBushVolume( p, i, &Volume, &nFuncs );          fprintf( pFile, "Functions = %2d. Volume = %2d. ", nFuncs, Volume );          uTruth = i; diff --git a/src/opt/rwr/rwrUtil.c b/src/opt/rwr/rwrUtil.c index 30b0cf69..dedd86fe 100644 --- a/src/opt/rwr/rwrUtil.c +++ b/src/opt/rwr/rwrUtil.c @@ -87,7 +87,7 @@ void Rwr_ManWriteToArray( Rwr_Man_t * p )    SeeAlso     []  ***********************************************************************/ -void Rwr_ManLoadFromArray( Rwr_Man_t * p ) +void Rwr_ManLoadFromArray( Rwr_Man_t * p, int fVerbose )  {      unsigned short * pArray = s_RwtAigSubgraphs;      Rwr_Node_t * p0, * p1; @@ -119,8 +119,11 @@ void Rwr_ManLoadFromArray( Rwr_Man_t * p )          Rwr_ManAddNode( p, p0, p1, fExor, Level, Volume + fExor );      }      nEntries = i - 1; -    printf( "The number of classes = %d. Canonical nodes = %d.\n", p->nClasses, p->nAdded ); -    printf( "The number of nodes loaded = %d.  ", nEntries );  PRT( "Loading", clock() - clk ); +    if ( fVerbose ) +    { +        printf( "The number of classes = %d. Canonical nodes = %d.\n", p->nClasses, p->nAdded ); +        printf( "The number of nodes loaded = %d.  ", nEntries );  PRT( "Loading", clock() - clk ); +    }  } diff --git a/src/sop/ft/ft.h b/src/sop/ft/ft.h index cea7d935..da162e99 100644 --- a/src/sop/ft/ft.h +++ b/src/sop/ft/ft.h @@ -95,6 +95,8 @@ extern Vec_Int_t *        Ft_Factor( char * pSop );  extern int                Ft_FactorGetNumNodes( Vec_Int_t * vForm );  extern int                Ft_FactorGetNumVars( Vec_Int_t * vForm );  extern void               Ft_FactorComplement( Vec_Int_t * vForm ); +extern Vec_Int_t *        Ft_FactorConst( int fConst1 ); +extern Vec_Int_t *        Ft_FactorVar( int iVar, int nVars, int fCompl );  /*=== ftPrint.c =====================================================*/  extern void               Ft_FactorPrint( FILE * pFile, Vec_Int_t * vForm, char * pNamesIn[], char * pNameOut ); diff --git a/src/sop/ft/ftFactor.c b/src/sop/ft/ftFactor.c index 1654973f..d25d0653 100644 --- a/src/sop/ft/ftFactor.c +++ b/src/sop/ft/ftFactor.c @@ -39,7 +39,6 @@ static Ft_Node_t *       Ft_FactorTrivialCubeCascade( Vec_Int_t * vForm, Mvc_Cov  static Ft_Node_t *       Ft_FactorNodeCreate( Vec_Int_t * vForm, int Type, Ft_Node_t * pNode1, Ft_Node_t * pNode2 );  static Ft_Node_t *       Ft_FactorLeafCreate( Vec_Int_t * vForm, int iLit );  static void              Ft_FactorFinalize( Vec_Int_t * vForm, Ft_Node_t * pNode, int nVars ); -static Vec_Int_t *       Ft_FactorConst( int fConst1 );  // temporary procedures that work with the covers  static Mvc_Cover_t *     Ft_ConvertSopToMvc( char * pSop ); @@ -320,6 +319,8 @@ Ft_Node_t * Ft_FactorTrivialTree_rec( Vec_Int_t * vForm, Ft_Node_t ** ppNodes, i          return ppNodes[0];      // split the nodes into two parts +//    nNodes1 = nNodes/2; +//    nNodes2 = nNodes - nNodes1;      nNodes2 = nNodes/2;      nNodes1 = nNodes - nNodes2; @@ -613,6 +614,32 @@ Vec_Int_t * Ft_FactorConst( int fConst1 )      return vForm;  } +/**Function************************************************************* + +  Synopsis    [Creates a constant 0 or 1 factored form.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +Vec_Int_t * Ft_FactorVar( int iVar, int nVars, int fCompl ) +{ +    Vec_Int_t * vForm; +    Ft_Node_t * pNode; +    // create the elementary variable node +    vForm = Vec_IntAlloc( nVars + 1 ); +    Vec_IntFill( vForm, nVars + 1, 0 ); +    pNode = Ft_NodeReadLast( vForm ); +    pNode->iFanin0 = iVar; +    pNode->iFanin1 = iVar; +    pNode->fIntern = 1; +    pNode->fCompl  = fCompl; +    return vForm; +} + | 
