summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--abc.dsp2
-rw-r--r--abc.optbin52736 -> 52736 bytes
-rw-r--r--abc.plg1667
-rw-r--r--abc.rc7
-rw-r--r--src/base/abc/abc.c47
-rw-r--r--src/base/abc/abc.h19
-rw-r--r--src/base/abc/abcAig.c205
-rw-r--r--src/base/abc/abcCheck.c5
-rw-r--r--src/base/abc/abcCut.c83
-rw-r--r--src/base/abc/abcRefactor.c39
-rw-r--r--src/base/abc/abcRefs.c3
-rw-r--r--src/base/abc/abcRewrite.c110
-rw-r--r--src/base/abc/abcStrash.c26
-rw-r--r--src/base/abc/abcTiming.c121
-rw-r--r--src/base/abc/abcUtil.c24
-rw-r--r--src/misc/extra/extraUtilMisc.c2
-rw-r--r--src/misc/vec/vecFan.h2
-rw-r--r--src/misc/vec/vecInt.h26
-rw-r--r--src/misc/vec/vecPtr.h26
-rw-r--r--src/misc/vec/vecStr.h2
-rw-r--r--src/misc/vec/vecVec.h30
-rw-r--r--src/opt/cut/cut.h1
-rw-r--r--src/opt/cut/cutInt.h1
-rw-r--r--src/opt/cut/cutMan.c5
-rw-r--r--src/opt/cut/cutNode.c7
-rw-r--r--src/opt/rwr/module.make2
-rw-r--r--src/opt/rwr/rwr.h55
-rw-r--r--src/opt/rwr/rwrCut.c254
-rw-r--r--src/opt/rwr/rwrDec.c231
-rw-r--r--src/opt/rwr/rwrEva.c254
-rw-r--r--src/opt/rwr/rwrMan.c117
-rw-r--r--src/opt/rwr/rwrPrint.c8
-rw-r--r--src/opt/rwr/rwrUtil.c9
-rw-r--r--src/sop/ft/ft.h2
-rw-r--r--src/sop/ft/ftFactor.c29
35 files changed, 2277 insertions, 1144 deletions
diff --git a/abc.dsp b/abc.dsp
index 6646c622..da023c2a 100644
--- a/abc.dsp
+++ b/abc.dsp
@@ -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
diff --git a/abc.opt b/abc.opt
index 3d077e0c..e644011b 100644
--- a/abc.opt
+++ b/abc.opt
Binary files differ
diff --git a/abc.plg b/abc.plg
index 08af2b53..844bfe4e 100644
--- a/abc.plg
+++ b/abc.plg
@@ -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>
diff --git a/abc.rc b/abc.rc
index 6f258814..ba6913b8 100644
--- a/abc.rc
+++ b/abc.rc
@@ -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;
+}
+