diff --git a/abc.dsp b/abc.dsp index e8fa05add..8e57a53a0 100644 --- a/abc.dsp +++ b/abc.dsp @@ -118,6 +118,10 @@ SOURCE=.\src\base\abc\abcFunc.c # End Source File # Begin Source File +SOURCE=.\src\base\abc\abcHie.c +# End Source File +# Begin Source File + SOURCE=.\src\base\abc\abcInt.h # End Source File # Begin Source File diff --git a/abc.plg b/abc.plg deleted file mode 100644 index 6cb57990c..000000000 --- a/abc.plg +++ /dev/null @@ -1,25 +0,0 @@ - -
--- - diff --git a/abc.rc b/abc.rc index 82ef85de7..e5e7f58d4 100644 --- a/abc.rc +++ b/abc.rc @@ -47,6 +47,7 @@ alias r3 retime -M 3 alias r3f retime -M 3 -f alias r3b retime -M 3 -b alias ren renode +alias rh read_hie alias rl read_blif alias rb read_bench alias ret retime @@ -76,6 +77,7 @@ alias trt "r c.blif; st; tr0; b; tr1" alias u undo alias w write alias wb write_blif +alias wh write_hie alias wl write_blif alias wp write_pla alias wv write_verilog @@ -106,6 +108,9 @@ alias compress2rs "b -l; rs -K 6 -l; rw -l; rs -K 6 -N 2 -l; rf -l; rs -K 8 -l; alias resyn2rsdc "b; rs -K 6 -F 2; rw; rs -K 6 -N 2 -F 2; rf; rs -K 8 -F 2; b; rs -K 8 -N 2 -F 2; rw; rs -K 10 -F 2; rwz; rs -K 10 -N 2 -F 2; b; rs -K 12 -F 2; rfz; rs -K 12 -N 2 -F 2; rwz; b" alias compress2rsdc "b -l; rs -K 6 -F 2 -l; rw -l; rs -K 6 -N 2 -F 2 -l; rf -l; rs -K 8 -F 2 -l; b -l; rs -K 8 -N 2 -F 2 -l; rw -l; rs -K 10 -F 2 -l; rwz -l; rs -K 10 -N 2 -F 2 -l; b -l; rs -K 12 -F 2 -l; rfz -l; rs -K 12 -N 2 -F 2 -l; rwz -l; b -l" +# minimizing for FF literals +alias fflitmin "compress2rs; ren; sop; ps -f" + # temporaries #alias t "rvl th/lib.v; rvv th/t2.v" #alias t "so c/pure_sat/test.c" @@ -113,5 +118,6 @@ alias compress2rsdc "b -l; rs -K 6 -F 2 -l; rw -l; rs -K 6 -N 2 -F 2 -l; rf -l; alias t0 "r res.blif; aig; mfs" alias t "r res2.blif; aig; mfs" +alias tt "rh a/quip_opt/nut_002_opt.blif" diff --git a/abclib.plg b/abclib.plg deleted file mode 100644 index 11a534660..000000000 --- a/abclib.plg +++ /dev/null @@ -1,903 +0,0 @@ - - -Build Log
----------------------Configuration: abc - Win32 Debug-------------------- -
-Command Lines
-Creating temporary file "C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP83C.tmp" with contents -[ -/nologo /MLd /W3 /Gm /GX /ZI /Od /I "src\base\abc" /I "src\base\abci" /I "src\base\abcs" /I "src\base\seq" /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\ft" /I "src\sat\asat" /I "src\sat\bsat" /I "src\sat\msat" /I "src\sat\fraig" /I "src\opt\cut" /I "src\opt\dec" /I "src\opt\fxu" /I "src\opt\sim" /I "src\opt\rwr" /I "src\opt\kit" /I "src\opt\res" /I "src\map\fpga" /I "src\map\if" /I "src\map\mapper" /I "src\map\mio" /I "src\map\super" /I "src\misc\extra" /I "src\misc\st" /I "src\misc\mvc" /I "src\misc\util" /I "src\misc\npn" /I "src\misc\vec" /I "src\misc\espresso" /I "src\misc\nm" /I "src\misc\hash" /I "src\aig\ivy" /I "src\aig\hop" /I "src\aig\rwt" /I "src\aig\deco" /I "src\aig\mem" /I "src\temp\esop" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "__STDC__" /FR"Debug/" /Fp"Debug/abc.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c -"C:\_projects\abc\src\base\abc\abcObj.c" -] -Creating command line "cl.exe @C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP83C.tmp" -Output Window
-Compiling... -abcObj.c - - - -Results
-abcObj.obj - 0 error(s), 0 warning(s) -
-- - diff --git a/abctestlib.plg b/abctestlib.plg deleted file mode 100644 index 0d4fd9356..000000000 --- a/abctestlib.plg +++ /dev/null @@ -1,35 +0,0 @@ - - -Build Log
----------------------Configuration: abclib - Win32 Debug-------------------- -
-Command Lines
-Creating temporary file "C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP137A.tmp" with contents -[ -/nologo /MLd /W3 /Gm /GX /ZI /Od /I "src\base\abc" /I "src\base\abci" /I "src\base\abcs" /I "src\base\seq" /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\ft" /I "src\sat\asat" /I "src\sat\bsat" /I "src\sat\msat" /I "src\sat\fraig" /I "src\opt\cut" /I "src\opt\dec" /I "src\opt\fxu" /I "src\opt\sim" /I "src\opt\rwr" /I "src\opt\kit" /I "src\map\fpga" /I "src\map\if" /I "src\map\mapper" /I "src\map\mio" /I "src\map\super" /I "src\misc\extra" /I "src\misc\st" /I "src\misc\mvc" /I "src\misc\util" /I "src\misc\npn" /I "src\misc\vec" /I "src\misc\espresso" /I "src\misc\nm" /I "src\misc\hash" /I "src\aig\ivy" /I "src\aig\hop" /I "src\aig\rwt" /I "src\aig\deco" /I "src\aig\mem" /I "src\temp\esop" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "__STDC__" /D "HAVE_ASSERT_H" /FR"abclib\DebugLib/" /Fp"abclib\DebugLib/abclib.pch" /YX /Fo"abclib\DebugLib/" /Fd"abclib\DebugLib/" /FD /GZ /c -"C:\_projects\abc\src\sat\asat\jfront.c" -] -Creating command line "cl.exe @C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP137A.tmp" -Creating temporary file "C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP137B.tmp" with contents -[ -/nologo /out:"abclib\abclib_debug.lib" -.\abclib\DebugLib\abcAig.obj -.\abclib\DebugLib\abcCheck.obj -.\abclib\DebugLib\abcDfs.obj -.\abclib\DebugLib\abcFanio.obj -.\abclib\DebugLib\abcFunc.obj -.\abclib\DebugLib\abcLatch.obj -.\abclib\DebugLib\abcLib.obj -.\abclib\DebugLib\abcMinBase.obj -.\abclib\DebugLib\abcNames.obj -.\abclib\DebugLib\abcNetlist.obj -.\abclib\DebugLib\abcNtk.obj -.\abclib\DebugLib\abcObj.obj -.\abclib\DebugLib\abcRefs.obj -.\abclib\DebugLib\abcShow.obj -.\abclib\DebugLib\abcSop.obj -.\abclib\DebugLib\abcUtil.obj -.\abclib\DebugLib\abc.obj -.\abclib\DebugLib\abcAttach.obj -.\abclib\DebugLib\abcAuto.obj -.\abclib\DebugLib\abcBalance.obj -.\abclib\DebugLib\abcBmc.obj -.\abclib\DebugLib\abcClpBdd.obj -.\abclib\DebugLib\abcClpSop.obj -.\abclib\DebugLib\abcCut.obj -.\abclib\DebugLib\abcDebug.obj -.\abclib\DebugLib\abcDress.obj -.\abclib\DebugLib\abcDsd.obj -.\abclib\DebugLib\abcEspresso.obj -.\abclib\DebugLib\abcExtract.obj -.\abclib\DebugLib\abcFpga.obj -.\abclib\DebugLib\abcFpgaFast.obj -.\abclib\DebugLib\abcFraig.obj -.\abclib\DebugLib\abcFxu.obj -.\abclib\DebugLib\abcGen.obj -.\abclib\DebugLib\abcIf.obj -.\abclib\DebugLib\abcIvy.obj -.\abclib\DebugLib\abcLut.obj -.\abclib\DebugLib\abcMap.obj -.\abclib\DebugLib\abcMini.obj -.\abclib\DebugLib\abcMiter.obj -.\abclib\DebugLib\abcMulti.obj -.\abclib\DebugLib\abcMv.obj -.\abclib\DebugLib\abcNtbdd.obj -.\abclib\DebugLib\abcOrder.obj -.\abclib\DebugLib\abcPrint.obj -.\abclib\DebugLib\abcProve.obj -.\abclib\DebugLib\abcReconv.obj -.\abclib\DebugLib\abcRefactor.obj -.\abclib\DebugLib\abcRenode.obj -.\abclib\DebugLib\abcReorder.obj -.\abclib\DebugLib\abcRestruct.obj -.\abclib\DebugLib\abcResub.obj -.\abclib\DebugLib\abcRewrite.obj -.\abclib\DebugLib\abcRr.obj -.\abclib\DebugLib\abcSat.obj -.\abclib\DebugLib\abcStrash.obj -.\abclib\DebugLib\abcSweep.obj -.\abclib\DebugLib\abcSymm.obj -.\abclib\DebugLib\abcTiming.obj -.\abclib\DebugLib\abcUnate.obj -.\abclib\DebugLib\abcUnreach.obj -.\abclib\DebugLib\abcVerify.obj -.\abclib\DebugLib\abcXsim.obj -.\abclib\DebugLib\cmd.obj -.\abclib\DebugLib\cmdAlias.obj -.\abclib\DebugLib\cmdApi.obj -.\abclib\DebugLib\cmdFlag.obj -.\abclib\DebugLib\cmdHist.obj -.\abclib\DebugLib\cmdUtils.obj -.\abclib\DebugLib\io.obj -.\abclib\DebugLib\ioReadAiger.obj -.\abclib\DebugLib\ioReadBaf.obj -.\abclib\DebugLib\ioReadBench.obj -.\abclib\DebugLib\ioReadBlif.obj -.\abclib\DebugLib\ioReadBlifAig.obj -.\abclib\DebugLib\ioReadEdif.obj -.\abclib\DebugLib\ioReadEqn.obj -.\abclib\DebugLib\ioReadPla.obj -.\abclib\DebugLib\ioUtil.obj -.\abclib\DebugLib\ioWriteAiger.obj -.\abclib\DebugLib\ioWriteBaf.obj -.\abclib\DebugLib\ioWriteBench.obj -.\abclib\DebugLib\ioWriteBlif.obj -.\abclib\DebugLib\ioWriteCnf.obj -.\abclib\DebugLib\ioWriteDot.obj -.\abclib\DebugLib\ioWriteEqn.obj -.\abclib\DebugLib\ioWriteGml.obj -.\abclib\DebugLib\ioWriteList.obj -.\abclib\DebugLib\ioWritePla.obj -.\abclib\DebugLib\ioWriteVer.obj -.\abclib\DebugLib\ioWriteVerAux.obj -.\abclib\DebugLib\libSupport.obj -.\abclib\DebugLib\main.obj -.\abclib\DebugLib\mainFrame.obj -.\abclib\DebugLib\mainInit.obj -.\abclib\DebugLib\mainUtils.obj -.\abclib\DebugLib\verCore.obj -.\abclib\DebugLib\verFormula.obj -.\abclib\DebugLib\verParse.obj -.\abclib\DebugLib\verStream.obj -.\abclib\DebugLib\verWords.obj -.\abclib\DebugLib\cuddAddAbs.obj -.\abclib\DebugLib\cuddAddApply.obj -.\abclib\DebugLib\cuddAddFind.obj -.\abclib\DebugLib\cuddAddInv.obj -.\abclib\DebugLib\cuddAddIte.obj -.\abclib\DebugLib\cuddAddNeg.obj -.\abclib\DebugLib\cuddAddWalsh.obj -.\abclib\DebugLib\cuddAndAbs.obj -.\abclib\DebugLib\cuddAnneal.obj -.\abclib\DebugLib\cuddApa.obj -.\abclib\DebugLib\cuddAPI.obj -.\abclib\DebugLib\cuddApprox.obj -.\abclib\DebugLib\cuddBddAbs.obj -.\abclib\DebugLib\cuddBddCorr.obj -.\abclib\DebugLib\cuddBddIte.obj -.\abclib\DebugLib\cuddBridge.obj -.\abclib\DebugLib\cuddCache.obj -.\abclib\DebugLib\cuddCheck.obj -.\abclib\DebugLib\cuddClip.obj -.\abclib\DebugLib\cuddCof.obj -.\abclib\DebugLib\cuddCompose.obj -.\abclib\DebugLib\cuddDecomp.obj -.\abclib\DebugLib\cuddEssent.obj -.\abclib\DebugLib\cuddExact.obj -.\abclib\DebugLib\cuddExport.obj -.\abclib\DebugLib\cuddGenCof.obj -.\abclib\DebugLib\cuddGenetic.obj -.\abclib\DebugLib\cuddGroup.obj -.\abclib\DebugLib\cuddHarwell.obj -.\abclib\DebugLib\cuddInit.obj -.\abclib\DebugLib\cuddInteract.obj -.\abclib\DebugLib\cuddLCache.obj -.\abclib\DebugLib\cuddLevelQ.obj -.\abclib\DebugLib\cuddLinear.obj -.\abclib\DebugLib\cuddLiteral.obj -.\abclib\DebugLib\cuddMatMult.obj -.\abclib\DebugLib\cuddPriority.obj -.\abclib\DebugLib\cuddRead.obj -.\abclib\DebugLib\cuddRef.obj -.\abclib\DebugLib\cuddReorder.obj -.\abclib\DebugLib\cuddSat.obj -.\abclib\DebugLib\cuddSign.obj -.\abclib\DebugLib\cuddSolve.obj -.\abclib\DebugLib\cuddSplit.obj -.\abclib\DebugLib\cuddSubsetHB.obj -.\abclib\DebugLib\cuddSubsetSP.obj -.\abclib\DebugLib\cuddSymmetry.obj -.\abclib\DebugLib\cuddTable.obj -.\abclib\DebugLib\cuddUtil.obj -.\abclib\DebugLib\cuddWindow.obj -.\abclib\DebugLib\cuddZddCount.obj -.\abclib\DebugLib\cuddZddFuncs.obj -.\abclib\DebugLib\cuddZddGroup.obj -.\abclib\DebugLib\cuddZddIsop.obj -.\abclib\DebugLib\cuddZddLin.obj -.\abclib\DebugLib\cuddZddMisc.obj -.\abclib\DebugLib\cuddZddPort.obj -.\abclib\DebugLib\cuddZddReord.obj -.\abclib\DebugLib\cuddZddSetop.obj -.\abclib\DebugLib\cuddZddSymm.obj -.\abclib\DebugLib\cuddZddUtil.obj -.\abclib\DebugLib\epd.obj -.\abclib\DebugLib\mtrBasic.obj -.\abclib\DebugLib\mtrGroup.obj -.\abclib\DebugLib\parseCore.obj -.\abclib\DebugLib\parseEqn.obj -.\abclib\DebugLib\parseStack.obj -.\abclib\DebugLib\dsdApi.obj -.\abclib\DebugLib\dsdCheck.obj -.\abclib\DebugLib\dsdLocal.obj -.\abclib\DebugLib\dsdMan.obj -.\abclib\DebugLib\dsdProc.obj -.\abclib\DebugLib\dsdTree.obj -.\abclib\DebugLib\reoApi.obj -.\abclib\DebugLib\reoCore.obj -.\abclib\DebugLib\reoProfile.obj -.\abclib\DebugLib\reoSift.obj -.\abclib\DebugLib\reoSwap.obj -.\abclib\DebugLib\reoTest.obj -.\abclib\DebugLib\reoTransfer.obj -.\abclib\DebugLib\reoUnits.obj -.\abclib\DebugLib\added.obj -.\abclib\DebugLib\asatmem.obj -.\abclib\DebugLib\solver.obj -.\abclib\DebugLib\msatActivity.obj -.\abclib\DebugLib\msatClause.obj -.\abclib\DebugLib\msatClauseVec.obj -.\abclib\DebugLib\msatMem.obj -.\abclib\DebugLib\msatOrderH.obj -.\abclib\DebugLib\msatQueue.obj -.\abclib\DebugLib\msatRead.obj -.\abclib\DebugLib\msatSolverApi.obj -.\abclib\DebugLib\msatSolverCore.obj -.\abclib\DebugLib\msatSolverIo.obj -.\abclib\DebugLib\msatSolverSearch.obj -.\abclib\DebugLib\msatSort.obj -.\abclib\DebugLib\msatVec.obj -.\abclib\DebugLib\fraigApi.obj -.\abclib\DebugLib\fraigCanon.obj -.\abclib\DebugLib\fraigChoice.obj -.\abclib\DebugLib\fraigFanout.obj -.\abclib\DebugLib\fraigFeed.obj -.\abclib\DebugLib\fraigMan.obj -.\abclib\DebugLib\fraigMem.obj -.\abclib\DebugLib\fraigNode.obj -.\abclib\DebugLib\fraigPrime.obj -.\abclib\DebugLib\fraigSat.obj -.\abclib\DebugLib\fraigTable.obj -.\abclib\DebugLib\fraigUtil.obj -.\abclib\DebugLib\fraigVec.obj -.\abclib\DebugLib\csat_apis.obj -.\abclib\DebugLib\satMem.obj -.\abclib\DebugLib\satSolver.obj -.\abclib\DebugLib\satUtil.obj -.\abclib\DebugLib\fxu.obj -.\abclib\DebugLib\fxuCreate.obj -.\abclib\DebugLib\fxuHeapD.obj -.\abclib\DebugLib\fxuHeapS.obj -.\abclib\DebugLib\fxuList.obj -.\abclib\DebugLib\fxuMatrix.obj -.\abclib\DebugLib\fxuPair.obj -.\abclib\DebugLib\fxuPrint.obj -.\abclib\DebugLib\fxuReduce.obj -.\abclib\DebugLib\fxuSelect.obj -.\abclib\DebugLib\fxuSingle.obj -.\abclib\DebugLib\fxuUpdate.obj -.\abclib\DebugLib\rwrDec.obj -.\abclib\DebugLib\rwrEva.obj -.\abclib\DebugLib\rwrExp.obj -.\abclib\DebugLib\rwrLib.obj -.\abclib\DebugLib\rwrMan.obj -.\abclib\DebugLib\rwrPrint.obj -.\abclib\DebugLib\rwrTemp.obj -.\abclib\DebugLib\rwrUtil.obj -.\abclib\DebugLib\cutApi.obj -.\abclib\DebugLib\cutCut.obj -.\abclib\DebugLib\cutExpand.obj -.\abclib\DebugLib\cutMan.obj -.\abclib\DebugLib\cutMerge.obj -.\abclib\DebugLib\cutNode.obj -.\abclib\DebugLib\cutOracle.obj -.\abclib\DebugLib\cutPre22.obj -.\abclib\DebugLib\cutSeq.obj -.\abclib\DebugLib\cutTruth.obj -.\abclib\DebugLib\decAbc.obj -.\abclib\DebugLib\decFactor.obj -.\abclib\DebugLib\decMan.obj -.\abclib\DebugLib\decPrint.obj -.\abclib\DebugLib\decUtil.obj -.\abclib\DebugLib\simMan.obj -.\abclib\DebugLib\simSat.obj -.\abclib\DebugLib\simSeq.obj -.\abclib\DebugLib\simSupp.obj -.\abclib\DebugLib\simSwitch.obj -.\abclib\DebugLib\simSym.obj -.\abclib\DebugLib\simSymSat.obj -.\abclib\DebugLib\simSymSim.obj -.\abclib\DebugLib\simSymStr.obj -.\abclib\DebugLib\simUtils.obj -.\abclib\DebugLib\retArea.obj -.\abclib\DebugLib\retCore.obj -.\abclib\DebugLib\retDelay.obj -.\abclib\DebugLib\retFlow.obj -.\abclib\DebugLib\retIncrem.obj -.\abclib\DebugLib\retInit.obj -.\abclib\DebugLib\retLvalue.obj -.\abclib\DebugLib\kitBdd.obj -.\abclib\DebugLib\kitFactor.obj -.\abclib\DebugLib\kitGraph.obj -.\abclib\DebugLib\kitHop.obj -.\abclib\DebugLib\kitIsop.obj -.\abclib\DebugLib\kitSop.obj -.\abclib\DebugLib\kitTruth.obj -.\abclib\DebugLib\fpga.obj -.\abclib\DebugLib\fpgaCore.obj -.\abclib\DebugLib\fpgaCreate.obj -.\abclib\DebugLib\fpgaCut.obj -.\abclib\DebugLib\fpgaCutUtils.obj -.\abclib\DebugLib\fpgaFanout.obj -.\abclib\DebugLib\fpgaLib.obj -.\abclib\DebugLib\fpgaMatch.obj -.\abclib\DebugLib\fpgaSwitch.obj -.\abclib\DebugLib\fpgaTime.obj -.\abclib\DebugLib\fpgaTruth.obj -.\abclib\DebugLib\fpgaUtils.obj -.\abclib\DebugLib\fpgaVec.obj -.\abclib\DebugLib\mapper.obj -.\abclib\DebugLib\mapperCanon.obj -.\abclib\DebugLib\mapperCore.obj -.\abclib\DebugLib\mapperCreate.obj -.\abclib\DebugLib\mapperCut.obj -.\abclib\DebugLib\mapperCutUtils.obj -.\abclib\DebugLib\mapperFanout.obj -.\abclib\DebugLib\mapperLib.obj -.\abclib\DebugLib\mapperMatch.obj -.\abclib\DebugLib\mapperRefs.obj -.\abclib\DebugLib\mapperSuper.obj -.\abclib\DebugLib\mapperSwitch.obj -.\abclib\DebugLib\mapperTable.obj -.\abclib\DebugLib\mapperTime.obj -.\abclib\DebugLib\mapperTree.obj -.\abclib\DebugLib\mapperTruth.obj -.\abclib\DebugLib\mapperUtils.obj -.\abclib\DebugLib\mapperVec.obj -.\abclib\DebugLib\mio.obj -.\abclib\DebugLib\mioApi.obj -.\abclib\DebugLib\mioFunc.obj -.\abclib\DebugLib\mioRead.obj -.\abclib\DebugLib\mioUtils.obj -.\abclib\DebugLib\super.obj -.\abclib\DebugLib\superAnd.obj -.\abclib\DebugLib\superGate.obj -.\abclib\DebugLib\superWrite.obj -.\abclib\DebugLib\ifCore.obj -.\abclib\DebugLib\ifCut.obj -.\abclib\DebugLib\ifMan.obj -.\abclib\DebugLib\ifMap.obj -.\abclib\DebugLib\ifPrepro.obj -.\abclib\DebugLib\ifReduce.obj -.\abclib\DebugLib\ifSeq.obj -.\abclib\DebugLib\ifTime.obj -.\abclib\DebugLib\ifTruth.obj -.\abclib\DebugLib\ifUtil.obj -.\abclib\DebugLib\extraBddAuto.obj -.\abclib\DebugLib\extraBddKmap.obj -.\abclib\DebugLib\extraBddMisc.obj -.\abclib\DebugLib\extraBddSymm.obj -.\abclib\DebugLib\extraBddUnate.obj -.\abclib\DebugLib\extraUtilBitMatrix.obj -.\abclib\DebugLib\extraUtilCanon.obj -.\abclib\DebugLib\extraUtilFile.obj -.\abclib\DebugLib\extraUtilMemory.obj -.\abclib\DebugLib\extraUtilMisc.obj -.\abclib\DebugLib\extraUtilProgress.obj -.\abclib\DebugLib\extraUtilReader.obj -.\abclib\DebugLib\extraUtilTruth.obj -.\abclib\DebugLib\extraUtilUtil.obj -.\abclib\DebugLib\st.obj -.\abclib\DebugLib\stmm.obj -.\abclib\DebugLib\mvc.obj -.\abclib\DebugLib\mvcApi.obj -.\abclib\DebugLib\mvcCompare.obj -.\abclib\DebugLib\mvcContain.obj -.\abclib\DebugLib\mvcCover.obj -.\abclib\DebugLib\mvcCube.obj -.\abclib\DebugLib\mvcDivide.obj -.\abclib\DebugLib\mvcDivisor.obj -.\abclib\DebugLib\mvcList.obj -.\abclib\DebugLib\mvcLits.obj -.\abclib\DebugLib\mvcMan.obj -.\abclib\DebugLib\mvcOpAlg.obj -.\abclib\DebugLib\mvcOpBool.obj -.\abclib\DebugLib\mvcPrint.obj -.\abclib\DebugLib\mvcSort.obj -.\abclib\DebugLib\mvcUtils.obj -.\abclib\DebugLib\cofactor.obj -.\abclib\DebugLib\cols.obj -.\abclib\DebugLib\compl.obj -.\abclib\DebugLib\contain.obj -.\abclib\DebugLib\cubehack.obj -.\abclib\DebugLib\cubestr.obj -.\abclib\DebugLib\cvrin.obj -.\abclib\DebugLib\cvrm.obj -.\abclib\DebugLib\cvrmisc.obj -.\abclib\DebugLib\cvrout.obj -.\abclib\DebugLib\dominate.obj -.\abclib\DebugLib\equiv.obj -.\abclib\DebugLib\espresso.obj -.\abclib\DebugLib\essen.obj -.\abclib\DebugLib\exact.obj -.\abclib\DebugLib\expand.obj -.\abclib\DebugLib\gasp.obj -.\abclib\DebugLib\gimpel.obj -.\abclib\DebugLib\globals.obj -.\abclib\DebugLib\hack.obj -.\abclib\DebugLib\indep.obj -.\abclib\DebugLib\irred.obj -.\abclib\DebugLib\map.obj -.\abclib\DebugLib\matrix.obj -.\abclib\DebugLib\mincov.obj -.\abclib\DebugLib\opo.obj -.\abclib\DebugLib\pair.obj -.\abclib\DebugLib\part.obj -.\abclib\DebugLib\primes.obj -.\abclib\DebugLib\reduce.obj -.\abclib\DebugLib\rows.obj -.\abclib\DebugLib\set.obj -.\abclib\DebugLib\setc.obj -.\abclib\DebugLib\sharp.obj -.\abclib\DebugLib\sminterf.obj -.\abclib\DebugLib\solution.obj -.\abclib\DebugLib\sparse.obj -.\abclib\DebugLib\unate.obj -.\abclib\DebugLib\verify.obj -.\abclib\DebugLib\nmApi.obj -.\abclib\DebugLib\nmTable.obj -.\abclib\DebugLib\hopBalance.obj -.\abclib\DebugLib\hopCheck.obj -.\abclib\DebugLib\hopDfs.obj -.\abclib\DebugLib\hopMan.obj -.\abclib\DebugLib\hopMem.obj -.\abclib\DebugLib\hopObj.obj -.\abclib\DebugLib\hopOper.obj -.\abclib\DebugLib\hopTable.obj -.\abclib\DebugLib\hopUtil.obj -.\abclib\DebugLib\ivyBalance.obj -.\abclib\DebugLib\ivyCanon.obj -.\abclib\DebugLib\ivyCheck.obj -.\abclib\DebugLib\ivyCut.obj -.\abclib\DebugLib\ivyCutTrav.obj -.\abclib\DebugLib\ivyDfs.obj -.\abclib\DebugLib\ivyDsd.obj -.\abclib\DebugLib\ivyFanout.obj -.\abclib\DebugLib\ivyFastMap.obj -.\abclib\DebugLib\ivyFraig.obj -.\abclib\DebugLib\ivyHaig.obj -.\abclib\DebugLib\ivyMan.obj -.\abclib\DebugLib\ivyMem.obj -.\abclib\DebugLib\ivyMulti.obj -.\abclib\DebugLib\ivyObj.obj -.\abclib\DebugLib\ivyOper.obj -.\abclib\DebugLib\ivyResyn.obj -.\abclib\DebugLib\ivyRwr.obj -.\abclib\DebugLib\ivySeq.obj -.\abclib\DebugLib\ivyShow.obj -.\abclib\DebugLib\ivyTable.obj -.\abclib\DebugLib\ivyUtil.obj -.\abclib\DebugLib\rwtDec.obj -.\abclib\DebugLib\rwtMan.obj -.\abclib\DebugLib\rwtUtil.obj -.\abclib\DebugLib\mem.obj -.\abclib\DebugLib\jfront.obj -] -Creating command line "link.exe -lib @C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP137B.tmp" -Output Window
-Compiling... -jfront.c -Creating library... -Creating temporary file "C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP137C.tmp" with contents -[ -/nologo /o"abclib\DebugLib/abclib.bsc" -.\abclib\DebugLib\abcAig.sbr -.\abclib\DebugLib\abcCheck.sbr -.\abclib\DebugLib\abcDfs.sbr -.\abclib\DebugLib\abcFanio.sbr -.\abclib\DebugLib\abcFunc.sbr -.\abclib\DebugLib\abcLatch.sbr -.\abclib\DebugLib\abcLib.sbr -.\abclib\DebugLib\abcMinBase.sbr -.\abclib\DebugLib\abcNames.sbr -.\abclib\DebugLib\abcNetlist.sbr -.\abclib\DebugLib\abcNtk.sbr -.\abclib\DebugLib\abcObj.sbr -.\abclib\DebugLib\abcRefs.sbr -.\abclib\DebugLib\abcShow.sbr -.\abclib\DebugLib\abcSop.sbr -.\abclib\DebugLib\abcUtil.sbr -.\abclib\DebugLib\abc.sbr -.\abclib\DebugLib\abcAttach.sbr -.\abclib\DebugLib\abcAuto.sbr -.\abclib\DebugLib\abcBalance.sbr -.\abclib\DebugLib\abcBmc.sbr -.\abclib\DebugLib\abcClpBdd.sbr -.\abclib\DebugLib\abcClpSop.sbr -.\abclib\DebugLib\abcCut.sbr -.\abclib\DebugLib\abcDebug.sbr -.\abclib\DebugLib\abcDress.sbr -.\abclib\DebugLib\abcDsd.sbr -.\abclib\DebugLib\abcEspresso.sbr -.\abclib\DebugLib\abcExtract.sbr -.\abclib\DebugLib\abcFpga.sbr -.\abclib\DebugLib\abcFpgaFast.sbr -.\abclib\DebugLib\abcFraig.sbr -.\abclib\DebugLib\abcFxu.sbr -.\abclib\DebugLib\abcGen.sbr -.\abclib\DebugLib\abcIf.sbr -.\abclib\DebugLib\abcIvy.sbr -.\abclib\DebugLib\abcLut.sbr -.\abclib\DebugLib\abcMap.sbr -.\abclib\DebugLib\abcMini.sbr -.\abclib\DebugLib\abcMiter.sbr -.\abclib\DebugLib\abcMulti.sbr -.\abclib\DebugLib\abcMv.sbr -.\abclib\DebugLib\abcNtbdd.sbr -.\abclib\DebugLib\abcOrder.sbr -.\abclib\DebugLib\abcPrint.sbr -.\abclib\DebugLib\abcProve.sbr -.\abclib\DebugLib\abcReconv.sbr -.\abclib\DebugLib\abcRefactor.sbr -.\abclib\DebugLib\abcRenode.sbr -.\abclib\DebugLib\abcReorder.sbr -.\abclib\DebugLib\abcRestruct.sbr -.\abclib\DebugLib\abcResub.sbr -.\abclib\DebugLib\abcRewrite.sbr -.\abclib\DebugLib\abcRr.sbr -.\abclib\DebugLib\abcSat.sbr -.\abclib\DebugLib\abcStrash.sbr -.\abclib\DebugLib\abcSweep.sbr -.\abclib\DebugLib\abcSymm.sbr -.\abclib\DebugLib\abcTiming.sbr -.\abclib\DebugLib\abcUnate.sbr -.\abclib\DebugLib\abcUnreach.sbr -.\abclib\DebugLib\abcVerify.sbr -.\abclib\DebugLib\abcXsim.sbr -.\abclib\DebugLib\cmd.sbr -.\abclib\DebugLib\cmdAlias.sbr -.\abclib\DebugLib\cmdApi.sbr -.\abclib\DebugLib\cmdFlag.sbr -.\abclib\DebugLib\cmdHist.sbr -.\abclib\DebugLib\cmdUtils.sbr -.\abclib\DebugLib\io.sbr -.\abclib\DebugLib\ioReadAiger.sbr -.\abclib\DebugLib\ioReadBaf.sbr -.\abclib\DebugLib\ioReadBench.sbr -.\abclib\DebugLib\ioReadBlif.sbr -.\abclib\DebugLib\ioReadBlifAig.sbr -.\abclib\DebugLib\ioReadEdif.sbr -.\abclib\DebugLib\ioReadEqn.sbr -.\abclib\DebugLib\ioReadPla.sbr -.\abclib\DebugLib\ioUtil.sbr -.\abclib\DebugLib\ioWriteAiger.sbr -.\abclib\DebugLib\ioWriteBaf.sbr -.\abclib\DebugLib\ioWriteBench.sbr -.\abclib\DebugLib\ioWriteBlif.sbr -.\abclib\DebugLib\ioWriteCnf.sbr -.\abclib\DebugLib\ioWriteDot.sbr -.\abclib\DebugLib\ioWriteEqn.sbr -.\abclib\DebugLib\ioWriteGml.sbr -.\abclib\DebugLib\ioWriteList.sbr -.\abclib\DebugLib\ioWritePla.sbr -.\abclib\DebugLib\ioWriteVer.sbr -.\abclib\DebugLib\ioWriteVerAux.sbr -.\abclib\DebugLib\libSupport.sbr -.\abclib\DebugLib\main.sbr -.\abclib\DebugLib\mainFrame.sbr -.\abclib\DebugLib\mainInit.sbr -.\abclib\DebugLib\mainUtils.sbr -.\abclib\DebugLib\verCore.sbr -.\abclib\DebugLib\verFormula.sbr -.\abclib\DebugLib\verParse.sbr -.\abclib\DebugLib\verStream.sbr -.\abclib\DebugLib\verWords.sbr -.\abclib\DebugLib\cuddAddAbs.sbr -.\abclib\DebugLib\cuddAddApply.sbr -.\abclib\DebugLib\cuddAddFind.sbr -.\abclib\DebugLib\cuddAddInv.sbr -.\abclib\DebugLib\cuddAddIte.sbr -.\abclib\DebugLib\cuddAddNeg.sbr -.\abclib\DebugLib\cuddAddWalsh.sbr -.\abclib\DebugLib\cuddAndAbs.sbr -.\abclib\DebugLib\cuddAnneal.sbr -.\abclib\DebugLib\cuddApa.sbr -.\abclib\DebugLib\cuddAPI.sbr -.\abclib\DebugLib\cuddApprox.sbr -.\abclib\DebugLib\cuddBddAbs.sbr -.\abclib\DebugLib\cuddBddCorr.sbr -.\abclib\DebugLib\cuddBddIte.sbr -.\abclib\DebugLib\cuddBridge.sbr -.\abclib\DebugLib\cuddCache.sbr -.\abclib\DebugLib\cuddCheck.sbr -.\abclib\DebugLib\cuddClip.sbr -.\abclib\DebugLib\cuddCof.sbr -.\abclib\DebugLib\cuddCompose.sbr -.\abclib\DebugLib\cuddDecomp.sbr -.\abclib\DebugLib\cuddEssent.sbr -.\abclib\DebugLib\cuddExact.sbr -.\abclib\DebugLib\cuddExport.sbr -.\abclib\DebugLib\cuddGenCof.sbr -.\abclib\DebugLib\cuddGenetic.sbr -.\abclib\DebugLib\cuddGroup.sbr -.\abclib\DebugLib\cuddHarwell.sbr -.\abclib\DebugLib\cuddInit.sbr -.\abclib\DebugLib\cuddInteract.sbr -.\abclib\DebugLib\cuddLCache.sbr -.\abclib\DebugLib\cuddLevelQ.sbr -.\abclib\DebugLib\cuddLinear.sbr -.\abclib\DebugLib\cuddLiteral.sbr -.\abclib\DebugLib\cuddMatMult.sbr -.\abclib\DebugLib\cuddPriority.sbr -.\abclib\DebugLib\cuddRead.sbr -.\abclib\DebugLib\cuddRef.sbr -.\abclib\DebugLib\cuddReorder.sbr -.\abclib\DebugLib\cuddSat.sbr -.\abclib\DebugLib\cuddSign.sbr -.\abclib\DebugLib\cuddSolve.sbr -.\abclib\DebugLib\cuddSplit.sbr -.\abclib\DebugLib\cuddSubsetHB.sbr -.\abclib\DebugLib\cuddSubsetSP.sbr -.\abclib\DebugLib\cuddSymmetry.sbr -.\abclib\DebugLib\cuddTable.sbr -.\abclib\DebugLib\cuddUtil.sbr -.\abclib\DebugLib\cuddWindow.sbr -.\abclib\DebugLib\cuddZddCount.sbr -.\abclib\DebugLib\cuddZddFuncs.sbr -.\abclib\DebugLib\cuddZddGroup.sbr -.\abclib\DebugLib\cuddZddIsop.sbr -.\abclib\DebugLib\cuddZddLin.sbr -.\abclib\DebugLib\cuddZddMisc.sbr -.\abclib\DebugLib\cuddZddPort.sbr -.\abclib\DebugLib\cuddZddReord.sbr -.\abclib\DebugLib\cuddZddSetop.sbr -.\abclib\DebugLib\cuddZddSymm.sbr -.\abclib\DebugLib\cuddZddUtil.sbr -.\abclib\DebugLib\epd.sbr -.\abclib\DebugLib\mtrBasic.sbr -.\abclib\DebugLib\mtrGroup.sbr -.\abclib\DebugLib\parseCore.sbr -.\abclib\DebugLib\parseEqn.sbr -.\abclib\DebugLib\parseStack.sbr -.\abclib\DebugLib\dsdApi.sbr -.\abclib\DebugLib\dsdCheck.sbr -.\abclib\DebugLib\dsdLocal.sbr -.\abclib\DebugLib\dsdMan.sbr -.\abclib\DebugLib\dsdProc.sbr -.\abclib\DebugLib\dsdTree.sbr -.\abclib\DebugLib\reoApi.sbr -.\abclib\DebugLib\reoCore.sbr -.\abclib\DebugLib\reoProfile.sbr -.\abclib\DebugLib\reoSift.sbr -.\abclib\DebugLib\reoSwap.sbr -.\abclib\DebugLib\reoTest.sbr -.\abclib\DebugLib\reoTransfer.sbr -.\abclib\DebugLib\reoUnits.sbr -.\abclib\DebugLib\added.sbr -.\abclib\DebugLib\asatmem.sbr -.\abclib\DebugLib\solver.sbr -.\abclib\DebugLib\msatActivity.sbr -.\abclib\DebugLib\msatClause.sbr -.\abclib\DebugLib\msatClauseVec.sbr -.\abclib\DebugLib\msatMem.sbr -.\abclib\DebugLib\msatOrderH.sbr -.\abclib\DebugLib\msatQueue.sbr -.\abclib\DebugLib\msatRead.sbr -.\abclib\DebugLib\msatSolverApi.sbr -.\abclib\DebugLib\msatSolverCore.sbr -.\abclib\DebugLib\msatSolverIo.sbr -.\abclib\DebugLib\msatSolverSearch.sbr -.\abclib\DebugLib\msatSort.sbr -.\abclib\DebugLib\msatVec.sbr -.\abclib\DebugLib\fraigApi.sbr -.\abclib\DebugLib\fraigCanon.sbr -.\abclib\DebugLib\fraigChoice.sbr -.\abclib\DebugLib\fraigFanout.sbr -.\abclib\DebugLib\fraigFeed.sbr -.\abclib\DebugLib\fraigMan.sbr -.\abclib\DebugLib\fraigMem.sbr -.\abclib\DebugLib\fraigNode.sbr -.\abclib\DebugLib\fraigPrime.sbr -.\abclib\DebugLib\fraigSat.sbr -.\abclib\DebugLib\fraigTable.sbr -.\abclib\DebugLib\fraigUtil.sbr -.\abclib\DebugLib\fraigVec.sbr -.\abclib\DebugLib\csat_apis.sbr -.\abclib\DebugLib\satMem.sbr -.\abclib\DebugLib\satSolver.sbr -.\abclib\DebugLib\satUtil.sbr -.\abclib\DebugLib\fxu.sbr -.\abclib\DebugLib\fxuCreate.sbr -.\abclib\DebugLib\fxuHeapD.sbr -.\abclib\DebugLib\fxuHeapS.sbr -.\abclib\DebugLib\fxuList.sbr -.\abclib\DebugLib\fxuMatrix.sbr -.\abclib\DebugLib\fxuPair.sbr -.\abclib\DebugLib\fxuPrint.sbr -.\abclib\DebugLib\fxuReduce.sbr -.\abclib\DebugLib\fxuSelect.sbr -.\abclib\DebugLib\fxuSingle.sbr -.\abclib\DebugLib\fxuUpdate.sbr -.\abclib\DebugLib\rwrDec.sbr -.\abclib\DebugLib\rwrEva.sbr -.\abclib\DebugLib\rwrExp.sbr -.\abclib\DebugLib\rwrLib.sbr -.\abclib\DebugLib\rwrMan.sbr -.\abclib\DebugLib\rwrPrint.sbr -.\abclib\DebugLib\rwrTemp.sbr -.\abclib\DebugLib\rwrUtil.sbr -.\abclib\DebugLib\cutApi.sbr -.\abclib\DebugLib\cutCut.sbr -.\abclib\DebugLib\cutExpand.sbr -.\abclib\DebugLib\cutMan.sbr -.\abclib\DebugLib\cutMerge.sbr -.\abclib\DebugLib\cutNode.sbr -.\abclib\DebugLib\cutOracle.sbr -.\abclib\DebugLib\cutPre22.sbr -.\abclib\DebugLib\cutSeq.sbr -.\abclib\DebugLib\cutTruth.sbr -.\abclib\DebugLib\decAbc.sbr -.\abclib\DebugLib\decFactor.sbr -.\abclib\DebugLib\decMan.sbr -.\abclib\DebugLib\decPrint.sbr -.\abclib\DebugLib\decUtil.sbr -.\abclib\DebugLib\simMan.sbr -.\abclib\DebugLib\simSat.sbr -.\abclib\DebugLib\simSeq.sbr -.\abclib\DebugLib\simSupp.sbr -.\abclib\DebugLib\simSwitch.sbr -.\abclib\DebugLib\simSym.sbr -.\abclib\DebugLib\simSymSat.sbr -.\abclib\DebugLib\simSymSim.sbr -.\abclib\DebugLib\simSymStr.sbr -.\abclib\DebugLib\simUtils.sbr -.\abclib\DebugLib\retArea.sbr -.\abclib\DebugLib\retCore.sbr -.\abclib\DebugLib\retDelay.sbr -.\abclib\DebugLib\retFlow.sbr -.\abclib\DebugLib\retIncrem.sbr -.\abclib\DebugLib\retInit.sbr -.\abclib\DebugLib\retLvalue.sbr -.\abclib\DebugLib\kitBdd.sbr -.\abclib\DebugLib\kitFactor.sbr -.\abclib\DebugLib\kitGraph.sbr -.\abclib\DebugLib\kitHop.sbr -.\abclib\DebugLib\kitIsop.sbr -.\abclib\DebugLib\kitSop.sbr -.\abclib\DebugLib\kitTruth.sbr -.\abclib\DebugLib\fpga.sbr -.\abclib\DebugLib\fpgaCore.sbr -.\abclib\DebugLib\fpgaCreate.sbr -.\abclib\DebugLib\fpgaCut.sbr -.\abclib\DebugLib\fpgaCutUtils.sbr -.\abclib\DebugLib\fpgaFanout.sbr -.\abclib\DebugLib\fpgaLib.sbr -.\abclib\DebugLib\fpgaMatch.sbr -.\abclib\DebugLib\fpgaSwitch.sbr -.\abclib\DebugLib\fpgaTime.sbr -.\abclib\DebugLib\fpgaTruth.sbr -.\abclib\DebugLib\fpgaUtils.sbr -.\abclib\DebugLib\fpgaVec.sbr -.\abclib\DebugLib\mapper.sbr -.\abclib\DebugLib\mapperCanon.sbr -.\abclib\DebugLib\mapperCore.sbr -.\abclib\DebugLib\mapperCreate.sbr -.\abclib\DebugLib\mapperCut.sbr -.\abclib\DebugLib\mapperCutUtils.sbr -.\abclib\DebugLib\mapperFanout.sbr -.\abclib\DebugLib\mapperLib.sbr -.\abclib\DebugLib\mapperMatch.sbr -.\abclib\DebugLib\mapperRefs.sbr -.\abclib\DebugLib\mapperSuper.sbr -.\abclib\DebugLib\mapperSwitch.sbr -.\abclib\DebugLib\mapperTable.sbr -.\abclib\DebugLib\mapperTime.sbr -.\abclib\DebugLib\mapperTree.sbr -.\abclib\DebugLib\mapperTruth.sbr -.\abclib\DebugLib\mapperUtils.sbr -.\abclib\DebugLib\mapperVec.sbr -.\abclib\DebugLib\mio.sbr -.\abclib\DebugLib\mioApi.sbr -.\abclib\DebugLib\mioFunc.sbr -.\abclib\DebugLib\mioRead.sbr -.\abclib\DebugLib\mioUtils.sbr -.\abclib\DebugLib\super.sbr -.\abclib\DebugLib\superAnd.sbr -.\abclib\DebugLib\superGate.sbr -.\abclib\DebugLib\superWrite.sbr -.\abclib\DebugLib\ifCore.sbr -.\abclib\DebugLib\ifCut.sbr -.\abclib\DebugLib\ifMan.sbr -.\abclib\DebugLib\ifMap.sbr -.\abclib\DebugLib\ifPrepro.sbr -.\abclib\DebugLib\ifReduce.sbr -.\abclib\DebugLib\ifSeq.sbr -.\abclib\DebugLib\ifTime.sbr -.\abclib\DebugLib\ifTruth.sbr -.\abclib\DebugLib\ifUtil.sbr -.\abclib\DebugLib\extraBddAuto.sbr -.\abclib\DebugLib\extraBddKmap.sbr -.\abclib\DebugLib\extraBddMisc.sbr -.\abclib\DebugLib\extraBddSymm.sbr -.\abclib\DebugLib\extraBddUnate.sbr -.\abclib\DebugLib\extraUtilBitMatrix.sbr -.\abclib\DebugLib\extraUtilCanon.sbr -.\abclib\DebugLib\extraUtilFile.sbr -.\abclib\DebugLib\extraUtilMemory.sbr -.\abclib\DebugLib\extraUtilMisc.sbr -.\abclib\DebugLib\extraUtilProgress.sbr -.\abclib\DebugLib\extraUtilReader.sbr -.\abclib\DebugLib\extraUtilTruth.sbr -.\abclib\DebugLib\extraUtilUtil.sbr -.\abclib\DebugLib\st.sbr -.\abclib\DebugLib\stmm.sbr -.\abclib\DebugLib\mvc.sbr -.\abclib\DebugLib\mvcApi.sbr -.\abclib\DebugLib\mvcCompare.sbr -.\abclib\DebugLib\mvcContain.sbr -.\abclib\DebugLib\mvcCover.sbr -.\abclib\DebugLib\mvcCube.sbr -.\abclib\DebugLib\mvcDivide.sbr -.\abclib\DebugLib\mvcDivisor.sbr -.\abclib\DebugLib\mvcList.sbr -.\abclib\DebugLib\mvcLits.sbr -.\abclib\DebugLib\mvcMan.sbr -.\abclib\DebugLib\mvcOpAlg.sbr -.\abclib\DebugLib\mvcOpBool.sbr -.\abclib\DebugLib\mvcPrint.sbr -.\abclib\DebugLib\mvcSort.sbr -.\abclib\DebugLib\mvcUtils.sbr -.\abclib\DebugLib\cofactor.sbr -.\abclib\DebugLib\cols.sbr -.\abclib\DebugLib\compl.sbr -.\abclib\DebugLib\contain.sbr -.\abclib\DebugLib\cubehack.sbr -.\abclib\DebugLib\cubestr.sbr -.\abclib\DebugLib\cvrin.sbr -.\abclib\DebugLib\cvrm.sbr -.\abclib\DebugLib\cvrmisc.sbr -.\abclib\DebugLib\cvrout.sbr -.\abclib\DebugLib\dominate.sbr -.\abclib\DebugLib\equiv.sbr -.\abclib\DebugLib\espresso.sbr -.\abclib\DebugLib\essen.sbr -.\abclib\DebugLib\exact.sbr -.\abclib\DebugLib\expand.sbr -.\abclib\DebugLib\gasp.sbr -.\abclib\DebugLib\gimpel.sbr -.\abclib\DebugLib\globals.sbr -.\abclib\DebugLib\hack.sbr -.\abclib\DebugLib\indep.sbr -.\abclib\DebugLib\irred.sbr -.\abclib\DebugLib\map.sbr -.\abclib\DebugLib\matrix.sbr -.\abclib\DebugLib\mincov.sbr -.\abclib\DebugLib\opo.sbr -.\abclib\DebugLib\pair.sbr -.\abclib\DebugLib\part.sbr -.\abclib\DebugLib\primes.sbr -.\abclib\DebugLib\reduce.sbr -.\abclib\DebugLib\rows.sbr -.\abclib\DebugLib\set.sbr -.\abclib\DebugLib\setc.sbr -.\abclib\DebugLib\sharp.sbr -.\abclib\DebugLib\sminterf.sbr -.\abclib\DebugLib\solution.sbr -.\abclib\DebugLib\sparse.sbr -.\abclib\DebugLib\unate.sbr -.\abclib\DebugLib\verify.sbr -.\abclib\DebugLib\nmApi.sbr -.\abclib\DebugLib\nmTable.sbr -.\abclib\DebugLib\hopBalance.sbr -.\abclib\DebugLib\hopCheck.sbr -.\abclib\DebugLib\hopDfs.sbr -.\abclib\DebugLib\hopMan.sbr -.\abclib\DebugLib\hopMem.sbr -.\abclib\DebugLib\hopObj.sbr -.\abclib\DebugLib\hopOper.sbr -.\abclib\DebugLib\hopTable.sbr -.\abclib\DebugLib\hopUtil.sbr -.\abclib\DebugLib\ivyBalance.sbr -.\abclib\DebugLib\ivyCanon.sbr -.\abclib\DebugLib\ivyCheck.sbr -.\abclib\DebugLib\ivyCut.sbr -.\abclib\DebugLib\ivyCutTrav.sbr -.\abclib\DebugLib\ivyDfs.sbr -.\abclib\DebugLib\ivyDsd.sbr -.\abclib\DebugLib\ivyFanout.sbr -.\abclib\DebugLib\ivyFastMap.sbr -.\abclib\DebugLib\ivyFraig.sbr -.\abclib\DebugLib\ivyHaig.sbr -.\abclib\DebugLib\ivyMan.sbr -.\abclib\DebugLib\ivyMem.sbr -.\abclib\DebugLib\ivyMulti.sbr -.\abclib\DebugLib\ivyObj.sbr -.\abclib\DebugLib\ivyOper.sbr -.\abclib\DebugLib\ivyResyn.sbr -.\abclib\DebugLib\ivyRwr.sbr -.\abclib\DebugLib\ivySeq.sbr -.\abclib\DebugLib\ivyShow.sbr -.\abclib\DebugLib\ivyTable.sbr -.\abclib\DebugLib\ivyUtil.sbr -.\abclib\DebugLib\rwtDec.sbr -.\abclib\DebugLib\rwtMan.sbr -.\abclib\DebugLib\rwtUtil.sbr -.\abclib\DebugLib\mem.sbr -.\abclib\DebugLib\jfront.sbr] -Creating command line "bscmake.exe @C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP137C.tmp" -Creating browse info file... -Output Window
- - - -Results
-abclib_debug.lib - 0 error(s), 0 warning(s) -
-- - diff --git a/src/base/abc/abc.h b/src/base/abc/abc.h index 62aac927a..e15ca5570 100644 --- a/src/base/abc/abc.h +++ b/src/base/abc/abc.h @@ -90,11 +90,10 @@ typedef enum { ABC_OBJ_ASSERT, // 7: assertion terminal ABC_OBJ_NET, // 8: net ABC_OBJ_NODE, // 9: node - ABC_OBJ_GATE, // 10: mapped node - ABC_OBJ_LATCH, // 11: latch - ABC_OBJ_TRI, // 12: tristate element - ABC_OBJ_BLACKBOX, // 13: box with unknown contents - ABC_OBJ_NUMBER // 14: unused + ABC_OBJ_LATCH, // 10: latch + ABC_OBJ_WHITEBOX, // 11: box with known contents + ABC_OBJ_BLACKBOX, // 12: box with unknown contents + ABC_OBJ_NUMBER // 13: unused } Abc_ObjType_t; // latch initial values @@ -188,8 +187,7 @@ struct Abc_Ntk_t_ Abc_Ntk_t * pNetBackup; // the pointer to the previous backup network int iStep; // the generation number for the given network // hierarchy - stmm_table * tName2Model; // the table hashing names into network pointers (or NULL if no hierarchy) - Vec_Int_t * pBlackBoxes; // stores pairs (PI num, PO num) for each model, including the base model (or NULL if no hierarchy) + Abc_Lib_t * pDesign; short fHieVisited; // flag to mark the visited network short fHiePath; // flag to mark the network on the path // miscellaneous data members @@ -197,7 +195,6 @@ struct Abc_Ntk_t_ Extra_MmFixed_t * pMmObj; // memory manager for objects Extra_MmStep_t * pMmStep; // memory manager for arrays void * pManFunc; // functionality manager (AIG manager, BDD manager, or memory manager for SOPs) - Abc_Lib_t * pDesign; // Abc_Lib_t * pVerLib; // for structural verilog designs Abc_ManTime_t * pManTime; // the timing manager (for mapped networks) stores arrival/required times for all nodes void * pManCut; // the cut manager (for AIGs) stores information about the cuts computed for the nodes @@ -299,9 +296,8 @@ static inline int Abc_NtkBiNum( Abc_Ntk_t * pNtk ) { return pN static inline int Abc_NtkBoNum( Abc_Ntk_t * pNtk ) { return pNtk->nObjCounts[ABC_OBJ_BO]; } static inline int Abc_NtkNetNum( Abc_Ntk_t * pNtk ) { return pNtk->nObjCounts[ABC_OBJ_NET]; } static inline int Abc_NtkNodeNum( Abc_Ntk_t * pNtk ) { return pNtk->nObjCounts[ABC_OBJ_NODE]; } -static inline int Abc_NtkGateNum( Abc_Ntk_t * pNtk ) { return pNtk->nObjCounts[ABC_OBJ_GATE]; } static inline int Abc_NtkLatchNum( Abc_Ntk_t * pNtk ) { return pNtk->nObjCounts[ABC_OBJ_LATCH]; } -static inline int Abc_NtkTriNum( Abc_Ntk_t * pNtk ) { return pNtk->nObjCounts[ABC_OBJ_TRI]; } +static inline int Abc_NtkWhiteboxNum( Abc_Ntk_t * pNtk ) { return pNtk->nObjCounts[ABC_OBJ_WHITEBOX]; } static inline int Abc_NtkBlackboxNum( Abc_Ntk_t * pNtk ) { return pNtk->nObjCounts[ABC_OBJ_BLACKBOX]; } static inline bool Abc_NtkIsComb( Abc_Ntk_t * pNtk ) { return Abc_NtkLatchNum(pNtk) == 0; } static inline bool Abc_NtkHasOnlyLatchBoxes(Abc_Ntk_t * pNtk ){ return Abc_NtkLatchNum(pNtk) == Abc_NtkBoxNum(pNtk); } @@ -315,8 +311,7 @@ static inline Abc_Obj_t * Abc_NtkCreateBo( Abc_Ntk_t * pNtk ) { return Ab static inline Abc_Obj_t * Abc_NtkCreateAssert( Abc_Ntk_t * pNtk ) { return Abc_NtkCreateObj( pNtk, ABC_OBJ_ASSERT ); } static inline Abc_Obj_t * Abc_NtkCreateNode( Abc_Ntk_t * pNtk ) { return Abc_NtkCreateObj( pNtk, ABC_OBJ_NODE ); } static inline Abc_Obj_t * Abc_NtkCreateLatch( Abc_Ntk_t * pNtk ) { return Abc_NtkCreateObj( pNtk, ABC_OBJ_LATCH ); } -static inline Abc_Obj_t * Abc_NtkCreateGate( Abc_Ntk_t * pNtk ) { return Abc_NtkCreateObj( pNtk, ABC_OBJ_GATE ); } -static inline Abc_Obj_t * Abc_NtkCreateTri( Abc_Ntk_t * pNtk ) { return Abc_NtkCreateObj( pNtk, ABC_OBJ_TRI ); } +static inline Abc_Obj_t * Abc_NtkCreateWhitebox( Abc_Ntk_t * pNtk ) { return Abc_NtkCreateObj( pNtk, ABC_OBJ_WHITEBOX ); } static inline Abc_Obj_t * Abc_NtkCreateBlackbox( Abc_Ntk_t * pNtk ) { return Abc_NtkCreateObj( pNtk, ABC_OBJ_BLACKBOX ); } // reading objects @@ -361,11 +356,11 @@ static inline bool Abc_ObjIsCo( Abc_Obj_t * pObj ) { return pO static inline bool Abc_ObjIsTerm( Abc_Obj_t * pObj ) { return Abc_ObjIsCi(pObj) || Abc_ObjIsCo(pObj); } static inline bool Abc_ObjIsNet( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_NET; } static inline bool Abc_ObjIsNode( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_NODE; } -static inline bool Abc_ObjIsGate( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_GATE; } static inline bool Abc_ObjIsLatch( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_LATCH; } -static inline bool Abc_ObjIsTri( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_TRI; } +static inline bool Abc_ObjIsBox( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_LATCH || pObj->Type == ABC_OBJ_WHITEBOX || pObj->Type == ABC_OBJ_BLACKBOX; } +static inline bool Abc_ObjIsWhitebox( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_WHITEBOX;} static inline bool Abc_ObjIsBlackbox( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_BLACKBOX;} -static inline bool Abc_ObjIsBox( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_LATCH || pObj->Type == ABC_OBJ_TRI || pObj->Type == ABC_OBJ_BLACKBOX; } +static inline void Abc_ObjBlackboxToWhitebox( Abc_Obj_t * pObj ) { assert( Abc_ObjIsBlackbox(pObj) ); pObj->Type = ABC_OBJ_WHITEBOX; pObj->pNtk->nObjCounts[ABC_OBJ_BLACKBOX]--; pObj->pNtk->nObjCounts[ABC_OBJ_WHITEBOX]++; } // working with fanin/fanout edges static inline int Abc_ObjFaninNum( Abc_Obj_t * pObj ) { return pObj->vFanins.nSize; } @@ -470,9 +465,9 @@ static inline void Abc_ObjSetMvVar( Abc_Obj_t * pObj, void * pV) { Vec_At #define Abc_NtkForEachLatchOutput( pNtk, pObj, i ) \ for ( i = 0; (i < Vec_PtrSize((pNtk)->vBoxes)) && (((pObj) = Abc_ObjFanout0(Abc_NtkBox(pNtk, i))), 1); i++ ) \ if ( !Abc_ObjIsLatch(Abc_NtkBox(pNtk, i)) ) {} else -#define Abc_NtkForEachTri( pNtk, pObj, i ) \ +#define Abc_NtkForEachWhitebox( pNtk, pObj, i ) \ for ( i = 0; (i < Vec_PtrSize((pNtk)->vBoxes)) && (((pObj) = Abc_NtkBox(pNtk, i)), 1); i++ ) \ - if ( !Abc_ObjIsTri(pObj) ) {} else + if ( !Abc_ObjIsWhitebox(pObj) ) {} else #define Abc_NtkForEachBlackbox( pNtk, pObj, i ) \ for ( i = 0; (i < Vec_PtrSize((pNtk)->vBoxes)) && (((pObj) = Abc_NtkBox(pNtk, i)), 1); i++ ) \ if ( !Abc_ObjIsBlackbox(pObj) ) {} else @@ -536,6 +531,7 @@ extern bool Abc_NtkCheckRead( Abc_Ntk_t * pNtk ); extern bool Abc_NtkDoCheck( Abc_Ntk_t * pNtk ); extern bool Abc_NtkCheckObj( Abc_Ntk_t * pNtk, Abc_Obj_t * pObj ); extern bool Abc_NtkCompareSignals( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int fOnlyPis, int fComb ); +extern int Abc_NtkIsAcyclicHierarchy( Abc_Ntk_t * pNtk ); /*=== abcCollapse.c ==========================================================*/ extern Abc_Ntk_t * Abc_NtkCollapse( Abc_Ntk_t * pNtk, int fBddSizeMax, int fDualRail, int fReorder, int fVerbose ); /*=== abcCut.c ==========================================================*/ @@ -550,6 +546,8 @@ extern Vec_Ptr_t * Abc_NtkDfsNodes( Abc_Ntk_t * pNtk, Abc_Obj_t ** ppNode extern Vec_Ptr_t * Abc_NtkDfsReverse( Abc_Ntk_t * pNtk ); extern Vec_Ptr_t * Abc_NtkDfsSeq( Abc_Ntk_t * pNtk ); extern Vec_Ptr_t * Abc_NtkDfsSeqReverse( Abc_Ntk_t * pNtk ); +extern Vec_Ptr_t * Abc_NtkDfsIter( Abc_Ntk_t * pNtk, int fCollectAll ); +extern Vec_Ptr_t * Abc_NtkDfsHie( Abc_Ntk_t * pNtk, int fCollectAll ); extern bool Abc_NtkIsDfsOrdered( Abc_Ntk_t * pNtk ); extern Vec_Ptr_t * Abc_NtkSupport( Abc_Ntk_t * pNtk ); extern Vec_Ptr_t * Abc_NtkNodeSupport( Abc_Ntk_t * pNtk, Abc_Obj_t ** ppNodes, int nNodes ); @@ -589,6 +587,10 @@ extern int Abc_NtkMapToSop( Abc_Ntk_t * pNtk ); extern int Abc_NtkLogicToSop( Abc_Ntk_t * pNtk, int fDirect ); extern int Abc_NtkLogicToBdd( Abc_Ntk_t * pNtk ); extern int Abc_NtkLogicToAig( Abc_Ntk_t * pNtk ); +/*=== abcHie.c ==========================================================*/ +extern Abc_Ntk_t * Abc_NtkFlattenLogicHierarchy( Abc_Ntk_t * pNtk ); +extern Abc_Ntk_t * Abc_NtkConvertBlackboxes( Abc_Ntk_t * pNtk ); +extern Abc_Ntk_t * Abc_NtkInsertNewLogic( Abc_Ntk_t * pNtkH, Abc_Ntk_t * pNtkL ); /*=== abcLatch.c ==========================================================*/ extern bool Abc_NtkLatchIsSelfFeed( Abc_Obj_t * pLatch ); extern int Abc_NtkCountSelfFeedLatches( Abc_Ntk_t * pNtk ); @@ -597,7 +599,7 @@ extern Vec_Int_t * Abc_NtkCollectLatchValues( Abc_Ntk_t * pNtk ); extern void Abc_NtkInsertLatchValues( Abc_Ntk_t * pNtk, Vec_Int_t * vValues ); /*=== abcLib.c ==========================================================*/ extern Abc_Lib_t * Abc_LibCreate( char * pName ); -extern void Abc_LibFree( Abc_Lib_t * pLib ); +extern void Abc_LibFree( Abc_Lib_t * pLib, Abc_Ntk_t * pNtk ); extern void Abc_LibPrint( Abc_Lib_t * pLib ); extern int Abc_LibAddModel( Abc_Lib_t * pLib, Abc_Ntk_t * pNtk ); extern Abc_Ntk_t * Abc_LibFindModelByName( Abc_Lib_t * pLib, char * pName ); diff --git a/src/base/abc/abcCheck.c b/src/base/abc/abcCheck.c index 8d8f98b38..725978819 100644 --- a/src/base/abc/abcCheck.c +++ b/src/base/abc/abcCheck.c @@ -38,8 +38,6 @@ static bool Abc_NtkComparePis( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int fComb ) static bool Abc_NtkComparePos( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int fComb ); static bool Abc_NtkCompareLatches( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int fComb ); -static int Abc_NtkIsAcyclicHierarchy( Abc_Ntk_t * pNtk ); - //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// @@ -112,7 +110,7 @@ bool Abc_NtkDoCheck( Abc_Ntk_t * pNtk ) } } - if ( !Abc_NtkBlackboxNum(pNtk) ) + if ( Abc_NtkHasOnlyLatchBoxes(pNtk) ) { // check CI/CO numbers if ( Abc_NtkPiNum(pNtk) + Abc_NtkLatchNum(pNtk) != Abc_NtkCiNum(pNtk) ) @@ -196,7 +194,7 @@ bool Abc_NtkDoCheck( Abc_Ntk_t * pNtk ) // check the EXDC network if present if ( pNtk->pExdc ) Abc_NtkCheck( pNtk->pExdc ); - +/* // check the hierarchy if ( Abc_NtkIsNetlist(pNtk) && pNtk->tName2Model ) { @@ -217,6 +215,7 @@ bool Abc_NtkDoCheck( Abc_Ntk_t * pNtk ) return 0; } } +*/ return 1; } @@ -746,7 +745,6 @@ bool Abc_NtkCompareSignals( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int fOnlyPis, return 1; } - /**Function************************************************************* Synopsis [Returns 0 if the network hierachy contains a cycle.] @@ -774,6 +772,8 @@ int Abc_NtkIsAcyclicHierarchy_rec( Abc_Ntk_t * pNtk ) // go through all the children networks Abc_NtkForEachBox( pNtk, pObj, i ) { + if ( Abc_ObjIsLatch(pObj) ) + continue; pNtkNext = pObj->pData; assert( pNtkNext != NULL ); if ( pNtkNext->fHiePath ) @@ -799,9 +799,20 @@ int Abc_NtkIsAcyclicHierarchy_rec( Abc_Ntk_t * pNtk ) ***********************************************************************/ int Abc_NtkIsAcyclicHierarchy( Abc_Ntk_t * pNtk ) { - assert( Abc_NtkIsNetlist(pNtk) && pNtk->tName2Model ); + Abc_Ntk_t * pTemp; + int i, RetValue; + assert( Abc_NtkIsNetlist(pNtk) && pNtk->pDesign ); + // clear the modules + Vec_PtrForEachEntry( pNtk->pDesign->vModules, pTemp, i ) + pTemp->fHieVisited = pTemp->fHiePath = 0; + // traverse pNtk->fHiePath = 1; - return Abc_NtkIsAcyclicHierarchy_rec( pNtk ); + RetValue = Abc_NtkIsAcyclicHierarchy_rec( pNtk ); + pNtk->fHiePath = 0; + // clear the modules + Vec_PtrForEachEntry( pNtk->pDesign->vModules, pTemp, i ) + pTemp->fHieVisited = pTemp->fHiePath = 0; + return RetValue; } //////////////////////////////////////////////////////////////////////// diff --git a/src/base/abc/abcDfs.c b/src/base/abc/abcDfs.c index 7e57c0a41..48ffa489d 100644 --- a/src/base/abc/abcDfs.c +++ b/src/base/abc/abcDfs.c @@ -24,18 +24,42 @@ /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// -static void Abc_NtkDfs_iter( Vec_Ptr_t * vStack, Abc_Obj_t * pRoot, Vec_Ptr_t * vNodes ); -static void Abc_NtkDfs_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ); -static void Abc_AigDfs_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ); -static void Abc_NtkDfsReverse_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ); -static void Abc_NtkNodeSupport_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ); -static void Abc_DfsLevelizedTfo_rec( Abc_Obj_t * pNode, Vec_Vec_t * vLevels ); -static bool Abc_NtkIsAcyclic_rec( Abc_Obj_t * pNode ); - //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// +/**Function************************************************************* + + Synopsis [Performs DFS for one node.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Abc_NtkDfs_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) +{ + Abc_Obj_t * pFanin; + int i; + assert( !Abc_ObjIsNet(pNode) ); + // if this node is already visited, skip + if ( Abc_NodeIsTravIdCurrent( pNode ) ) + return; + // mark the node as visited + Abc_NodeSetTravIdCurrent( pNode ); + // skip the CI + if ( Abc_ObjIsCi(pNode) || (Abc_NtkIsStrash(pNode->pNtk) && Abc_AigNodeIsConst(pNode)) ) + return; + assert( Abc_ObjIsNode( pNode ) || Abc_ObjIsBox( pNode ) ); + // visit the transitive fanin of the node + Abc_ObjForEachFanin( pNode, pFanin, i ) + Abc_NtkDfs_rec( Abc_ObjFanin0Ntk(pFanin), vNodes ); + // add the node after the fanins have been added + Vec_PtrPush( vNodes, pNode ); +} + /**Function************************************************************* Synopsis [Returns the DFS ordered array of logic nodes.] @@ -105,6 +129,7 @@ Vec_Ptr_t * Abc_NtkDfsNodes( Abc_Ntk_t * pNtk, Abc_Obj_t ** ppNodes, int nNodes return vNodes; } + /**Function************************************************************* Synopsis [Performs DFS for one node.] @@ -116,9 +141,9 @@ Vec_Ptr_t * Abc_NtkDfsNodes( Abc_Ntk_t * pNtk, Abc_Obj_t ** ppNodes, int nNodes SeeAlso [] ***********************************************************************/ -void Abc_NtkDfs_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) +void Abc_NtkDfsReverse_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) { - Abc_Obj_t * pFanin; + Abc_Obj_t * pFanout; int i; assert( !Abc_ObjIsNet(pNode) ); // if this node is already visited, skip @@ -127,54 +152,168 @@ void Abc_NtkDfs_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) // mark the node as visited Abc_NodeSetTravIdCurrent( pNode ); // skip the CI - if ( Abc_ObjIsCi(pNode) || (Abc_NtkIsStrash(pNode->pNtk) && Abc_AigNodeIsConst(pNode)) ) + if ( Abc_ObjIsCo(pNode) ) return; - assert( Abc_ObjIsNode( pNode ) || Abc_ObjIsBox( pNode ) ); + assert( Abc_ObjIsNode( pNode ) ); // visit the transitive fanin of the node - Abc_ObjForEachFanin( pNode, pFanin, i ) - Abc_NtkDfs_rec( Abc_ObjFanin0Ntk(pFanin), vNodes ); + pNode = Abc_ObjFanout0Ntk(pNode); + Abc_ObjForEachFanout( pNode, pFanout, i ) + Abc_NtkDfsReverse_rec( pFanout, vNodes ); // add the node after the fanins have been added Vec_PtrPush( vNodes, pNode ); } /**Function************************************************************* - Synopsis [Returns the DFS ordered array of logic nodes.] + Synopsis [Returns the reverse DFS ordered array of logic nodes.] - Description [Collects only the internal nodes, leaving CIs and CO. - However it marks with the current TravId both CIs and COs.] + Description [Collects only the internal nodes, leaving out CIs/COs. + However it marks both CIs and COs with the current TravId.] SideEffects [] SeeAlso [] ***********************************************************************/ -Vec_Ptr_t * Abc_NtkDfsIter( Abc_Ntk_t * pNtk, int fCollectAll ) +Vec_Ptr_t * Abc_NtkDfsReverse( Abc_Ntk_t * pNtk ) { - Vec_Ptr_t * vNodes, * vStack; - Abc_Obj_t * pObj; - int i; + Vec_Ptr_t * vNodes; + Abc_Obj_t * pObj, * pFanout; + int i, k; // set the traversal ID Abc_NtkIncrementTravId( pNtk ); // start the array of nodes - vNodes = Vec_PtrAlloc( 1000 ); - vStack = Vec_PtrAlloc( 1000 ); - Abc_NtkForEachCo( pNtk, pObj, i ) + vNodes = Vec_PtrAlloc( 100 ); + Abc_NtkForEachCi( pNtk, pObj, i ) { Abc_NodeSetTravIdCurrent( pObj ); - Abc_NtkDfs_iter( vStack, Abc_ObjFanin0Ntk(Abc_ObjFanin0(pObj)), vNodes ); + pObj = Abc_ObjFanout0Ntk(pObj); + Abc_ObjForEachFanout( pObj, pFanout, k ) + Abc_NtkDfsReverse_rec( pFanout, vNodes ); } - // collect dangling nodes if asked to - if ( fCollectAll ) - { + // add constant nodes in the end + if ( !Abc_NtkIsStrash(pNtk) ) Abc_NtkForEachNode( pNtk, pObj, i ) - if ( !Abc_NodeIsTravIdCurrent(pObj) ) - Abc_NtkDfs_iter( vStack, pObj, vNodes ); - } - Vec_PtrFree( vStack ); + if ( Abc_NodeIsConst(pObj) ) + Vec_PtrPush( vNodes, pObj ); return vNodes; } + +/**Function************************************************************* + + Synopsis [Performs DFS for one node.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Abc_NtkDfsSeq_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) +{ + Abc_Obj_t * pFanin; + int i; + // if this node is already visited, skip + if ( Abc_NodeIsTravIdCurrent( pNode ) ) + return; + // mark the node as visited + Abc_NodeSetTravIdCurrent( pNode ); + // visit the transitive fanin of the node + Abc_ObjForEachFanin( pNode, pFanin, i ) + Abc_NtkDfsSeq_rec( pFanin, vNodes ); + // add the node after the fanins have been added + Vec_PtrPush( vNodes, pNode ); +} + +/**Function************************************************************* + + Synopsis [Returns the array of nodes and latches reachable from POs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Vec_Ptr_t * Abc_NtkDfsSeq( Abc_Ntk_t * pNtk ) +{ + Vec_Ptr_t * vNodes; + Abc_Obj_t * pObj; + int i; + assert( !Abc_NtkIsNetlist(pNtk) ); + // set the traversal ID + Abc_NtkIncrementTravId( pNtk ); + // start the array of nodes + vNodes = Vec_PtrAlloc( 100 ); + Abc_NtkForEachPo( pNtk, pObj, i ) + Abc_NtkDfsSeq_rec( pObj, vNodes ); + // mark the PIs + Abc_NtkForEachPi( pNtk, pObj, i ) + Abc_NtkDfsSeq_rec( pObj, vNodes ); + return vNodes; +} + + +/**Function************************************************************* + + Synopsis [Performs DFS for one node.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Abc_NtkDfsSeqReverse_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) +{ + Abc_Obj_t * pFanout; + int i; + // if this node is already visited, skip + if ( Abc_NodeIsTravIdCurrent( pNode ) ) + return; + // mark the node as visited + Abc_NodeSetTravIdCurrent( pNode ); + // visit the transitive fanin of the node + Abc_ObjForEachFanout( pNode, pFanout, i ) + Abc_NtkDfsSeqReverse_rec( pFanout, vNodes ); + // add the node after the fanins have been added + Vec_PtrPush( vNodes, pNode ); +} + +/**Function************************************************************* + + Synopsis [Returns the array of nodes and latches reachable from POs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Vec_Ptr_t * Abc_NtkDfsSeqReverse( Abc_Ntk_t * pNtk ) +{ + Vec_Ptr_t * vNodes; + Abc_Obj_t * pObj; + int i; + assert( !Abc_NtkIsNetlist(pNtk) ); + // set the traversal ID + Abc_NtkIncrementTravId( pNtk ); + // start the array of nodes + vNodes = Vec_PtrAlloc( 100 ); + Abc_NtkForEachPi( pNtk, pObj, i ) + Abc_NtkDfsSeqReverse_rec( pObj, vNodes ); + // mark the logic feeding into POs + Abc_NtkForEachPo( pNtk, pObj, i ) + Abc_NtkDfsSeq_rec( pObj, vNodes ); + return vNodes; +} + + /**Function************************************************************* Synopsis [Iterative version of the DFS procedure.] @@ -232,75 +371,44 @@ void Abc_NtkDfs_iter( Vec_Ptr_t * vStack, Abc_Obj_t * pRoot, Vec_Ptr_t * vNodes } } - /**Function************************************************************* - Synopsis [Returns the reverse DFS ordered array of logic nodes.] + Synopsis [Returns the DFS ordered array of logic nodes.] - Description [Collects only the internal nodes, leaving out CIs/COs. - However it marks both CIs and COs with the current TravId.] + Description [Collects only the internal nodes, leaving CIs and CO. + However it marks with the current TravId both CIs and COs.] SideEffects [] SeeAlso [] ***********************************************************************/ -Vec_Ptr_t * Abc_NtkDfsReverse( Abc_Ntk_t * pNtk ) +Vec_Ptr_t * Abc_NtkDfsIter( Abc_Ntk_t * pNtk, int fCollectAll ) { - Vec_Ptr_t * vNodes; - Abc_Obj_t * pObj, * pFanout; - int i, k; + Vec_Ptr_t * vNodes, * vStack; + Abc_Obj_t * pObj; + int i; // set the traversal ID Abc_NtkIncrementTravId( pNtk ); // start the array of nodes - vNodes = Vec_PtrAlloc( 100 ); - Abc_NtkForEachCi( pNtk, pObj, i ) + vNodes = Vec_PtrAlloc( 1000 ); + vStack = Vec_PtrAlloc( 1000 ); + Abc_NtkForEachCo( pNtk, pObj, i ) { Abc_NodeSetTravIdCurrent( pObj ); - pObj = Abc_ObjFanout0Ntk(pObj); - Abc_ObjForEachFanout( pObj, pFanout, k ) - Abc_NtkDfsReverse_rec( pFanout, vNodes ); + Abc_NtkDfs_iter( vStack, Abc_ObjFanin0Ntk(Abc_ObjFanin0(pObj)), vNodes ); } - // add constant nodes in the end - if ( !Abc_NtkIsStrash(pNtk) ) + // collect dangling nodes if asked to + if ( fCollectAll ) + { Abc_NtkForEachNode( pNtk, pObj, i ) - if ( Abc_NodeIsConst(pObj) ) - Vec_PtrPush( vNodes, pObj ); + if ( !Abc_NodeIsTravIdCurrent(pObj) ) + Abc_NtkDfs_iter( vStack, pObj, vNodes ); + } + Vec_PtrFree( vStack ); return vNodes; } -/**Function************************************************************* - - Synopsis [Performs DFS for one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDfsReverse_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) -{ - Abc_Obj_t * pFanout; - int i; - assert( !Abc_ObjIsNet(pNode) ); - // if this node is already visited, skip - if ( Abc_NodeIsTravIdCurrent( pNode ) ) - return; - // mark the node as visited - Abc_NodeSetTravIdCurrent( pNode ); - // skip the CI - if ( Abc_ObjIsCo(pNode) ) - return; - assert( Abc_ObjIsNode( pNode ) ); - // visit the transitive fanin of the node - pNode = Abc_ObjFanout0Ntk(pNode); - Abc_ObjForEachFanout( pNode, pFanout, i ) - Abc_NtkDfsReverse_rec( pFanout, vNodes ); - // add the node after the fanins have been added - Vec_PtrPush( vNodes, pNode ); -} /**Function************************************************************* @@ -313,106 +421,54 @@ void Abc_NtkDfsReverse_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) SeeAlso [] ***********************************************************************/ -void Abc_NtkDfsSeq_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) +void Abc_NtkDfsHie_rec( Abc_Obj_t * pObj, Vec_Ptr_t * vNodes ) { Abc_Obj_t * pFanin; int i; // if this node is already visited, skip - if ( Abc_NodeIsTravIdCurrent( pNode ) ) + if ( Abc_NodeIsTravIdCurrent( pObj ) ) return; // mark the node as visited - Abc_NodeSetTravIdCurrent( pNode ); + Abc_NodeSetTravIdCurrent( pObj ); // visit the transitive fanin of the node - Abc_ObjForEachFanin( pNode, pFanin, i ) - Abc_NtkDfsSeq_rec( pFanin, vNodes ); + Abc_ObjForEachFanin( pObj, pFanin, i ) + Abc_NtkDfsHie_rec( pFanin, vNodes ); // add the node after the fanins have been added - Vec_PtrPush( vNodes, pNode ); + Vec_PtrPush( vNodes, pObj ); } /**Function************************************************************* - Synopsis [Returns the array of nodes and latches reachable from POs.] + Synopsis [Returns the DFS ordered array of all objects.] - Description [] + Description [This procedure collects everything from POs to PIs.] SideEffects [] SeeAlso [] ***********************************************************************/ -Vec_Ptr_t * Abc_NtkDfsSeq( Abc_Ntk_t * pNtk ) +Vec_Ptr_t * Abc_NtkDfsHie( Abc_Ntk_t * pNtk, int fCollectAll ) { Vec_Ptr_t * vNodes; Abc_Obj_t * pObj; int i; - assert( !Abc_NtkIsNetlist(pNtk) ); // set the traversal ID Abc_NtkIncrementTravId( pNtk ); // start the array of nodes vNodes = Vec_PtrAlloc( 100 ); Abc_NtkForEachPo( pNtk, pObj, i ) - Abc_NtkDfsSeq_rec( pObj, vNodes ); - // mark the PIs - Abc_NtkForEachPi( pNtk, pObj, i ) - Abc_NtkDfsSeq_rec( pObj, vNodes ); + Abc_NtkDfsHie_rec( pObj, vNodes ); + // collect dangling nodes if asked to + if ( fCollectAll ) + { + Abc_NtkForEachObj( pNtk, pObj, i ) + if ( !Abc_NodeIsTravIdCurrent(pObj) ) + Abc_NtkDfs_rec( pObj, vNodes ); + } return vNodes; } -/**Function************************************************************* - - Synopsis [Performs DFS for one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDfsSeqReverse_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) -{ - Abc_Obj_t * pFanout; - int i; - // if this node is already visited, skip - if ( Abc_NodeIsTravIdCurrent( pNode ) ) - return; - // mark the node as visited - Abc_NodeSetTravIdCurrent( pNode ); - // visit the transitive fanin of the node - Abc_ObjForEachFanout( pNode, pFanout, i ) - Abc_NtkDfsSeqReverse_rec( pFanout, vNodes ); - // add the node after the fanins have been added - Vec_PtrPush( vNodes, pNode ); -} - -/**Function************************************************************* - - Synopsis [Returns the array of nodes and latches reachable from POs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NtkDfsSeqReverse( Abc_Ntk_t * pNtk ) -{ - Vec_Ptr_t * vNodes; - Abc_Obj_t * pObj; - int i; - assert( !Abc_NtkIsNetlist(pNtk) ); - // set the traversal ID - Abc_NtkIncrementTravId( pNtk ); - // start the array of nodes - vNodes = Vec_PtrAlloc( 100 ); - Abc_NtkForEachPi( pNtk, pObj, i ) - Abc_NtkDfsSeqReverse_rec( pObj, vNodes ); - // mark the logic feeding into POs - Abc_NtkForEachPo( pNtk, pObj, i ) - Abc_NtkDfsSeq_rec( pObj, vNodes ); - return vNodes; -} /**Function************************************************************* @@ -452,6 +508,40 @@ bool Abc_NtkIsDfsOrdered( Abc_Ntk_t * pNtk ) return 1; } + +/**Function************************************************************* + + Synopsis [Performs DFS for one node.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Abc_NtkNodeSupport_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) +{ + Abc_Obj_t * pFanin; + int i; + assert( !Abc_ObjIsNet(pNode) ); + // if this node is already visited, skip + if ( Abc_NodeIsTravIdCurrent( pNode ) ) + return; + // mark the node as visited + Abc_NodeSetTravIdCurrent( pNode ); + // collect the CI + if ( Abc_ObjIsCi(pNode) || Abc_ObjFaninNum(pNode) == 0 ) + { + Vec_PtrPush( vNodes, pNode ); + return; + } + assert( Abc_ObjIsNode( pNode ) ); + // visit the transitive fanin of the node + Abc_ObjForEachFanin( pNode, pFanin, i ) + Abc_NtkNodeSupport_rec( Abc_ObjFanin0Ntk(pFanin), vNodes ); +} + /**Function************************************************************* Synopsis [Returns the set of CI nodes in the support of the given nodes.] @@ -511,6 +601,7 @@ Vec_Ptr_t * Abc_NtkNodeSupport( Abc_Ntk_t * pNtk, Abc_Obj_t ** ppNodes, int nNod return vNodes; } + /**Function************************************************************* Synopsis [Performs DFS for one node.] @@ -522,29 +613,30 @@ Vec_Ptr_t * Abc_NtkNodeSupport( Abc_Ntk_t * pNtk, Abc_Obj_t ** ppNodes, int nNod SeeAlso [] ***********************************************************************/ -void Abc_NtkNodeSupport_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) +void Abc_AigDfs_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) { Abc_Obj_t * pFanin; int i; - assert( !Abc_ObjIsNet(pNode) ); // if this node is already visited, skip if ( Abc_NodeIsTravIdCurrent( pNode ) ) return; // mark the node as visited Abc_NodeSetTravIdCurrent( pNode ); - // collect the CI - if ( Abc_ObjIsCi(pNode) || Abc_ObjFaninNum(pNode) == 0 ) - { - Vec_PtrPush( vNodes, pNode ); + // skip the PI + if ( Abc_ObjIsCi(pNode) || Abc_AigNodeIsConst(pNode) ) return; - } assert( Abc_ObjIsNode( pNode ) ); // visit the transitive fanin of the node Abc_ObjForEachFanin( pNode, pFanin, i ) - Abc_NtkNodeSupport_rec( Abc_ObjFanin0Ntk(pFanin), vNodes ); + Abc_AigDfs_rec( pFanin, vNodes ); + // visit the equivalent nodes + if ( Abc_AigNodeIsChoice( pNode ) ) + for ( pFanin = pNode->pData; pFanin; pFanin = pFanin->pData ) + Abc_AigDfs_rec( pFanin, vNodes ); + // add the node after the fanins have been added + Vec_PtrPush( vNodes, pNode ); } - /**Function************************************************************* Synopsis [Returns the DFS ordered array of logic nodes.] @@ -585,39 +677,36 @@ Vec_Ptr_t * Abc_AigDfs( Abc_Ntk_t * pNtk, int fCollectAll, int fCollectCos ) return vNodes; } + /**Function************************************************************* - Synopsis [Performs DFS for one node.] + Synopsis [Collects nodes in the DFS manner by level.] - Description [] + Description [The number of levels should be set!!!] SideEffects [] SeeAlso [] ***********************************************************************/ -void Abc_AigDfs_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) +void Abc_DfsLevelizedTfo_rec( Abc_Obj_t * pNode, Vec_Vec_t * vLevels ) { - Abc_Obj_t * pFanin; + Abc_Obj_t * pFanout; int i; // if this node is already visited, skip if ( Abc_NodeIsTravIdCurrent( pNode ) ) return; // mark the node as visited Abc_NodeSetTravIdCurrent( pNode ); - // skip the PI - if ( Abc_ObjIsCi(pNode) || Abc_AigNodeIsConst(pNode) ) + // skip the terminals + if ( Abc_ObjIsCo(pNode) ) return; - assert( Abc_ObjIsNode( pNode ) ); - // visit the transitive fanin of the node - Abc_ObjForEachFanin( pNode, pFanin, i ) - Abc_AigDfs_rec( pFanin, vNodes ); - // visit the equivalent nodes - if ( Abc_AigNodeIsChoice( pNode ) ) - for ( pFanin = pNode->pData; pFanin; pFanin = pFanin->pData ) - Abc_AigDfs_rec( pFanin, vNodes ); - // add the node after the fanins have been added - Vec_PtrPush( vNodes, pNode ); + assert( Abc_ObjIsNode(pNode) ); + // add the node to the structure + Vec_VecPush( vLevels, pNode->Level, pNode ); + // visit the TFO + Abc_ObjForEachFanout( pNode, pFanout, i ) + Abc_DfsLevelizedTfo_rec( pFanout, vLevels ); } /**Function************************************************************* @@ -653,37 +742,6 @@ Vec_Vec_t * Abc_DfsLevelized( Abc_Obj_t * pNode, bool fTfi ) return vLevels; } -/**Function************************************************************* - - Synopsis [Collects nodes in the DFS manner by level.] - - Description [The number of levels should be set!!!] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_DfsLevelizedTfo_rec( Abc_Obj_t * pNode, Vec_Vec_t * vLevels ) -{ - Abc_Obj_t * pFanout; - int i; - // if this node is already visited, skip - if ( Abc_NodeIsTravIdCurrent( pNode ) ) - return; - // mark the node as visited - Abc_NodeSetTravIdCurrent( pNode ); - // skip the terminals - if ( Abc_ObjIsCo(pNode) ) - return; - assert( Abc_ObjIsNode(pNode) ); - // add the node to the structure - Vec_VecPush( vLevels, pNode->Level, pNode ); - // visit the TFO - Abc_ObjForEachFanout( pNode, pFanout, i ) - Abc_DfsLevelizedTfo_rec( pFanout, vLevels ); -} - /**Function************************************************************* @@ -821,51 +879,6 @@ int Abc_NtkLevelReverse( Abc_Ntk_t * pNtk ) } -/**Function************************************************************* - - Synopsis [Detects combinational loops.] - - Description [This procedure is based on the idea suggested by Donald Chai. - As we traverse the network and visit the nodes, we need to distinquish - three types of nodes: (1) those that are visited for the first time, - (2) those that have been visited in this traversal but are currently not - on the traversal path, (3) those that have been visited and are currently - on the travesal path. When the node of type (3) is encountered, it means - that there is a combinational loop. To mark the three types of nodes, - two new values of the traversal IDs are used.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -bool Abc_NtkIsAcyclic( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode; - int fAcyclic, i; - // set the traversal ID for this DFS ordering - Abc_NtkIncrementTravId( pNtk ); - Abc_NtkIncrementTravId( pNtk ); - // pNode->TravId == pNet->nTravIds means "pNode is on the path" - // pNode->TravId == pNet->nTravIds - 1 means "pNode is visited but is not on the path" - // pNode->TravId < pNet->nTravIds - 1 means "pNode is not visited" - // traverse the network to detect cycles - fAcyclic = 1; - Abc_NtkForEachCo( pNtk, pNode, i ) - { - pNode = Abc_ObjFanin0Ntk(Abc_ObjFanin0(pNode)); - if ( Abc_NodeIsTravIdPrevious(pNode) ) - continue; - // traverse the output logic cone - if ( fAcyclic = Abc_NtkIsAcyclic_rec(pNode) ) - continue; - // stop as soon as the first loop is detected - fprintf( stdout, " (cone of CO \"%s\")\n", Abc_ObjName(pNode) ); - break; - } - return fAcyclic; -} - /**Function************************************************************* Synopsis [Recursively detects combinational loops.] @@ -919,6 +932,51 @@ bool Abc_NtkIsAcyclic_rec( Abc_Obj_t * pNode ) return 1; } +/**Function************************************************************* + + Synopsis [Detects combinational loops.] + + Description [This procedure is based on the idea suggested by Donald Chai. + As we traverse the network and visit the nodes, we need to distinquish + three types of nodes: (1) those that are visited for the first time, + (2) those that have been visited in this traversal but are currently not + on the traversal path, (3) those that have been visited and are currently + on the travesal path. When the node of type (3) is encountered, it means + that there is a combinational loop. To mark the three types of nodes, + two new values of the traversal IDs are used.] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +bool Abc_NtkIsAcyclic( Abc_Ntk_t * pNtk ) +{ + Abc_Obj_t * pNode; + int fAcyclic, i; + // set the traversal ID for this DFS ordering + Abc_NtkIncrementTravId( pNtk ); + Abc_NtkIncrementTravId( pNtk ); + // pNode->TravId == pNet->nTravIds means "pNode is on the path" + // pNode->TravId == pNet->nTravIds - 1 means "pNode is visited but is not on the path" + // pNode->TravId < pNet->nTravIds - 1 means "pNode is not visited" + // traverse the network to detect cycles + fAcyclic = 1; + Abc_NtkForEachCo( pNtk, pNode, i ) + { + pNode = Abc_ObjFanin0Ntk(Abc_ObjFanin0(pNode)); + if ( Abc_NodeIsTravIdPrevious(pNode) ) + continue; + // traverse the output logic cone + if ( fAcyclic = Abc_NtkIsAcyclic_rec(pNode) ) + continue; + // stop as soon as the first loop is detected + fprintf( stdout, " (cone of CO \"%s\")\n", Abc_ObjName(pNode) ); + break; + } + return fAcyclic; +} + /**Function************************************************************* diff --git a/src/base/abc/abcFanio.c b/src/base/abc/abcFanio.c index 154fe149b..ff6d0590e 100644 --- a/src/base/abc/abcFanio.c +++ b/src/base/abc/abcFanio.c @@ -53,6 +53,8 @@ void Abc_ObjAddFanin( Abc_Obj_t * pObj, Abc_Obj_t * pFanin ) { int x = 0; } +// printf( "Adding fanin of %s ", Abc_ObjName(pObj) ); +// printf( "to be %s\n", Abc_ObjName(pFanin) ); } diff --git a/src/base/abc/abcHie.c b/src/base/abc/abcHie.c index c42cff45b..a804203f9 100644 --- a/src/base/abc/abcHie.c +++ b/src/base/abc/abcHie.c @@ -24,16 +24,129 @@ /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// -extern Abc_Ntk_t * Abc_NtkFlattenLogicHierarchy( Abc_Ntk_t * pNtk ); -extern Abc_Ntk_t * Abc_NtkConvertBlackboxes( Abc_Ntk_t * pNtk ); -extern void Abc_NtkInsertNewLogic( Abc_Ntk_t * pNtkHie, Abc_Ntk_t * pNtk ); - -static void Abc_NtkFlattenLogicHierarchy_rec( Abc_Ntk_t * pNtkNew, Abc_Ntk_t * pNtkOld, int * pCounter ); - //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// +/**Function************************************************************* + + Synopsis [Recursively flattens logic hierarchy of the netlist.] + + Description [When this procedure is called, the PI/PO nets of the old + netlist point to the corresponding nets of the flattened netlist.] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Abc_NtkFlattenLogicHierarchy_rec( Abc_Ntk_t * pNtkNew, Abc_Ntk_t * pNtk, int * pCounter ) +{ + char Suffix[1000] = {0}; + Abc_Ntk_t * pNtkModel; + Abc_Obj_t * pObj, * pTerm, * pNet, * pFanin; + int i, k; + + // process the blackbox + if ( Abc_NtkHasBlackbox(pNtk) ) + { + // duplicate the blackbox + assert( Abc_NtkBoxNum(pNtk) == 1 ); + pObj = Abc_NtkBox( pNtk, 0 ); + Abc_NtkDupBox( pNtkNew, pObj, 1 ); + + // connect blackbox fanins to the PI nets + assert( Abc_ObjFaninNum(pObj->pCopy) == Abc_NtkPiNum(pNtk) ); + Abc_NtkForEachPi( pNtk, pTerm, i ) + Abc_ObjAddFanin( Abc_ObjFanin(pObj->pCopy,i), Abc_ObjFanout0(pTerm) ); + + // connect blackbox fanouts to the PO nets + assert( Abc_ObjFanoutNum(pObj->pCopy) == Abc_NtkPoNum(pNtk) ); + Abc_NtkForEachPo( pNtk, pTerm, i ) + Abc_ObjAddFanin( Abc_ObjFanin0(pTerm), Abc_ObjFanout(pObj->pCopy,i) ); + return; + } + + (*pCounter)++; + + // create the prefix, which will be appended to the internal names + if ( *pCounter ) + sprintf( Suffix, "_%s_%d", Abc_NtkName(pNtk), *pCounter ); + + // duplicate nets of all boxes, including latches + Abc_NtkForEachBox( pNtk, pObj, i ) + { + Abc_ObjForEachFanin( pObj, pTerm, k ) + { + pNet = Abc_ObjFanin0(pTerm); + if ( pNet->pCopy ) + continue; + pNet->pCopy = Abc_NtkFindOrCreateNet( pNtkNew, Abc_ObjNameSuffix(pNet, Suffix) ); + } + Abc_ObjForEachFanout( pObj, pTerm, k ) + { + pNet = Abc_ObjFanout0(pTerm); + if ( pNet->pCopy ) + continue; + pNet->pCopy = Abc_NtkFindOrCreateNet( pNtkNew, Abc_ObjNameSuffix(pNet, Suffix) ); + } + } + + // mark objects that will not be used + Abc_NtkIncrementTravId( pNtk ); + Abc_NtkForEachPi( pNtk, pTerm, i ) + Abc_NodeSetTravIdCurrent( pTerm ); + Abc_NtkForEachPo( pNtk, pTerm, i ) + Abc_NodeSetTravIdCurrent( pTerm ); + Abc_NtkForEachBox( pNtk, pObj, i ) + { + if ( Abc_ObjIsLatch(pObj) ) + continue; + Abc_NodeSetTravIdCurrent( pObj ); + Abc_ObjForEachFanin( pObj, pTerm, k ) + Abc_NodeSetTravIdCurrent( pTerm ); + Abc_ObjForEachFanout( pObj, pTerm, k ) + Abc_NodeSetTravIdCurrent( pTerm ); + } + + // duplicate objects that do not have prototypes yet + Abc_NtkForEachObj( pNtk, pObj, i ) + { + if ( Abc_NodeIsTravIdCurrent(pObj) ) + continue; + if ( pObj->pCopy ) + continue; + Abc_NtkDupObj( pNtkNew, pObj, 0 ); + } + + // connect objects + Abc_NtkForEachObj( pNtk, pObj, i ) + if ( !Abc_NodeIsTravIdCurrent(pObj) ) + Abc_ObjForEachFanin( pObj, pFanin, k ) + if ( !Abc_NodeIsTravIdCurrent(pFanin) ) + Abc_ObjAddFanin( pObj->pCopy, pFanin->pCopy ); + + // call recursively + Abc_NtkForEachBox( pNtk, pObj, i ) + { + if ( Abc_ObjIsLatch(pObj) ) + continue; + pNtkModel = pObj->pData; + // check the match between the number of actual and formal parameters + assert( Abc_ObjFaninNum(pObj) == Abc_NtkPiNum(pNtkModel) ); + assert( Abc_ObjFanoutNum(pObj) == Abc_NtkPoNum(pNtkModel) ); + // clean the node copy fields + Abc_NtkCleanCopy( pNtkModel ); + // map PIs/POs + Abc_ObjForEachFanin( pObj, pTerm, k ) + Abc_ObjFanout0( Abc_NtkPi(pNtkModel, k) )->pCopy = Abc_ObjFanin0(pTerm)->pCopy; + Abc_ObjForEachFanout( pObj, pTerm, k ) + Abc_ObjFanin0( Abc_NtkPo(pNtkModel, k) )->pCopy = Abc_ObjFanout0(pTerm)->pCopy; + // call recursively + Abc_NtkFlattenLogicHierarchy_rec( pNtkNew, pNtkModel, pCounter ); + } +} + /**Function************************************************************* Synopsis [Flattens the logic hierarchy of the netlist.] @@ -48,121 +161,61 @@ static void Abc_NtkFlattenLogicHierarchy_rec( Abc_Ntk_t * pNtkNew, Abc_Ntk_t * p Abc_Ntk_t * Abc_NtkFlattenLogicHierarchy( Abc_Ntk_t * pNtk ) { Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pObj, * pNet; - int i, Counter = 0; + Abc_Obj_t * pTerm, * pNet; + int i, Counter; assert( Abc_NtkIsNetlist(pNtk) ); + // start the network pNtkNew = Abc_NtkAlloc( pNtk->ntkType, pNtk->ntkFunc, 1 ); // duplicate the name and the spec pNtkNew->pName = Extra_UtilStrsav(pNtk->pName); pNtkNew->pSpec = Extra_UtilStrsav(pNtk->pSpec); + // clean the node copy fields Abc_NtkCleanCopy( pNtk ); + // duplicate PIs/POs and their nets - Abc_NtkForEachPi( pNtk, pObj, i ) + Abc_NtkForEachPi( pNtk, pTerm, i ) { - Abc_NtkDupObj( pNtkNew, pObj, 0 ); - pNet = Abc_ObjFanout0( pObj ); - Abc_NtkDupObj( pNtkNew, pNet, 1 ); - Abc_ObjAddFanin( pNet->pCopy, pObj->pCopy ); - } - Abc_NtkForEachPo( pNtk, pObj, i ) - { - Abc_NtkDupObj( pNtkNew, pObj, 0 ); - pNet = Abc_ObjFanin0( pObj ); + Abc_NtkDupObj( pNtkNew, pTerm, 0 ); + pNet = Abc_ObjFanout0( pTerm ); pNet->pCopy = Abc_NtkFindOrCreateNet( pNtkNew, Abc_ObjName(pNet) ); - Abc_ObjAddFanin( pObj->pCopy, pNet->pCopy ); + Abc_ObjAddFanin( pNet->pCopy, pTerm->pCopy ); } + Abc_NtkForEachPo( pNtk, pTerm, i ) + { + Abc_NtkDupObj( pNtkNew, pTerm, 0 ); + pNet = Abc_ObjFanin0( pTerm ); + pNet->pCopy = Abc_NtkFindOrCreateNet( pNtkNew, Abc_ObjName(pNet) ); + Abc_ObjAddFanin( pTerm->pCopy, pNet->pCopy ); + } + // recursively flatten hierarchy, create internal logic, add new PI/PO names if there are black boxes + Counter = -1; Abc_NtkFlattenLogicHierarchy_rec( pNtkNew, pNtk, &Counter ); - printf( "Abc_NtkFlattenLogicHierarchy(): Flattened %d logic boxes. Left %d block boxes.\n", - Counter - 1, Abc_NtkBlackboxNum(pNtkNew) ); + printf( "Abc_NtkFlattenLogicHierarchy(): Flattened %d logic instances. Preserved %d black boxes.\n", + Counter, Abc_NtkBlackboxNum(pNtkNew) ); + // copy the timing information // Abc_ManTimeDup( pNtk, pNtkNew ); // duplicate EXDC if ( pNtk->pExdc ) printf( "EXDC is not transformed.\n" ); if ( !Abc_NtkCheck( pNtkNew ) ) - fprintf( stdout, "Abc_NtkFlattenLogicHierarchy(): Network check has failed.\n" ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Recursively flattens the logic hierarchy of the netlist.] - - Description [When this procedure is called, the PI/PO nets of the netlist - are already assigned.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFlattenLogicHierarchy_rec( Abc_Ntk_t * pNtkNew, Abc_Ntk_t * pNtkOld, int * pCounter ) -{ - Vec_Ptr_t * vNodes; - Abc_Ntk_t * pNtkModel; - Abc_Obj_t * pObj, * pTerm, * pFanin, * pNet; - int i, k; - (*pCounter)++; - // collect nodes and boxes in topological order - vNodes = Abc_NtkDfs( pNtkOld, 0 ); - // duplicate nodes and blackboxes, call recursively for logic boxes - Vec_PtrForEachEntry( vNodes, pObj, i ) { - if ( Abc_ObjIsNode(pObj) ) - { - // duplicate the node - Abc_NtkDupObj( pNtkNew, pObj, 0 ); - Abc_ObjForEachFanin( pObj, pNet, k ) - Abc_ObjAddFanin( pObj->pCopy, pNet->pCopy ); - // duplicate the net - pNet = Abc_ObjFanout0( pObj ); - pNet->pCopy = Abc_NtkFindOrCreateNet( pNtkNew, Abc_ObjName(pNet) ); - Abc_ObjAddFanin( pNet->pCopy, pObj->pCopy ); - continue; - } - if ( Abc_ObjIsBlackbox(pObj) ) - { - // duplicate the box - Abc_NtkDupObj( pNtkNew, pObj, 1 ); - // connect the fanins - Abc_ObjForEachFanin( pObj, pNet, k ) - Abc_ObjAddFanin( pObj->pCopy, pNet->pCopy ); - // duplicate fanout nets and connect them - Abc_ObjForEachFanout( pObj, pNet, i ) - { - pNet->pCopy = Abc_NtkFindOrCreateNet( pNtkNew, Abc_ObjName(pNet) ); - Abc_ObjAddFanin( pNet->pCopy, pObj->pCopy ); - } - continue; - } - assert( Abc_ObjIsBox(pObj) ); - pNtkModel = pObj->pData; - assert( pNtkModel && !Abc_NtkHasBlackbox(pNtkModel) ); - // clean the node copy fields - Abc_NtkCleanCopy( pNtkModel ); - // consider this blackbox - // copy the PIs/POs of the box - Abc_NtkForEachPi( pNtkModel, pTerm, k ) - Abc_ObjFanout(pTerm, k)->pCopy = Abc_ObjFanin(pObj, k); - Abc_NtkForEachPo( pNtkModel, pTerm, k ) - Abc_ObjFanin(pTerm, k)->pCopy = Abc_ObjFanout(pObj, k); - // call recursively - Abc_NtkFlattenLogicHierarchy_rec( pNtkNew, pNtkModel, pCounter ); + fprintf( stdout, "Abc_NtkFlattenLogicHierarchy(): Network check has failed.\n" ); + Abc_NtkDelete( pNtkNew ); + return NULL; } - // connect the POs - Abc_NtkForEachPo( pNtkOld, pTerm, k ) - pTerm->pCopy = Abc_ObjFanin0(pTerm)->pCopy; - Vec_PtrFree( vNodes ); + return pNtkNew; } /**Function************************************************************* Synopsis [Extracts blackboxes by making them into additional PIs/POs.] - Description [] + Description [The input netlist has not logic hierarchy. The resulting + netlist has additional PIs/POs for each blackbox input/output.] SideEffects [] @@ -172,68 +225,74 @@ void Abc_NtkFlattenLogicHierarchy_rec( Abc_Ntk_t * pNtkNew, Abc_Ntk_t * pNtkOld, Abc_Ntk_t * Abc_NtkConvertBlackboxes( Abc_Ntk_t * pNtk ) { Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pObj, * pNet; + Abc_Obj_t * pObj, * pNet, * pFanin, * pTerm; int i, k; + assert( Abc_NtkIsNetlist(pNtk) ); - assert( Abc_NtkBlackboxNum(pNtk) == Abc_NtkBoxNum(pNtk) - Abc_NtkLatchNum(pNtk) ); + assert( Abc_NtkWhiteboxNum(pNtk) == 0 ); + // start the network pNtkNew = Abc_NtkAlloc( pNtk->ntkType, pNtk->ntkFunc, 1 ); // duplicate the name and the spec pNtkNew->pName = Extra_UtilStrsav( pNtk->pName ); - pNtkNew->pSpec = Extra_UtilStrsav( pNtk->pSpec ); +// pNtkNew->pSpec = Extra_UtilStrsav( pNtk->pSpec ); + // clean the node copy fields Abc_NtkCleanCopy( pNtk ); - // create PIs/POs for the box inputs outputs + + // create PIs/POs for the box inputs/outputs + // mark the nodes that should not be connected + Abc_NtkIncrementTravId( pNtk ); Abc_NtkForEachBlackbox( pNtk, pObj, i ) { - pObj->pCopy = pObj; // placeholder - Abc_ObjForEachFanout( pObj, pNet, k ) + Abc_NodeSetTravIdCurrent( pObj ); + Abc_ObjForEachFanout( pObj, pTerm, k ) { + pNet = Abc_ObjFanout0(pTerm); if ( pNet->pCopy ) - continue; - pNet->pCopy = Abc_NtkCreatePi( pNtkNew ); - Abc_ObjAssignName( pNet->pCopy, Abc_ObjName(pNet), NULL ); - } - Abc_ObjForEachFanin( pObj, pNet, k ) - { - if ( pNet->pCopy ) - continue; - pNet->pCopy = Abc_NtkCreatePo( pNtkNew ); - Abc_ObjAssignName( pNet->pCopy, Abc_ObjName(pNet), NULL ); + { + printf( "Error in Abc_NtkConvertBlackboxes(): Output %s of a black box has a non-unique name.\n", Abc_ObjName(pNet->pCopy) ); + Abc_NtkDelete( pNtkNew ); + return NULL; + } + pNet->pCopy = Abc_NtkFindOrCreateNet( pNtkNew, Abc_ObjName(pNet) ); + pTerm->pCopy = Abc_NtkCreatePi( pNtkNew ); + Abc_NodeSetTravIdCurrent( pTerm ); } } + Abc_NtkForEachBlackbox( pNtk, pObj, i ) + { + Abc_ObjForEachFanin( pObj, pTerm, k ) + { + pNet = Abc_ObjFanin0(pTerm); + if ( pNet->pCopy ) + { + Abc_NodeSetTravIdCurrent( pTerm ); + continue; + } + pNet->pCopy = Abc_NtkFindOrCreateNet( pNtkNew, Abc_ObjName(pNet) ); + pTerm->pCopy = Abc_NtkCreatePo( pNtkNew ); + } + } + // duplicate other objects Abc_NtkForEachObj( pNtk, pObj, i ) - if ( pObj->pCopy == NULL ) + if ( !Abc_NodeIsTravIdCurrent(pObj) && pObj->pCopy == NULL ) Abc_NtkDupObj( pNtkNew, pObj, Abc_ObjIsNet(pObj) ); + // connect all objects - - - - - - // duplicate all objects besides the boxes Abc_NtkForEachObj( pNtk, pObj, i ) - if ( !Abc_ObjIsBlackbox(pObj) ) - Abc_NtkDupObj( pNtkNew, pObj, Abc_ObjIsNet(pObj) ); - // create PIs/POs for the nets belonging to the boxes - Abc_NtkForEachBlackbox( pNtk, pObj, i ) - { - Abc_ObjForEachFanin( pObj, pNet, k ) - if ( !Abc_ObjIsPi(Abc_ObjFanin0(pNet)) ) - Abc_NtkCreatePi(pNtkNew) + if ( !Abc_NodeIsTravIdCurrent(pObj) ) + Abc_ObjForEachFanin( pObj, pFanin, k ) + Abc_ObjAddFanin( pObj->pCopy, pFanin->pCopy ); - } - // connect all objects, besides blackboxes - Abc_NtkForEachObj( pNtk, pObj, i ) + // check integrity + if ( !Abc_NtkCheck( pNtkNew ) ) { - if ( !Abc_ObjIsBlackbox(pObj) ) - continue; - Abc_ObjForEachFanin( pObj, pNet, k ) - Abc_ObjAddFanin( pObj->pCopy, pNet->pCopy ); + fprintf( stdout, "Abc_NtkConvertBlackboxes(): Network check has failed.\n" ); + Abc_NtkDelete( pNtkNew ); + return NULL; } - if ( !Abc_NtkCheck( pNtkHie ) ) - fprintf( stdout, "Abc_NtkInsertNewLogic(): Network check has failed.\n" ); return pNtkNew; } @@ -242,99 +301,129 @@ Abc_Ntk_t * Abc_NtkConvertBlackboxes( Abc_Ntk_t * pNtk ) Synopsis [Inserts blackboxes into the netlist.] Description [The first arg is the netlist with blackboxes without logic hierarchy. - The second arg is a non-hierarchical netlist derived from logic network after processing. - This procedure inserts the logic back into the original hierarhical netlist. - The result is updated original hierarchical netlist.] + The second arg is a non-hierarchical netlist derived from the above netlist after processing. + This procedure create a new netlist, which is comparable to the original netlist with + blackboxes, except that it contains logic nodes from the netlist after processing.] - SideEffects [] + SideEffects [This procedure silently assumes that blackboxes appear + only in the top-level model. If they appear in other models as well, + the name of the model and its number were appended to the names of + blackbox inputs/outputs.] SeeAlso [] ***********************************************************************/ -int Abc_NtkInsertNewLogic( Abc_Ntk_t * pNtkHie, Abc_Ntk_t * pNtk ) +Abc_Ntk_t * Abc_NtkInsertNewLogic( Abc_Ntk_t * pNtkH, Abc_Ntk_t * pNtkL ) { - Abc_Obj_t * pObj, * pNet, * pNetLogic; + Abc_Ntk_t * pNtkNew; + Abc_Obj_t * pObjH, * pObjL, * pNetH, * pNetL, * pTermH; int i, k; - assert( Abc_NtkIsNetlist(pNtkHie) ); - assert( Abc_NtkIsNetlist(pNtk) ); - assert( Abc_NtkBlackboxNum(pNtk) == 0 ); - Abc_NtkCleanCopy( pNtk ); - // mark PIs/POs/blackboxes and their nets - // map the nets into the corresponding nets of the logic design - Abc_NtkForEachPi( pNtkHie, pObj, i ) + + assert( Abc_NtkIsNetlist(pNtkH) ); + assert( Abc_NtkWhiteboxNum(pNtkH) == 0 ); + assert( Abc_NtkBlackboxNum(pNtkL) > 0 ); + + assert( Abc_NtkIsNetlist(pNtkL) ); + assert( Abc_NtkWhiteboxNum(pNtkL) == 0 ); + assert( Abc_NtkBlackboxNum(pNtkL) == 0 ); + + // prepare the logic network for copying + Abc_NtkCleanCopy( pNtkL ); + + // start the network + pNtkNew = Abc_NtkAlloc( pNtkH->ntkType, pNtkH->ntkFunc, 1 ); + // duplicate the name and the spec + pNtkNew->pName = Extra_UtilStrsav( pNtkH->pName ); + pNtkNew->pSpec = Extra_UtilStrsav( pNtkH->pSpec ); + + // make sure every PI/PO has a PI/PO in the processed network + Abc_NtkForEachPi( pNtkH, pObjH, i ) { - pObj->fMarkA = 1; - pNet = Abc_ObjFanout0(pObj); - pNet->fMarkA = 1; - pNetLogic = Abc_NtkFindNet( pNtk, Abc_ObjName(pNet) ); - assert( pNetLogic ); - pNetLogic->pCopy = pNet; - } - Abc_NtkForEachPo( pNtkHie, pObj, i ) - { - pObj->fMarkA = 1; - pNet = Abc_ObjFanin0(pObj); - pNet->fMarkA = 1; - pNetLogic = Abc_NtkFindNet( pNtk, Abc_ObjName(pNet) ); - assert( pNetLogic ); - pNetLogic->pCopy = pNet; - } - Abc_NtkForEachBlackbox( pNtkHie, pObj, i ) - { - pObj->fMarkA = 1; - Abc_ObjForEachFanin( pObj, pNet, k ) + pNetH = Abc_ObjFanout0(pObjH); + pNetL = Abc_NtkFindNet( pNtkL, Abc_ObjName(pNetH) ); + if ( pNetL == NULL || !Abc_ObjIsPi( Abc_ObjFanin0(pNetL) ) ) { - pNet->fMarkA = 1; - pNetLogic = Abc_NtkFindNet( pNtk, Abc_ObjName(pNet) ); - assert( pNetLogic ); - pNetLogic->pCopy = pNet; + printf( "There is no PI corresponding to the PI %s.\n", Abc_ObjName(pNetH) ); + Abc_NtkDelete( pNtkNew ); + return NULL; } - Abc_ObjForEachFanout( pObj, pNet, k ) + // duplicate + pNetL->pCopy = Abc_NtkFindOrCreateNet( pNtkNew, Abc_ObjName(pNetH) ); + Abc_NtkDupObj( pNtkNew, Abc_ObjFanin0(pNetL), 0 ); + } + Abc_NtkForEachPo( pNtkH, pObjH, i ) + { + pNetH = Abc_ObjFanin0(pObjH); + pNetL = Abc_NtkFindNet( pNtkL, Abc_ObjName(pNetH) ); + if ( pNetL == NULL || !Abc_ObjIsPo( Abc_ObjFanout0(pNetL) ) ) { - pNet->fMarkA = 1; - pNetLogic = Abc_NtkFindNet( pNtk, Abc_ObjName(pNet) ); - assert( pNetLogic ); - pNetLogic->pCopy = pNet; + printf( "There is no PO corresponding to the PO %s.\n", Abc_ObjName(pNetH) ); + Abc_NtkDelete( pNtkNew ); + return NULL; + } + // duplicate + pNetL->pCopy = Abc_NtkFindOrCreateNet( pNtkNew, Abc_ObjName(pNetH) ); + Abc_NtkDupObj( pNtkNew, Abc_ObjFanout0(pNetL), 0 ); + } + + // make sure every BB has a PI/PO in the processed network + Abc_NtkForEachBlackbox( pNtkH, pObjH, i ) + { + // duplicate the box + Abc_NtkDupObj( pNtkNew, pObjH, 1 ); + // look and fanins/fanouts of the box + Abc_ObjForEachFanin( pObjH, pTermH, k ) + { + pNetH = Abc_ObjFanin0( pTermH ); + pNetL = Abc_NtkFindNet( pNtkL, Abc_ObjName(pNetH) ); + if ( pNetL == NULL || !Abc_ObjIsPo( Abc_ObjFanout0(pNetL) ) ) + { + printf( "There is no PO corresponding to the input %s of blackbox %s.\n", Abc_ObjName(pNetH), Abc_ObjName(pObjH) ); + Abc_NtkDelete( pNtkNew ); + return NULL; + } + // duplicate + pNetL->pCopy = Abc_NtkFindOrCreateNet( pNtkNew, Abc_ObjName(pNetH) ); + Abc_NtkDupObj( pNtkNew, Abc_ObjFanout0(pNetL), 0 ); + // connect + Abc_ObjAddFanin( pObjH->pCopy, Abc_ObjFanout0(pNetL)->pCopy ); + } + Abc_ObjForEachFanout( pObjH, pTermH, k ) + { + pNetH = Abc_ObjFanout0( pTermH ); + pNetL = Abc_NtkFindNet( pNtkL, Abc_ObjName(pNetH) ); + if ( pNetL == NULL || !Abc_ObjIsPi( Abc_ObjFanin0(pNetL) ) ) + { + printf( "There is no PI corresponding to the inpout %s of blackbox %s.\n", Abc_ObjName(pNetH), Abc_ObjName(pObjH) ); + Abc_NtkDelete( pNtkNew ); + return NULL; + } + // duplicate + pNetL->pCopy = Abc_NtkFindOrCreateNet( pNtkNew, Abc_ObjName(pNetH) ); + Abc_NtkDupObj( pNtkNew, Abc_ObjFanin0(pNetL), 0 ); + // connect + Abc_ObjAddFanin( Abc_ObjFanin0(pNetL)->pCopy, pObjH->pCopy ); } } - // remove all other logic fro the hierarchical netlist - Abc_NtkForEachObj( pNtkHie, pObj, i ) - { - if ( pObj->fMarkA ) - pObj->fMarkA = 0; - else - Abc_NtkDeleteObj( pObj ); - } - // mark PI/PO nets of the network - Abc_NtkForEachPi( pNtk, pObj, i ) - Abc_ObjFanout0(pObj)->fMarkA = 1; - Abc_NtkForEachPo( pNtk, pObj, i ) - Abc_ObjFanin0(pObj)->fMarkA = 1; - // make sure only these nodes are assigned the copy - Abc_NtkForEachObj( pNtk, pObj, i ) - { - assert( pObj->fMarkA == (pObj->pCopy != NULL) ); - pObj->fMarkA = 0; - if ( pObj->pCopy ) - continue; - if ( Abc_ObjIsPi(pObj) || Abc_ObjIsPi(pObj) ) - continue; - Abc_NtkDupObj( pNtkHie, pObj, 0 ); - } - // connect all the nodes, except the PIs and POs - Abc_NtkForEachObj( pNtk, pObj, i ) - { - if ( Abc_ObjIsPi(pObj) || Abc_ObjIsPi(pObj) ) - continue; - Abc_ObjForEachFanin( pObj, pNet, k ) - Abc_ObjAddFanin( pObj->pCopy, pNet->pCopy ); - } - if ( !Abc_NtkCheck( pNtkHie ) ) + + // duplicate other objects of the logic network + Abc_NtkForEachObj( pNtkL, pObjL, i ) + if ( pObjL->pCopy ) + Abc_NtkDupObj( pNtkNew, pObjL, 0 ); + + // connect objects + Abc_NtkForEachObj( pNtkL, pObjL, i ) + Abc_ObjForEachFanin( pObjL, pNetL, k ) + Abc_ObjAddFanin( pObjL->pCopy, pNetL->pCopy ); + + // check integrity + if ( !Abc_NtkCheck( pNtkNew ) ) { fprintf( stdout, "Abc_NtkInsertNewLogic(): Network check has failed.\n" ); - return 0; + Abc_NtkDelete( pNtkNew ); + return NULL; } - return 1; + return pNtkNew; } //////////////////////////////////////////////////////////////////////// diff --git a/src/base/abc/abcLib.c b/src/base/abc/abcLib.c index 773ef2df3..b31fed6bd 100644 --- a/src/base/abc/abcLib.c +++ b/src/base/abc/abcLib.c @@ -64,7 +64,7 @@ Abc_Lib_t * Abc_LibCreate( char * pName ) SeeAlso [] ***********************************************************************/ -void Abc_LibFree( Abc_Lib_t * pLib ) +void Abc_LibFree( Abc_Lib_t * pLib, Abc_Ntk_t * pNtkSave ) { Abc_Ntk_t * pNtk; int i; @@ -79,6 +79,8 @@ void Abc_LibFree( Abc_Lib_t * pLib ) Vec_PtrForEachEntry( pLib->vModules, pNtk, i ) { // pNtk->pManFunc = NULL; + if ( pNtk == pNtkSave ) + continue; Abc_NtkDelete( pNtk ); } Vec_PtrFree( pLib->vModules ); @@ -108,11 +110,15 @@ void Abc_LibPrint( Abc_Lib_t * pLib ) Vec_PtrForEachEntry( pLib->vModules, pNtk, i ) { printf( "%2d : %20s ", i+1, pNtk->pName ); - printf( "nd = %6d lat = %6d box = %3d\n", Abc_NtkNodeNum(pNtk), Abc_NtkLatchNum(pNtk), Abc_NtkBlackboxNum(pNtk) ); + printf( "nd = %6d lat = %6d whitebox = %3d blackbox = %3d\n", + Abc_NtkNodeNum(pNtk), Abc_NtkLatchNum(pNtk), + Abc_NtkWhiteboxNum(pNtk), Abc_NtkBlackboxNum(pNtk) ); if ( Abc_NtkBlackboxNum(pNtk) == 0 ) continue; + Abc_NtkForEachWhitebox( pNtk, pObj, k ) + printf( " %20s (whitebox)\n", Abc_NtkName(pObj->pData) ); Abc_NtkForEachBlackbox( pNtk, pObj, k ) - printf( " %20s (submodel)\n", Abc_NtkName(pObj->pData) ); + printf( " %20s (blackbox)\n", Abc_NtkName(pObj->pData) ); } } diff --git a/src/base/abc/abcNames.c b/src/base/abc/abcNames.c index 2029994ca..a649fe431 100644 --- a/src/base/abc/abcNames.c +++ b/src/base/abc/abcNames.c @@ -414,9 +414,9 @@ void Abc_NtkAddDummyAssertNames( Abc_Ntk_t * pNtk ) ***********************************************************************/ void Abc_NtkAddDummyBoxNames( Abc_Ntk_t * pNtk ) { - Abc_Obj_t * pObj, * pTerm; - int nDigits, nDigitsF, i, k; - char * pName; + Abc_Obj_t * pObj; + int nDigits, i; + assert( !Abc_NtkIsNetlist(pNtk) ); nDigits = Extra_Base10Log( Abc_NtkLatchNum(pNtk) ); Abc_NtkForEachLatch( pNtk, pObj, i ) { @@ -424,14 +424,7 @@ void Abc_NtkAddDummyBoxNames( Abc_Ntk_t * pNtk ) Abc_ObjAssignName( Abc_ObjFanin0(pObj), Abc_ObjNameDummy("Li", i, nDigits), NULL ); Abc_ObjAssignName( Abc_ObjFanout0(pObj), Abc_ObjNameDummy("Lo", i, nDigits), NULL ); } - nDigits = Extra_Base10Log( Abc_NtkTriNum(pNtk) ); - Abc_NtkForEachTri( pNtk, pObj, i ) - { - Abc_ObjAssignName( pObj, Abc_ObjNameDummy("T", i, nDigits), NULL ); - Abc_ObjAssignName( Abc_ObjFanin0(pObj), Abc_ObjNameDummy("Ti0", i, nDigits), NULL ); - Abc_ObjAssignName( Abc_ObjFanin1(pObj), Abc_ObjNameDummy("Ti1", i, nDigits), NULL ); - Abc_ObjAssignName( Abc_ObjFanout0(pObj), Abc_ObjNameDummy("To", i, nDigits), NULL ); - } +/* nDigits = Extra_Base10Log( Abc_NtkBlackboxNum(pNtk) ); Abc_NtkForEachBlackbox( pNtk, pObj, i ) { @@ -443,6 +436,7 @@ void Abc_NtkAddDummyBoxNames( Abc_Ntk_t * pNtk ) Abc_ObjForEachFanout( pObj, pTerm, k ) Abc_ObjAssignName( Abc_ObjFanin0(pObj), pName, Abc_ObjNameDummy("o", k, nDigitsF) ); } +*/ } /**Function************************************************************* diff --git a/src/base/abc/abcNetlist.c b/src/base/abc/abcNetlist.c index 2a20617c3..30c7d6216 100644 --- a/src/base/abc/abcNetlist.c +++ b/src/base/abc/abcNetlist.c @@ -49,7 +49,8 @@ Abc_Ntk_t * Abc_NtkNetlistToLogic( Abc_Ntk_t * pNtk ) int i, k; assert( Abc_NtkIsNetlist(pNtk) ); // consider simple case when there is hierarchy - assert( pNtk->tName2Model == NULL ); + assert( pNtk->pDesign == NULL ); +// assert( pNtk->tName2Model == NULL ); // if ( pNtk->tName2Model ) // return Abc_NtkNetlistToLogicHie( pNtk ); // start the network diff --git a/src/base/abc/abcNtk.c b/src/base/abc/abcNtk.c index 5e5cee693..664262687 100644 --- a/src/base/abc/abcNtk.c +++ b/src/base/abc/abcNtk.c @@ -840,17 +840,13 @@ void Abc_NtkDelete( Abc_Ntk_t * pNtk ) else if ( !Abc_NtkHasBlackbox(pNtk) ) assert( 0 ); // free the hierarchy - if ( Abc_NtkIsNetlist(pNtk) && pNtk->tName2Model ) + if ( pNtk->pDesign ) { - stmm_generator * gen; - Abc_Ntk_t * pNtkTemp; - char * pName; - stmm_foreach_item( pNtk->tName2Model, gen, &pName, (char **)&pNtkTemp ) - Abc_NtkDelete( pNtkTemp ); - stmm_free_table( pNtk->tName2Model ); + Abc_LibFree( pNtk->pDesign, pNtk ); + pNtk->pDesign = NULL; } - if ( pNtk->pBlackBoxes ) - Vec_IntFree( pNtk->pBlackBoxes ); +// if ( pNtk->pBlackBoxes ) +// Vec_IntFree( pNtk->pBlackBoxes ); // free node attributes Vec_PtrForEachEntry( pNtk->vAttrs, pAttrMan, i ) if ( pAttrMan ) @@ -879,7 +875,7 @@ void Abc_NtkFixNonDrivenNets( Abc_Ntk_t * pNtk ) if ( Abc_NtkNodeNum(pNtk) == 0 ) { - pNtk->ntkFunc = ABC_FUNC_BLACKBOX; +// pNtk->ntkFunc = ABC_FUNC_BLACKBOX; return; } diff --git a/src/base/abc/abcObj.c b/src/base/abc/abcObj.c index 8d347404a..d55ccfcf4 100644 --- a/src/base/abc/abcObj.c +++ b/src/base/abc/abcObj.c @@ -140,11 +140,10 @@ Abc_Obj_t * Abc_NtkCreateObj( Abc_Ntk_t * pNtk, Abc_ObjType_t Type ) break; case ABC_OBJ_NET: case ABC_OBJ_NODE: - case ABC_OBJ_GATE: break; case ABC_OBJ_LATCH: pObj->pData = (void *)ABC_INIT_NONE; - case ABC_OBJ_TRI: + case ABC_OBJ_WHITEBOX: case ABC_OBJ_BLACKBOX: if ( pNtk->vBoxes ) Vec_PtrPush( pNtk->vBoxes, pObj ); break; @@ -220,7 +219,6 @@ void Abc_NtkDeleteObj( Abc_Obj_t * pObj ) Vec_PtrRemove( pNtk->vCos, pObj ); break; case ABC_OBJ_NET: - case ABC_OBJ_GATE: break; case ABC_OBJ_NODE: if ( Abc_NtkHasBdd(pNtk) ) @@ -228,7 +226,7 @@ void Abc_NtkDeleteObj( Abc_Obj_t * pObj ) pObj->pData = NULL; break; case ABC_OBJ_LATCH: - case ABC_OBJ_TRI: + case ABC_OBJ_WHITEBOX: case ABC_OBJ_BLACKBOX: if ( pNtk->vBoxes ) Vec_PtrRemove( pNtk->vBoxes, pObj ); break; @@ -324,9 +322,15 @@ Abc_Obj_t * Abc_NtkDupObj( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pObj, int fCopyName if ( fCopyName ) { if ( Abc_ObjIsCi(pObj) ) - Abc_ObjAssignName( pObjNew, Abc_ObjName(Abc_ObjFanout0Ntk(pObj)), NULL ); + { + if ( !Abc_NtkIsNetlist(pNtkNew) ) + Abc_ObjAssignName( pObjNew, Abc_ObjName(Abc_ObjFanout0Ntk(pObj)), NULL ); + } else if ( Abc_ObjIsCo(pObj) ) - Abc_ObjAssignName( pObjNew, Abc_ObjName(Abc_ObjFanin0Ntk(pObj)), NULL ); + { + if ( !Abc_NtkIsNetlist(pNtkNew) ) + Abc_ObjAssignName( pObjNew, Abc_ObjName(Abc_ObjFanin0Ntk(pObj)), NULL ); + } else if ( Abc_ObjIsBox(pObj) || Abc_ObjIsNet(pObj) ) Abc_ObjAssignName( pObjNew, Abc_ObjName(pObj), NULL ); } diff --git a/src/base/abc/abcSop.c b/src/base/abc/abcSop.c index 4e9a65485..0836bb89f 100644 --- a/src/base/abc/abcSop.c +++ b/src/base/abc/abcSop.c @@ -840,6 +840,12 @@ char * Abc_SopFromTruthBin( char * pTruth ) if ( Digit == 1 ) Vec_IntPush( vMints, nTruthSize - 1 - i ); } + if ( Vec_IntSize( vMints ) == 0 || Vec_IntSize( vMints ) == nTruthSize ) + { + Vec_IntFree( vMints ); + printf( "Cannot create constant function.\n" ); + return NULL; + } // create the SOP representation of the minterms Length = Vec_IntSize(vMints) * (nVars + 3); diff --git a/src/base/abc/abcUtil.c b/src/base/abc/abcUtil.c index 3070e01a9..f5c5536a5 100644 --- a/src/base/abc/abcUtil.c +++ b/src/base/abc/abcUtil.c @@ -735,6 +735,12 @@ bool Abc_NtkLogicHasSimpleCos( Abc_Ntk_t * pNtk ) Abc_NtkIncrementTravId( pNtk ); Abc_NtkForEachCo( pNtk, pNode, i ) { +/* + if ( strcmp( Abc_ObjName(pNode), "g704" ) == 0 ) + { + int s = 1; + } +*/ // if the driver is complemented, this is an error pDriver = Abc_ObjFanin0(pNode); if ( Abc_ObjFaninC0(pNode) ) @@ -1564,6 +1570,31 @@ int Abc_NtkCrossCut( Abc_Ntk_t * pNtk ) } +/**Function************************************************************* + + Synopsis [Prints all 3-var functions.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Abc_NtkPrint256() +{ + FILE * pFile; + int i; + pFile = fopen( "4varfs.txt", "w" ); + for ( i = 1; i < (1<<16)-1; i++ ) + { + fprintf( pFile, "read_truth " ); + Extra_PrintBinary( pFile, &i, 16 ); + fprintf( pFile, "; clp; st; w 1.blif; map; cec 1.blif\n" ); + } + fclose( pFile ); +} + //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// diff --git a/src/base/abc/module.make b/src/base/abc/module.make index 113b1f085..5edf90001 100644 --- a/src/base/abc/module.make +++ b/src/base/abc/module.make @@ -3,6 +3,7 @@ SRC += src/base/abc/abcAig.c \ src/base/abc/abcDfs.c \ src/base/abc/abcFanio.c \ src/base/abc/abcFunc.c \ + src/base/abc/abcHie.c \ src/base/abc/abcLatch.c \ src/base/abc/abcLib.c \ src/base/abc/abcMinBase.c \ diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index f1ec7920e..30602af54 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -288,7 +288,8 @@ void Abc_Init( Abc_Frame_t * pAbc ) // Map_Var3Print(); // Map_Var4Test(); -} +// Abc_NtkPrint256(); +} /**Function************************************************************* diff --git a/src/base/abci/abcPrint.c b/src/base/abci/abcPrint.c index 177c269b6..59ce16747 100644 --- a/src/base/abci/abcPrint.c +++ b/src/base/abci/abcPrint.c @@ -896,14 +896,11 @@ void Abc_ObjPrint( FILE * pFile, Abc_Obj_t * pObj ) case ABC_OBJ_NODE: fprintf( pFile, "Node " ); break; - case ABC_OBJ_GATE: - fprintf( pFile, "Gate " ); - break; case ABC_OBJ_LATCH: fprintf( pFile, "Latch " ); break; - case ABC_OBJ_TRI: - fprintf( pFile, "Tristate" ); + case ABC_OBJ_WHITEBOX: + fprintf( pFile, "Whitebox" ); break; case ABC_OBJ_BLACKBOX: fprintf( pFile, "Blackbox" ); diff --git a/src/base/abci/abcStrash.c b/src/base/abci/abcStrash.c index b6aecef92..2ce80a8fa 100644 --- a/src/base/abci/abcStrash.c +++ b/src/base/abci/abcStrash.c @@ -218,7 +218,6 @@ int Abc_NtkAppend( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int fAddPos ) ***********************************************************************/ void Abc_NtkStrashPerform( Abc_Ntk_t * pNtkOld, Abc_Ntk_t * pNtkNew, bool fAllNodes ) { - extern Vec_Ptr_t * Abc_NtkDfsIter( Abc_Ntk_t * pNtk, int fCollectAll ); ProgressBar * pProgress; Vec_Ptr_t * vNodes; Abc_Obj_t * pNodeOld; diff --git a/src/base/cmd/cmd.c b/src/base/cmd/cmd.c index 6e470aa86..08584290c 100644 --- a/src/base/cmd/cmd.c +++ b/src/base/cmd/cmd.c @@ -1271,7 +1271,7 @@ int CmdCommandSis( Abc_Frame_t * pAbc, int argc, char **argv ) fprintf( pErr, "Cannot produce the intermediate network.\n" ); goto usage; } - Io_WriteBlifNetlist( pNetlist, "_sis_in.blif", 1 ); + Io_WriteBlif( pNetlist, "_sis_in.blif", 1 ); Abc_NtkDelete( pNetlist ); // create the file for sis @@ -1412,7 +1412,7 @@ int CmdCommandMvsis( Abc_Frame_t * pAbc, int argc, char **argv ) fprintf( pErr, "Cannot produce the intermediate network.\n" ); goto usage; } - Io_WriteBlifNetlist( pNetlist, "_mvsis_in.blif", 1 ); + Io_WriteBlif( pNetlist, "_mvsis_in.blif", 1 ); Abc_NtkDelete( pNetlist ); // create the file for MVSIS @@ -1558,7 +1558,7 @@ int CmdCommandCapo( Abc_Frame_t * pAbc, int argc, char **argv ) fprintf( pErr, "Cannot produce the intermediate network.\n" ); goto usage; } - Io_WriteBlifNetlist( pNetlist, "_capo_in.blif", 1 ); + Io_WriteBlif( pNetlist, "_capo_in.blif", 1 ); Abc_NtkDelete( pNetlist ); // create the file for Capo diff --git a/src/base/io/io.c b/src/base/io/io.c index 8d5b8ad6f..644511187 100644 --- a/src/base/io/io.c +++ b/src/base/io/io.c @@ -40,6 +40,7 @@ static int IoCommandReadVer ( Abc_Frame_t * pAbc, int argc, char **argv ); static int IoCommandReadVerLib ( Abc_Frame_t * pAbc, int argc, char **argv ); static int IoCommandWrite ( Abc_Frame_t * pAbc, int argc, char **argv ); +static int IoCommandWriteHie ( Abc_Frame_t * pAbc, int argc, char **argv ); static int IoCommandWriteAiger ( Abc_Frame_t * pAbc, int argc, char **argv ); static int IoCommandWriteBaf ( Abc_Frame_t * pAbc, int argc, char **argv ); static int IoCommandWriteBlif ( Abc_Frame_t * pAbc, int argc, char **argv ); @@ -75,7 +76,7 @@ extern Abc_Lib_t * Ver_ParseFile( char * pFileName, Abc_Lib_t * pGateLib, int fC void Io_Init( Abc_Frame_t * pAbc ) { Cmd_CommandAdd( pAbc, "I/O", "read", IoCommandRead, 1 ); - Cmd_CommandAdd( pAbc, "I/O", "rh", IoCommandReadHie, 1 ); + Cmd_CommandAdd( pAbc, "I/O", "read_hie", IoCommandReadHie, 1 ); Cmd_CommandAdd( pAbc, "I/O", "read_aiger", IoCommandReadAiger, 1 ); Cmd_CommandAdd( pAbc, "I/O", "read_baf", IoCommandReadBaf, 1 ); Cmd_CommandAdd( pAbc, "I/O", "read_blif", IoCommandReadBlif, 1 ); @@ -89,6 +90,7 @@ void Io_Init( Abc_Frame_t * pAbc ) // Cmd_CommandAdd( pAbc, "I/O", "read_verlib", IoCommandReadVerLib, 0 ); Cmd_CommandAdd( pAbc, "I/O", "write", IoCommandWrite, 0 ); + Cmd_CommandAdd( pAbc, "I/O", "write_hie", IoCommandWriteHie, 0 ); Cmd_CommandAdd( pAbc, "I/O", "write_aiger", IoCommandWriteAiger, 0 ); Cmd_CommandAdd( pAbc, "I/O", "write_baf", IoCommandWriteBaf, 0 ); Cmd_CommandAdd( pAbc, "I/O", "write_blif", IoCommandWriteBlif, 0 ); @@ -169,6 +171,7 @@ usage: fprintf( pAbc->Err, "usage: read [-ch]Build Log
----------------------Configuration: abctestlib - Win32 Debug-------------------- -
-Command Lines
-Creating temporary file "C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP1389.tmp" with contents -[ -/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR"Debug/" /Fp"Debug/abctestlib.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c -"C:\_projects\abc\demo.c" -] -Creating command line "cl.exe @C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP1389.tmp" -Creating temporary file "C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP138A.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 C:\_projects\abc\abclib\abclib_debug.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/abctestlib.pdb" /debug /machine:I386 /out:"_TEST/abctestlib.exe" /pdbtype:sept -.\Debug\demo.obj -] -Creating command line "link.exe @C:\DOCUME~1\alanmi\LOCALS~1\Temp\RSP138A.tmp" -Output Window
-Compiling... -demo.c -Linking... -Creating command line "bscmake.exe /nologo /o"Debug/abctestlib.bsc" .\Debug\demo.sbr" -Creating browse info file... -Output Window
- - - -Results
-abctestlib.exe - 0 error(s), 0 warning(s) -