diff options
Diffstat (limited to 'src/base/abci')
60 files changed, 0 insertions, 44334 deletions
diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c deleted file mode 100644 index 18fbad38..00000000 --- a/src/base/abci/abc.c +++ /dev/null @@ -1,12764 +0,0 @@ -/**CFile**************************************************************** - - FileName [abc.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Command file.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abc.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "mainInt.h" -#include "fraig.h" -#include "fxu.h" -#include "cut.h" -#include "fpga.h" -#include "if.h" -#include "res.h" -#include "lpk.h" -#include "aig.h" -#include "dar.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static int Abc_CommandPrintStats ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintExdc ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintIo ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintLatch ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintFanio ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintMffc ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintFactor ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintLevel ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintSupport ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintSymms ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintUnate ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintAuto ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintKMap ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintGates ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintSharing ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintXCut ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPrintDsd ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandShow ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandShowBdd ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandShowCut ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandCollapse ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandStrash ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandBalance ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandMulti ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandRenode ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandCleanup ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandSweep ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandFastExtract ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandDisjoint ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandImfs ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandLutpack ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandRewrite ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandRefactor ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandRestructure ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandResubstitute ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandRr ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandCascade ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandLogic ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandComb ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandMiter ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandDemiter ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandOrPos ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandAndPos ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandAppend ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandFrames ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandSop ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandBdd ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandAig ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandReorder ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandOrder ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandMuxes ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandExtSeqDcs ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandCone ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandNode ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandTopmost ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandTrim ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandShortNames ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandExdcFree ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandExdcGet ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandExdcSet ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandCut ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandEspresso ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandGen ( Abc_Frame_t * pAbc, int argc, char ** argv ); -//static int Abc_CommandXyz ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandDouble ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandTest ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandQuaVar ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandQuaRel ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandQuaReach ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandIStrash ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandICut ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandIRewrite ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandDRewrite ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandDRefactor ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandDCompress2 ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandDChoice ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandDrwsat ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandIRewriteSeq ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandIResyn ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandISat ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandIFraig ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandDFraig ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandCSweep ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandIProve ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandDProve ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandHaig ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandMini ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandBmc ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandQbf ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandFraig ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandFraigTrust ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandFraigStore ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandFraigRestore ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandFraigClean ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandFraigSweep ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandFraigDress ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandHaigStart ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandHaigStop ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandHaigUse ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandRecStart ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandRecStop ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandRecAdd ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandRecPs ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandRecUse ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandMap ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandUnmap ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandAttach ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandSuperChoice ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandSuperChoiceLut ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandFpga ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandFpgaFast ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandIf ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandScut ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandInit ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandZero ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandUndc ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandPipe ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandSeq ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandUnseq ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandRetime ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandSeqFpga ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandSeqMap ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandSeqSweep ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandLcorr ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandSeqCleanup ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandCycle ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandXsim ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandCec ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandSec ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandDSec ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandSat ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandDSat ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandProve ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandDebug ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -static int Abc_CommandTraceStart ( Abc_Frame_t * pAbc, int argc, char ** argv ); -static int Abc_CommandTraceCheck ( Abc_Frame_t * pAbc, int argc, char ** argv ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_Init( Abc_Frame_t * pAbc ) -{ -// Abc_NtkBddImplicationTest(); - - Cmd_CommandAdd( pAbc, "Printing", "print_stats", Abc_CommandPrintStats, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_exdc", Abc_CommandPrintExdc, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_io", Abc_CommandPrintIo, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_latch", Abc_CommandPrintLatch, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_fanio", Abc_CommandPrintFanio, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_mffc", Abc_CommandPrintMffc, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_factor", Abc_CommandPrintFactor, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_level", Abc_CommandPrintLevel, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_supp", Abc_CommandPrintSupport, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_symm", Abc_CommandPrintSymms, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_unate", Abc_CommandPrintUnate, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_auto", Abc_CommandPrintAuto, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_kmap", Abc_CommandPrintKMap, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_gates", Abc_CommandPrintGates, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_sharing", Abc_CommandPrintSharing, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_xcut", Abc_CommandPrintXCut, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "print_dsd", Abc_CommandPrintDsd, 0 ); - - Cmd_CommandAdd( pAbc, "Printing", "show", Abc_CommandShow, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "show_bdd", Abc_CommandShowBdd, 0 ); - Cmd_CommandAdd( pAbc, "Printing", "show_cut", Abc_CommandShowCut, 0 ); - - Cmd_CommandAdd( pAbc, "Synthesis", "collapse", Abc_CommandCollapse, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "strash", Abc_CommandStrash, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "balance", Abc_CommandBalance, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "multi", Abc_CommandMulti, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "renode", Abc_CommandRenode, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "cleanup", Abc_CommandCleanup, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "sweep", Abc_CommandSweep, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "fx", Abc_CommandFastExtract, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "dsd", Abc_CommandDisjoint, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "imfs", Abc_CommandImfs, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "lutpack", Abc_CommandLutpack, 1 ); - - Cmd_CommandAdd( pAbc, "Synthesis", "rewrite", Abc_CommandRewrite, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "refactor", Abc_CommandRefactor, 1 ); -// Cmd_CommandAdd( pAbc, "Synthesis", "restructure", Abc_CommandRestructure, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "resub", Abc_CommandResubstitute, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "rr", Abc_CommandRr, 1 ); - Cmd_CommandAdd( pAbc, "Synthesis", "cascade", Abc_CommandCascade, 1 ); - - Cmd_CommandAdd( pAbc, "Various", "logic", Abc_CommandLogic, 1 ); - Cmd_CommandAdd( pAbc, "Various", "comb", Abc_CommandComb, 1 ); - Cmd_CommandAdd( pAbc, "Various", "miter", Abc_CommandMiter, 1 ); - Cmd_CommandAdd( pAbc, "Various", "demiter", Abc_CommandDemiter, 1 ); - Cmd_CommandAdd( pAbc, "Various", "orpos", Abc_CommandOrPos, 1 ); - Cmd_CommandAdd( pAbc, "Various", "andpos", Abc_CommandAndPos, 1 ); - Cmd_CommandAdd( pAbc, "Various", "append", Abc_CommandAppend, 1 ); - Cmd_CommandAdd( pAbc, "Various", "frames", Abc_CommandFrames, 1 ); - Cmd_CommandAdd( pAbc, "Various", "sop", Abc_CommandSop, 0 ); - Cmd_CommandAdd( pAbc, "Various", "bdd", Abc_CommandBdd, 0 ); - Cmd_CommandAdd( pAbc, "Various", "aig", Abc_CommandAig, 0 ); - Cmd_CommandAdd( pAbc, "Various", "reorder", Abc_CommandReorder, 0 ); - Cmd_CommandAdd( pAbc, "Various", "order", Abc_CommandOrder, 0 ); - Cmd_CommandAdd( pAbc, "Various", "muxes", Abc_CommandMuxes, 1 ); - Cmd_CommandAdd( pAbc, "Various", "ext_seq_dcs", Abc_CommandExtSeqDcs, 0 ); - Cmd_CommandAdd( pAbc, "Various", "cone", Abc_CommandCone, 1 ); - Cmd_CommandAdd( pAbc, "Various", "node", Abc_CommandNode, 1 ); - Cmd_CommandAdd( pAbc, "Various", "topmost", Abc_CommandTopmost, 1 ); - Cmd_CommandAdd( pAbc, "Various", "trim", Abc_CommandTrim, 1 ); - Cmd_CommandAdd( pAbc, "Various", "short_names", Abc_CommandShortNames, 0 ); - Cmd_CommandAdd( pAbc, "Various", "exdc_free", Abc_CommandExdcFree, 1 ); - Cmd_CommandAdd( pAbc, "Various", "exdc_get", Abc_CommandExdcGet, 1 ); - Cmd_CommandAdd( pAbc, "Various", "exdc_set", Abc_CommandExdcSet, 1 ); - Cmd_CommandAdd( pAbc, "Various", "cut", Abc_CommandCut, 0 ); - Cmd_CommandAdd( pAbc, "Various", "espresso", Abc_CommandEspresso, 1 ); - Cmd_CommandAdd( pAbc, "Various", "gen", Abc_CommandGen, 0 ); -// Cmd_CommandAdd( pAbc, "Various", "xyz", Abc_CommandXyz, 1 ); - Cmd_CommandAdd( pAbc, "Various", "double", Abc_CommandDouble, 1 ); - Cmd_CommandAdd( pAbc, "Various", "test", Abc_CommandTest, 0 ); - - Cmd_CommandAdd( pAbc, "Various", "qvar", Abc_CommandQuaVar, 1 ); - Cmd_CommandAdd( pAbc, "Various", "qrel", Abc_CommandQuaRel, 1 ); - Cmd_CommandAdd( pAbc, "Various", "qreach", Abc_CommandQuaReach, 1 ); - - Cmd_CommandAdd( pAbc, "New AIG", "istrash", Abc_CommandIStrash, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "icut", Abc_CommandICut, 0 ); - Cmd_CommandAdd( pAbc, "New AIG", "irw", Abc_CommandIRewrite, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "drw", Abc_CommandDRewrite, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "drf", Abc_CommandDRefactor, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "dcompress2", Abc_CommandDCompress2, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "dchoice", Abc_CommandDChoice, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "drwsat", Abc_CommandDrwsat, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "irws", Abc_CommandIRewriteSeq, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "iresyn", Abc_CommandIResyn, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "isat", Abc_CommandISat, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "ifraig", Abc_CommandIFraig, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "dfraig", Abc_CommandDFraig, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "csweep", Abc_CommandCSweep, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "iprove", Abc_CommandIProve, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "haig", Abc_CommandHaig, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "mini", Abc_CommandMini, 1 ); - Cmd_CommandAdd( pAbc, "New AIG", "_bmc", Abc_CommandBmc, 0 ); - Cmd_CommandAdd( pAbc, "New AIG", "qbf", Abc_CommandQbf, 0 ); - - Cmd_CommandAdd( pAbc, "Fraiging", "fraig", Abc_CommandFraig, 1 ); - Cmd_CommandAdd( pAbc, "Fraiging", "fraig_trust", Abc_CommandFraigTrust, 1 ); - Cmd_CommandAdd( pAbc, "Fraiging", "fraig_store", Abc_CommandFraigStore, 0 ); - Cmd_CommandAdd( pAbc, "Fraiging", "fraig_restore", Abc_CommandFraigRestore, 1 ); - Cmd_CommandAdd( pAbc, "Fraiging", "fraig_clean", Abc_CommandFraigClean, 0 ); - Cmd_CommandAdd( pAbc, "Fraiging", "fraig_sweep", Abc_CommandFraigSweep, 1 ); - Cmd_CommandAdd( pAbc, "Fraiging", "dress", Abc_CommandFraigDress, 1 ); - - Cmd_CommandAdd( pAbc, "Choicing", "haig_start", Abc_CommandHaigStart, 0 ); - Cmd_CommandAdd( pAbc, "Choicing", "haig_stop", Abc_CommandHaigStop, 0 ); - Cmd_CommandAdd( pAbc, "Choicing", "haig_use", Abc_CommandHaigUse, 1 ); - - Cmd_CommandAdd( pAbc, "Choicing", "rec_start", Abc_CommandRecStart, 0 ); - Cmd_CommandAdd( pAbc, "Choicing", "rec_stop", Abc_CommandRecStop, 0 ); - Cmd_CommandAdd( pAbc, "Choicing", "rec_add", Abc_CommandRecAdd, 0 ); - Cmd_CommandAdd( pAbc, "Choicing", "rec_ps", Abc_CommandRecPs, 0 ); - Cmd_CommandAdd( pAbc, "Choicing", "rec_use", Abc_CommandRecUse, 1 ); - - Cmd_CommandAdd( pAbc, "SC mapping", "map", Abc_CommandMap, 1 ); - Cmd_CommandAdd( pAbc, "SC mapping", "unmap", Abc_CommandUnmap, 1 ); - Cmd_CommandAdd( pAbc, "SC mapping", "attach", Abc_CommandAttach, 1 ); - Cmd_CommandAdd( pAbc, "SC mapping", "sc", Abc_CommandSuperChoice, 1 ); - Cmd_CommandAdd( pAbc, "SC mapping", "scl", Abc_CommandSuperChoiceLut, 1 ); - - Cmd_CommandAdd( pAbc, "FPGA mapping", "fpga", Abc_CommandFpga, 1 ); - Cmd_CommandAdd( pAbc, "FPGA mapping", "ffpga", Abc_CommandFpgaFast, 1 ); - Cmd_CommandAdd( pAbc, "FPGA mapping", "if", Abc_CommandIf, 1 ); - -// Cmd_CommandAdd( pAbc, "Sequential", "scut", Abc_CommandScut, 0 ); - Cmd_CommandAdd( pAbc, "Sequential", "init", Abc_CommandInit, 1 ); - Cmd_CommandAdd( pAbc, "Sequential", "zero", Abc_CommandZero, 1 ); - Cmd_CommandAdd( pAbc, "Sequential", "undc", Abc_CommandUndc, 1 ); -// Cmd_CommandAdd( pAbc, "Sequential", "pipe", Abc_CommandPipe, 1 ); - Cmd_CommandAdd( pAbc, "Sequential", "retime", Abc_CommandRetime, 1 ); -// Cmd_CommandAdd( pAbc, "Sequential", "sfpga", Abc_CommandSeqFpga, 1 ); -// Cmd_CommandAdd( pAbc, "Sequential", "smap", Abc_CommandSeqMap, 1 ); - Cmd_CommandAdd( pAbc, "Sequential", "ssweep", Abc_CommandSeqSweep, 1 ); - Cmd_CommandAdd( pAbc, "Sequential", "lcorr", Abc_CommandLcorr, 1 ); - Cmd_CommandAdd( pAbc, "Sequential", "scleanup", Abc_CommandSeqCleanup, 1 ); - Cmd_CommandAdd( pAbc, "Sequential", "cycle", Abc_CommandCycle, 1 ); - Cmd_CommandAdd( pAbc, "Sequential", "xsim", Abc_CommandXsim, 0 ); - - Cmd_CommandAdd( pAbc, "Verification", "cec", Abc_CommandCec, 0 ); - Cmd_CommandAdd( pAbc, "Verification", "sec", Abc_CommandSec, 0 ); - Cmd_CommandAdd( pAbc, "Verification", "dsec", Abc_CommandDSec, 0 ); - Cmd_CommandAdd( pAbc, "Verification", "dprove", Abc_CommandDProve, 0 ); - Cmd_CommandAdd( pAbc, "Verification", "sat", Abc_CommandSat, 0 ); - Cmd_CommandAdd( pAbc, "Verification", "dsat", Abc_CommandDSat, 0 ); - Cmd_CommandAdd( pAbc, "Verification", "prove", Abc_CommandProve, 1 ); - Cmd_CommandAdd( pAbc, "Verification", "debug", Abc_CommandDebug, 0 ); - -// Cmd_CommandAdd( pAbc, "Verification", "trace_start", Abc_CommandTraceStart, 0 ); -// Cmd_CommandAdd( pAbc, "Verification", "trace_check", Abc_CommandTraceCheck, 0 ); - -// Rwt_Man4ExploreStart(); -// Map_Var3Print(); -// Map_Var4Test(); - -// Abc_NtkPrint256(); -// Kit_TruthCountMintermsPrecomp(); -// Kit_DsdPrecompute4Vars(); - - { - extern void Dar_LibStart(); - Dar_LibStart(); - } -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_End() -{ -// Dar_LibDumpPriorities(); - - { - extern void Cnf_ClearMemory(); - Cnf_ClearMemory(); - } - { - extern void Dar_LibStop(); - Dar_LibStop(); - } - - Abc_NtkFraigStoreClean(); -// Rwt_Man4ExplorePrint(); - -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintStats( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - bool fShort; - int c; - int fFactor; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set the defaults - fShort = 1; - fFactor = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "sfh" ) ) != EOF ) - { - switch ( c ) - { - case 's': - fShort ^= 1; - break; - case 'f': - fFactor ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( Abc_FrameReadErr(pAbc), "Empty network.\n" ); - return 1; - } - Abc_NtkPrintStats( pOut, pNtk, fFactor ); - return 0; - -usage: - fprintf( pErr, "usage: print_stats [-fh]\n" ); - fprintf( pErr, "\t prints the network statistics\n" ); - fprintf( pErr, "\t-f : toggles printing the literal count in the factored forms [default = %s]\n", fFactor? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintExdc( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkTemp; - double Percentage; - bool fShort; - int c; - int fPrintDc; - - extern double Abc_NtkSpacePercentage( Abc_Obj_t * pNode ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set the defaults - fShort = 1; - fPrintDc = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "sdh" ) ) != EOF ) - { - switch ( c ) - { - case 's': - fShort ^= 1; - break; - case 'd': - fPrintDc ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( Abc_FrameReadErr(pAbc), "Empty network.\n" ); - return 1; - } - if ( pNtk->pExdc == NULL ) - { - fprintf( Abc_FrameReadErr(pAbc), "Network has no EXDC.\n" ); - return 1; - } - - if ( fPrintDc ) - { - if ( !Abc_NtkIsStrash(pNtk->pExdc) ) - { - pNtkTemp = Abc_NtkStrash(pNtk->pExdc, 0, 0, 0); - Percentage = Abc_NtkSpacePercentage( Abc_ObjChild0( Abc_NtkPo(pNtkTemp, 0) ) ); - Abc_NtkDelete( pNtkTemp ); - } - else - Percentage = Abc_NtkSpacePercentage( Abc_ObjChild0( Abc_NtkPo(pNtk->pExdc, 0) ) ); - - printf( "EXDC network statistics: " ); - printf( "(" ); - if ( Percentage > 0.05 && Percentage < 99.95 ) - printf( "%.2f", Percentage ); - else if ( Percentage > 0.000005 && Percentage < 99.999995 ) - printf( "%.6f", Percentage ); - else - printf( "%f", Percentage ); - printf( " %% don't-cares)\n" ); - } - else - printf( "EXDC network statistics: \n" ); - Abc_NtkPrintStats( pOut, pNtk->pExdc, 0 ); - return 0; - -usage: - fprintf( pErr, "usage: print_exdc [-dh]\n" ); - fprintf( pErr, "\t prints the EXDC network statistics\n" ); - fprintf( pErr, "\t-d : toggles printing don't-care percentage [default = %s]\n", fPrintDc? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintIo( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - Abc_Obj_t * pNode; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( argc > globalUtilOptind + 1 ) - { - fprintf( pErr, "Wrong number of auguments.\n" ); - goto usage; - } - - if ( argc == globalUtilOptind + 1 ) - { - pNode = Abc_NtkFindNode( pNtk, argv[globalUtilOptind] ); - if ( pNode == NULL ) - { - fprintf( pErr, "Cannot find node \"%s\".\n", argv[globalUtilOptind] ); - return 1; - } - Abc_NodePrintFanio( pOut, pNode ); - return 0; - } - // print the nodes - Abc_NtkPrintIo( pOut, pNtk ); - return 0; - -usage: - fprintf( pErr, "usage: print_io [-h] <node>\n" ); - fprintf( pErr, "\t prints the PIs/POs or fanins/fanouts of a node\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\tnode : the node to print fanins/fanouts\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintLatch( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - // print the nodes - Abc_NtkPrintLatch( pOut, pNtk ); - return 0; - -usage: - fprintf( pErr, "usage: print_latch [-h]\n" ); - fprintf( pErr, "\t prints information about latches\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintFanio( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - // print the nodes - Abc_NtkPrintFanio( pOut, pNtk ); - return 0; - -usage: - fprintf( pErr, "usage: print_fanio [-h]\n" ); - fprintf( pErr, "\t prints the statistics about fanins/fanouts of all nodes\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintMffc( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - extern void Abc_NtkPrintMffc( FILE * pFile, Abc_Ntk_t * pNtk ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - // print the nodes - Abc_NtkPrintMffc( pOut, pNtk ); - return 0; - -usage: - fprintf( pErr, "usage: print_mffc [-h]\n" ); - fprintf( pErr, "\t prints the MFFC of each node in the network\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintFactor( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - Abc_Obj_t * pNode; - int c; - int fUseRealNames; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fUseRealNames = 1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "nh" ) ) != EOF ) - { - switch ( c ) - { - case 'n': - fUseRealNames ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsSopLogic(pNtk) ) - { - fprintf( pErr, "Printing factored forms can be done for SOP networks.\n" ); - return 1; - } - - if ( argc > globalUtilOptind + 1 ) - { - fprintf( pErr, "Wrong number of auguments.\n" ); - goto usage; - } - - if ( argc == globalUtilOptind + 1 ) - { - pNode = Abc_NtkFindNode( pNtk, argv[globalUtilOptind] ); - if ( pNode == NULL ) - { - fprintf( pErr, "Cannot find node \"%s\".\n", argv[globalUtilOptind] ); - return 1; - } - Abc_NodePrintFactor( pOut, pNode, fUseRealNames ); - return 0; - } - // print the nodes - Abc_NtkPrintFactor( pOut, pNtk, fUseRealNames ); - return 0; - -usage: - fprintf( pErr, "usage: print_factor [-nh] <node>\n" ); - fprintf( pErr, "\t prints the factored forms of nodes\n" ); - fprintf( pErr, "\t-n : toggles real/dummy fanin names [default = %s]\n", fUseRealNames? "real": "dummy" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\tnode : (optional) one node to consider\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintLevel( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - Abc_Obj_t * pNode; - int c; - int fListNodes; - int fProfile; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fListNodes = 0; - fProfile = 1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "nph" ) ) != EOF ) - { - switch ( c ) - { - case 'n': - fListNodes ^= 1; - break; - case 'p': - fProfile ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !fProfile && !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for AIGs (run \"strash\").\n" ); - return 1; - } - - if ( argc > globalUtilOptind + 1 ) - { - fprintf( pErr, "Wrong number of auguments.\n" ); - goto usage; - } - - if ( argc == globalUtilOptind + 1 ) - { - pNode = Abc_NtkFindNode( pNtk, argv[globalUtilOptind] ); - if ( pNode == NULL ) - { - fprintf( pErr, "Cannot find node \"%s\".\n", argv[globalUtilOptind] ); - return 1; - } - Abc_NodePrintLevel( pOut, pNode ); - return 0; - } - // process all COs - Abc_NtkPrintLevel( pOut, pNtk, fProfile, fListNodes ); - return 0; - -usage: - fprintf( pErr, "usage: print_level [-nph] <node>\n" ); - fprintf( pErr, "\t prints information about node level and cone size\n" ); - fprintf( pErr, "\t-n : toggles printing nodes by levels [default = %s]\n", fListNodes? "yes": "no" ); - fprintf( pErr, "\t-p : toggles printing level profile [default = %s]\n", fProfile? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\tnode : (optional) one node to consider\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintSupport( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - Vec_Ptr_t * vSuppFun; - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fStruct; - int fVerbose; - extern Vec_Ptr_t * Sim_ComputeFunSupp( Abc_Ntk_t * pNtk, int fVerbose ); - extern void Abc_NtkPrintStrSupports( Abc_Ntk_t * pNtk ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fStruct = 1; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "svh" ) ) != EOF ) - { - switch ( c ) - { - case 's': - fStruct ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - // print support information - if ( fStruct ) - { - Abc_NtkPrintStrSupports( pNtk ); - return 0; - } - - if ( !Abc_NtkIsComb(pNtk) ) - { - fprintf( pErr, "This command works only for combinational networks (run \"comb\").\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for AIGs (run \"strash\").\n" ); - return 1; - } - vSuppFun = Sim_ComputeFunSupp( pNtk, fVerbose ); - free( vSuppFun->pArray[0] ); - Vec_PtrFree( vSuppFun ); - return 0; - -usage: - fprintf( pErr, "usage: print_supp [-svh]\n" ); - fprintf( pErr, "\t prints the supports of the CO nodes\n" ); - fprintf( pErr, "\t-s : toggle printing structural support only [default = %s].\n", fStruct? "yes": "no" ); - fprintf( pErr, "\t-v : enable verbose output [default = %s].\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintSymms( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fUseBdds; - int fNaive; - int fReorder; - int fVerbose; - extern void Abc_NtkSymmetries( Abc_Ntk_t * pNtk, int fUseBdds, int fNaive, int fReorder, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fUseBdds = 0; - fNaive = 0; - fReorder = 1; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "bnrvh" ) ) != EOF ) - { - switch ( c ) - { - case 'b': - fUseBdds ^= 1; - break; - case 'n': - fNaive ^= 1; - break; - case 'r': - fReorder ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsComb(pNtk) ) - { - fprintf( pErr, "This command works only for combinational networks (run \"comb\").\n" ); - return 1; - } - if ( Abc_NtkIsStrash(pNtk) ) - Abc_NtkSymmetries( pNtk, fUseBdds, fNaive, fReorder, fVerbose ); - else - { - pNtk = Abc_NtkStrash( pNtk, 0, 0, 0 ); - Abc_NtkSymmetries( pNtk, fUseBdds, fNaive, fReorder, fVerbose ); - Abc_NtkDelete( pNtk ); - } - return 0; - -usage: - fprintf( pErr, "usage: print_symm [-bnrvh]\n" ); - fprintf( pErr, "\t computes symmetries of the PO functions\n" ); - fprintf( pErr, "\t-b : toggle BDD-based or SAT-based computations [default = %s].\n", fUseBdds? "BDD": "SAT" ); - fprintf( pErr, "\t-n : enable naive BDD-based computation [default = %s].\n", fNaive? "yes": "no" ); - fprintf( pErr, "\t-r : enable dynamic BDD variable reordering [default = %s].\n", fReorder? "yes": "no" ); - fprintf( pErr, "\t-v : enable verbose output [default = %s].\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintUnate( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fUseBdds; - int fUseNaive; - int fVerbose; - extern void Abc_NtkPrintUnate( Abc_Ntk_t * pNtk, int fUseBdds, int fUseNaive, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fUseBdds = 1; - fUseNaive = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "bnvh" ) ) != EOF ) - { - switch ( c ) - { - case 'b': - fUseBdds ^= 1; - break; - case 'n': - fUseNaive ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for AIGs (run \"strash\").\n" ); - return 1; - } - Abc_NtkPrintUnate( pNtk, fUseBdds, fUseNaive, fVerbose ); - return 0; - -usage: - fprintf( pErr, "usage: print_unate [-bnvh]\n" ); - fprintf( pErr, "\t computes unate variables of the PO functions\n" ); - fprintf( pErr, "\t-b : toggle BDD-based or SAT-based computations [default = %s].\n", fUseBdds? "BDD": "SAT" ); - fprintf( pErr, "\t-n : toggle naive BDD-based computation [default = %s].\n", fUseNaive? "yes": "no" ); - fprintf( pErr, "\t-v : enable verbose output [default = %s].\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintAuto( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int Output; - int fNaive; - int fVerbose; - extern void Abc_NtkAutoPrint( Abc_Ntk_t * pNtk, int Output, int fNaive, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Output = -1; - fNaive = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Onvh" ) ) != EOF ) - { - switch ( c ) - { - case 'O': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-O\" should be followed by an integer.\n" ); - goto usage; - } - Output = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( Output < 0 ) - goto usage; - break; - case 'n': - fNaive ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for AIGs (run \"strash\").\n" ); - return 1; - } - - - Abc_NtkAutoPrint( pNtk, Output, fNaive, fVerbose ); - return 0; - -usage: - fprintf( pErr, "usage: print_auto [-O num] [-nvh]\n" ); - fprintf( pErr, "\t computes autosymmetries of the PO functions\n" ); - fprintf( pErr, "\t-O num : (optional) the 0-based number of the output [default = all]\n"); - fprintf( pErr, "\t-n : enable naive BDD-based computation [default = %s].\n", fNaive? "yes": "no" ); - fprintf( pErr, "\t-v : enable verbose output [default = %s].\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintKMap( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - Abc_Obj_t * pNode; - int c; - int fUseRealNames; - - extern void Abc_NodePrintKMap( Abc_Obj_t * pNode, int fUseRealNames ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fUseRealNames = 1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "nh" ) ) != EOF ) - { - switch ( c ) - { - case 'n': - fUseRealNames ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "Visualization of Karnaugh maps works for logic networks.\n" ); - return 1; - } - if ( argc > globalUtilOptind + 1 ) - { - fprintf( pErr, "Wrong number of auguments.\n" ); - goto usage; - } - if ( argc == globalUtilOptind ) - { - pNode = Abc_ObjFanin0( Abc_NtkPo(pNtk, 0) ); - if ( !Abc_ObjIsNode(pNode) ) - { - fprintf( pErr, "The driver \"%s\" of the first PO is not an internal node.\n", Abc_ObjName(pNode) ); - return 1; - } - } - else - { - pNode = Abc_NtkFindNode( pNtk, argv[globalUtilOptind] ); - if ( pNode == NULL ) - { - fprintf( pErr, "Cannot find node \"%s\".\n", argv[globalUtilOptind] ); - return 1; - } - } - Abc_NtkToBdd(pNtk); - Abc_NodePrintKMap( pNode, fUseRealNames ); - return 0; - -usage: - fprintf( pErr, "usage: print_kmap [-nh] <node>\n" ); - fprintf( pErr, " shows the truth table of the node\n" ); - fprintf( pErr, "\t-n : toggles real/dummy fanin names [default = %s]\n", fUseRealNames? "real": "dummy" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\tnode : the node to consider (default = the driver of the first PO)\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintGates( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fUseLibrary; - - extern void Abc_NtkPrintGates( Abc_Ntk_t * pNtk, int fUseLibrary ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fUseLibrary = 1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "lh" ) ) != EOF ) - { - switch ( c ) - { - case 'l': - fUseLibrary ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkHasAig(pNtk) ) - { - fprintf( pErr, "Printing gates does not work for AIGs and sequential AIGs.\n" ); - return 1; - } - - Abc_NtkPrintGates( pNtk, fUseLibrary ); - return 0; - -usage: - fprintf( pErr, "usage: print_gates [-lh]\n" ); - fprintf( pErr, "\t prints statistics about gates used in the network\n" ); - fprintf( pErr, "\t-l : used library gate names (if mapped) [default = %s]\n", fUseLibrary? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintSharing( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fUseLibrary; - - extern void Abc_NtkPrintSharing( Abc_Ntk_t * pNtk ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fUseLibrary = 1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "lh" ) ) != EOF ) - { - switch ( c ) - { - case 'l': - fUseLibrary ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - Abc_NtkPrintSharing( pNtk ); - return 0; - -usage: - fprintf( pErr, "usage: print_sharing [-h]\n" ); - fprintf( pErr, "\t prints the number of shared nodes in the TFI cones of the COs\n" ); -// fprintf( pErr, "\t-l : used library gate names (if mapped) [default = %s]\n", fUseLibrary? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintXCut( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fUseLibrary; - - extern int Abc_NtkCrossCut( Abc_Ntk_t * pNtk ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fUseLibrary = 1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "lh" ) ) != EOF ) - { - switch ( c ) - { - case 'l': - fUseLibrary ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - Abc_NtkCrossCut( pNtk ); - return 0; - -usage: - fprintf( pErr, "usage: print_xcut [-h]\n" ); - fprintf( pErr, "\t prints the size of the cross cut of the current network\n" ); -// fprintf( pErr, "\t-l : used library gate names (if mapped) [default = %s]\n", fUseLibrary? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPrintDsd( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fCofactor; - int nCofLevel; - - extern void Kit_DsdTest( unsigned * pTruth, int nVars ); - extern void Kit_DsdPrintCofactors( unsigned * pTruth, int nVars, int nCofLevel, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nCofLevel = 1; - fCofactor = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Nch" ) ) != EOF ) - { - switch ( c ) - { - case 'N': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by an integer.\n" ); - goto usage; - } - nCofLevel = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nCofLevel < 0 ) - goto usage; - break; - case 'c': - fCofactor ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - // get the truth table of the first output - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "Currently works only for logic networks.\n" ); - return 1; - } - Abc_NtkToAig( pNtk ); - // convert it to truth table - { - Abc_Obj_t * pObj = Abc_ObjFanin0( Abc_NtkPo(pNtk, 0) ); - Vec_Int_t * vMemory = Vec_IntAlloc(0); - unsigned * pTruth; - if ( !Abc_ObjIsNode(pObj) ) - { - fprintf( pErr, "The fanin of the first PO node does not have a logic function.\n" ); - return 1; - } - if ( Abc_ObjFaninNum(pObj) > 16 ) - { - fprintf( pErr, "Currently works only for up to 16 inputs.\n" ); - return 1; - } - pTruth = Abc_ConvertAigToTruth( pNtk->pManFunc, Hop_Regular(pObj->pData), Abc_ObjFaninNum(pObj), vMemory, 0 ); - if ( Hop_IsComplement(pObj->pData) ) - Extra_TruthNot( pTruth, pTruth, Abc_ObjFaninNum(pObj) ); - Extra_PrintBinary( stdout, pTruth, 1 << Abc_ObjFaninNum(pObj) ); - printf( "\n" ); - if ( fCofactor ) - Kit_DsdPrintCofactors( pTruth, Abc_ObjFaninNum(pObj), nCofLevel, 1 ); - else - Kit_DsdTest( pTruth, Abc_ObjFaninNum(pObj) ); - Vec_IntFree( vMemory ); - } - return 0; - -usage: - fprintf( pErr, "usage: print_dsd [-ch] [-N num]\n" ); - fprintf( pErr, "\t print DSD formula for a single-output function with less than 16 variables\n" ); - fprintf( pErr, "\t-c : toggle recursive cofactoring [default = %s]\n", fCofactor? "yes": "no" ); - fprintf( pErr, "\t-N num : the number of levels to cofactor [default = %d]\n", nCofLevel ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandShow( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fSeq; - int fGateNames; - int fUseReverse; - extern void Abc_NtkShow( Abc_Ntk_t * pNtk, int fGateNames, int fSeq, int fUseReverse ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fSeq = 0; - fGateNames = 0; - fUseReverse = 1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "rsgh" ) ) != EOF ) - { - switch ( c ) - { - case 'r': - fUseReverse ^= 1; - break; - case 's': - fSeq ^= 1; - break; - case 'g': - fGateNames ^= 1; - break; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - Abc_NtkShow( pNtk, fGateNames, fSeq, fUseReverse ); - return 0; - -usage: - fprintf( pErr, "usage: show [-srgh]\n" ); - fprintf( pErr, " visualizes the network structure using DOT and GSVIEW\n" ); -#ifdef WIN32 - fprintf( pErr, " \"dot.exe\" and \"gsview32.exe\" should be set in the paths\n" ); - fprintf( pErr, " (\"gsview32.exe\" may be in \"C:\\Program Files\\Ghostgum\\gsview\\\")\n" ); -#endif - fprintf( pErr, "\t-s : toggles visualization of sequential networks [default = %s].\n", fSeq? "yes": "no" ); - fprintf( pErr, "\t-r : toggles ordering nodes in reverse order [default = %s].\n", fUseReverse? "yes": "no" ); - fprintf( pErr, "\t-g : toggles printing gate names for mapped network [default = %s].\n", fGateNames? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandShowBdd( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - Abc_Obj_t * pNode; - int c; - extern void Abc_NodeShowBdd( Abc_Obj_t * pNode ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsBddLogic(pNtk) ) - { - fprintf( pErr, "Visualizing BDDs can only be done for logic BDD networks (run \"bdd\").\n" ); - return 1; - } - - if ( argc > globalUtilOptind + 1 ) - { - fprintf( pErr, "Wrong number of auguments.\n" ); - goto usage; - } - if ( argc == globalUtilOptind ) - { - pNode = Abc_ObjFanin0( Abc_NtkPo(pNtk, 0) ); - if ( !Abc_ObjIsNode(pNode) ) - { - fprintf( pErr, "The driver \"%s\" of the first PO is not an internal node.\n", Abc_ObjName(pNode) ); - return 1; - } - } - else - { - pNode = Abc_NtkFindNode( pNtk, argv[globalUtilOptind] ); - if ( pNode == NULL ) - { - fprintf( pErr, "Cannot find node \"%s\".\n", argv[globalUtilOptind] ); - return 1; - } - } - Abc_NodeShowBdd( pNode ); - return 0; - -usage: - fprintf( pErr, "usage: show_bdd [-h] <node>\n" ); - fprintf( pErr, " visualizes the BDD of a node using DOT and GSVIEW\n" ); -#ifdef WIN32 - fprintf( pErr, " \"dot.exe\" and \"gsview32.exe\" should be set in the paths\n" ); - fprintf( pErr, " (\"gsview32.exe\" may be in \"C:\\Program Files\\Ghostgum\\gsview\\\")\n" ); -#endif - fprintf( pErr, "\tnode : the node to consider [default = the driver of the first PO]\n"); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandShowCut( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - Abc_Obj_t * pNode; - int c; - int nNodeSizeMax; - int nConeSizeMax; - extern void Abc_NodeShowCut( Abc_Obj_t * pNode, int nNodeSizeMax, int nConeSizeMax ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nNodeSizeMax = 10; - nConeSizeMax = ABC_INFINITY; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "NCh" ) ) != EOF ) - { - switch ( c ) - { - case 'N': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by an integer.\n" ); - goto usage; - } - nNodeSizeMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nNodeSizeMax < 0 ) - goto usage; - break; - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - nConeSizeMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nConeSizeMax < 0 ) - goto usage; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Visualizing cuts only works for AIGs (run \"strash\").\n" ); - return 1; - } - if ( argc != globalUtilOptind + 1 ) - { - fprintf( pErr, "Wrong number of auguments.\n" ); - goto usage; - } - - pNode = Abc_NtkFindNode( pNtk, argv[globalUtilOptind] ); - if ( pNode == NULL ) - { - fprintf( pErr, "Cannot find node \"%s\".\n", argv[globalUtilOptind] ); - return 1; - } - Abc_NodeShowCut( pNode, nNodeSizeMax, nConeSizeMax ); - return 0; - -usage: - fprintf( pErr, "usage: show_cut [-N num] [-C num] [-h] <node>\n" ); - fprintf( pErr, " visualizes the cut of a node using DOT and GSVIEW\n" ); -#ifdef WIN32 - fprintf( pErr, " \"dot.exe\" and \"gsview32.exe\" should be set in the paths\n" ); - fprintf( pErr, " (\"gsview32.exe\" may be in \"C:\\Program Files\\Ghostgum\\gsview\\\")\n" ); -#endif - fprintf( pErr, "\t-N num : the max size of the cut to be computed [default = %d]\n", nNodeSizeMax ); - fprintf( pErr, "\t-C num : the max support of the containing cone [default = %d]\n", nConeSizeMax ); - fprintf( pErr, "\tnode : the node to consider\n"); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandCollapse( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int fVerbose; - int fBddSizeMax; - int fDualRail; - int fReorder; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fVerbose = 1; - fReorder = 1; - fDualRail = 0; - fBddSizeMax = 50000000; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Brdvh" ) ) != EOF ) - { - switch ( c ) - { - case 'B': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-B\" should be followed by an integer.\n" ); - goto usage; - } - fBddSizeMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( fBddSizeMax < 0 ) - goto usage; - break; - case 'd': - fDualRail ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'r': - fReorder ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsLogic(pNtk) && !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Can only collapse a logic network or an AIG.\n" ); - return 1; - } - - // get the new network - if ( Abc_NtkIsStrash(pNtk) ) - pNtkRes = Abc_NtkCollapse( pNtk, fBddSizeMax, fDualRail, fReorder, fVerbose ); - else - { - pNtk = Abc_NtkStrash( pNtk, 0, 0, 0 ); - pNtkRes = Abc_NtkCollapse( pNtk, fBddSizeMax, fDualRail, fReorder, fVerbose ); - Abc_NtkDelete( pNtk ); - } - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Collapsing has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: collapse [-B num] [-rdvh]\n" ); - fprintf( pErr, "\t collapses the network by constructing global BDDs\n" ); - fprintf( pErr, "\t-B num : limit on live BDD nodes during collapsing [default = %d]\n", fBddSizeMax ); - fprintf( pErr, "\t-r : toggles dynamic variable reordering [default = %s]\n", fReorder? "yes": "no" ); - fprintf( pErr, "\t-d : toggles dual-rail collapsing mode [default = %s]\n", fDualRail? "yes": "no" ); - fprintf( pErr, "\t-v : print verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandStrash( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - int fAllNodes; - int fRecord; - int fCleanup; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fAllNodes = 0; - fCleanup = 1; - fRecord = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "acrh" ) ) != EOF ) - { - switch ( c ) - { - case 'a': - fAllNodes ^= 1; - break; - case 'c': - fCleanup ^= 1; - break; - case 'r': - fRecord ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - // get the new network - pNtkRes = Abc_NtkStrash( pNtk, fAllNodes, fCleanup, fRecord ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Strashing has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: strash [-acrh]\n" ); - fprintf( pErr, "\t transforms combinational logic into an AIG\n" ); - fprintf( pErr, "\t-a : toggles between using all nodes and DFS nodes [default = %s]\n", fAllNodes? "all": "DFS" ); - fprintf( pErr, "\t-c : toggles cleanup to remove the dagling AIG nodes [default = %s]\n", fCleanup? "all": "DFS" ); - fprintf( pErr, "\t-r : enables using the record of AIG subgraphs [default = %s]\n", fRecord? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandBalance( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes, * pNtkTemp; - int c; - bool fDuplicate; - bool fSelective; - bool fUpdateLevel; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fDuplicate = 0; - fSelective = 0; - fUpdateLevel = 1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "ldsh" ) ) != EOF ) - { - switch ( c ) - { - case 'l': - fUpdateLevel ^= 1; - break; - case 'd': - fDuplicate ^= 1; - break; - case 's': - fSelective ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - // get the new network - if ( Abc_NtkIsStrash(pNtk) ) - { - pNtkRes = Abc_NtkBalance( pNtk, fDuplicate, fSelective, fUpdateLevel ); - } - else - { - pNtkTemp = Abc_NtkStrash( pNtk, 0, 0, 0 ); - if ( pNtkTemp == NULL ) - { - fprintf( pErr, "Strashing before balancing has failed.\n" ); - return 1; - } - pNtkRes = Abc_NtkBalance( pNtkTemp, fDuplicate, fSelective, fUpdateLevel ); - Abc_NtkDelete( pNtkTemp ); - } - - // check if balancing worked - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Balancing has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: balance [-ldsh]\n" ); - fprintf( pErr, "\t transforms the current network into a well-balanced AIG\n" ); - fprintf( pErr, "\t-l : toggle minimizing the number of levels [default = %s]\n", fUpdateLevel? "yes": "no" ); - fprintf( pErr, "\t-d : toggle duplication of logic [default = %s]\n", fDuplicate? "yes": "no" ); - fprintf( pErr, "\t-s : toggle duplication on the critical paths [default = %s]\n", fSelective? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandMulti( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int nThresh, nFaninMax, c; - int fCnf; - int fMulti; - int fSimple; - int fFactor; - extern Abc_Ntk_t * Abc_NtkMulti( Abc_Ntk_t * pNtk, int nThresh, int nFaninMax, int fCnf, int fMulti, int fSimple, int fFactor ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nThresh = 1; - nFaninMax = 20; - fCnf = 0; - fMulti = 1; - fSimple = 0; - fFactor = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "TFmcsfh" ) ) != EOF ) - { - switch ( c ) - { - case 'T': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-T\" should be followed by an integer.\n" ); - goto usage; - } - nThresh = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nThresh < 0 ) - goto usage; - break; - case 'F': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-F\" should be followed by an integer.\n" ); - goto usage; - } - nFaninMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nFaninMax < 0 ) - goto usage; - break; - case 'c': - fCnf ^= 1; - break; - case 'm': - fMulti ^= 1; - break; - case 's': - fSimple ^= 1; - break; - case 'f': - fFactor ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Cannot renode a network that is not an AIG (run \"strash\").\n" ); - return 1; - } - - // get the new network - pNtkRes = Abc_NtkMulti( pNtk, nThresh, nFaninMax, fCnf, fMulti, fSimple, fFactor ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Renoding has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: multi [-T num] [-F num] [-msfch]\n" ); - fprintf( pErr, "\t transforms an AIG into a logic network by creating larger nodes\n" ); - fprintf( pErr, "\t-F num : the maximum fanin size after renoding [default = %d]\n", nFaninMax ); - fprintf( pErr, "\t-T num : the threshold for AIG node duplication [default = %d]\n", nThresh ); - fprintf( pErr, "\t (an AIG node is the root of a new node after renoding\n" ); - fprintf( pErr, "\t if this leads to duplication of no more than %d AIG nodes,\n", nThresh ); - fprintf( pErr, "\t that is, if [(numFanouts(Node)-1) * size(MFFC(Node))] <= %d)\n", nThresh ); - fprintf( pErr, "\t-m : creates multi-input AND graph [default = %s]\n", fMulti? "yes": "no" ); - fprintf( pErr, "\t-s : creates a simple AIG (no renoding) [default = %s]\n", fSimple? "yes": "no" ); - fprintf( pErr, "\t-f : creates a factor-cut network [default = %s]\n", fFactor? "yes": "no" ); - fprintf( pErr, "\t-c : performs renoding to derive the CNF [default = %s]\n", fCnf? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandRenode( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int nLutSize, nCutsMax, c; - int nFlowIters, nAreaIters; - int fArea; - int fUseBdds; - int fUseSops; - int fUseCnfs; - int fUseMv; - int fVerbose; - extern Abc_Ntk_t * Abc_NtkRenode( Abc_Ntk_t * pNtk, int nLutSize, int nCutsMax, int nFlowIters, int nAreaIters, int fArea, int fUseBdds, int fUseSops, int fUseCnfs, int fUseMv, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nLutSize = 8; - nCutsMax = 4; - nFlowIters = 1; - nAreaIters = 1; - fArea = 0; - fUseBdds = 0; - fUseSops = 0; - fUseCnfs = 0; - fUseMv = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "KCFAabscivh" ) ) != EOF ) - { - switch ( c ) - { - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-F\" should be followed by an integer.\n" ); - goto usage; - } - nLutSize = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nLutSize < 0 ) - goto usage; - break; - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - nCutsMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nCutsMax < 0 ) - goto usage; - break; - case 'F': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-F\" should be followed by a positive integer.\n" ); - goto usage; - } - nFlowIters = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nFlowIters < 0 ) - goto usage; - break; - case 'A': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-A\" should be followed by a positive integer.\n" ); - goto usage; - } - nAreaIters = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nAreaIters < 0 ) - goto usage; - break; - case 'a': - fArea ^= 1; - break; - case 'b': - fUseBdds ^= 1; - break; - case 's': - fUseSops ^= 1; - break; - case 'c': - fUseCnfs ^= 1; - break; - case 'i': - fUseMv ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( fUseBdds + fUseSops + fUseCnfs + fUseMv > 1 ) - { - fprintf( pErr, "Cannot optimize two parameters at the same time.\n" ); - return 1; - } - - if ( nLutSize < 3 || nLutSize > IF_MAX_FUNC_LUTSIZE ) - { - fprintf( pErr, "Incorrect LUT size (%d).\n", nLutSize ); - return 1; - } - - if ( nCutsMax < 1 || nCutsMax >= (1<<12) ) - { - fprintf( pErr, "Incorrect number of cuts.\n" ); - return 1; - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Cannot renode a network that is not an AIG (run \"strash\").\n" ); - return 1; - } - - // get the new network - pNtkRes = Abc_NtkRenode( pNtk, nLutSize, nCutsMax, nFlowIters, nAreaIters, fArea, fUseBdds, fUseSops, fUseCnfs, fUseMv, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Renoding has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: renode [-K num] [-C num] [-F num] [-A num] [-sbciav]\n" ); - fprintf( pErr, "\t transforms the AIG into a logic network with larger nodes\n" ); - fprintf( pErr, "\t while minimizing the number of FF literals of the node SOPs\n" ); - fprintf( pErr, "\t-K num : the max cut size for renoding (2 < num < %d) [default = %d]\n", IF_MAX_FUNC_LUTSIZE+1, nLutSize ); - fprintf( pErr, "\t-C num : the max number of cuts used at a node (0 < num < 2^12) [default = %d]\n", nCutsMax ); - fprintf( pErr, "\t-F num : the number of area flow recovery iterations (num >= 0) [default = %d]\n", nFlowIters ); - fprintf( pErr, "\t-A num : the number of exact area recovery iterations (num >= 0) [default = %d]\n", nAreaIters ); - fprintf( pErr, "\t-s : toggles minimizing SOP cubes instead of FF lits [default = %s]\n", fUseSops? "yes": "no" ); - fprintf( pErr, "\t-b : toggles minimizing BDD nodes instead of FF lits [default = %s]\n", fUseBdds? "yes": "no" ); - fprintf( pErr, "\t-c : toggles minimizing CNF clauses instead of FF lits [default = %s]\n", fUseCnfs? "yes": "no" ); - fprintf( pErr, "\t-i : toggles minimizing MV-SOP instead of FF lits [default = %s]\n", fUseMv? "yes": "no" ); - fprintf( pErr, "\t-a : toggles area-oriented mapping [default = %s]\n", fArea? "yes": "no" ); - fprintf( pErr, "\t-v : print verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandCleanup( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Cleanup cannot be performed on the AIG.\n" ); - return 1; - } - // modify the current network - Abc_NtkCleanup( pNtk, 1 ); - return 0; - -usage: - fprintf( pErr, "usage: cleanup [-h]\n" ); - fprintf( pErr, "\t removes dangling nodes\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandSweep( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "The classical (SIS-like) sweep can only be performed on a logic network.\n" ); - return 1; - } - // modify the current network - Abc_NtkSweep( pNtk, 0 ); - return 0; - -usage: - fprintf( pErr, "usage: sweep [-h]\n" ); - fprintf( pErr, "\t removes dangling nodes; propagates constant, buffers, inverters\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandFastExtract( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - Abc_Ntk_t * pNtk; - FILE * pOut, * pErr; - Fxu_Data_t * p = NULL; - int c; - extern bool Abc_NtkFastExtract( Abc_Ntk_t * pNtk, Fxu_Data_t * p ); - extern void Abc_NtkFxuFreeInfo( Fxu_Data_t * p ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // allocate the structure - p = ALLOC( Fxu_Data_t, 1 ); - memset( p, 0, sizeof(Fxu_Data_t) ); - // set the defaults - p->nSingleMax = 20000; - p->nPairsMax = 30000; - p->nNodesExt = 10000; - p->fOnlyS = 0; - p->fOnlyD = 0; - p->fUse0 = 0; - p->fUseCompl = 1; - p->fVerbose = 0; - Extra_UtilGetoptReset(); - while ( (c = Extra_UtilGetopt(argc, argv, "SDNsdzcvh")) != EOF ) - { - switch (c) - { - case 'S': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-S\" should be followed by an integer.\n" ); - goto usage; - } - p->nSingleMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( p->nSingleMax < 0 ) - goto usage; - break; - case 'D': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-D\" should be followed by an integer.\n" ); - goto usage; - } - p->nPairsMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( p->nPairsMax < 0 ) - goto usage; - break; - case 'N': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by an integer.\n" ); - goto usage; - } - p->nNodesExt = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( p->nNodesExt < 0 ) - goto usage; - break; - case 's': - p->fOnlyS ^= 1; - break; - case 'd': - p->fOnlyD ^= 1; - break; - case 'z': - p->fUse0 ^= 1; - break; - case 'c': - p->fUseCompl ^= 1; - break; - case 'v': - p->fVerbose ^= 1; - break; - case 'h': - goto usage; - break; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - Abc_NtkFxuFreeInfo( p ); - return 1; - } - - if ( Abc_NtkNodeNum(pNtk) == 0 ) - { - fprintf( pErr, "The network does not have internal nodes.\n" ); - Abc_NtkFxuFreeInfo( p ); - return 1; - } - - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "Fast extract can only be applied to a logic network (run \"renode\").\n" ); - Abc_NtkFxuFreeInfo( p ); - return 1; - } - - - // the nodes to be merged are linked into the special linked list - Abc_NtkFastExtract( pNtk, p ); - Abc_NtkFxuFreeInfo( p ); - return 0; - -usage: - fprintf( pErr, "usage: fx [-S num] [-D num] [-N num] [-sdzcvh]\n"); - fprintf( pErr, "\t performs unate fast extract on the current network\n"); - fprintf( pErr, "\t-S num : max number of single-cube divisors to consider [default = %d]\n", p->nSingleMax ); - fprintf( pErr, "\t-D num : max number of double-cube divisors to consider [default = %d]\n", p->nPairsMax ); - fprintf( pErr, "\t-N num : the maximum number of divisors to extract [default = %d]\n", p->nNodesExt ); - fprintf( pErr, "\t-s : use only single-cube divisors [default = %s]\n", p->fOnlyS? "yes": "no" ); - fprintf( pErr, "\t-d : use only double-cube divisors [default = %s]\n", p->fOnlyD? "yes": "no" ); - fprintf( pErr, "\t-z : use zero-weight divisors [default = %s]\n", p->fUse0? "yes": "no" ); - fprintf( pErr, "\t-c : use complement in the binary case [default = %s]\n", p->fUseCompl? "yes": "no" ); - fprintf( pErr, "\t-v : print verbose information [default = %s]\n", p->fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - Abc_NtkFxuFreeInfo( p ); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandDisjoint( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes, * pNtkNew; - int fGlobal, fRecursive, fVerbose, fPrint, fShort, c; - - extern Abc_Ntk_t * Abc_NtkDsdGlobal( Abc_Ntk_t * pNtk, bool fVerbose, bool fPrint, bool fShort ); - extern int Abc_NtkDsdLocal( Abc_Ntk_t * pNtk, bool fVerbose, bool fRecursive ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fGlobal = 1; - fRecursive = 0; - fVerbose = 0; - fPrint = 0; - fShort = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "grvpsh" ) ) != EOF ) - { - switch ( c ) - { - case 'g': - fGlobal ^= 1; - break; - case 'r': - fRecursive ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'p': - fPrint ^= 1; - break; - case 's': - fShort ^= 1; - break; - case 'h': - goto usage; - break; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( fGlobal ) - { -// fprintf( stdout, "Performing DSD of global functions of the network.\n" ); - // get the new network - if ( !Abc_NtkIsStrash(pNtk) ) - { - pNtkNew = Abc_NtkStrash( pNtk, 0, 0, 0 ); - pNtkRes = Abc_NtkDsdGlobal( pNtkNew, fVerbose, fPrint, fShort ); - Abc_NtkDelete( pNtkNew ); - } - else - { - pNtkRes = Abc_NtkDsdGlobal( pNtk, fVerbose, fPrint, fShort ); - } - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Global DSD has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - } - else if ( fRecursive ) - { - if ( !Abc_NtkIsBddLogic( pNtk ) ) - { - fprintf( pErr, "This command is only applicable to logic BDD networks.\n" ); - return 1; - } - fprintf( stdout, "Performing recursive DSD and MUX decomposition of local functions.\n" ); - if ( !Abc_NtkDsdLocal( pNtk, fVerbose, fRecursive ) ) - fprintf( pErr, "Recursive DSD has failed.\n" ); - } - else - { - if ( !Abc_NtkIsBddLogic( pNtk ) ) - { - fprintf( pErr, "This command is only applicable to logic BDD networks (run \"bdd\").\n" ); - return 1; - } - fprintf( stdout, "Performing simple non-recursive DSD of local functions.\n" ); - if ( !Abc_NtkDsdLocal( pNtk, fVerbose, fRecursive ) ) - fprintf( pErr, "Simple DSD of local functions has failed.\n" ); - } - return 0; - -usage: - fprintf( pErr, "usage: dsd [-grvpsh]\n" ); - fprintf( pErr, "\t decomposes the network using disjoint-support decomposition\n" ); - fprintf( pErr, "\t-g : toggle DSD of global and local functions [default = %s]\n", fGlobal? "global": "local" ); - fprintf( pErr, "\t-r : toggle recursive DSD/MUX and simple DSD [default = %s]\n", fRecursive? "recursive DSD/MUX": "simple DSD" ); - fprintf( pErr, "\t-v : prints DSD statistics and runtime [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-p : prints DSD structure to the standard output [default = %s]\n", fPrint? "yes": "no" ); - fprintf( pErr, "\t-s : use short PI names when printing DSD structure [default = %s]\n", fShort? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandImfs( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - Res_Par_t Pars, * pPars = &Pars; - int c; - -// printf( "Implementation of this command is not finished.\n" ); -// return 1; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - pPars->nWindow = 62; - pPars->nGrowthLevel = 1; - pPars->nCands = 5; - pPars->nSimWords = 4; - pPars->fArea = 0; - pPars->fVerbose = 0; - pPars->fVeryVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "WSCLavwh" ) ) != EOF ) - { - switch ( c ) - { - case 'W': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-W\" should be followed by an integer.\n" ); - goto usage; - } - pPars->nWindow = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nWindow < 1 || pPars->nWindow > 99 ) - goto usage; - break; - case 'S': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-S\" should be followed by an integer.\n" ); - goto usage; - } - pPars->nSimWords = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nSimWords < 1 || pPars->nSimWords > 256 ) - goto usage; - break; - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - pPars->nCands = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nCands < 0 || pPars->nCands > ABC_INFINITY ) - goto usage; - break; - case 'L': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-L\" should be followed by an integer.\n" ); - goto usage; - } - pPars->nGrowthLevel = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nGrowthLevel < 0 || pPars->nGrowthLevel > ABC_INFINITY ) - goto usage; - break; - case 'a': - pPars->fArea ^= 1; - break; - case 'v': - pPars->fVerbose ^= 1; - break; - case 'w': - pPars->fVeryVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "This command can only be applied to a logic network.\n" ); - return 1; - } - - // modify the current network - if ( !Abc_NtkResynthesize( pNtk, pPars ) ) - { - fprintf( pErr, "Resynthesis has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: imfs [-W <NM>] [-L <num>] [-C <num>] [-S <num>] [-avwh]\n" ); - fprintf( pErr, "\t performs resubstitution-based resynthesis with interpolation\n" ); - fprintf( pErr, "\t-W <NM> : fanin/fanout levels (NxM) of the window (00 <= NM <= 99) [default = %d%d]\n", pPars->nWindow/10, pPars->nWindow%10 ); - fprintf( pErr, "\t-L <num> : the largest increase in node level after resynthesis (0 <= num) [default = %d]\n", pPars->nGrowthLevel ); - fprintf( pErr, "\t-C <num> : the max number of resub candidates (1 <= n) [default = %d]\n", pPars->nCands ); - fprintf( pErr, "\t-S <num> : the number of simulation words (1 <= n <= 256) [default = %d]\n", pPars->nSimWords ); - fprintf( pErr, "\t-a : toggle optimization for area only [default = %s]\n", pPars->fArea? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", pPars->fVerbose? "yes": "no" ); - fprintf( pErr, "\t-w : toggle printout subgraph statistics [default = %s]\n", pPars->fVeryVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandLutpack( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - Lpk_Par_t Pars, * pPars = &Pars; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - memset( pPars, 0, sizeof(Lpk_Par_t) ); - pPars->nLutsMax = 4; // (N) the maximum number of LUTs in the structure - pPars->nLutsOver = 3; // (Q) the maximum number of LUTs not in the MFFC - pPars->nVarsShared = 0; // (S) the maximum number of shared variables (crossbars) - pPars->nGrowthLevel = 0; // (L) the maximum number of increased levels - pPars->fSatur = 1; - pPars->fZeroCost = 0; - pPars->fFirst = 0; - pPars->fOldAlgo = 0; - pPars->fVerbose = 0; - pPars->fVeryVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "NQSLszfovwh" ) ) != EOF ) - { - switch ( c ) - { - case 'N': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by an integer.\n" ); - goto usage; - } - pPars->nLutsMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nLutsMax < 2 || pPars->nLutsMax > 8 ) - goto usage; - break; - case 'Q': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-Q\" should be followed by an integer.\n" ); - goto usage; - } - pPars->nLutsOver = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nLutsOver < 0 || pPars->nLutsOver > 8 ) - goto usage; - break; - case 'S': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-S\" should be followed by an integer.\n" ); - goto usage; - } - pPars->nVarsShared = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nVarsShared < 0 || pPars->nVarsShared > 4 ) - goto usage; - break; - case 'L': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-L\" should be followed by an integer.\n" ); - goto usage; - } - pPars->nGrowthLevel = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nGrowthLevel < 0 || pPars->nGrowthLevel > ABC_INFINITY ) - goto usage; - break; - case 's': - pPars->fSatur ^= 1; - break; - case 'z': - pPars->fZeroCost ^= 1; - break; - case 'f': - pPars->fFirst ^= 1; - break; - case 'o': - pPars->fOldAlgo ^= 1; - break; - case 'v': - pPars->fVerbose ^= 1; - break; - case 'w': - pPars->fVeryVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "This command can only be applied to a logic network.\n" ); - return 1; - } - if ( pPars->nVarsShared < 0 || pPars->nVarsShared > 3 ) - { - fprintf( pErr, "The number of shared variables (%d) is not in the range 0 <= S <= 3.\n", pPars->nVarsShared ); - return 1; - } - - // modify the current network - if ( !Lpk_Resynthesize( pNtk, pPars ) ) - { - fprintf( pErr, "Resynthesis has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: lutpack [-N <num>] [-Q <num>] [-S <num>] [-L <num>] [-szfovwh]\n" ); - fprintf( pErr, "\t performs \"rewriting\" for LUT networks\n" ); - fprintf( pErr, "\t-N <num> : the max number of LUTs in the structure (2 <= num) [default = %d]\n", pPars->nLutsMax ); - fprintf( pErr, "\t-Q <num> : the max number of LUTs not in MFFC (0 <= num) [default = %d]\n", pPars->nLutsOver ); - fprintf( pErr, "\t-S <num> : the max number of LUT inputs shared (0 <= num <= 3) [default = %d]\n", pPars->nVarsShared ); - fprintf( pErr, "\t-L <num> : max level increase after resynthesis (0 <= num) [default = %d]\n", pPars->nGrowthLevel ); - fprintf( pErr, "\t-s : toggle iteration till saturation [default = %s]\n", pPars->fSatur? "yes": "no" ); - fprintf( pErr, "\t-z : toggle zero-cost replacements [default = %s]\n", pPars->fZeroCost? "yes": "no" ); - fprintf( pErr, "\t-f : toggle using only first node and first cut [default = %s]\n", pPars->fFirst? "yes": "no" ); - fprintf( pErr, "\t-o : toggle using old implementation [default = %s]\n", pPars->fOldAlgo? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", pPars->fVerbose? "yes": "no" ); - fprintf( pErr, "\t-w : toggle detailed printout of decomposed functions [default = %s]\n", pPars->fVeryVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandRewrite( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - bool fUpdateLevel; - bool fPrecompute; - bool fUseZeros; - bool fVerbose; - bool fVeryVerbose; - bool fPlaceEnable; - // external functions - extern void Rwr_Precompute(); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fUpdateLevel = 1; - fPrecompute = 0; - fUseZeros = 0; - fVerbose = 0; - fVeryVerbose = 0; - fPlaceEnable = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "lxzvwh" ) ) != EOF ) - { - switch ( c ) - { - case 'l': - fUpdateLevel ^= 1; - break; - case 'x': - fPrecompute ^= 1; - break; - case 'z': - fUseZeros ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'w': - fVeryVerbose ^= 1; - break; - case 'p': - fPlaceEnable ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( fPrecompute ) - { - Rwr_Precompute(); - return 0; - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command can only be applied to an AIG (run \"strash\").\n" ); - return 1; - } - if ( Abc_NtkGetChoiceNum(pNtk) ) - { - fprintf( pErr, "AIG resynthesis cannot be applied to AIGs with choice nodes.\n" ); - return 1; - } - - // modify the current network - if ( !Abc_NtkRewrite( pNtk, fUpdateLevel, fUseZeros, fVerbose, fVeryVerbose, fPlaceEnable ) ) - { - fprintf( pErr, "Rewriting has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: rewrite [-lzvwh]\n" ); - fprintf( pErr, "\t performs technology-independent rewriting of the AIG\n" ); - fprintf( pErr, "\t-l : toggle preserving the number of levels [default = %s]\n", fUpdateLevel? "yes": "no" ); - fprintf( pErr, "\t-z : toggle using zero-cost replacements [default = %s]\n", fUseZeros? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-w : toggle printout subgraph statistics [default = %s]\n", fVeryVerbose? "yes": "no" ); -// fprintf( pErr, "\t-p : toggle placement-aware rewriting [default = %s]\n", fPlaceEnable? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandRefactor( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int nNodeSizeMax; - int nConeSizeMax; - bool fUpdateLevel; - bool fUseZeros; - bool fUseDcs; - bool fVerbose; - extern int Abc_NtkRefactor( Abc_Ntk_t * pNtk, int nNodeSizeMax, int nConeSizeMax, bool fUpdateLevel, bool fUseZeros, bool fUseDcs, bool fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nNodeSizeMax = 10; - nConeSizeMax = 16; - fUpdateLevel = 1; - fUseZeros = 0; - fUseDcs = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "NClzdvh" ) ) != EOF ) - { - switch ( c ) - { - case 'N': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by an integer.\n" ); - goto usage; - } - nNodeSizeMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nNodeSizeMax < 0 ) - goto usage; - break; - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - nConeSizeMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nConeSizeMax < 0 ) - goto usage; - break; - case 'l': - fUpdateLevel ^= 1; - break; - case 'z': - fUseZeros ^= 1; - break; - case 'd': - fUseDcs ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command can only be applied to an AIG (run \"strash\").\n" ); - return 1; - } - if ( Abc_NtkGetChoiceNum(pNtk) ) - { - fprintf( pErr, "AIG resynthesis cannot be applied to AIGs with choice nodes.\n" ); - return 1; - } - - if ( fUseDcs && nNodeSizeMax >= nConeSizeMax ) - { - fprintf( pErr, "For don't-care to work, containing cone should be larger than collapsed node.\n" ); - return 1; - } - - // modify the current network - if ( !Abc_NtkRefactor( pNtk, nNodeSizeMax, nConeSizeMax, fUpdateLevel, fUseZeros, fUseDcs, fVerbose ) ) - { - fprintf( pErr, "Refactoring has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: refactor [-N num] [-C num] [-lzdvh]\n" ); - fprintf( pErr, "\t performs technology-independent refactoring of the AIG\n" ); - fprintf( pErr, "\t-N num : the max support of the collapsed node [default = %d]\n", nNodeSizeMax ); - fprintf( pErr, "\t-C num : the max support of the containing cone [default = %d]\n", nConeSizeMax ); - fprintf( pErr, "\t-l : toggle preserving the number of levels [default = %s]\n", fUpdateLevel? "yes": "no" ); - fprintf( pErr, "\t-z : toggle using zero-cost replacements [default = %s]\n", fUseZeros? "yes": "no" ); - fprintf( pErr, "\t-d : toggle using don't-cares [default = %s]\n", fUseDcs? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandRestructure( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int nCutsMax; - bool fUpdateLevel; - bool fUseZeros; - bool fVerbose; - extern int Abc_NtkRestructure( Abc_Ntk_t * pNtk, int nCutsMax, bool fUpdateLevel, bool fUseZeros, bool fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nCutsMax = 5; - fUpdateLevel = 0; - fUseZeros = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Klzvh" ) ) != EOF ) - { - switch ( c ) - { - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by an integer.\n" ); - goto usage; - } - nCutsMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nCutsMax < 0 ) - goto usage; - break; - case 'l': - fUpdateLevel ^= 1; - break; - case 'z': - fUseZeros ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( nCutsMax < 4 || nCutsMax > CUT_SIZE_MAX ) - { - fprintf( pErr, "Can only compute the cuts for %d <= K <= %d.\n", 4, CUT_SIZE_MAX ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command can only be applied to an AIG (run \"strash\").\n" ); - return 1; - } - if ( Abc_NtkGetChoiceNum(pNtk) ) - { - fprintf( pErr, "AIG resynthesis cannot be applied to AIGs with choice nodes.\n" ); - return 1; - } - - // modify the current network - if ( !Abc_NtkRestructure( pNtk, nCutsMax, fUpdateLevel, fUseZeros, fVerbose ) ) - { - fprintf( pErr, "Refactoring has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: restructure [-K num] [-lzvh]\n" ); - fprintf( pErr, "\t performs technology-independent restructuring of the AIG\n" ); - fprintf( pErr, "\t-K num : the max cut size (%d <= num <= %d) [default = %d]\n", CUT_SIZE_MIN, CUT_SIZE_MAX, nCutsMax ); - fprintf( pErr, "\t-l : toggle preserving the number of levels [default = %s]\n", fUpdateLevel? "yes": "no" ); - fprintf( pErr, "\t-z : toggle using zero-cost replacements [default = %s]\n", fUseZeros? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandResubstitute( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int RS_CUT_MIN = 4; - int RS_CUT_MAX = 16; - int c; - int nCutsMax; - int nNodesMax; - int nLevelsOdc; - bool fUpdateLevel; - bool fUseZeros; - bool fVerbose; - bool fVeryVerbose; - extern int Abc_NtkResubstitute( Abc_Ntk_t * pNtk, int nCutsMax, int nNodesMax, int nLevelsOdc, bool fUpdateLevel, bool fVerbose, bool fVeryVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nCutsMax = 8; - nNodesMax = 1; - nLevelsOdc = 0; - fUpdateLevel = 1; - fUseZeros = 0; - fVerbose = 0; - fVeryVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "KNFlzvwh" ) ) != EOF ) - { - switch ( c ) - { - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by an integer.\n" ); - goto usage; - } - nCutsMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nCutsMax < 0 ) - goto usage; - break; - case 'N': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by an integer.\n" ); - goto usage; - } - nNodesMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nNodesMax < 0 ) - goto usage; - break; - case 'F': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-F\" should be followed by an integer.\n" ); - goto usage; - } - nLevelsOdc = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nLevelsOdc < 0 ) - goto usage; - break; - case 'l': - fUpdateLevel ^= 1; - break; - case 'z': - fUseZeros ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'w': - fVeryVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( nCutsMax < RS_CUT_MIN || nCutsMax > RS_CUT_MAX ) - { - fprintf( pErr, "Can only compute cuts for %d <= K <= %d.\n", RS_CUT_MIN, RS_CUT_MAX ); - return 1; - } - if ( nNodesMax < 0 || nNodesMax > 3 ) - { - fprintf( pErr, "Can only resubstitute at most 3 nodes.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command can only be applied to an AIG (run \"strash\").\n" ); - return 1; - } - if ( Abc_NtkGetChoiceNum(pNtk) ) - { - fprintf( pErr, "AIG resynthesis cannot be applied to AIGs with choice nodes.\n" ); - return 1; - } - - // modify the current network - if ( !Abc_NtkResubstitute( pNtk, nCutsMax, nNodesMax, nLevelsOdc, fUpdateLevel, fVerbose, fVeryVerbose ) ) - { - fprintf( pErr, "Refactoring has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: resub [-K num] [-N num] [-F num] [-lzvwh]\n" ); - fprintf( pErr, "\t performs technology-independent restructuring of the AIG\n" ); - fprintf( pErr, "\t-K num : the max cut size (%d <= num <= %d) [default = %d]\n", RS_CUT_MIN, RS_CUT_MAX, nCutsMax ); - fprintf( pErr, "\t-N num : the max number of nodes to add (0 <= num <= 3) [default = %d]\n", nNodesMax ); - fprintf( pErr, "\t-F num : the number of fanout levels for ODC computation [default = %d]\n", nLevelsOdc ); - fprintf( pErr, "\t-l : toggle preserving the number of levels [default = %s]\n", fUpdateLevel? "yes": "no" ); - fprintf( pErr, "\t-z : toggle using zero-cost replacements [default = %s]\n", fUseZeros? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-w : toggle verbose printout of ODC computation [default = %s]\n", fVeryVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandRr( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c, Window; - int nFaninLevels; - int nFanoutLevels; - int fUseFanouts; - int fVerbose; - extern int Abc_NtkRR( Abc_Ntk_t * pNtk, int nFaninLevels, int nFanoutLevels, int fUseFanouts, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nFaninLevels = 3; - nFanoutLevels = 3; - fUseFanouts = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Wfvh" ) ) != EOF ) - { - switch ( c ) - { - case 'W': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-W\" should be followed by an integer.\n" ); - goto usage; - } - Window = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( Window < 0 ) - goto usage; - nFaninLevels = Window / 10; - nFanoutLevels = Window % 10; - break; - case 'f': - fUseFanouts ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command can only be applied to an AIG (run \"strash\").\n" ); - return 1; - } - if ( Abc_NtkGetChoiceNum(pNtk) ) - { - fprintf( pErr, "AIG resynthesis cannot be applied to AIGs with choice nodes.\n" ); - return 1; - } - - // modify the current network - if ( !Abc_NtkRR( pNtk, nFaninLevels, nFanoutLevels, fUseFanouts, fVerbose ) ) - { - fprintf( pErr, "Redundancy removal has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: rr [-W NM] [-fvh]\n" ); - fprintf( pErr, "\t removes combinational redundancies in the current network\n" ); - fprintf( pErr, "\t-W NM : window size: TFI (N) and TFO (M) logic levels [default = %d%d]\n", nFaninLevels, nFanoutLevels ); - fprintf( pErr, "\t-f : toggle RR w.r.t. fanouts [default = %s]\n", fUseFanouts? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandCascade( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, nLutSize; - int fCheck; - int fVerbose; - extern Abc_Ntk_t * Abc_NtkCascade( Abc_Ntk_t * pNtk, int nLutSize, int fCheck, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nLutSize = 12; - fCheck = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Kcvh" ) ) != EOF ) - { - switch ( c ) - { - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by an integer.\n" ); - goto usage; - } - nLutSize = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nLutSize < 0 ) - goto usage; - break; - case 'c': - fCheck ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsLogic(pNtk) && !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Can only collapse a logic network or an AIG.\n" ); - return 1; - } - - // get the new network - if ( Abc_NtkIsStrash(pNtk) ) - pNtkRes = Abc_NtkCascade( pNtk, nLutSize, fCheck, fVerbose ); - else - { - pNtk = Abc_NtkStrash( pNtk, 0, 0, 0 ); - pNtkRes = Abc_NtkCascade( pNtk, nLutSize, fCheck, fVerbose ); - Abc_NtkDelete( pNtk ); - } - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Cascade synthesis has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: cascade [-K <num>] [-cvh]\n" ); - fprintf( pErr, "\t performs LUT cascade synthesis for the current network\n" ); - fprintf( pErr, "\t-K num : the number of LUT inputs [default = %d]\n", nLutSize ); - fprintf( pErr, "\t-c : check equivalence after synthesis [default = %s]\n", fCheck? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\t \n"); - fprintf( pErr, " A lookup-table cascade is a programmable architecture developed by\n"); - fprintf( pErr, " Professor Tsutomu Sasao (sasao@cse.kyutech.ac.jp) at Kyushu Institute\n"); - fprintf( pErr, " of Technology. This work received Takeda Techno-Entrepreneurship Award:\n"); - fprintf( pErr, " http://www.lsi-cad.com/sasao/photo/takeda.html\n"); - fprintf( pErr, "\t \n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandLogic( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsStrash( pNtk ) ) - { - fprintf( pErr, "This command is only applicable to strashed networks.\n" ); - return 1; - } - - // get the new network - pNtkRes = Abc_NtkToLogic( pNtk ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Converting to a logic network has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: logic [-h]\n" ); - fprintf( pErr, "\t transforms an AIG into a logic network with SOPs\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandComb( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkIsComb(pNtk) ) - { - fprintf( pErr, "The network is already combinational.\n" ); - return 0; - } - - // get the new network - pNtkRes = Abc_NtkDup( pNtk ); - Abc_NtkMakeComb( pNtkRes ); - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: comb [-h]\n" ); - fprintf( pErr, "\t makes the current network combinational by replacing latches by PI/PO pairs\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandMiter( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - char Buffer[32]; - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtk1, * pNtk2, * pNtkRes; - int fDelete1, fDelete2; - char ** pArgvNew; - int nArgcNew; - int c; - int fCheck; - int fComb; - int nPartSize; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fComb = 1; - fCheck = 1; - nPartSize = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Pch" ) ) != EOF ) - { - switch ( c ) - { - case 'P': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-P\" should be followed by an integer.\n" ); - goto usage; - } - nPartSize = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nPartSize < 0 ) - goto usage; - break; - case 'c': - fComb ^= 1; - break; - default: - goto usage; - } - } - - pArgvNew = argv + globalUtilOptind; - nArgcNew = argc - globalUtilOptind; - if ( !Abc_NtkPrepareTwoNtks( pErr, pNtk, pArgvNew, nArgcNew, &pNtk1, &pNtk2, &fDelete1, &fDelete2 ) ) - return 1; - - // compute the miter - pNtkRes = Abc_NtkMiter( pNtk1, pNtk2, fComb, nPartSize ); - if ( fDelete1 ) Abc_NtkDelete( pNtk1 ); - if ( fDelete2 ) Abc_NtkDelete( pNtk2 ); - - // get the new network - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Miter computation has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - if ( nPartSize == 0 ) - strcpy( Buffer, "unused" ); - else - sprintf( Buffer, "%d", nPartSize ); - fprintf( pErr, "usage: miter [-P num] [-ch] <file1> <file2>\n" ); - fprintf( pErr, "\t computes the miter of the two circuits\n" ); - fprintf( pErr, "\t-P num : output partition size [default = %s]\n", Buffer ); - fprintf( pErr, "\t-c : computes combinational miter (latches as POs) [default = %s]\n", fComb? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\tfile1 : (optional) the file with the first network\n"); - fprintf( pErr, "\tfile2 : (optional) the file with the second network\n"); - fprintf( pErr, "\t if no files are given, uses the current network and its spec\n"); - fprintf( pErr, "\t if one file is given, uses the current network and the file\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandDemiter( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk;//, * pNtkRes; - int fComb; - int c; - extern int Abc_NtkDemiter( Abc_Ntk_t * pNtk ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "ch" ) ) != EOF ) - { - switch ( c ) - { - case 'c': - fComb ^= 1; - break; - default: - goto usage; - } - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "The network is not strashed.\n" ); - return 1; - } - - if ( Abc_NtkPoNum(pNtk) != 1 ) - { - fprintf( pErr, "The network is not a miter.\n" ); - return 1; - } - - if ( !Abc_NodeIsExorType(Abc_ObjFanin0(Abc_NtkPo(pNtk,0))) ) - { - fprintf( pErr, "The miter's PO is not an EXOR.\n" ); - return 1; - } - - // get the new network - if ( !Abc_NtkDemiter( pNtk ) ) - { - fprintf( pErr, "Demitering has failed.\n" ); - return 1; - } - // replace the current network -// Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: demiter [-h]\n" ); - fprintf( pErr, "\t removes topmost EXOR from the miter to create two POs\n" ); -// fprintf( pErr, "\t-c : computes combinational miter (latches as POs) [default = %s]\n", fComb? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandOrPos( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk;//, * pNtkRes; - int fComb; - int c; - extern int Abc_NtkCombinePos( Abc_Ntk_t * pNtk, int fAnd ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "ch" ) ) != EOF ) - { - switch ( c ) - { - case 'c': - fComb ^= 1; - break; - default: - goto usage; - } - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "The network is not strashed.\n" ); - return 1; - } -/* - if ( Abc_NtkPoNum(pNtk) == 1 ) - { - fprintf( pErr, "The network already has one PO.\n" ); - return 1; - } -*/ -/* - if ( Abc_NtkLatchNum(pNtk) ) - { - fprintf( pErr, "The miter has latches. ORing is not performed.\n" ); - return 1; - } -*/ - // get the new network - if ( !Abc_NtkCombinePos( pNtk, 0 ) ) - { - fprintf( pErr, "ORing the POs has failed.\n" ); - return 1; - } - // replace the current network -// Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: orpos [-h]\n" ); - fprintf( pErr, "\t creates single-output miter by ORing the POs of the current network\n" ); -// fprintf( pErr, "\t-c : computes combinational miter (latches as POs) [default = %s]\n", fComb? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandAndPos( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk;//, * pNtkRes; - int fComb; - int c; - extern int Abc_NtkCombinePos( Abc_Ntk_t * pNtk, int fAnd ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "ch" ) ) != EOF ) - { - switch ( c ) - { - case 'c': - fComb ^= 1; - break; - default: - goto usage; - } - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "The network is not strashed.\n" ); - return 1; - } - - if ( Abc_NtkPoNum(pNtk) == 1 ) - { - fprintf( pErr, "The network already has one PO.\n" ); - return 1; - } - - if ( Abc_NtkLatchNum(pNtk) ) - { - fprintf( pErr, "The miter has latches. ORing is not performed.\n" ); - return 1; - } - - // get the new network - if ( !Abc_NtkCombinePos( pNtk, 1 ) ) - { - fprintf( pErr, "ANDing the POs has failed.\n" ); - return 1; - } - // replace the current network -// Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: andpos [-h]\n" ); - fprintf( pErr, "\t creates single-output miter by ANDing the POs of the current network\n" ); -// fprintf( pErr, "\t-c : computes combinational miter (latches as POs) [default = %s]\n", fComb? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandAppend( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtk2; - char * FileName; - int fComb; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "ch" ) ) != EOF ) - { - switch ( c ) - { - case 'c': - fComb ^= 1; - break; - default: - goto usage; - } - } - - // get the second network - if ( argc != globalUtilOptind + 1 ) - { - fprintf( pErr, "The network to append is not given.\n" ); - return 1; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "The base network should be strashed for the appending to work.\n" ); - return 1; - } - - // read the second network - FileName = argv[globalUtilOptind]; - pNtk2 = Io_Read( FileName, Io_ReadFileType(FileName), 1 ); - if ( pNtk2 == NULL ) - return 1; - - // check if the second network is combinational - if ( Abc_NtkLatchNum(pNtk2) ) - { - fprintf( pErr, "The second network has latches. Appending does not work for such networks.\n" ); - return 1; - } - - // get the new network - if ( !Abc_NtkAppend( pNtk, pNtk2, 1 ) ) - { - Abc_NtkDelete( pNtk2 ); - fprintf( pErr, "Appending the networks failed.\n" ); - return 1; - } - Abc_NtkDelete( pNtk2 ); - // sweep dangling logic - Abc_AigCleanup( pNtk->pManFunc ); - // replace the current network -// Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: append [-h] <file>\n" ); - fprintf( pErr, "\t appends a combinational network on top of the current network\n" ); -// fprintf( pErr, "\t-c : computes combinational miter (latches as POs) [default = %s]\n", fComb? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\t<file> : file name with the second network\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandFrames( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkTemp, * pNtkRes; - int fInitial; - int nFrames; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fInitial = 0; - nFrames = 5; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Fih" ) ) != EOF ) - { - switch ( c ) - { - case 'F': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-F\" should be followed by an integer.\n" ); - goto usage; - } - nFrames = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nFrames <= 0 ) - goto usage; - break; - case 'i': - fInitial ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - // get the new network - if ( !Abc_NtkIsStrash(pNtk) ) - { - pNtkTemp = Abc_NtkStrash( pNtk, 0, 0, 0 ); - pNtkRes = Abc_NtkFrames( pNtkTemp, nFrames, fInitial ); - Abc_NtkDelete( pNtkTemp ); - } - else - pNtkRes = Abc_NtkFrames( pNtk, nFrames, fInitial ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Unrolling the network has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: frames [-F num] [-ih]\n" ); - fprintf( pErr, "\t unrolls the network for a number of time frames\n" ); - fprintf( pErr, "\t-F num : the number of frames to unroll [default = %d]\n", nFrames ); - fprintf( pErr, "\t-i : toggles initializing the first frame [default = %s]\n", fInitial? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandSop( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int fDirect; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fDirect = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "dh" ) ) != EOF ) - { - switch ( c ) - { - case 'd': - fDirect ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "Converting to SOP is possible only for logic networks.\n" ); - return 1; - } - if ( !Abc_NtkToSop(pNtk, fDirect) ) - { - fprintf( pErr, "Converting to SOP has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: sop [-dh]\n" ); - fprintf( pErr, "\t converts node functions to SOP\n" ); - fprintf( pErr, "\t-d : toggles using both phases or only positive [default = %s]\n", fDirect? "direct": "both" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandBdd( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "Converting to BDD is possible only for logic networks.\n" ); - return 1; - } - if ( Abc_NtkIsBddLogic(pNtk) ) - { - fprintf( pOut, "The logic network is already in the BDD form.\n" ); - return 0; - } - if ( !Abc_NtkToBdd(pNtk) ) - { - fprintf( pErr, "Converting to BDD has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: bdd [-h]\n" ); - fprintf( pErr, "\t converts node functions to BDD\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandAig( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "Converting to AIG is possible only for logic networks.\n" ); - return 1; - } - if ( Abc_NtkIsAigLogic(pNtk) ) - { - fprintf( pOut, "The logic network is already in the AIG form.\n" ); - return 0; - } - if ( !Abc_NtkToAig(pNtk) ) - { - fprintf( pErr, "Converting to AIG has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: aig [-h]\n" ); - fprintf( pErr, "\t converts node functions to AIG\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandReorder( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fVerbose; - extern void Abc_NtkBddReorder( Abc_Ntk_t * pNtk, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "vh" ) ) != EOF ) - { - switch ( c ) - { - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - // get the new network - if ( !Abc_NtkIsBddLogic(pNtk) ) - { - fprintf( pErr, "Variable reordering is possible when node functions are BDDs (run \"bdd\").\n" ); - return 1; - } - Abc_NtkBddReorder( pNtk, fVerbose ); - return 0; - -usage: - fprintf( pErr, "usage: reorder [-vh]\n" ); - fprintf( pErr, "\t reorders local functions of the nodes using sifting\n" ); - fprintf( pErr, "\t-v : prints verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandOrder( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr, * pFile; - Abc_Ntk_t * pNtk; - char * pFileName; - int c; - int fReverse; - int fVerbose; - extern void Abc_NtkImplementCiOrder( Abc_Ntk_t * pNtk, char * pFileName, int fReverse, int fVerbose ); - extern void Abc_NtkFindCiOrder( Abc_Ntk_t * pNtk, int fReverse, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fReverse = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "rvh" ) ) != EOF ) - { - switch ( c ) - { - case 'r': - fReverse ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } -// if ( Abc_NtkLatchNum(pNtk) > 0 ) -// { -// printf( "Currently this procedure does not work for sequential networks.\n" ); -// return 1; -// } - - // if the var order file is given, implement this order - pFileName = NULL; - if ( argc == globalUtilOptind + 1 ) - { - pFileName = argv[globalUtilOptind]; - pFile = fopen( pFileName, "r" ); - if ( pFile == NULL ) - { - fprintf( pErr, "Cannot open file \"%s\" with the BDD variable order.\n", pFileName ); - return 1; - } - fclose( pFile ); - } - if ( pFileName ) - Abc_NtkImplementCiOrder( pNtk, pFileName, fReverse, fVerbose ); - else - Abc_NtkFindCiOrder( pNtk, fReverse, fVerbose ); - return 0; - -usage: - fprintf( pErr, "usage: order [-rvh] <file>\n" ); - fprintf( pErr, "\t computes a good static CI variable order\n" ); - fprintf( pErr, "\t-r : toggle reverse ordering [default = %s]\n", fReverse? "yes": "no" ); - fprintf( pErr, "\t-v : prints verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\t<file> : (optional) file with the given variable order\n" ); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandMuxes( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsBddLogic(pNtk) ) - { - fprintf( pErr, "Only a BDD logic network can be converted to MUXes.\n" ); - return 1; - } - - // get the new network - pNtkRes = Abc_NtkBddToMuxes( pNtk ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Converting to MUXes has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: muxes [-h]\n" ); - fprintf( pErr, "\t converts the current network by a network derived by\n" ); - fprintf( pErr, "\t replacing all nodes by DAGs isomorphic to the local BDDs\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandExtSeqDcs( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fVerbose; - extern int Abc_NtkExtractSequentialDcs( Abc_Ntk_t * pNet, bool fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "vh" ) ) != EOF ) - { - switch ( c ) - { - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkLatchNum(pNtk) == 0 ) - { - fprintf( stdout, "The current network has no latches.\n" ); - return 0; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( stdout, "Extracting sequential don't-cares works only for AIGs (run \"strash\").\n" ); - return 0; - } - if ( !Abc_NtkExtractSequentialDcs( pNtk, fVerbose ) ) - { - fprintf( stdout, "Extracting sequential don't-cares has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: ext_seq_dcs [-vh]\n" ); - fprintf( pErr, "\t create EXDC network using unreachable states\n" ); - fprintf( pErr, "\t-v : prints verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandCone( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - Abc_Obj_t * pNode, * pNodeCo; - int c; - int fUseAllCis; - int fUseMffc; - int Output; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fUseAllCis = 0; - fUseMffc = 0; - Output = -1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Omah" ) ) != EOF ) - { - switch ( c ) - { - case 'O': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-O\" should be followed by an integer.\n" ); - goto usage; - } - Output = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( Output < 0 ) - goto usage; - break; - case 'm': - fUseMffc ^= 1; - case 'a': - fUseAllCis ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsLogic(pNtk) && !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Currently can only be applied to the logic network or an AIG.\n" ); - return 1; - } - - if ( argc > globalUtilOptind + 1 ) - { - fprintf( pErr, "Wrong number of auguments.\n" ); - goto usage; - } - - pNodeCo = NULL; - if ( argc == globalUtilOptind + 1 ) - { - pNode = Abc_NtkFindNode( pNtk, argv[globalUtilOptind] ); - if ( pNode == NULL ) - { - fprintf( pErr, "Cannot find node \"%s\".\n", argv[globalUtilOptind] ); - return 1; - } - if ( fUseMffc ) - pNtkRes = Abc_NtkCreateMffc( pNtk, pNode, argv[globalUtilOptind] ); - else - pNtkRes = Abc_NtkCreateCone( pNtk, pNode, argv[globalUtilOptind], fUseAllCis ); - } - else - { - if ( Output == -1 ) - { - fprintf( pErr, "The node is not specified.\n" ); - return 1; - } - if ( Output >= Abc_NtkCoNum(pNtk) ) - { - fprintf( pErr, "The 0-based output number (%d) is larger than the number of outputs (%d).\n", Output, Abc_NtkCoNum(pNtk) ); - return 1; - } - pNodeCo = Abc_NtkCo( pNtk, Output ); - if ( fUseMffc ) - pNtkRes = Abc_NtkCreateMffc( pNtk, Abc_ObjFanin0(pNodeCo), Abc_ObjName(pNodeCo) ); - else - pNtkRes = Abc_NtkCreateCone( pNtk, Abc_ObjFanin0(pNodeCo), Abc_ObjName(pNodeCo), fUseAllCis ); - } - if ( pNodeCo && Abc_ObjFaninC0(pNodeCo) ) - printf( "The extracted cone represents the complement function of the CO.\n" ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Writing the logic cone of one node has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: cone [-O num] [-amh] <name>\n" ); - fprintf( pErr, "\t replaces the current network by one logic cone\n" ); - fprintf( pErr, "\t-a : toggle writing all CIs or structral support only [default = %s]\n", fUseAllCis? "all": "structural" ); - fprintf( pErr, "\t-m : toggle writing only MFFC or complete TFI cone [default = %s]\n", fUseMffc? "MFFC": "TFI cone" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\t-O num : (optional) the 0-based number of the CO to extract\n"); - fprintf( pErr, "\tname : (optional) the name of the node to extract\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandNode( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - Abc_Obj_t * pNode; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "Currently can only be applied to a logic network.\n" ); - return 1; - } - - if ( argc != globalUtilOptind + 1 ) - { - fprintf( pErr, "Wrong number of auguments.\n" ); - goto usage; - } - - pNode = Abc_NtkFindNode( pNtk, argv[globalUtilOptind] ); - if ( pNode == NULL ) - { - fprintf( pErr, "Cannot find node \"%s\".\n", argv[globalUtilOptind] ); - return 1; - } - - pNtkRes = Abc_NtkCreateFromNode( pNtk, pNode ); -// pNtkRes = Abc_NtkDeriveFromBdd( pNtk->pManFunc, pNode->pData, NULL, NULL ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Splitting one node has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: node [-h] <name>\n" ); - fprintf( pErr, "\t replaces the current network by the network composed of one node\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\tname : the node name\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandTopmost( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, nLevels; - extern Abc_Ntk_t * Abc_NtkTopmost( Abc_Ntk_t * pNtk, int nLevels ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nLevels = 10; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Nh" ) ) != EOF ) - { - switch ( c ) - { - case 'N': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by an integer.\n" ); - goto usage; - } - nLevels = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nLevels < 0 ) - goto usage; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( stdout, "Currently only works for structurally hashed circuits.\n" ); - return 0; - } - - if ( Abc_NtkLatchNum(pNtk) > 0 ) - { - fprintf( stdout, "Currently can only works for combinational circuits.\n" ); - return 0; - } - if ( Abc_NtkPoNum(pNtk) != 1 ) - { - fprintf( stdout, "Currently expects a single-output miter.\n" ); - return 0; - } - - pNtkRes = Abc_NtkTopmost( pNtk, nLevels ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "The command has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: topmost [-N num] [-h]\n" ); - fprintf( pErr, "\t replaces the current network by several of its topmost levels\n" ); - fprintf( pErr, "\t-N num : max number of levels [default = %d]\n", nLevels ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\tname : the node name\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandTrim( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, nLevels; - extern Abc_Ntk_t * Abc_NtkTrim( Abc_Ntk_t * pNtk ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nLevels = 10; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Nh" ) ) != EOF ) - { - switch ( c ) - { -/* - case 'N': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by an integer.\n" ); - goto usage; - } - nLevels = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nLevels < 0 ) - goto usage; - break; -*/ - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkIsStrash(pNtk) ) - { - fprintf( stdout, "Currently only works for logic circuits.\n" ); - return 0; - } - - pNtkRes = Abc_NtkTrim( pNtk ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "The command has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: trim [-h]\n" ); - fprintf( pErr, "\t removes POs fed by PIs and constants, and PIs w/o fanout\n" ); -// fprintf( pErr, "\t-N num : max number of levels [default = %d]\n", nLevels ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandShortNames( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - Abc_NtkShortNames( pNtk ); - return 0; - -usage: - fprintf( pErr, "usage: short_names [-h]\n" ); - fprintf( pErr, "\t replaces PI/PO/latch names by short char strings\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandExdcFree( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( pNtk->pExdc == NULL ) - { - fprintf( pErr, "The network has no EXDC.\n" ); - return 1; - } - - Abc_NtkDelete( pNtk->pExdc ); - pNtk->pExdc = NULL; - - // replace the current network - pNtkRes = Abc_NtkDup( pNtk ); - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: exdc_free [-h]\n" ); - fprintf( pErr, "\t frees the EXDC network of the current network\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandExdcGet( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( pNtk->pExdc == NULL ) - { - fprintf( pErr, "The network has no EXDC.\n" ); - return 1; - } - - // replace the current network - pNtkRes = Abc_NtkDup( pNtk->pExdc ); - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: exdc_get [-h]\n" ); - fprintf( pErr, "\t replaces the current network by the EXDC of the current network\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandExdcSet( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr, * pFile; - Abc_Ntk_t * pNtk, * pNtkNew, * pNtkRes; - char * FileName; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( argc != globalUtilOptind + 1 ) - { - goto usage; - } - - // get the input file name - FileName = argv[globalUtilOptind]; - if ( (pFile = fopen( FileName, "r" )) == NULL ) - { - fprintf( pAbc->Err, "Cannot open input file \"%s\". ", FileName ); - if ( FileName = Extra_FileGetSimilarName( FileName, ".mv", ".blif", ".pla", ".eqn", ".bench" ) ) - fprintf( pAbc->Err, "Did you mean \"%s\"?", FileName ); - fprintf( pAbc->Err, "\n" ); - return 1; - } - fclose( pFile ); - - // set the new network - pNtkNew = Io_Read( FileName, Io_ReadFileType(FileName), 1 ); - if ( pNtkNew == NULL ) - { - fprintf( pAbc->Err, "Reading network from file has failed.\n" ); - return 1; - } - - // replace the EXDC - if ( pNtk->pExdc ) - { - Abc_NtkDelete( pNtk->pExdc ); - pNtk->pExdc = NULL; - } - pNtkRes = Abc_NtkDup( pNtk ); - pNtkRes->pExdc = pNtkNew; - - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: exdc_set [-h] <file>\n" ); - fprintf( pErr, "\t sets the network from file as EXDC for the current network\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\t<file> : file with the new EXDC network\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandCut( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - Cut_Params_t Params, * pParams = &Params; - Cut_Man_t * pCutMan; - Cut_Oracle_t * pCutOracle; - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fOracle; - extern Cut_Man_t * Abc_NtkCuts( Abc_Ntk_t * pNtk, Cut_Params_t * pParams ); - extern void Abc_NtkCutsOracle( Abc_Ntk_t * pNtk, Cut_Oracle_t * pCutOracle ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fOracle = 0; - memset( pParams, 0, sizeof(Cut_Params_t) ); - pParams->nVarsMax = 5; // the max cut size ("k" of the k-feasible cuts) - pParams->nKeepMax = 1000; // the max number of cuts kept at a node - pParams->fTruth = 0; // compute truth tables - pParams->fFilter = 1; // filter dominated cuts - pParams->fDrop = 0; // drop cuts on the fly - pParams->fDag = 0; // compute DAG cuts - pParams->fTree = 0; // compute tree cuts - pParams->fGlobal = 0; // compute global cuts - pParams->fLocal = 0; // compute local cuts - pParams->fFancy = 0; // compute something fancy - pParams->fMap = 0; // compute mapping delay - pParams->fVerbose = 0; // the verbosiness flag - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "KMtfdxyglzmvoh" ) ) != EOF ) - { - switch ( c ) - { - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by an integer.\n" ); - goto usage; - } - pParams->nVarsMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pParams->nVarsMax < 0 ) - goto usage; - break; - case 'M': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-M\" should be followed by an integer.\n" ); - goto usage; - } - pParams->nKeepMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pParams->nKeepMax < 0 ) - goto usage; - break; - case 't': - pParams->fTruth ^= 1; - break; - case 'f': - pParams->fFilter ^= 1; - break; - case 'd': - pParams->fDrop ^= 1; - break; - case 'x': - pParams->fDag ^= 1; - break; - case 'y': - pParams->fTree ^= 1; - break; - case 'g': - pParams->fGlobal ^= 1; - break; - case 'l': - pParams->fLocal ^= 1; - break; - case 'z': - pParams->fFancy ^= 1; - break; - case 'm': - pParams->fMap ^= 1; - break; - case 'v': - pParams->fVerbose ^= 1; - break; - case 'o': - fOracle ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Cut computation is available only for AIGs (run \"strash\").\n" ); - return 1; - } - if ( pParams->nVarsMax < CUT_SIZE_MIN || pParams->nVarsMax > CUT_SIZE_MAX ) - { - fprintf( pErr, "Can only compute the cuts for %d <= K <= %d.\n", CUT_SIZE_MIN, CUT_SIZE_MAX ); - return 1; - } - if ( pParams->fDag && pParams->fTree ) - { - fprintf( pErr, "Cannot compute both DAG cuts and tree cuts at the same time.\n" ); - return 1; - } - - if ( fOracle ) - pParams->fRecord = 1; - pCutMan = Abc_NtkCuts( pNtk, pParams ); - if ( fOracle ) - pCutOracle = Cut_OracleStart( pCutMan ); - Cut_ManStop( pCutMan ); - if ( fOracle ) - { - Abc_NtkCutsOracle( pNtk, pCutOracle ); - Cut_OracleStop( pCutOracle ); - } - return 0; - -usage: - fprintf( pErr, "usage: cut [-K num] [-M num] [-tfdxyzmvh]\n" ); - fprintf( pErr, "\t computes k-feasible cuts for the AIG\n" ); - fprintf( pErr, "\t-K num : max number of leaves (%d <= num <= %d) [default = %d]\n", CUT_SIZE_MIN, CUT_SIZE_MAX, pParams->nVarsMax ); - fprintf( pErr, "\t-M num : max number of cuts stored at a node [default = %d]\n", pParams->nKeepMax ); - fprintf( pErr, "\t-t : toggle truth table computation [default = %s]\n", pParams->fTruth? "yes": "no" ); - fprintf( pErr, "\t-f : toggle filtering of duplicated/dominated [default = %s]\n", pParams->fFilter? "yes": "no" ); - fprintf( pErr, "\t-d : toggle dropping when fanouts are done [default = %s]\n", pParams->fDrop? "yes": "no" ); - fprintf( pErr, "\t-x : toggle computing only DAG cuts [default = %s]\n", pParams->fDag? "yes": "no" ); - fprintf( pErr, "\t-y : toggle computing only tree cuts [default = %s]\n", pParams->fTree? "yes": "no" ); - fprintf( pErr, "\t-g : toggle computing only global cuts [default = %s]\n", pParams->fGlobal? "yes": "no" ); - fprintf( pErr, "\t-l : toggle computing only local cuts [default = %s]\n", pParams->fLocal? "yes": "no" ); - fprintf( pErr, "\t-z : toggle fancy computations [default = %s]\n", pParams->fFancy? "yes": "no" ); - fprintf( pErr, "\t-m : toggle delay-oriented FPGA mapping [default = %s]\n", pParams->fMap? "yes": "no" ); - fprintf( pErr, "\t-v : toggle printing verbose information [default = %s]\n", pParams->fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandScut( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - Cut_Params_t Params, * pParams = &Params; - Cut_Man_t * pCutMan; - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - extern Cut_Man_t * Abc_NtkSeqCuts( Abc_Ntk_t * pNtk, Cut_Params_t * pParams ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - memset( pParams, 0, sizeof(Cut_Params_t) ); - pParams->nVarsMax = 5; // the max cut size ("k" of the k-feasible cuts) - pParams->nKeepMax = 1000; // the max number of cuts kept at a node - pParams->fTruth = 0; // compute truth tables - pParams->fFilter = 1; // filter dominated cuts - pParams->fSeq = 1; // compute sequential cuts - pParams->fVerbose = 0; // the verbosiness flag - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "KMtvh" ) ) != EOF ) - { - switch ( c ) - { - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by an integer.\n" ); - goto usage; - } - pParams->nVarsMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pParams->nVarsMax < 0 ) - goto usage; - break; - case 'M': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-M\" should be followed by an integer.\n" ); - goto usage; - } - pParams->nKeepMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pParams->nKeepMax < 0 ) - goto usage; - break; - case 't': - pParams->fTruth ^= 1; - break; - case 'v': - pParams->fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } -/* - if ( !Abc_NtkIsSeq(pNtk) ) - { - fprintf( pErr, "Sequential cuts can be computed for sequential AIGs (run \"seq\").\n" ); - return 1; - } -*/ - if ( pParams->nVarsMax < CUT_SIZE_MIN || pParams->nVarsMax > CUT_SIZE_MAX ) - { - fprintf( pErr, "Can only compute the cuts for %d <= K <= %d.\n", CUT_SIZE_MIN, CUT_SIZE_MAX ); - return 1; - } - - pCutMan = Abc_NtkSeqCuts( pNtk, pParams ); - Cut_ManStop( pCutMan ); - return 0; - -usage: - fprintf( pErr, "usage: scut [-K num] [-M num] [-tvh]\n" ); - fprintf( pErr, "\t computes k-feasible cuts for the sequential AIG\n" ); - fprintf( pErr, "\t-K num : max number of leaves (%d <= num <= %d) [default = %d]\n", CUT_SIZE_MIN, CUT_SIZE_MAX, pParams->nVarsMax ); - fprintf( pErr, "\t-M num : max number of cuts stored at a node [default = %d]\n", pParams->nKeepMax ); - fprintf( pErr, "\t-t : toggle truth table computation [default = %s]\n", pParams->fTruth? "yes": "no" ); - fprintf( pErr, "\t-v : toggle printing verbose information [default = %s]\n", pParams->fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandEspresso( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fVerbose; - extern void Abc_NtkEspresso( Abc_Ntk_t * pNtk, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "vh" ) ) != EOF ) - { - switch ( c ) - { - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "SOP minimization is possible for logic networks (run \"renode\").\n" ); - return 1; - } - Abc_NtkEspresso( pNtk, fVerbose ); - return 0; - -usage: - fprintf( pErr, "usage: espresso [-vh]\n" ); - fprintf( pErr, "\t minimizes SOPs of the local functions using Espresso\n" ); - fprintf( pErr, "\t-v : prints verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandGen( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int nVars; - int fAdder; - int fSorter; - int fMesh; - int fFpga; - int fVerbose; - char * FileName; - extern void Abc_GenAdder( char * pFileName, int nVars ); - extern void Abc_GenSorter( char * pFileName, int nVars ); - extern void Abc_GenMesh( char * pFileName, int nVars ); - extern void Abc_GenFpga( char * pFileName, int nLutSize, int nLuts, int nVars ); - - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nVars = 8; - fAdder = 0; - fSorter = 0; - fMesh = 0; - fFpga = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Nasmfvh" ) ) != EOF ) - { - switch ( c ) - { - case 'N': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by an integer.\n" ); - goto usage; - } - nVars = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nVars < 0 ) - goto usage; - break; - case 'a': - fAdder ^= 1; - break; - case 's': - fSorter ^= 1; - break; - case 'm': - fMesh ^= 1; - break; - case 'f': - fFpga ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( argc != globalUtilOptind + 1 ) - { - goto usage; - } - - // get the input file name - FileName = argv[globalUtilOptind]; - if ( fAdder ) - Abc_GenAdder( FileName, nVars ); - else if ( fSorter ) - Abc_GenSorter( FileName, nVars ); - else if ( fMesh ) - Abc_GenMesh( FileName, nVars ); - else if ( fFpga ) - Abc_GenFpga( FileName, 4, 3, 10 ); -// Abc_GenFpga( FileName, 2, 2, 3 ); -// Abc_GenFpga( FileName, 3, 2, 5 ); - else - printf( "Type of circuit is not specified.\n" ); - return 0; - -usage: - fprintf( pErr, "usage: gen [-N] [-asmfvh] <file>\n" ); - fprintf( pErr, "\t generates simple circuits\n" ); - fprintf( pErr, "\t-N num : the number of variables [default = %d]\n", nVars ); - fprintf( pErr, "\t-a : generate ripple-carry adder [default = %s]\n", fAdder? "yes": "no" ); - fprintf( pErr, "\t-s : generate a sorter [default = %s]\n", fSorter? "yes": "no" ); - fprintf( pErr, "\t-m : generate a mesh [default = %s]\n", fMesh? "yes": "no" ); - fprintf( pErr, "\t-f : generate a LUT FPGA structure [default = %s]\n", fFpga? "yes": "no" ); - fprintf( pErr, "\t-v : prints verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\t<file> : output file name\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandXyz( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes;//, * pNtkTemp; - int c; - int nLutMax; - int nPlaMax; - int RankCost; - int fFastMode; - int fRewriting; - int fSynthesis; - int fVerbose; -// extern Abc_Ntk_t * Abc_NtkXyz( Abc_Ntk_t * pNtk, int nPlaMax, bool fEsop, bool fSop, bool fInvs, bool fVerbose ); - extern void * Abc_NtkPlayer( void * pNtk, int nLutMax, int nPlaMax, int RankCost, int fFastMode, int fRewriting, int fSynthesis, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nLutMax = 8; - nPlaMax = 128; - RankCost = 96000; - fFastMode = 1; - fRewriting = 0; - fSynthesis = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "LPRfrsvh" ) ) != EOF ) - { - switch ( c ) - { - case 'L': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-L\" should be followed by an integer.\n" ); - goto usage; - } - nLutMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nLutMax < 0 ) - goto usage; - break; - case 'P': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-P\" should be followed by an integer.\n" ); - goto usage; - } - nPlaMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nPlaMax < 0 ) - goto usage; - break; - case 'R': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-R\" should be followed by an integer.\n" ); - goto usage; - } - RankCost = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( RankCost < 0 ) - goto usage; - break; - case 'f': - fFastMode ^= 1; - break; - case 'r': - fRewriting ^= 1; - break; - case 's': - fSynthesis ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Only works for strashed networks.\n" ); - return 1; - } -/* - if ( nLutMax < 2 || nLutMax > 12 || nPlaMax < 8 || nPlaMax > 128 ) - { - fprintf( pErr, "Incorrect LUT/PLA parameters.\n" ); - return 1; - } -*/ - // run the command -// pNtkRes = Abc_NtkXyz( pNtk, nPlaMax, 1, 0, fInvs, fVerbose ); -/* - if ( !Abc_NtkIsStrash(pNtk) ) - { - pNtkTemp = Abc_NtkStrash( pNtk, 0, 1, 0 ); - pNtkRes = Abc_NtkPlayer( pNtkTemp, nLutMax, nPlaMax, RankCost, fFastMode, fRewriting, fSynthesis, fVerbose ); - Abc_NtkDelete( pNtkTemp ); - } - else - pNtkRes = Abc_NtkPlayer( pNtk, nLutMax, nPlaMax, RankCost, fFastMode, fRewriting, fSynthesis, fVerbose ); -*/ - pNtkRes = NULL; - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: xyz [-L num] [-P num] [-R num] [-frsvh]\n" ); - fprintf( pErr, "\t specilized LUT/PLA decomposition\n" ); - fprintf( pErr, "\t-L num : maximum number of LUT inputs (2<=num<=8) [default = %d]\n", nLutMax ); - fprintf( pErr, "\t-P num : maximum number of PLA inputs/cubes (8<=num<=128) [default = %d]\n", nPlaMax ); - fprintf( pErr, "\t-R num : maximum are of one decomposition rank [default = %d]\n", RankCost ); - fprintf( pErr, "\t-f : toggle using fast LUT mapping mode [default = %s]\n", fFastMode? "yes": "no" ); - fprintf( pErr, "\t-r : toggle using one pass of AIG rewriting [default = %s]\n", fRewriting? "yes": "no" ); - fprintf( pErr, "\t-s : toggle using synthesis by AIG rewriting [default = %s]\n", fSynthesis? "yes": "no" ); - fprintf( pErr, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandDouble( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - int nFrames; - int fVerbose; - extern Abc_Ntk_t * Abc_NtkDouble( Abc_Ntk_t * pNtk ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nFrames = 50; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "vh" ) ) != EOF ) - { - switch ( c ) - { - case 'F': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-F\" should be followed by an integer.\n" ); - goto usage; - } - nFrames = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nFrames < 0 ) - goto usage; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsSopLogic(pNtk) ) - { - fprintf( pErr, "Only works for logic SOP networks.\n" ); - return 1; - } - - pNtkRes = Abc_NtkDouble( pNtk ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: double [-vh]\n" ); - fprintf( pErr, "\t puts together two parallel copies of the current network\n" ); -// fprintf( pErr, "\t-F num : the number of frames to simulate [default = %d]\n", nFrames ); - fprintf( pErr, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandTest( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - int nLevels; - int fVerbose; -// extern Abc_Ntk_t * Abc_NtkNewAig( Abc_Ntk_t * pNtk ); -// extern Abc_Ntk_t * Abc_NtkIvy( Abc_Ntk_t * pNtk ); -// extern void Abc_NtkMaxFlowTest( Abc_Ntk_t * pNtk ); -// extern int Pr_ManProofTest( char * pFileName ); - extern void Abc_NtkCompareSupports( Abc_Ntk_t * pNtk ); - extern void Abc_NtkCompareCones( Abc_Ntk_t * pNtk ); - extern Abc_Ntk_t * Abc_NtkDar( Abc_Ntk_t * pNtk ); - extern Abc_Ntk_t * Abc_NtkDarToCnf( Abc_Ntk_t * pNtk, char * pFileName ); - extern Abc_Ntk_t * Abc_NtkFilter( Abc_Ntk_t * pNtk ); - extern Abc_Ntk_t * Abc_NtkDarRetime( Abc_Ntk_t * pNtk, int nStepsMax, int fVerbose ); - extern Abc_Ntk_t * Abc_NtkPcmTest( Abc_Ntk_t * pNtk, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fVerbose = 0; - nLevels = 1000; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Nvh" ) ) != EOF ) - { - switch ( c ) - { - case 'N': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by an integer.\n" ); - goto usage; - } - nLevels = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nLevels < 0 ) - goto usage; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } -/* - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkIsSeq(pNtk) ) - { - fprintf( pErr, "Only works for non-sequential networks.\n" ); - return 1; - } -*/ - -// Abc_NtkTestEsop( pNtk ); -// Abc_NtkTestSop( pNtk ); -// printf( "This command is currently not used.\n" ); - // run the command -// pNtkRes = Abc_NtkMiterForCofactors( pNtk, 0, 0, -1 ); -// pNtkRes = Abc_NtkNewAig( pNtk ); - -/* - pNtkRes = NULL; - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); -*/ - -// if ( Cut_CellIsRunning() ) -// Cut_CellDumpToFile(); -// else -// Cut_CellPrecompute(); -// Cut_CellLoad(); -/* - { - Abc_Ntk_t * pNtkRes; - extern Abc_Ntk_t * Abc_NtkTopmost( Abc_Ntk_t * pNtk, int nLevels ); - pNtkRes = Abc_NtkTopmost( pNtk, nLevels ); - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - } -*/ -// Abc_NtkSimulteBuggyMiter( pNtk ); - -// Rwr_Temp(); -// Abc_MvExperiment(); -// Ivy_TruthTest(); - - -// Ivy_TruthEstimateNodesTest(); -/* - pNtkRes = Abc_NtkIvy( pNtk ); -// pNtkRes = Abc_NtkPlayer( pNtk, nLevels, 0 ); -// pNtkRes = NULL; - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); -*/ -// Abc_NtkMaxFlowTest( pNtk ); -// Pr_ManProofTest( "trace.cnf" ); - -// Abc_NtkCompareSupports( pNtk ); -// Abc_NtkCompareCones( pNtk ); -/* - { - extern Vec_Vec_t * Abc_NtkPartitionSmart( Abc_Ntk_t * pNtk, int fVerbose ); - Vec_Vec_t * vParts; - vParts = Abc_NtkPartitionSmart( pNtk, 1 ); - Vec_VecFree( vParts ); - } -*/ -// Abc_Ntk4VarTable( pNtk ); -// Dar_NtkGenerateArrays( pNtk ); -// Dar_ManDeriveCnfTest2(); -/* - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Network should be strashed. Command has failed.\n" ); - return 1; - } -*/ -/* - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( stdout, "Currently only works for structurally hashed circuits.\n" ); - return 0; - } -*/ - if ( Abc_NtkIsStrash(pNtk) ) - { - fprintf( stdout, "Currently only works for logic circuits.\n" ); - return 0; - } - -// pNtkRes = Abc_NtkDar( pNtk ); -// pNtkRes = Abc_NtkDarRetime( pNtk, nLevels, 1 ); - pNtkRes = Abc_NtkPcmTest( pNtk, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; -usage: - fprintf( pErr, "usage: test [-h]\n" ); - fprintf( pErr, "\t testbench for new procedures\n" ); - fprintf( pErr, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandQuaVar( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, iVar, fUniv, fVerbose, RetValue; - extern int Abc_NtkQuantify( Abc_Ntk_t * pNtk, int fUniv, int iVar, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - iVar = 0; - fUniv = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Iuvh" ) ) != EOF ) - { - switch ( c ) - { - case 'I': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-I\" should be followed by an integer.\n" ); - goto usage; - } - iVar = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( iVar < 0 ) - goto usage; - break; - case 'u': - fUniv ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkGetChoiceNum( pNtk ) ) - { - fprintf( pErr, "This command cannot be applied to an AIG with choice nodes.\n" ); - return 1; - } - - // get the strashed network - pNtkRes = Abc_NtkStrash( pNtk, 0, 1, 0 ); - RetValue = Abc_NtkQuantify( pNtkRes, fUniv, iVar, fVerbose ); - // clean temporary storage for the cofactors - Abc_NtkCleanData( pNtkRes ); - Abc_AigCleanup( pNtkRes->pManFunc ); - // check the result - if ( !RetValue ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: qvar [-I num] [-uvh]\n" ); - fprintf( pErr, "\t quantifies one variable using the AIG\n" ); - fprintf( pErr, "\t-I num : the zero-based index of a variable to quantify [default = %d]\n", iVar ); - fprintf( pErr, "\t-u : toggle universal quantification [default = %s]\n", fUniv? "yes": "no" ); - fprintf( pErr, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandQuaRel( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, iVar, fInputs, fVerbose; - extern Abc_Ntk_t * Abc_NtkTransRel( Abc_Ntk_t * pNtk, int fInputs, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - iVar = 0; - fInputs = 1; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Iqvh" ) ) != EOF ) - { - switch ( c ) - { - case 'I': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-I\" should be followed by an integer.\n" ); - goto usage; - } - iVar = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( iVar < 0 ) - goto usage; - break; - case 'q': - fInputs ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkGetChoiceNum( pNtk ) ) - { - fprintf( pErr, "This command cannot be applied to an AIG with choice nodes.\n" ); - return 1; - } - if ( Abc_NtkIsComb(pNtk) ) - { - fprintf( pErr, "This command works only for sequential circuits.\n" ); - return 1; - } - - // get the strashed network - if ( !Abc_NtkIsStrash(pNtk) ) - { - pNtk = Abc_NtkStrash( pNtk, 0, 1, 0 ); - pNtkRes = Abc_NtkTransRel( pNtk, fInputs, fVerbose ); - Abc_NtkDelete( pNtk ); - } - else - pNtkRes = Abc_NtkTransRel( pNtk, fInputs, fVerbose ); - // check if the result is available - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: qrel [-qvh]\n" ); - fprintf( pErr, "\t computes transition relation of the sequential network\n" ); -// fprintf( pErr, "\t-I num : the zero-based index of a variable to quantify [default = %d]\n", iVar ); - fprintf( pErr, "\t-q : perform quantification of inputs [default = %s]\n", fInputs? "yes": "no" ); - fprintf( pErr, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandQuaReach( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, nIters, fVerbose; - extern Abc_Ntk_t * Abc_NtkReachability( Abc_Ntk_t * pNtk, int nIters, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nIters = 256; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Ivh" ) ) != EOF ) - { - switch ( c ) - { - case 'I': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-I\" should be followed by an integer.\n" ); - goto usage; - } - nIters = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nIters < 0 ) - goto usage; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkGetChoiceNum( pNtk ) ) - { - fprintf( pErr, "This command cannot be applied to an AIG with choice nodes.\n" ); - return 1; - } - if ( !Abc_NtkIsComb(pNtk) ) - { - fprintf( pErr, "This command works only for combinational transition relations.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - if ( Abc_NtkPoNum(pNtk) > 1 ) - { - fprintf( pErr, "The transition relation should have one output.\n" ); - return 1; - } - if ( Abc_NtkPiNum(pNtk) % 2 != 0 ) - { - fprintf( pErr, "The transition relation should have an even number of inputs.\n" ); - return 1; - } - - pNtkRes = Abc_NtkReachability( pNtk, nIters, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: qreach [-I num] [-vh]\n" ); - fprintf( pErr, "\t computes unreachable states using AIG-based quantification\n" ); - fprintf( pErr, "\t assumes that the current network is a transition relation\n" ); - fprintf( pErr, "\t assumes that the initial state is composed of all zeros\n" ); - fprintf( pErr, "\t-I num : the number of image computations to perform [default = %d]\n", nIters ); - fprintf( pErr, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandIStrash( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes, * pNtkTemp; - int c; - extern Abc_Ntk_t * Abc_NtkIvyStrash( Abc_Ntk_t * pNtk ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - pNtkTemp = Abc_NtkStrash( pNtk, 0, 1, 0 ); - pNtkRes = Abc_NtkIvyStrash( pNtkTemp ); - Abc_NtkDelete( pNtkTemp ); - } - else - pNtkRes = Abc_NtkIvyStrash( pNtk ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: istrash [-h]\n" ); - fprintf( pErr, "\t perform sequential structural hashing\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandICut( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c, nInputs; - extern void Abc_NtkIvyCuts( Abc_Ntk_t * pNtk, int nInputs ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nInputs = 5; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Kh" ) ) != EOF ) - { - switch ( c ) - { - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by an integer.\n" ); - goto usage; - } - nInputs = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nInputs < 0 ) - goto usage; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - - Abc_NtkIvyCuts( pNtk, nInputs ); - return 0; - -usage: - fprintf( pErr, "usage: icut [-K num] [-h]\n" ); - fprintf( pErr, "\t computes sequential cuts of the given size\n" ); - fprintf( pErr, "\t-K num : the number of cut inputs (2 <= num <= 6) [default = %d]\n", nInputs ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandIRewrite( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, fUpdateLevel, fUseZeroCost, fVerbose; - extern Abc_Ntk_t * Abc_NtkIvyRewrite( Abc_Ntk_t * pNtk, int fUpdateLevel, int fUseZeroCost, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fUpdateLevel = 1; - fUseZeroCost = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "lzvh" ) ) != EOF ) - { - switch ( c ) - { - case 'l': - fUpdateLevel ^= 1; - break; - case 'z': - fUseZeroCost ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - - pNtkRes = Abc_NtkIvyRewrite( pNtk, fUpdateLevel, fUseZeroCost, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: irw [-lzvh]\n" ); - fprintf( pErr, "\t perform combinational AIG rewriting\n" ); - fprintf( pErr, "\t-l : toggle preserving the number of levels [default = %s]\n", fUpdateLevel? "yes": "no" ); - fprintf( pErr, "\t-z : toggle using zero-cost replacements [default = %s]\n", fUseZeroCost? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandDRewrite( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - Dar_RwrPar_t Pars, * pPars = &Pars; - int c; - - extern Abc_Ntk_t * Abc_NtkDRewrite( Abc_Ntk_t * pNtk, Dar_RwrPar_t * pPars ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Dar_ManDefaultRwrParams( pPars ); - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "CNflzvwh" ) ) != EOF ) - { - switch ( c ) - { - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - pPars->nCutsMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nCutsMax < 0 ) - goto usage; - break; - case 'N': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by an integer.\n" ); - goto usage; - } - pPars->nSubgMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nSubgMax < 0 ) - goto usage; - break; - case 'f': - pPars->fFanout ^= 1; - break; - case 'l': - pPars->fUpdateLevel ^= 1; - break; - case 'z': - pPars->fUseZeros ^= 1; - break; - case 'v': - pPars->fVerbose ^= 1; - break; - case 'w': - pPars->fVeryVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - pNtkRes = Abc_NtkDRewrite( pNtk, pPars ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: drw [-C num] [-N num] [-flzvwh]\n" ); - fprintf( pErr, "\t performs combinational AIG rewriting\n" ); - fprintf( pErr, "\t-C num : the max number of cuts at a node [default = %d]\n", pPars->nCutsMax ); - fprintf( pErr, "\t-N num : the max number of subgraphs tried [default = %d]\n", pPars->nSubgMax ); - fprintf( pErr, "\t-f : toggle representing fanouts [default = %s]\n", pPars->fFanout? "yes": "no" ); - fprintf( pErr, "\t-l : toggle preserving the number of levels [default = %s]\n", pPars->fUpdateLevel? "yes": "no" ); - fprintf( pErr, "\t-z : toggle using zero-cost replacements [default = %s]\n", pPars->fUseZeros? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", pPars->fVerbose? "yes": "no" ); - fprintf( pErr, "\t-w : toggle very verbose printout [default = %s]\n", pPars->fVeryVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandDRefactor( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - Dar_RefPar_t Pars, * pPars = &Pars; - int c; - - extern Abc_Ntk_t * Abc_NtkDRefactor( Abc_Ntk_t * pNtk, Dar_RefPar_t * pPars ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Dar_ManDefaultRefParams( pPars ); - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "MKCelzvwh" ) ) != EOF ) - { - switch ( c ) - { - case 'M': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - pPars->nMffcMin = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nMffcMin < 0 ) - goto usage; - break; - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by an integer.\n" ); - goto usage; - } - pPars->nLeafMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nLeafMax < 0 ) - goto usage; - break; - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - pPars->nCutsMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nCutsMax < 0 ) - goto usage; - break; - case 'e': - pPars->fExtend ^= 1; - break; - case 'l': - pPars->fUpdateLevel ^= 1; - break; - case 'z': - pPars->fUseZeros ^= 1; - break; - case 'v': - pPars->fVerbose ^= 1; - break; - case 'w': - pPars->fVeryVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - if ( pPars->nLeafMax < 4 || pPars->nLeafMax > 15 ) - { - fprintf( pErr, "This command only works for cut sizes 4 <= K <= 15.\n" ); - return 1; - } - pNtkRes = Abc_NtkDRefactor( pNtk, pPars ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: drf [-M num] [-K num] [-C num] [-elzvwh]\n" ); - fprintf( pErr, "\t performs combinational AIG refactoring\n" ); - fprintf( pErr, "\t-M num : the min MFFC size to attempt refactoring [default = %d]\n", pPars->nMffcMin ); - fprintf( pErr, "\t-K num : the max number of cuts leaves [default = %d]\n", pPars->nLeafMax ); - fprintf( pErr, "\t-C num : the max number of cuts to try at a node [default = %d]\n", pPars->nCutsMax ); - fprintf( pErr, "\t-e : toggle extending tbe cut below MFFC [default = %s]\n", pPars->fExtend? "yes": "no" ); - fprintf( pErr, "\t-l : toggle preserving the number of levels [default = %s]\n", pPars->fUpdateLevel? "yes": "no" ); - fprintf( pErr, "\t-z : toggle using zero-cost replacements [default = %s]\n", pPars->fUseZeros? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", pPars->fVerbose? "yes": "no" ); - fprintf( pErr, "\t-w : toggle very verbose printout [default = %s]\n", pPars->fVeryVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandDCompress2( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int fBalance, fVerbose, fUpdateLevel, c; - - extern Abc_Ntk_t * Abc_NtkDCompress2( Abc_Ntk_t * pNtk, int fBalance, int fUpdateLevel, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fBalance = 0; - fVerbose = 0; - fUpdateLevel = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "blvh" ) ) != EOF ) - { - switch ( c ) - { - case 'b': - fBalance ^= 1; - break; - case 'l': - fUpdateLevel ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - pNtkRes = Abc_NtkDCompress2( pNtk, fBalance, fUpdateLevel, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: dcompress2 [-blvh]\n" ); - fprintf( pErr, "\t performs combinational AIG optimization\n" ); - fprintf( pErr, "\t-b : toggle internal balancing [default = %s]\n", fBalance? "yes": "no" ); - fprintf( pErr, "\t-l : toggle updating level [default = %s]\n", fUpdateLevel? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandDChoice( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int fBalance, fVerbose, fUpdateLevel, c; - - extern Abc_Ntk_t * Abc_NtkDChoice( Abc_Ntk_t * pNtk, int fBalance, int fUpdateLevel, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fBalance = 1; - fUpdateLevel = 1; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "blvh" ) ) != EOF ) - { - switch ( c ) - { - case 'b': - fBalance ^= 1; - break; - case 'l': - fUpdateLevel ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - pNtkRes = Abc_NtkDChoice( pNtk, fBalance, fUpdateLevel, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: dchoice [-blvh]\n" ); - fprintf( pErr, "\t performs partitioned choicing using a new AIG package\n" ); - fprintf( pErr, "\t-b : toggle internal balancing [default = %s]\n", fBalance? "yes": "no" ); - fprintf( pErr, "\t-l : toggle updating level [default = %s]\n", fUpdateLevel? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandDrwsat( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int fBalance, fVerbose, c; - - extern Abc_Ntk_t * Abc_NtkDrwsat( Abc_Ntk_t * pNtk, int fBalance, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fBalance = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "bvh" ) ) != EOF ) - { - switch ( c ) - { - case 'b': - fBalance ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - pNtkRes = Abc_NtkDrwsat( pNtk, fBalance, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: drwsat [-bvh]\n" ); - fprintf( pErr, "\t performs combinational AIG optimization for SAT\n" ); - fprintf( pErr, "\t-b : toggle internal balancing [default = %s]\n", fBalance? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandIRewriteSeq( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, fUpdateLevel, fUseZeroCost, fVerbose; - extern Abc_Ntk_t * Abc_NtkIvyRewriteSeq( Abc_Ntk_t * pNtk, int fUseZeroCost, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fUpdateLevel = 0; - fUseZeroCost = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "lzvh" ) ) != EOF ) - { - switch ( c ) - { - case 'l': - fUpdateLevel ^= 1; - break; - case 'z': - fUseZeroCost ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - - pNtkRes = Abc_NtkIvyRewriteSeq( pNtk, fUseZeroCost, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: irws [-zvh]\n" ); - fprintf( pErr, "\t perform sequential AIG rewriting\n" ); -// fprintf( pErr, "\t-l : toggle preserving the number of levels [default = %s]\n", fUpdateLevel? "yes": "no" ); - fprintf( pErr, "\t-z : toggle using zero-cost replacements [default = %s]\n", fUseZeroCost? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandIResyn( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, fUpdateLevel, fVerbose; - extern Abc_Ntk_t * Abc_NtkIvyResyn( Abc_Ntk_t * pNtk, int fUpdateLevel, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fUpdateLevel = 1; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "lzvh" ) ) != EOF ) - { - switch ( c ) - { - case 'l': - fUpdateLevel ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - - pNtkRes = Abc_NtkIvyResyn( pNtk, fUpdateLevel, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: iresyn [-lvh]\n" ); - fprintf( pErr, "\t performs combinational resynthesis\n" ); - fprintf( pErr, "\t-l : toggle preserving the number of levels [default = %s]\n", fUpdateLevel? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandISat( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, fUpdateLevel, fVerbose; - int nConfLimit; - - extern Abc_Ntk_t * Abc_NtkIvySat( Abc_Ntk_t * pNtk, int nConfLimit, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nConfLimit = 100000; - fUpdateLevel = 1; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Clzvh" ) ) != EOF ) - { - switch ( c ) - { - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - nConfLimit = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nConfLimit < 0 ) - goto usage; - break; - case 'l': - fUpdateLevel ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - - pNtkRes = Abc_NtkIvySat( pNtk, nConfLimit, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: isat [-C num] [-vh]\n" ); - fprintf( pErr, "\t tries to prove the miter constant 0\n" ); - fprintf( pErr, "\t-C num : limit on the number of conflicts [default = %d]\n", nConfLimit ); -// fprintf( pErr, "\t-l : toggle preserving the number of levels [default = %s]\n", fUpdateLevel? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandIFraig( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, fProve, fVerbose, fDoSparse; - int nConfLimit; - - extern Abc_Ntk_t * Abc_NtkIvyFraig( Abc_Ntk_t * pNtk, int nConfLimit, int fDoSparse, int fProve, int fTransfer, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nConfLimit = 100; - fDoSparse = 0; - fProve = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Cspvh" ) ) != EOF ) - { - switch ( c ) - { - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - nConfLimit = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nConfLimit < 0 ) - goto usage; - break; - case 's': - fDoSparse ^= 1; - break; - case 'p': - fProve ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - - pNtkRes = Abc_NtkIvyFraig( pNtk, nConfLimit, fDoSparse, fProve, 0, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: ifraig [-C num] [-spvh]\n" ); - fprintf( pErr, "\t performs fraiging using a new method\n" ); - fprintf( pErr, "\t-C num : limit on the number of conflicts [default = %d]\n", nConfLimit ); - fprintf( pErr, "\t-s : toggle considering sparse functions [default = %s]\n", fDoSparse? "yes": "no" ); - fprintf( pErr, "\t-p : toggle proving the miter outputs [default = %s]\n", fProve? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandDFraig( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, nConfLimit, fDoSparse, fProve, fSpeculate, fChoicing, fVerbose; - - extern Abc_Ntk_t * Abc_NtkDarFraig( Abc_Ntk_t * pNtk, int nConfLimit, int fDoSparse, int fProve, int fTransfer, int fSpeculate, int fChoicing, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nConfLimit = 100; - fDoSparse = 1; - fProve = 0; - fSpeculate = 0; - fChoicing = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Csprcvh" ) ) != EOF ) - { - switch ( c ) - { - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - nConfLimit = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nConfLimit < 0 ) - goto usage; - break; - case 's': - fDoSparse ^= 1; - break; - case 'p': - fProve ^= 1; - break; - case 'r': - fSpeculate ^= 1; - break; - case 'c': - fChoicing ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - - pNtkRes = Abc_NtkDarFraig( pNtk, nConfLimit, fDoSparse, fProve, 0, fSpeculate, fChoicing, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: dfraig [-C num] [-sprcvh]\n" ); - fprintf( pErr, "\t performs fraiging using a new method\n" ); - fprintf( pErr, "\t-C num : limit on the number of conflicts [default = %d]\n", nConfLimit ); - fprintf( pErr, "\t-s : toggle considering sparse functions [default = %s]\n", fDoSparse? "yes": "no" ); - fprintf( pErr, "\t-p : toggle proving the miter outputs [default = %s]\n", fProve? "yes": "no" ); - fprintf( pErr, "\t-r : toggle speculative reduction [default = %s]\n", fSpeculate? "yes": "no" ); - fprintf( pErr, "\t-c : toggle accumulation of choices [default = %s]\n", fChoicing? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandCSweep( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, nCutsMax, nLeafMax, fVerbose; - - extern Abc_Ntk_t * Abc_NtkCSweep( Abc_Ntk_t * pNtk, int nCutsMax, int nLeafMax, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nCutsMax = 8; - nLeafMax = 6; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "CKvh" ) ) != EOF ) - { - switch ( c ) - { - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - nCutsMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nCutsMax < 0 ) - goto usage; - break; - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by an integer.\n" ); - goto usage; - } - nLeafMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nLeafMax < 0 ) - goto usage; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( nCutsMax < 2 ) - { - fprintf( pErr, "The number of cuts cannot be less than 2.\n" ); - return 1; - } - - if ( nLeafMax < 3 || nLeafMax > 16 ) - { - fprintf( pErr, "The number of leaves is infeasible.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - - pNtkRes = Abc_NtkCSweep( pNtk, nCutsMax, nLeafMax, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: csweep [-C num] [-K num] [-vh]\n" ); - fprintf( pErr, "\t performs cut sweeping using a new method\n" ); - fprintf( pErr, "\t-C num : limit on the number of cuts (C >= 2) [default = %d]\n", nCutsMax ); - fprintf( pErr, "\t-K num : limit on the cut size (3 <= K <= 16) [default = %d]\n", nLeafMax ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandIProve( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - Prove_Params_t Params, * pParams = &Params; - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkTemp; - int c, clk, RetValue; - - extern int Abc_NtkIvyProve( Abc_Ntk_t ** ppNtk, void * pPars ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Prove_ParamsSetDefault( pParams ); - pParams->fUseRewriting = 1; - pParams->fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "rvh" ) ) != EOF ) - { - switch ( c ) - { - case 'r': - pParams->fUseRewriting ^= 1; - break; - case 'v': - pParams->fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - clk = clock(); - - if ( Abc_NtkIsStrash(pNtk) ) - pNtkTemp = Abc_NtkDup( pNtk ); - else - pNtkTemp = Abc_NtkStrash( pNtk, 0, 0, 0 ); - - RetValue = Abc_NtkIvyProve( &pNtkTemp, pParams ); - - // verify that the pattern is correct - if ( RetValue == 0 ) - { - int * pSimInfo = Abc_NtkVerifySimulatePattern( pNtk, pNtkTemp->pModel ); - if ( pSimInfo[0] != 1 ) - printf( "ERROR in Abc_NtkMiterProve(): Generated counter-example is invalid.\n" ); - free( pSimInfo ); - } - - if ( RetValue == -1 ) - printf( "UNDECIDED " ); - else if ( RetValue == 0 ) - printf( "SATISFIABLE " ); - else - printf( "UNSATISFIABLE " ); - //printf( "\n" ); - - PRT( "Time", clock() - clk ); - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkTemp ); - return 0; - -usage: - fprintf( pErr, "usage: iprove [-rvh]\n" ); - fprintf( pErr, "\t performs CEC using a new method\n" ); - fprintf( pErr, "\t-r : toggle AIG rewriting [default = %s]\n", pParams->fUseRewriting? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", pParams->fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandHaig( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, fUseZeroCost, fVerbose, nIters; - extern Abc_Ntk_t * Abc_NtkIvyHaig( Abc_Ntk_t * pNtk, int nIters, int fUseZeroCost, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nIters = 2; - fUseZeroCost = 0; - fVerbose = 1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Izvh" ) ) != EOF ) - { - switch ( c ) - { - case 'I': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-I\" should be followed by a positive integer.\n" ); - goto usage; - } - nIters = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nIters < 0 ) - goto usage; - break; - case 'z': - fUseZeroCost ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for strashed networks.\n" ); - return 1; - } - - pNtkRes = Abc_NtkIvyHaig( pNtk, nIters, fUseZeroCost, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: haig [-Izvh]\n" ); - fprintf( pErr, "\t prints HAIG stats after sequential rewriting\n" ); - fprintf( pErr, "\t-I num : the number of rewriting iterations [default = %d]\n", nIters ); - fprintf( pErr, "\t-z : toggle zero-cost replacements [default = %s]\n", fUseZeroCost? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandMini( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - extern Abc_Ntk_t * Abc_NtkMiniBalance( Abc_Ntk_t * pNtk ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Only works for combinatinally strashed AIG networks.\n" ); - return 1; - } - - pNtkRes = Abc_NtkMiniBalance( pNtk ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Command has failed.\n" ); - return 0; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: mini [-h]\n" ); - fprintf( pErr, "\t perform balancing using new package\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandBmc( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int nFrames; - int fInit; - int fVerbose; - - extern void Abc_NtkBmc( Abc_Ntk_t * pNtk, int nFrames, int fInit, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nFrames = 5; - fInit = 0; - fVerbose = 1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Kivh" ) ) != EOF ) - { - switch ( c ) - { - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-R\" should be followed by an integer.\n" ); - goto usage; - } - nFrames = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nFrames < 0 ) - goto usage; - break; - case 'i': - fInit ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkIsStrash(pNtk) ) - Abc_NtkBmc( pNtk, nFrames, fInit, fVerbose ); - else - { - pNtk = Abc_NtkStrash( pNtk, 0, 1, 0 ); - Abc_NtkBmc( pNtk, nFrames, fInit, fVerbose ); - Abc_NtkDelete( pNtk ); - } - return 0; - -usage: - fprintf( pErr, "usage: _bmc [-K num] [-ivh]\n" ); - fprintf( pErr, "\t perform bounded model checking\n" ); - fprintf( pErr, "\t-K num : number of time frames [default = %d]\n", nFrames ); - fprintf( pErr, "\t-i : toggle initialization of the first frame [default = %s]\n", fInit? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandQbf( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int nPars; - int fVerbose; - - extern void Abc_NtkQbf( Abc_Ntk_t * pNtk, int nPars, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nPars = -1; - fVerbose = 1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Pvh" ) ) != EOF ) - { - switch ( c ) - { - case 'P': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-P\" should be followed by an integer.\n" ); - goto usage; - } - nPars = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nPars < 0 ) - goto usage; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsComb(pNtk) ) - { - fprintf( pErr, "Works only for combinational networks.\n" ); - return 1; - } - if ( Abc_NtkPoNum(pNtk) != 1 ) - { - fprintf( pErr, "The miter should have one primary output.\n" ); - return 1; - } - if ( !(nPars > 0 && nPars < Abc_NtkPiNum(pNtk)) ) - { - fprintf( pErr, "The number of paramter variables is invalid (should be > 0 and < PI num).\n" ); - return 1; - } - if ( Abc_NtkIsStrash(pNtk) ) - Abc_NtkQbf( pNtk, nPars, fVerbose ); - else - { - pNtk = Abc_NtkStrash( pNtk, 0, 1, 0 ); - Abc_NtkQbf( pNtk, nPars, fVerbose ); - Abc_NtkDelete( pNtk ); - } - return 0; - -usage: - fprintf( pErr, "usage: qbf [-P num] [-vh]\n" ); - fprintf( pErr, "\t solves a quantified boolean formula problem EpVxM(p,x)\n" ); - fprintf( pErr, "\t-P num : number of paramters (should be the first PIs) [default = %d]\n", nPars ); - fprintf( pErr, "\t-v : toggle verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandFraig( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - char Buffer[100]; - Fraig_Params_t Params, * pParams = &Params; - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int fAllNodes; - int fExdc; - int c; - int fPartition = 0; - extern void Abc_NtkFraigPartitionedTime( Abc_Ntk_t * pNtk, void * pParams ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fExdc = 0; - fAllNodes = 0; - memset( pParams, 0, sizeof(Fraig_Params_t) ); - pParams->nPatsRand = 2048; // the number of words of random simulation info - pParams->nPatsDyna = 2048; // the number of words of dynamic simulation info - pParams->nBTLimit = 100; // the max number of backtracks to perform - pParams->fFuncRed = 1; // performs only one level hashing - pParams->fFeedBack = 1; // enables solver feedback - pParams->fDist1Pats = 1; // enables distance-1 patterns - pParams->fDoSparse = 1; // performs equiv tests for sparse functions - pParams->fChoicing = 0; // enables recording structural choices - pParams->fTryProve = 0; // tries to solve the final miter - pParams->fVerbose = 0; // the verbosiness flag - pParams->fVerboseP = 0; // the verbosiness flag - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "RDCrscptvaeh" ) ) != EOF ) - { - switch ( c ) - { - case 'R': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-R\" should be followed by an integer.\n" ); - goto usage; - } - pParams->nPatsRand = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pParams->nPatsRand < 0 ) - goto usage; - break; - case 'D': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-D\" should be followed by an integer.\n" ); - goto usage; - } - pParams->nPatsDyna = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pParams->nPatsDyna < 0 ) - goto usage; - break; - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - pParams->nBTLimit = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pParams->nBTLimit < 0 ) - goto usage; - break; - - case 'r': - pParams->fFuncRed ^= 1; - break; - case 's': - pParams->fDoSparse ^= 1; - break; - case 'c': - pParams->fChoicing ^= 1; - break; - case 'p': - pParams->fTryProve ^= 1; - break; - case 'v': - pParams->fVerbose ^= 1; - break; - case 't': - fPartition ^= 1; - break; - case 'a': - fAllNodes ^= 1; - break; - case 'e': - fExdc ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsLogic(pNtk) && !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Can only fraig a logic network or an AIG.\n" ); - return 1; - } - - // report the proof - pParams->fVerboseP = pParams->fTryProve; - - // get the new network - if ( fPartition ) - { - pNtkRes = Abc_NtkDup( pNtk ); - if ( Abc_NtkIsStrash(pNtk) ) - Abc_NtkFraigPartitionedTime( pNtk, &Params ); - else - { - pNtk = Abc_NtkStrash( pNtk, fAllNodes, !fAllNodes, 0 ); - Abc_NtkFraigPartitionedTime( pNtk, &Params ); - Abc_NtkDelete( pNtk ); - } - } - else - { - if ( Abc_NtkIsStrash(pNtk) ) - pNtkRes = Abc_NtkFraig( pNtk, &Params, fAllNodes, fExdc ); - else - { - pNtk = Abc_NtkStrash( pNtk, fAllNodes, !fAllNodes, 0 ); - pNtkRes = Abc_NtkFraig( pNtk, &Params, fAllNodes, fExdc ); - Abc_NtkDelete( pNtk ); - } - } - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Fraiging has failed.\n" ); - return 1; - } - - if ( pParams->fTryProve ) // report the result - Abc_NtkMiterReport( pNtkRes ); - - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - sprintf( Buffer, "%d", pParams->nBTLimit ); - fprintf( pErr, "usage: fraig [-R num] [-D num] [-C num] [-rscpvtah]\n" ); - fprintf( pErr, "\t transforms a logic network into a functionally reduced AIG\n" ); - fprintf( pErr, "\t-R num : number of random patterns (127 < num < 32769) [default = %d]\n", pParams->nPatsRand ); - fprintf( pErr, "\t-D num : number of systematic patterns (127 < num < 32769) [default = %d]\n", pParams->nPatsDyna ); - fprintf( pErr, "\t-C num : number of backtracks for one SAT problem [default = %s]\n", pParams->nBTLimit==-1? "infinity" : Buffer ); - fprintf( pErr, "\t-r : toggle functional reduction [default = %s]\n", pParams->fFuncRed? "yes": "no" ); - fprintf( pErr, "\t-s : toggle considering sparse functions [default = %s]\n", pParams->fDoSparse? "yes": "no" ); - fprintf( pErr, "\t-c : toggle accumulation of choices [default = %s]\n", pParams->fChoicing? "yes": "no" ); - fprintf( pErr, "\t-p : toggle proving the miter outputs [default = %s]\n", pParams->fTryProve? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose output [default = %s]\n", pParams->fVerbose? "yes": "no" ); - fprintf( pErr, "\t-e : toggle functional sweeping using EXDC [default = %s]\n", fExdc? "yes": "no" ); - fprintf( pErr, "\t-a : toggle between all nodes and DFS nodes [default = %s]\n", fAllNodes? "all": "dfs" ); - fprintf( pErr, "\t-t : toggle using partitioned representation [default = %s]\n", fPartition? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandFraigTrust( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - int fDuplicate; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fDuplicate = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "dh" ) ) != EOF ) - { - switch ( c ) - { - case 'd': - fDuplicate ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - // get the new network - pNtkRes = Abc_NtkFraigTrust( pNtk ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Fraiging in the trust mode has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: fraig_trust [-h]\n" ); - fprintf( pErr, "\t transforms the current network into an AIG assuming it is FRAIG with choices\n" ); -// fprintf( pErr, "\t-d : toggle duplication of logic [default = %s]\n", fDuplicate? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandFraigStore( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fDuplicate; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fDuplicate = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "dh" ) ) != EOF ) - { - switch ( c ) - { - case 'd': - fDuplicate ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - // get the new network - if ( !Abc_NtkFraigStore( pNtk ) ) - { - fprintf( pErr, "Fraig storing has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: fraig_store [-h]\n" ); - fprintf( pErr, "\t saves the current network in the AIG database\n" ); -// fprintf( pErr, "\t-d : toggle duplication of logic [default = %s]\n", fDuplicate? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandFraigRestore( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - int fDuplicate; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fDuplicate = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "dh" ) ) != EOF ) - { - switch ( c ) - { - case 'd': - fDuplicate ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - // get the new network - pNtkRes = Abc_NtkFraigRestore(); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Fraig restoring has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: fraig_restore [-h]\n" ); - fprintf( pErr, "\t makes the current network by fraiging the AIG database\n" ); -// fprintf( pErr, "\t-d : toggle duplication of logic [default = %s]\n", fDuplicate? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandFraigClean( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fDuplicate; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fDuplicate = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "dh" ) ) != EOF ) - { - switch ( c ) - { - case 'd': - fDuplicate ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - Abc_NtkFraigStoreClean(); - return 0; - -usage: - fprintf( pErr, "usage: fraig_clean [-h]\n" ); - fprintf( pErr, "\t cleans the internal FRAIG storage\n" ); -// fprintf( pErr, "\t-d : toggle duplication of logic [default = %s]\n", fDuplicate? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandFraigSweep( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fUseInv; - int fExdc; - int fVerbose; - int fVeryVerbose; - extern bool Abc_NtkFraigSweep( Abc_Ntk_t * pNtk, int fUseInv, int fExdc, int fVerbose, int fVeryVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fUseInv = 1; - fExdc = 0; - fVerbose = 0; - fVeryVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "ievwh" ) ) != EOF ) - { - switch ( c ) - { - case 'i': - fUseInv ^= 1; - break; - case 'e': - fExdc ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'w': - fVeryVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Cannot sweep AIGs (use \"fraig\").\n" ); - return 1; - } - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "Transform the current network into a logic network.\n" ); - return 1; - } - // modify the current network - if ( !Abc_NtkFraigSweep( pNtk, fUseInv, fExdc, fVerbose, fVeryVerbose ) ) - { - fprintf( pErr, "Sweeping has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: fraig_sweep [-evwh]\n" ); - fprintf( pErr, "\t performs technology-dependent sweep\n" ); - fprintf( pErr, "\t-e : toggle functional sweeping using EXDC [default = %s]\n", fExdc? "yes": "no" ); - fprintf( pErr, "\t-v : prints verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-w : prints equivalence class information [default = %s]\n", fVeryVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandFraigDress( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - char * pFileName; - int c; - int fVerbose; - extern void Abc_NtkDress( Abc_Ntk_t * pNtk, char * pFileName, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "vh" ) ) != EOF ) - { - switch ( c ) - { - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for logic networks.\n" ); - return 1; - } - if ( argc != globalUtilOptind && argc != globalUtilOptind + 1 ) - goto usage; - if ( argc == globalUtilOptind && Abc_NtkSpec(pNtk) == NULL ) - { - fprintf( pErr, "The current network has no spec.\n" ); - return 1; - } - // get the input file name - pFileName = (argc == globalUtilOptind + 1) ? argv[globalUtilOptind] : Abc_NtkSpec(pNtk); - // modify the current network - Abc_NtkDress( pNtk, pFileName, fVerbose ); - return 0; - -usage: - fprintf( pErr, "usage: dress [-vh] <file>\n" ); - fprintf( pErr, "\t transfers internal node names from file to the current network\n" ); - fprintf( pErr, "\t<file> : network with names (if not given, the current network spec is used)\n" ); - fprintf( pErr, "\t-v : prints verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandHaigStart( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "dh" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for AIGs; run strashing (\"st\").\n" ); - return 0; - } - Abc_NtkHaigStart( pNtk ); - return 0; - -usage: - fprintf( pErr, "usage: haig_start [-h]\n" ); - fprintf( pErr, "\t starts constructive accumulation of combinational choices\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandHaigStop( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "dh" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for AIGs; run strashing (\"st\").\n" ); - return 0; - } - Abc_NtkHaigStop( pNtk ); - return 0; - -usage: - fprintf( pErr, "usage: haig_stop [-h]\n" ); - fprintf( pErr, "\t cleans the internal storage for combinational choices\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandHaigUse( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "dh" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for AIGs; run strashing (\"st\").\n" ); - return 0; - } - // get the new network - pNtkRes = Abc_NtkHaigUse( pNtk ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Transforming internal storage into AIG with choices has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: haig_use [-h]\n" ); - fprintf( pErr, "\t transforms internal storage into an AIG with choices\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandRecStart( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int nVars; - int nCuts; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nVars = 4; - nCuts = 8; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "KCh" ) ) != EOF ) - { - switch ( c ) - { - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by an integer.\n" ); - goto usage; - } - nVars = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nVars < 1 ) - goto usage; - break; - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - nCuts = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nCuts < 1 ) - goto usage; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( !(nVars >= 3 && nVars <= 16) ) - { - fprintf( pErr, "The range of allowed values is 3 <= K <= 16.\n" ); - return 0; - } - if ( Abc_NtkRecIsRunning() ) - { - fprintf( pErr, "The AIG subgraph recording is already started.\n" ); - return 0; - } - if ( pNtk && !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for AIGs; run strashing (\"st\").\n" ); - return 0; - } - Abc_NtkRecStart( pNtk, nVars, nCuts ); - return 0; - -usage: - fprintf( pErr, "usage: rec_start [-K num] [-C num] [-h]\n" ); - fprintf( pErr, "\t starts recording AIG subgraphs (should be called for\n" ); - fprintf( pErr, "\t an empty network or after reading in a previous record)\n" ); - fprintf( pErr, "\t-K num : the largest number of inputs [default = %d]\n", nVars ); - fprintf( pErr, "\t-C num : the max number of cuts used at a node (0 < num < 2^12) [default = %d]\n", nCuts ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandRecStop( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "dh" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - if ( !Abc_NtkRecIsRunning() ) - { - fprintf( pErr, "This command works only after calling \"rec_start\".\n" ); - return 0; - } - Abc_NtkRecStop(); - return 0; - -usage: - fprintf( pErr, "usage: rec_stop [-h]\n" ); - fprintf( pErr, "\t cleans the internal storage for AIG subgraphs\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandRecAdd( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "dh" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works for AIGs.\n" ); - return 0; - } - if ( !Abc_NtkRecIsRunning() ) - { - fprintf( pErr, "This command works for AIGs after calling \"rec_start\".\n" ); - return 0; - } - Abc_NtkRecAdd( pNtk ); - return 0; - -usage: - fprintf( pErr, "usage: rec_add [-h]\n" ); - fprintf( pErr, "\t adds subgraphs from the current network to the set\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandRecPs( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "dh" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - if ( !Abc_NtkRecIsRunning() ) - { - fprintf( pErr, "This command works for AIGs only after calling \"rec_start\".\n" ); - return 0; - } - Abc_NtkRecPs(); - return 0; - -usage: - fprintf( pErr, "usage: rec_ps [-h]\n" ); - fprintf( pErr, "\t prints statistics about the recorded AIG subgraphs\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandRecUse( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "dh" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - if ( !Abc_NtkRecIsRunning() ) - { - fprintf( pErr, "This command works for AIGs only after calling \"rec_start\".\n" ); - return 0; - } - // get the new network - pNtkRes = Abc_NtkRecUse(); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Transforming internal AIG subgraphs into an AIG with choices has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: rec_use [-h]\n" ); - fprintf( pErr, "\t transforms internal storage into an AIG with choices\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandMap( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - char Buffer[100]; - double DelayTarget; - int fRecovery; - int fSweep; - int fSwitching; - int fVerbose; - int c; - extern Abc_Ntk_t * Abc_NtkMap( Abc_Ntk_t * pNtk, double DelayTarget, int fRecovery, int fSwitching, int fVerbose ); - extern bool Abc_NtkFraigSweep( Abc_Ntk_t * pNtk, int fUseInv, int fExdc, int fVerbose, int fVeryVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - DelayTarget =-1; - fRecovery = 1; - fSweep = 1; - fSwitching = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Daspvh" ) ) != EOF ) - { - switch ( c ) - { - case 'D': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-D\" should be followed by a floating point number.\n" ); - goto usage; - } - DelayTarget = (float)atof(argv[globalUtilOptind]); - globalUtilOptind++; - if ( DelayTarget <= 0.0 ) - goto usage; - break; - case 'a': - fRecovery ^= 1; - break; - case 's': - fSweep ^= 1; - break; - case 'p': - fSwitching ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - pNtk = Abc_NtkStrash( pNtk, 0, 0, 0 ); - if ( pNtk == NULL ) - { - fprintf( pErr, "Strashing before mapping has failed.\n" ); - return 1; - } - pNtk = Abc_NtkBalance( pNtkRes = pNtk, 0, 0, 1 ); - Abc_NtkDelete( pNtkRes ); - if ( pNtk == NULL ) - { - fprintf( pErr, "Balancing before mapping has failed.\n" ); - return 1; - } - fprintf( pOut, "The network was strashed and balanced before mapping.\n" ); - // get the new network - pNtkRes = Abc_NtkMap( pNtk, DelayTarget, fRecovery, fSwitching, fVerbose ); - if ( pNtkRes == NULL ) - { - Abc_NtkDelete( pNtk ); - fprintf( pErr, "Mapping has failed.\n" ); - return 1; - } - Abc_NtkDelete( pNtk ); - } - else - { - // get the new network - pNtkRes = Abc_NtkMap( pNtk, DelayTarget, fRecovery, fSwitching, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Mapping has failed.\n" ); - return 1; - } - } - - if ( fSweep ) - Abc_NtkFraigSweep( pNtkRes, 0, 0, 0, 0 ); - - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - if ( DelayTarget == -1 ) - sprintf( Buffer, "not used" ); - else - sprintf( Buffer, "%.3f", DelayTarget ); - fprintf( pErr, "usage: map [-D float] [-aspvh]\n" ); - fprintf( pErr, "\t performs standard cell mapping of the current network\n" ); - fprintf( pErr, "\t-D float : sets the global required times [default = %s]\n", Buffer ); - fprintf( pErr, "\t-a : toggles area recovery [default = %s]\n", fRecovery? "yes": "no" ); - fprintf( pErr, "\t-s : toggles sweep after mapping [default = %s]\n", fSweep? "yes": "no" ); - fprintf( pErr, "\t-p : optimizes power by minimizing switching [default = %s]\n", fSwitching? "yes": "no" ); - fprintf( pErr, "\t-v : toggles verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandUnmap( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkHasMapping(pNtk) ) - { - fprintf( pErr, "Cannot unmap the network that is not mapped.\n" ); - return 1; - } - - // get the new network - if ( !Abc_NtkMapToSop( pNtk ) ) - { - fprintf( pErr, "Unmapping has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: unmap [-h]\n" ); - fprintf( pErr, "\t replaces the library gates by the logic nodes represented using SOPs\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandAttach( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsSopLogic(pNtk) ) - { - fprintf( pErr, "Can only attach gates if the nodes have SOP representations.\n" ); - return 1; - } - - // get the new network - if ( !Abc_NtkAttach( pNtk ) ) - { - fprintf( pErr, "Attaching gates has failed.\n" ); - return 1; - } - return 0; - -usage: - fprintf( pErr, "usage: attach [-h]\n" ); - fprintf( pErr, "\t replaces the SOP functions by the gates from the library\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandSuperChoice( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - extern Abc_Ntk_t * Abc_NtkSuperChoice( Abc_Ntk_t * pNtk ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Superchoicing works only for the AIG representation (run \"strash\").\n" ); - return 1; - } - - // get the new network - pNtkRes = Abc_NtkSuperChoice( pNtk ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Superchoicing has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: sc [-h]\n" ); - fprintf( pErr, "\t performs superchoicing\n" ); - fprintf( pErr, "\t (accumulate: \"r file.blif; rsup; b; sc; f -ac; wb file_sc.blif\")\n" ); - fprintf( pErr, "\t (map without supergate library: \"r file_sc.blif; ft; map\")\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandSuperChoiceLut( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - int nLutSize; - int nCutSizeMax; - int fVerbose; - extern int Abc_NtkSuperChoiceLut( Abc_Ntk_t * pNtk, int nLutSize, int nCutSizeMax, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fVerbose = 1; - nLutSize = 4; - nCutSizeMax = 10; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "KNh" ) ) != EOF ) - { - switch ( c ) - { - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by a positive integer.\n" ); - goto usage; - } - nLutSize = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nLutSize < 0 ) - goto usage; - break; - case 'N': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by a positive integer.\n" ); - goto usage; - } - nCutSizeMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nCutSizeMax < 0 ) - goto usage; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Superchoicing works only for the AIG representation (run \"strash\").\n" ); - return 1; - } - - // convert the network into the SOP network - pNtkRes = Abc_NtkToLogic( pNtk ); - - // get the new network - if ( !Abc_NtkSuperChoiceLut( pNtkRes, nLutSize, nCutSizeMax, fVerbose ) ) - { - Abc_NtkDelete( pNtkRes ); - fprintf( pErr, "Superchoicing has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: scl [-K num] [-N num] [-vh]\n" ); - fprintf( pErr, "\t performs superchoicing for K-LUTs\n" ); - fprintf( pErr, "\t (accumulate: \"r file.blif; b; scl; f -ac; wb file_sc.blif\")\n" ); - fprintf( pErr, "\t (FPGA map: \"r file_sc.blif; ft; read_lut lutlibK; fpga\")\n" ); - fprintf( pErr, "\t-K num : the number of LUT inputs [default = %d]\n", nLutSize ); - fprintf( pErr, "\t-N num : the max size of the cut [default = %d]\n", nCutSizeMax ); - fprintf( pErr, "\t-v : toggles verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandFpga( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - char Buffer[100]; - char LutSize[100]; - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - int fRecovery; - int fSwitching; - int fLatchPaths; - int fVerbose; - int nLutSize; - float DelayTarget; - - extern Abc_Ntk_t * Abc_NtkFpga( Abc_Ntk_t * pNtk, float DelayTarget, int fRecovery, int fSwitching, int fLatchPaths, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fRecovery = 1; - fSwitching = 0; - fLatchPaths = 0; - fVerbose = 0; - DelayTarget =-1; - nLutSize =-1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "aplvhDK" ) ) != EOF ) - { - switch ( c ) - { - case 'a': - fRecovery ^= 1; - break; - case 'p': - fSwitching ^= 1; - break; - case 'l': - fLatchPaths ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - case 'D': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-D\" should be followed by a floating point number.\n" ); - goto usage; - } - DelayTarget = (float)atof(argv[globalUtilOptind]); - globalUtilOptind++; - if ( DelayTarget <= 0.0 ) - goto usage; - break; - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by a positive integer.\n" ); - goto usage; - } - nLutSize = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nLutSize < 0 ) - goto usage; - break; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - // create the new LUT library - if ( nLutSize >= 3 && nLutSize <= 10 ) - Fpga_SetSimpleLutLib( nLutSize ); -/* - else - { - fprintf( pErr, "Cannot perform FPGA mapping with LUT size %d.\n", nLutSize ); - return 1; - } -*/ - if ( !Abc_NtkIsStrash(pNtk) ) - { - // strash and balance the network - pNtk = Abc_NtkStrash( pNtk, 0, 0, 0 ); - if ( pNtk == NULL ) - { - fprintf( pErr, "Strashing before FPGA mapping has failed.\n" ); - return 1; - } - pNtk = Abc_NtkBalance( pNtkRes = pNtk, 0, 0, 1 ); - Abc_NtkDelete( pNtkRes ); - if ( pNtk == NULL ) - { - fprintf( pErr, "Balancing before FPGA mapping has failed.\n" ); - return 1; - } - fprintf( pOut, "The network was strashed and balanced before FPGA mapping.\n" ); - // get the new network - pNtkRes = Abc_NtkFpga( pNtk, DelayTarget, fRecovery, fSwitching, fLatchPaths, fVerbose ); - if ( pNtkRes == NULL ) - { - Abc_NtkDelete( pNtk ); - fprintf( pErr, "FPGA mapping has failed.\n" ); - return 1; - } - Abc_NtkDelete( pNtk ); - } - else - { - // get the new network - pNtkRes = Abc_NtkFpga( pNtk, DelayTarget, fRecovery, fSwitching, fLatchPaths, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "FPGA mapping has failed.\n" ); - return 1; - } - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - if ( DelayTarget == -1 ) - sprintf( Buffer, "best possible" ); - else - sprintf( Buffer, "%.2f", DelayTarget ); - if ( nLutSize == -1 ) - sprintf( LutSize, "library" ); - else - sprintf( LutSize, "%d", nLutSize ); - fprintf( pErr, "usage: fpga [-D float] [-K num] [-aplvh]\n" ); - fprintf( pErr, "\t performs FPGA mapping of the current network\n" ); - fprintf( pErr, "\t-a : toggles area recovery [default = %s]\n", fRecovery? "yes": "no" ); - fprintf( pErr, "\t-p : optimizes power by minimizing switching activity [default = %s]\n", fSwitching? "yes": "no" ); - fprintf( pErr, "\t-l : optimizes latch paths for delay, other paths for area [default = %s]\n", fLatchPaths? "yes": "no" ); - fprintf( pErr, "\t-D float : sets the required time for the mapping [default = %s]\n", Buffer ); - fprintf( pErr, "\t-K num : the number of LUT inputs (2 < num < 11) [default = %s]%s\n", LutSize, (nLutSize == -1 ? " (type \"print_lut\")" : "") ); - fprintf( pErr, "\t-v : toggles verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : prints the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandFpgaFast( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - char Buffer[100]; - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - int fRecovery; - int fVerbose; - int nLutSize; - float DelayTarget; - - extern Abc_Ntk_t * Abc_NtkFpgaFast( Abc_Ntk_t * pNtk, int nLutSize, int fRecovery, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fRecovery = 1; - fVerbose = 0; - DelayTarget =-1; - nLutSize = 5; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "avhDK" ) ) != EOF ) - { - switch ( c ) - { - case 'a': - fRecovery ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - case 'D': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-D\" should be followed by a floating point number.\n" ); - goto usage; - } - DelayTarget = (float)atof(argv[globalUtilOptind]); - globalUtilOptind++; - if ( DelayTarget <= 0.0 ) - goto usage; - break; - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by a positive integer.\n" ); - goto usage; - } - nLutSize = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nLutSize < 0 ) - goto usage; - break; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - // strash and balance the network - pNtk = Abc_NtkStrash( pNtk, 0, 0, 0 ); - if ( pNtk == NULL ) - { - fprintf( pErr, "Strashing before FPGA mapping has failed.\n" ); - return 1; - } - pNtk = Abc_NtkBalance( pNtkRes = pNtk, 0, 0, 1 ); - Abc_NtkDelete( pNtkRes ); - if ( pNtk == NULL ) - { - fprintf( pErr, "Balancing before FPGA mapping has failed.\n" ); - return 1; - } - fprintf( pOut, "The network was strashed and balanced before FPGA mapping.\n" ); - // get the new network - pNtkRes = Abc_NtkFpgaFast( pNtk, nLutSize, fRecovery, fVerbose ); - if ( pNtkRes == NULL ) - { - Abc_NtkDelete( pNtk ); - fprintf( pErr, "FPGA mapping has failed.\n" ); - return 1; - } - Abc_NtkDelete( pNtk ); - } - else - { - // get the new network - pNtkRes = Abc_NtkFpgaFast( pNtk, nLutSize, fRecovery, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "FPGA mapping has failed.\n" ); - return 1; - } - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - if ( DelayTarget == -1 ) - sprintf( Buffer, "not used" ); - else - sprintf( Buffer, "%.2f", DelayTarget ); - fprintf( pErr, "usage: ffpga [-K num] [-avh]\n" ); - fprintf( pErr, "\t performs fast FPGA mapping of the current network\n" ); - fprintf( pErr, "\t-a : toggles area recovery [default = %s]\n", fRecovery? "yes": "no" ); -// fprintf( pErr, "\t-D float : sets the required time for the mapping [default = %s]\n", Buffer ); - fprintf( pErr, "\t-K num : the number of LUT inputs (2 < num < 32) [default = %d]\n", nLutSize ); - fprintf( pErr, "\t-v : toggles verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : prints the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandIf( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - char Buffer[100]; - char LutSize[100]; - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - If_Par_t Pars, * pPars = &Pars; - int c; - extern Abc_Ntk_t * Abc_NtkIf( Abc_Ntk_t * pNtk, If_Par_t * pPars ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - memset( pPars, 0, sizeof(If_Par_t) ); - // user-controlable paramters - pPars->nLutSize = -1; - pPars->nCutsMax = 8; - pPars->nFlowIters = 1; - pPars->nAreaIters = 2; - pPars->DelayTarget = -1; - pPars->fPreprocess = 1;// - pPars->fArea = 0; - pPars->fFancy = 0; - pPars->fExpRed = 1;// - pPars->fLatchPaths = 0; - pPars->fSeqMap = 0; - pPars->fVerbose = 0;// - // internal parameters - pPars->fTruth = 0; - pPars->nLatches = pNtk? Abc_NtkLatchNum(pNtk) : 0; - pPars->fLiftLeaves = 0; - pPars->pLutLib = Abc_FrameReadLibLut(); - pPars->pTimesArr = NULL; - pPars->pTimesArr = NULL; - pPars->pFuncCost = NULL; - - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "KCFADpaflrstvh" ) ) != EOF ) - { - switch ( c ) - { - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by a positive integer.\n" ); - goto usage; - } - pPars->nLutSize = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nLutSize < 0 ) - goto usage; - // if the LUT size is specified, disable library - pPars->pLutLib = NULL; - break; - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by a positive integer.\n" ); - goto usage; - } - pPars->nCutsMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nCutsMax < 0 ) - goto usage; - break; - case 'F': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-F\" should be followed by a positive integer.\n" ); - goto usage; - } - pPars->nFlowIters = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nFlowIters < 0 ) - goto usage; - break; - case 'A': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-A\" should be followed by a positive integer.\n" ); - goto usage; - } - pPars->nAreaIters = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->nAreaIters < 0 ) - goto usage; - break; - case 'D': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-D\" should be followed by a floating point number.\n" ); - goto usage; - } - pPars->DelayTarget = (float)atof(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pPars->DelayTarget <= 0.0 ) - goto usage; - break; - case 'p': - pPars->fPreprocess ^= 1; - break; - case 'a': - pPars->fArea ^= 1; - break; - case 'f': - pPars->fFancy ^= 1; - break; - case 'l': - pPars->fLatchPaths ^= 1; - break; - case 'r': - pPars->fExpRed ^= 1; - break; - case 's': - pPars->fSeqMap ^= 1; - break; - case 't': - pPars->fLiftLeaves ^= 1; - break; - case 'v': - pPars->fVerbose ^= 1; - break; - case 'h': - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( pPars->fSeqMap && pPars->nLatches == 0 ) - { - fprintf( pErr, "The network has no latches. Use combinational mapping instead of sequential.\n" ); - return 1; - } - - if ( pPars->nLutSize == -1 ) - { - if ( pPars->pLutLib == NULL ) - { - fprintf( pErr, "The LUT library is not given.\n" ); - return 1; - } - // get LUT size from the library - pPars->nLutSize = pPars->pLutLib->LutMax; - } - - if ( pPars->nLutSize < 3 || pPars->nLutSize > IF_MAX_LUTSIZE ) - { - fprintf( pErr, "Incorrect LUT size (%d).\n", pPars->nLutSize ); - return 1; - } - - if ( pPars->nCutsMax < 1 || pPars->nCutsMax >= (1<<12) ) - { - fprintf( pErr, "Incorrect number of cuts.\n" ); - return 1; - } - - if ( Abc_NtkGetChoiceNum( pNtk ) ) - { - printf( "Performing FPGA mapping with choices.\n" ); -// printf( "Currently mapping with choices is not enabled.\n" ); - pPars->fTruth = 1; -// return 1; - } - - if ( pPars->fTruth && pPars->nLutSize > IF_MAX_FUNC_LUTSIZE ) - { - fprintf( pErr, "Mapping with choices requires computing truth tables. In this case, the LUT size cannot be more than %d.\n", IF_MAX_FUNC_LUTSIZE ); - return 1; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - // strash and balance the network - pNtk = Abc_NtkStrash( pNtk, 0, 0, 0 ); - if ( pNtk == NULL ) - { - fprintf( pErr, "Strashing before FPGA mapping has failed.\n" ); - return 1; - } - pNtk = Abc_NtkBalance( pNtkRes = pNtk, 0, 0, 1 ); - Abc_NtkDelete( pNtkRes ); - if ( pNtk == NULL ) - { - fprintf( pErr, "Balancing before FPGA mapping has failed.\n" ); - return 1; - } - fprintf( pOut, "The network was strashed and balanced before FPGA mapping.\n" ); - // get the new network - pNtkRes = Abc_NtkIf( pNtk, pPars ); - if ( pNtkRes == NULL ) - { - Abc_NtkDelete( pNtk ); - fprintf( pErr, "FPGA mapping has failed.\n" ); - return 0; - } - Abc_NtkDelete( pNtk ); - } - else - { - // get the new network - pNtkRes = Abc_NtkIf( pNtk, pPars ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "FPGA mapping has failed.\n" ); - return 0; - } - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - if ( pPars->DelayTarget == -1 ) - sprintf( Buffer, "best possible" ); - else - sprintf( Buffer, "%.2f", pPars->DelayTarget ); - if ( pPars->nLutSize == -1 ) - sprintf( LutSize, "library" ); - else - sprintf( LutSize, "%d", pPars->nLutSize ); - fprintf( pErr, "usage: if [-K num] [-C num] [-F num] [-A num] [-D float] [-pafrsvh]\n" ); - fprintf( pErr, "\t performs FPGA technology mapping of the network\n" ); - fprintf( pErr, "\t-K num : the number of LUT inputs (2 < num < %d) [default = %s]\n", IF_MAX_LUTSIZE+1, LutSize ); - fprintf( pErr, "\t-C num : the max number of priority cuts (0 < num < 2^12) [default = %d]\n", pPars->nCutsMax ); - fprintf( pErr, "\t-F num : the number of area flow recovery iterations (num >= 0) [default = %d]\n", pPars->nFlowIters ); - fprintf( pErr, "\t-A num : the number of exact area recovery iterations (num >= 0) [default = %d]\n", pPars->nAreaIters ); - fprintf( pErr, "\t-D float : sets the delay constraint for the mapping [default = %s]\n", Buffer ); - fprintf( pErr, "\t-p : toggles preprocessing using several starting points [default = %s]\n", pPars->fPreprocess? "yes": "no" ); - fprintf( pErr, "\t-a : toggles area-oriented mapping [default = %s]\n", pPars->fArea? "yes": "no" ); -// fprintf( pErr, "\t-f : toggles one fancy feature [default = %s]\n", pPars->fFancy? "yes": "no" ); - fprintf( pErr, "\t-r : enables expansion/reduction of the best cuts [default = %s]\n", pPars->fExpRed? "yes": "no" ); - fprintf( pErr, "\t-l : optimizes latch paths for delay, other paths for area [default = %s]\n", pPars->fLatchPaths? "yes": "no" ); - fprintf( pErr, "\t-s : toggles sequential mapping [default = %s]\n", pPars->fSeqMap? "yes": "no" ); -// fprintf( pErr, "\t-t : toggles the use of true sequential cuts [default = %s]\n", pPars->fLiftLeaves? "yes": "no" ); - fprintf( pErr, "\t-v : toggles verbose output [default = %s]\n", pPars->fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : prints the command usage\n"); - return 1; -} - - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandInit( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - Abc_Obj_t * pObj; - int c, i; - int fZeros; - int fOnes; - int fRandom; - int fDontCare; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fZeros = 0; - fOnes = 0; - fRandom = 0; - fDontCare = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "zordh" ) ) != EOF ) - { - switch ( c ) - { - case 'z': - fZeros ^= 1; - break; - case 'o': - fOnes ^= 1; - break; - case 'r': - fRandom ^= 1; - break; - case 'd': - fDontCare ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( Abc_NtkIsComb(pNtk) ) - { - fprintf( pErr, "The current network is combinational.\n" ); - return 0; - } - - if ( fZeros ) - { - Abc_NtkForEachLatch( pNtk, pObj, i ) - Abc_LatchSetInit0( pObj ); - } - else if ( fOnes ) - { - Abc_NtkForEachLatch( pNtk, pObj, i ) - Abc_LatchSetInit1( pObj ); - } - else if ( fRandom ) - { - Abc_NtkForEachLatch( pNtk, pObj, i ) - if ( rand() & 1 ) - Abc_LatchSetInit1( pObj ); - else - Abc_LatchSetInit0( pObj ); - } - else if ( fDontCare ) - { - Abc_NtkForEachLatch( pNtk, pObj, i ) - Abc_LatchSetInitDc( pObj ); - } - else - printf( "The initial states remain unchanged.\n" ); - return 0; - -usage: - fprintf( pErr, "usage: init [-zordh]\n" ); - fprintf( pErr, "\t resets initial states of all latches\n" ); - fprintf( pErr, "\t-z : set zeros initial states [default = %s]\n", fZeros? "yes": "no" ); - fprintf( pErr, "\t-o : set ones initial states [default = %s]\n", fOnes? "yes": "no" ); - fprintf( pErr, "\t-d : set don't-care initial states [default = %s]\n", fDontCare? "yes": "no" ); - fprintf( pErr, "\t-r : set random initial states [default = %s]\n", fRandom? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandZero( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - - extern Abc_Ntk_t * Abc_NtkRestrashZero( Abc_Ntk_t * pNtk, bool fCleanup ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( Abc_NtkIsComb(pNtk) ) - { - fprintf( pErr, "The current network is combinational.\n" ); - return 0; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command works only for AIGs.\n" ); - return 0; - } - - // get the new network - pNtkRes = Abc_NtkRestrashZero( pNtk, 0 ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Converting to sequential AIG has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: zero [-h]\n" ); - fprintf( pErr, "\t converts latches to have const-0 initial value\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandUndc( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( Abc_NtkIsComb(pNtk) ) - { - fprintf( pErr, "The current network is combinational.\n" ); - return 0; - } - - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "This command works only for logic networks.\n" ); - return 0; - } - - // get the new network - Abc_NtkConvertDcLatches( pNtk ); - return 0; - -usage: - fprintf( pErr, "usage: undc [-h]\n" ); - fprintf( pErr, "\t converts latches with DC init values into free PIs\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandPipe( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int nLatches; - extern void Abc_NtkLatchPipe( Abc_Ntk_t * pNtk, int nLatches ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nLatches = 5; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Lh" ) ) != EOF ) - { - switch ( c ) - { - case 'L': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-L\" should be followed by a positive integer.\n" ); - goto usage; - } - nLatches = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nLatches < 0 ) - goto usage; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( Abc_NtkIsComb(pNtk) ) - { - fprintf( pErr, "The current network is combinational.\n" ); - return 1; - } - - // update the network - Abc_NtkLatchPipe( pNtk, nLatches ); - return 0; - -usage: - fprintf( pErr, "usage: pipe [-L num] [-h]\n" ); - fprintf( pErr, "\t inserts the given number of latches at each PI for pipelining\n" ); - fprintf( pErr, "\t-L num : the number of latches to insert [default = %d]\n", nLatches ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandSeq( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( Abc_NtkLatchNum(pNtk) == 0 ) - { - fprintf( pErr, "The network has no latches.\n" ); - return 0; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Conversion to sequential AIG works only for combinational AIGs (run \"strash\").\n" ); - return 1; - } - - // get the new network -// pNtkRes = Abc_NtkAigToSeq( pNtk ); - pNtkRes = NULL; - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Converting to sequential AIG has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: seq [-h]\n" ); - fprintf( pErr, "\t converts AIG into sequential AIG\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandUnseq( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - int fShare; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fShare = 1; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "sh" ) ) != EOF ) - { - switch ( c ) - { - case 's': - fShare ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } -/* - if ( !Abc_NtkIsSeq(pNtk) ) - { - fprintf( pErr, "Conversion to combinational AIG works only for sequential AIG (run \"seq\").\n" ); - return 1; - } -*/ - // share the latches on the fanout edges -// if ( fShare ) -// Seq_NtkShareFanouts(pNtk); - - // get the new network -// pNtkRes = Abc_NtkSeqToLogicSop( pNtk ); - pNtkRes = NULL; - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Converting sequential AIG into an SOP logic network has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: unseq [-sh]\n" ); - fprintf( pErr, "\t converts sequential AIG into an SOP logic network\n" ); - fprintf( pErr, "\t-s : toggle sharing latches [default = %s]\n", fShare? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandRetime( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c, nMaxIters; - int fForward; - int fBackward; - int fOneStep; - int fVerbose; - int Mode; - extern int Abc_NtkRetime( Abc_Ntk_t * pNtk, int Mode, int fForwardOnly, int fBackwardOnly, int fOneStep, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Mode = 5; - fForward = 0; - fBackward = 0; - fOneStep = 0; - fVerbose = 0; - nMaxIters = 15; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Mfbsvh" ) ) != EOF ) - { - switch ( c ) - { - case 'M': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-M\" should be followed by a positive integer.\n" ); - goto usage; - } - Mode = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( Mode < 0 ) - goto usage; - break; - case 'f': - fForward ^= 1; - break; - case 'b': - fBackward ^= 1; - break; - case 's': - fOneStep ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( fForward && fBackward ) - { - fprintf( pErr, "Only one switch \"-f\" or \"-b\" can be selected at a time.\n" ); - return 1; - } - - if ( !Abc_NtkLatchNum(pNtk) ) - { - fprintf( pErr, "The network has no latches. Retiming is not performed.\n" ); - return 0; - } - - if ( Mode < 0 || Mode > 6 ) - { - fprintf( pErr, "The mode (%d) is incorrect. Retiming is not performed.\n", Mode ); - return 0; - } - - if ( Abc_NtkIsStrash(pNtk) ) - { - if ( Abc_NtkGetChoiceNum(pNtk) ) - { - fprintf( pErr, "Retiming with choice nodes is not implemented.\n" ); - return 0; - } - // convert the network into an SOP network - pNtkRes = Abc_NtkToLogic( pNtk ); - // perform the retiming - Abc_NtkRetime( pNtkRes, Mode, fForward, fBackward, fOneStep, fVerbose ); - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - } - - // get the network in the SOP form - if ( !Abc_NtkToSop(pNtk, 0) ) - { - printf( "Converting to SOPs has failed.\n" ); - return 0; - } - - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "The network is not a logic network. Retiming is not performed.\n" ); - return 0; - } - - // perform the retiming - Abc_NtkRetime( pNtk, Mode, fForward, fBackward, fOneStep, fVerbose ); - return 0; - -usage: - fprintf( pErr, "usage: retime [-M num] [-fbvh]\n" ); - fprintf( pErr, "\t retimes the current network using one of the algorithms:\n" ); - fprintf( pErr, "\t 1: most forward retiming\n" ); - fprintf( pErr, "\t 2: most backward retiming\n" ); - fprintf( pErr, "\t 3: forward and backward min-area retiming\n" ); - fprintf( pErr, "\t 4: forward and backward min-delay retiming\n" ); - fprintf( pErr, "\t 5: mode 3 followed by mode 4\n" ); - fprintf( pErr, "\t 6: Pan's optimum-delay retiming using binary search\n" ); - fprintf( pErr, "\t-M num : the retiming algorithm to use [default = %d]\n", Mode ); - fprintf( pErr, "\t-f : enables forward-only retiming in modes 3,4,5 [default = %s]\n", fForward? "yes": "no" ); - fprintf( pErr, "\t-b : enables backward-only retiming in modes 3,4,5 [default = %s]\n", fBackward? "yes": "no" ); - fprintf( pErr, "\t-s : enables retiming one step only in mode 4 [default = %s]\n", fOneStep? "yes": "no" ); - fprintf( pErr, "\t-v : enables verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -// fprintf( pErr, "\t-I num : max number of iterations of l-value computation [default = %d]\n", nMaxIters ); -// fprintf( pErr, "\t-f : toggle forward retiming (for AIGs) [default = %s]\n", fForward? "yes": "no" ); -// fprintf( pErr, "\t-b : toggle backward retiming (for AIGs) [default = %s]\n", fBackward? "yes": "no" ); -// fprintf( pErr, "\t-i : toggle computation of initial state [default = %s]\n", fInitial? "yes": "no" ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandSeqFpga( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkNew, * pNtkRes; - int c, nMaxIters; - int fVerbose; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nMaxIters = 15; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Ivh" ) ) != EOF ) - { - switch ( c ) - { - case 'I': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-I\" should be followed by a positive integer.\n" ); - goto usage; - } - nMaxIters = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nMaxIters < 0 ) - goto usage; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( Abc_NtkHasAig(pNtk) ) - { -/* - // quit if there are choice nodes - if ( Abc_NtkGetChoiceNum(pNtk) ) - { - fprintf( pErr, "Currently cannot map/retime networks with choice nodes.\n" ); - return 0; - } -*/ -// if ( Abc_NtkIsStrash(pNtk) ) -// pNtkNew = Abc_NtkAigToSeq(pNtk); -// else -// pNtkNew = Abc_NtkDup(pNtk); - pNtkNew = NULL; - } - else - { - // strash and balance the network - pNtkNew = Abc_NtkStrash( pNtk, 0, 0, 0 ); - if ( pNtkNew == NULL ) - { - fprintf( pErr, "Strashing before FPGA mapping/retiming has failed.\n" ); - return 1; - } - - pNtkNew = Abc_NtkBalance( pNtkRes = pNtkNew, 0, 0, 1 ); - Abc_NtkDelete( pNtkRes ); - if ( pNtkNew == NULL ) - { - fprintf( pErr, "Balancing before FPGA mapping has failed.\n" ); - return 1; - } - - // convert into a sequential AIG -// pNtkNew = Abc_NtkAigToSeq( pNtkRes = pNtkNew ); - pNtkNew = NULL; - Abc_NtkDelete( pNtkRes ); - if ( pNtkNew == NULL ) - { - fprintf( pErr, "Converting into a seq AIG before FPGA mapping/retiming has failed.\n" ); - return 1; - } - - fprintf( pOut, "The network was strashed and balanced before FPGA mapping/retiming.\n" ); - } - - // get the new network -// pNtkRes = Seq_NtkFpgaMapRetime( pNtkNew, nMaxIters, fVerbose ); - pNtkRes = NULL; - if ( pNtkRes == NULL ) - { -// fprintf( pErr, "Sequential FPGA mapping has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return 0; - } - Abc_NtkDelete( pNtkNew ); - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: sfpga [-I num] [-vh]\n" ); - fprintf( pErr, "\t performs integrated sequential FPGA mapping/retiming\n" ); - fprintf( pErr, "\t-I num : max number of iterations of l-value computation [default = %d]\n", nMaxIters ); - fprintf( pErr, "\t-v : toggle verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandSeqMap( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkNew, * pNtkRes; - int c, nMaxIters; - int fVerbose; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nMaxIters = 15; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Ivh" ) ) != EOF ) - { - switch ( c ) - { - case 'I': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-I\" should be followed by a positive integer.\n" ); - goto usage; - } - nMaxIters = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nMaxIters < 0 ) - goto usage; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( Abc_NtkHasAig(pNtk) ) - { -/* - // quit if there are choice nodes - if ( Abc_NtkGetChoiceNum(pNtk) ) - { - fprintf( pErr, "Currently cannot map/retime networks with choice nodes.\n" ); - return 0; - } -*/ -// if ( Abc_NtkIsStrash(pNtk) ) -// pNtkNew = Abc_NtkAigToSeq(pNtk); -// else -// pNtkNew = Abc_NtkDup(pNtk); - pNtkNew = NULL; - } - else - { - // strash and balance the network - pNtkNew = Abc_NtkStrash( pNtk, 0, 0, 0 ); - if ( pNtkNew == NULL ) - { - fprintf( pErr, "Strashing before SC mapping/retiming has failed.\n" ); - return 1; - } - - pNtkNew = Abc_NtkBalance( pNtkRes = pNtkNew, 0, 0, 1 ); - Abc_NtkDelete( pNtkRes ); - if ( pNtkNew == NULL ) - { - fprintf( pErr, "Balancing before SC mapping/retiming has failed.\n" ); - return 1; - } - - // convert into a sequential AIG -// pNtkNew = Abc_NtkAigToSeq( pNtkRes = pNtkNew ); - pNtkNew = NULL; - Abc_NtkDelete( pNtkRes ); - if ( pNtkNew == NULL ) - { - fprintf( pErr, "Converting into a seq AIG before SC mapping/retiming has failed.\n" ); - return 1; - } - - fprintf( pOut, "The network was strashed and balanced before SC mapping/retiming.\n" ); - } - - // get the new network -// pNtkRes = Seq_MapRetime( pNtkNew, nMaxIters, fVerbose ); - pNtkRes = NULL; - if ( pNtkRes == NULL ) - { -// fprintf( pErr, "Sequential FPGA mapping has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return 0; - } - Abc_NtkDelete( pNtkNew ); - - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: smap [-I num] [-vh]\n" ); - fprintf( pErr, "\t performs integrated sequential standard-cell mapping/retiming\n" ); - fprintf( pErr, "\t-I num : max number of iterations of l-value computation [default = %d]\n", nMaxIters ); - fprintf( pErr, "\t-v : toggle verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandSeqSweep( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - int nFramesP; - int nFramesK; - int nMaxImps; - int fUseImps; - int fRewrite; - int fLatchCorr; - int fWriteImps; - int fVerbose; - extern Abc_Ntk_t * Abc_NtkDarSeqSweep( Abc_Ntk_t * pNtk, int nFramesP, int nFrames, int nMaxImps, int fRewrite, int fUseImps, int fLatchCorr, int fWriteImps, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nFramesP = 0; - nFramesK = 1; - nMaxImps = 5000; - fUseImps = 0; - fRewrite = 0; - fLatchCorr = 0; - fWriteImps = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "PFIirlevh" ) ) != EOF ) - { - switch ( c ) - { - case 'P': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-P\" should be followed by an integer.\n" ); - goto usage; - } - nFramesP = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nFramesP < 0 ) - goto usage; - break; - case 'F': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-F\" should be followed by an integer.\n" ); - goto usage; - } - nFramesK = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nFramesK <= 0 ) - goto usage; - break; - case 'I': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-I\" should be followed by an integer.\n" ); - goto usage; - } - nMaxImps = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nMaxImps <= 0 ) - goto usage; - break; - case 'i': - fUseImps ^= 1; - break; - case 'r': - fRewrite ^= 1; - break; - case 'l': - fLatchCorr ^= 1; - break; - case 'e': - fWriteImps ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( Abc_NtkIsComb(pNtk) ) - { - fprintf( pErr, "The network is combinational (run \"fraig\" or \"fraig_sweep\").\n" ); - return 1; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - printf( "This command works only for structrally hashed networks. Run \"st\".\n" ); - return 0; - } - - // get the new network - pNtkRes = Abc_NtkDarSeqSweep( pNtk, nFramesP, nFramesK, nMaxImps, fRewrite, fUseImps, fLatchCorr, fWriteImps, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Sequential sweeping has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: ssweep [-P num] [-F num] [-I num] [-ilrevh]\n" ); - fprintf( pErr, "\t performs sequential sweep using K-step induction\n" ); - fprintf( pErr, "\t-P num : number of time frames to use as the prefix [default = %d]\n", nFramesP ); - fprintf( pErr, "\t-F num : number of time frames for induction (1=simple) [default = %d]\n", nFramesK ); - fprintf( pErr, "\t-I num : max number of implications to consider [default = %d]\n", nMaxImps ); - fprintf( pErr, "\t-i : toggle using implications [default = %s]\n", fUseImps? "yes": "no" ); - fprintf( pErr, "\t-l : toggle latch correspondence only [default = %s]\n", fLatchCorr? "yes": "no" ); - fprintf( pErr, "\t-r : toggle AIG rewriting [default = %s]\n", fRewrite? "yes": "no" ); - fprintf( pErr, "\t-e : toggle writing implications as assertions [default = %s]\n", fWriteImps? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandLcorr( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - int nFramesP; - int nConfMax; - int fVerbose; - extern Abc_Ntk_t * Abc_NtkDarLcorr( Abc_Ntk_t * pNtk, int nFramesP, int nConfMax, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nFramesP = 0; - nConfMax = 10000; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "PCvh" ) ) != EOF ) - { - switch ( c ) - { - case 'P': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-P\" should be followed by an integer.\n" ); - goto usage; - } - nFramesP = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nFramesP < 0 ) - goto usage; - break; - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - nConfMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nConfMax < 0 ) - goto usage; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( Abc_NtkIsComb(pNtk) ) - { - fprintf( pErr, "The network is combinational (run \"fraig\" or \"fraig_sweep\").\n" ); - return 1; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - printf( "This command works only for structrally hashed networks. Run \"st\".\n" ); - return 0; - } - - // get the new network - pNtkRes = Abc_NtkDarLcorr( pNtk, nFramesP, nConfMax, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Sequential sweeping has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: lcorr [-P num] [-C num] [-vh]\n" ); - fprintf( pErr, "\t computes latch correspondence using 1-step induction\n" ); - fprintf( pErr, "\t-P num : number of time frames to use as the prefix [default = %d]\n", nFramesP ); - fprintf( pErr, "\t-C num : max conflict number when proving latch equivalence [default = %d]\n", nConfMax ); - fprintf( pErr, "\t-v : toggle verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandSeqCleanup( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkRes; - int c; - int fLatchSweep; - int fAutoSweep; - int fVerbose; - extern Abc_Ntk_t * Abc_NtkDarLatchSweep( Abc_Ntk_t * pNtk, int fLatchSweep, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fLatchSweep = 0; - fAutoSweep = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "lavh" ) ) != EOF ) - { - switch ( c ) - { - case 'l': - fLatchSweep ^= 1; - break; - case 'a': - fAutoSweep ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Only works for structrally hashed networks.\n" ); - return 1; - } - if ( !Abc_NtkLatchNum(pNtk) ) - { - fprintf( pErr, "Only works for sequential networks.\n" ); - return 1; - } - // modify the current network - pNtkRes = Abc_NtkDarLatchSweep( pNtk, fLatchSweep, fVerbose ); - if ( pNtkRes == NULL ) - { - fprintf( pErr, "Sequential cleanup has failed.\n" ); - return 1; - } - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); - return 0; - -usage: - fprintf( pErr, "usage: scleanup [-lvh]\n" ); - fprintf( pErr, "\t performs sequential cleanup\n" ); - fprintf( pErr, "\t - removes nodes/latches that do not feed into POs\n" ); - fprintf( pErr, "\t - removes stuck-at and identical latches (latch sweep)\n" ); -// fprintf( pErr, "\t - replaces autonomous logic by free PI variables\n" ); - fprintf( pErr, "\t (the latter may change sequential behaviour)\n" ); - fprintf( pErr, "\t-l : toggle sweeping latches [default = %s]\n", fLatchSweep? "yes": "no" ); -// fprintf( pErr, "\t-a : toggle removing autonomous logic [default = %s]\n", fAutoSweep? "yes": "no" ); - fprintf( pErr, "\t-v : toggle verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandCycle( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int nFrames; - int fVerbose; - extern void Abc_NtkCycleInitState( Abc_Ntk_t * pNtk, int nFrames, int fVerbose ); - extern void Abc_NtkCycleInitStateSop( Abc_Ntk_t * pNtk, int nFrames, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nFrames = 100; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Fvh" ) ) != EOF ) - { - switch ( c ) - { - case 'F': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-F\" should be followed by an integer.\n" ); - goto usage; - } - nFrames = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nFrames < 0 ) - goto usage; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsStrash(pNtk) && !Abc_NtkIsSopLogic(pNtk) ) - { - fprintf( pErr, "Only works for strashed networks or logic SOP networks.\n" ); - return 1; - } - if ( !Abc_NtkLatchNum(pNtk) ) - { - fprintf( pErr, "Only works for sequential networks.\n" ); - return 1; - } - - if ( Abc_NtkIsStrash(pNtk) ) - Abc_NtkCycleInitState( pNtk, nFrames, fVerbose ); - else - Abc_NtkCycleInitStateSop( pNtk, nFrames, fVerbose ); - return 0; - -usage: - fprintf( pErr, "usage: cycle [-F num] [-vh]\n" ); - fprintf( pErr, "\t cycles sequiential circuit for the given number of timeframes\n" ); - fprintf( pErr, "\t to derive a new initial state (which may be on the envelope)\n" ); - fprintf( pErr, "\t-F num : the number of frames to simulate [default = %d]\n", nFrames ); - fprintf( pErr, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandXsim( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int nFrames; - int fXInputs; - int fXState; - int fVerbose; - extern void Abc_NtkXValueSimulate( Abc_Ntk_t * pNtk, int nFrames, int fXInputs, int fXState, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nFrames = 10; - fXInputs = 0; - fXState = 0; - fVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Fisvh" ) ) != EOF ) - { - switch ( c ) - { - case 'F': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-F\" should be followed by an integer.\n" ); - goto usage; - } - nFrames = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nFrames < 0 ) - goto usage; - break; - case 'i': - fXInputs ^= 1; - break; - case 's': - fXState ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "Only works for strashed networks.\n" ); - return 1; - } - if ( !Abc_NtkLatchNum(pNtk) ) - { - fprintf( pErr, "Only works for sequential networks.\n" ); - return 1; - } - Abc_NtkXValueSimulate( pNtk, nFrames, fXInputs, fXState, fVerbose ); - return 0; - -usage: - fprintf( pErr, "usage: xsim [-F num] [-isvh]\n" ); - fprintf( pErr, "\t performs X-valued simulation of the AIG\n" ); - fprintf( pErr, "\t-F num : the number of frames to simulate [default = %d]\n", nFrames ); - fprintf( pErr, "\t-i : toggle X-valued representation of inputs [default = %s]\n", fXInputs? "yes": "no" ); - fprintf( pErr, "\t-s : toggle X-valued representation of state [default = %s]\n", fXState? "yes": "no" ); - fprintf( pErr, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandCec( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - char Buffer[16]; - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtk1, * pNtk2; - int fDelete1, fDelete2; - char ** pArgvNew; - int nArgcNew; - int c; - int fSat; - int fVerbose; - int nSeconds; - int nPartSize; - int nConfLimit; - int nInsLimit; - int fPartition; - - extern void Abc_NtkCecSat( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nConfLimit, int nInsLimit ); - extern void Abc_NtkCecFraig( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, int fVerbose ); - extern void Abc_NtkCecFraigPart( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, int nPartSize, int fVerbose ); - extern void Abc_NtkCecFraigPartAuto( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, int fVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fSat = 0; - fVerbose = 0; - nSeconds = 20; - nPartSize = 0; - nConfLimit = 10000; - nInsLimit = 0; - fPartition = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "TCIPpsvh" ) ) != EOF ) - { - switch ( c ) - { - case 'T': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-T\" should be followed by an integer.\n" ); - goto usage; - } - nSeconds = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nSeconds < 0 ) - goto usage; - break; - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - nConfLimit = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nConfLimit < 0 ) - goto usage; - break; - case 'I': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-I\" should be followed by an integer.\n" ); - goto usage; - } - nInsLimit = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nInsLimit < 0 ) - goto usage; - break; - case 'P': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-P\" should be followed by an integer.\n" ); - goto usage; - } - nPartSize = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nPartSize < 0 ) - goto usage; - break; - case 'p': - fPartition ^= 1; - break; - case 's': - fSat ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - default: - goto usage; - } - } - - pArgvNew = argv + globalUtilOptind; - nArgcNew = argc - globalUtilOptind; - if ( !Abc_NtkPrepareTwoNtks( pErr, pNtk, pArgvNew, nArgcNew, &pNtk1, &pNtk2, &fDelete1, &fDelete2 ) ) - return 1; - - // perform equivalence checking - if ( fPartition ) - Abc_NtkCecFraigPartAuto( pNtk1, pNtk2, nSeconds, fVerbose ); - else if ( nPartSize ) - Abc_NtkCecFraigPart( pNtk1, pNtk2, nSeconds, nPartSize, fVerbose ); - else if ( fSat ) - Abc_NtkCecSat( pNtk1, pNtk2, nConfLimit, nInsLimit ); - else - Abc_NtkCecFraig( pNtk1, pNtk2, nSeconds, fVerbose ); - - if ( fDelete1 ) Abc_NtkDelete( pNtk1 ); - if ( fDelete2 ) Abc_NtkDelete( pNtk2 ); - return 0; - -usage: - if ( nPartSize == 0 ) - strcpy( Buffer, "unused" ); - else - sprintf( Buffer, "%d", nPartSize ); - fprintf( pErr, "usage: cec [-T num] [-C num] [-I num] [-P num] [-psvh] <file1> <file2>\n" ); - fprintf( pErr, "\t performs combinational equivalence checking\n" ); - fprintf( pErr, "\t-T num : approximate runtime limit in seconds [default = %d]\n", nSeconds ); - fprintf( pErr, "\t-C num : limit on the number of conflicts [default = %d]\n", nConfLimit ); - fprintf( pErr, "\t-I num : limit on the number of clause inspections [default = %d]\n", nInsLimit ); - fprintf( pErr, "\t-P num : partition size for multi-output networks [default = %s]\n", Buffer ); - fprintf( pErr, "\t-p : toggle automatic partitioning [default = %s]\n", fPartition? "yes": "no" ); - fprintf( pErr, "\t-s : toggle \"SAT only\" and \"FRAIG + SAT\" [default = %s]\n", fSat? "SAT only": "FRAIG + SAT" ); - fprintf( pErr, "\t-v : toggles verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\tfile1 : (optional) the file with the first network\n"); - fprintf( pErr, "\tfile2 : (optional) the file with the second network\n"); - fprintf( pErr, "\t if no files are given, uses the current network and its spec\n"); - fprintf( pErr, "\t if one file is given, uses the current network and the file\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandSec( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtk1, * pNtk2; - int fDelete1, fDelete2; - char ** pArgvNew; - int nArgcNew; - int c; - int fRetime; - int fSat; - int fVerbose; - int nFrames; - int nSeconds; - int nConfLimit; - int nInsLimit; - - extern void Abc_NtkSecSat( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nConfLimit, int nInsLimit, int nFrames ); - extern int Abc_NtkSecFraig( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, int nFrames, int fVerbose ); - extern void Abc_NtkSecRetime( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2 ); - - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fRetime = 0; // verification after retiming - fSat = 0; - fVerbose = 0; - nFrames = 5; - nSeconds = 20; - nConfLimit = 10000; - nInsLimit = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "FTCIsrvh" ) ) != EOF ) - { - switch ( c ) - { - case 'F': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-F\" should be followed by an integer.\n" ); - goto usage; - } - nFrames = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nFrames <= 0 ) - goto usage; - break; - case 'T': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-T\" should be followed by an integer.\n" ); - goto usage; - } - nSeconds = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nSeconds < 0 ) - goto usage; - break; - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - nConfLimit = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nConfLimit < 0 ) - goto usage; - break; - case 'I': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-I\" should be followed by an integer.\n" ); - goto usage; - } - nInsLimit = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nInsLimit < 0 ) - goto usage; - break; - case 'r': - fRetime ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - case 's': - fSat ^= 1; - break; - default: - goto usage; - } - } - - pArgvNew = argv + globalUtilOptind; - nArgcNew = argc - globalUtilOptind; - if ( !Abc_NtkPrepareTwoNtks( pErr, pNtk, pArgvNew, nArgcNew, &pNtk1, &pNtk2, &fDelete1, &fDelete2 ) ) - return 1; - - if ( Abc_NtkLatchNum(pNtk1) == 0 || Abc_NtkLatchNum(pNtk2) == 0 ) - { - printf( "The network has no latches. Used combinational command \"cec\".\n" ); - return 0; - } - - // perform equivalence checking - if ( fRetime ) - Abc_NtkSecRetime( pNtk1, pNtk2 ); - else if ( fSat ) - Abc_NtkSecSat( pNtk1, pNtk2, nConfLimit, nInsLimit, nFrames ); - else - Abc_NtkSecFraig( pNtk1, pNtk2, nSeconds, nFrames, fVerbose ); - - if ( fDelete1 ) Abc_NtkDelete( pNtk1 ); - if ( fDelete2 ) Abc_NtkDelete( pNtk2 ); - return 0; - -usage: - fprintf( pErr, "usage: sec [-F num] [-T num] [-C num] [-I num] [-srvh] <file1> <file2>\n" ); - fprintf( pErr, "\t performs bounded sequential equivalence checking\n" ); - fprintf( pErr, "\t-s : toggle \"SAT only\" and \"FRAIG + SAT\" [default = %s]\n", fSat? "SAT only": "FRAIG + SAT" ); - fprintf( pErr, "\t-r : toggles retiming verification [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-v : toggles verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\t-F num : the number of time frames to use [default = %d]\n", nFrames ); - fprintf( pErr, "\t-T num : approximate runtime limit in seconds [default = %d]\n", nSeconds ); - fprintf( pErr, "\t-C num : limit on the number of conflicts [default = %d]\n", nConfLimit ); - fprintf( pErr, "\t-I num : limit on the number of inspections [default = %d]\n", nInsLimit ); - fprintf( pErr, "\tfile1 : (optional) the file with the first network\n"); - fprintf( pErr, "\tfile2 : (optional) the file with the second network\n"); - fprintf( pErr, "\t if no files are given, uses the current network and its spec\n"); - fprintf( pErr, "\t if one file is given, uses the current network and the file\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandDSec( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtk1, * pNtk2; - int fDelete1, fDelete2; - char ** pArgvNew; - int nArgcNew; - int c; - int fRetimeFirst; - int fVerbose; - int fVeryVerbose; - int nFrames; - - extern int Abc_NtkDarSec( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nFrames, int fRetimeFirst, int fVerbose, int fVeryVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nFrames =16; - fRetimeFirst = 1; - fVerbose = 0; - fVeryVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Krwvh" ) ) != EOF ) - { - switch ( c ) - { - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by an integer.\n" ); - goto usage; - } - nFrames = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nFrames < 0 ) - goto usage; - break; - case 'r': - fRetimeFirst ^= 1; - break; - case 'w': - fVeryVerbose ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - default: - goto usage; - } - } - - pArgvNew = argv + globalUtilOptind; - nArgcNew = argc - globalUtilOptind; - if ( !Abc_NtkPrepareTwoNtks( pErr, pNtk, pArgvNew, nArgcNew, &pNtk1, &pNtk2, &fDelete1, &fDelete2 ) ) - return 1; - - if ( Abc_NtkLatchNum(pNtk1) == 0 || Abc_NtkLatchNum(pNtk2) == 0 ) - { - printf( "The network has no latches. Used combinational command \"cec\".\n" ); - return 0; - } - - // perform verification - Abc_NtkDarSec( pNtk1, pNtk2, nFrames, fRetimeFirst, fVerbose, fVeryVerbose ); - - if ( fDelete1 ) Abc_NtkDelete( pNtk1 ); - if ( fDelete2 ) Abc_NtkDelete( pNtk2 ); - return 0; - -usage: - fprintf( pErr, "usage: dsec [-K num] [-rwvh] <file1> <file2>\n" ); - fprintf( pErr, "\t performs inductive sequential equivalence checking\n" ); - fprintf( pErr, "\t-K num : the limit on the depth of induction [default = %d]\n", nFrames ); - fprintf( pErr, "\t-r : toggles forward retiming at the beginning [default = %s]\n", fRetimeFirst? "yes": "no" ); - fprintf( pErr, "\t-v : toggles verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-w : toggles additional verbose output [default = %s]\n", fVeryVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - fprintf( pErr, "\tfile1 : (optional) the file with the first network\n"); - fprintf( pErr, "\tfile2 : (optional) the file with the second network\n"); - fprintf( pErr, "\t if no files are given, uses the current network and its spec\n"); - fprintf( pErr, "\t if one file is given, uses the current network and the file\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandDProve( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int fRetimeFirst; - int fVerbose; - int fVeryVerbose; - int nFrames; - - extern int Abc_NtkDarProve( Abc_Ntk_t * pNtk, int nFrames, int fRetimeFirst, int fVerbose, int fVeryVerbose ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - nFrames = 16; - fRetimeFirst = 1; - fVerbose = 0; - fVeryVerbose = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "Krwvh" ) ) != EOF ) - { - switch ( c ) - { - case 'K': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-K\" should be followed by an integer.\n" ); - goto usage; - } - nFrames = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nFrames < 0 ) - goto usage; - break; - case 'r': - fRetimeFirst ^= 1; - break; - case 'w': - fVeryVerbose ^= 1; - break; - case 'v': - fVerbose ^= 1; - break; - default: - goto usage; - } - } - - if ( Abc_NtkLatchNum(pNtk) == 0 ) - { - printf( "The network has no latches. Used combinational command \"iprove\".\n" ); - return 0; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - printf( "This command works only for structrally hashed networks. Run \"st\".\n" ); - return 0; - } - - // perform verification - Abc_NtkDarProve( pNtk, nFrames, fRetimeFirst, fVerbose, fVeryVerbose ); - return 0; - -usage: - fprintf( pErr, "usage: dprove [-K num] [-rwvh]\n" ); - fprintf( pErr, "\t performs SEC on the sequential miter\n" ); - fprintf( pErr, "\t-K num : the limit on the depth of induction [default = %d]\n", nFrames ); - fprintf( pErr, "\t-r : toggles forward retiming at the beginning [default = %s]\n", fRetimeFirst? "yes": "no" ); - fprintf( pErr, "\t-v : toggles verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-w : toggles additional verbose output [default = %s]\n", fVeryVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandSat( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int RetValue; - int fVerbose; - int nConfLimit; - int nInsLimit; - int clk; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fVerbose = 0; - nConfLimit = 100000; - nInsLimit = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "CIvh" ) ) != EOF ) - { - switch ( c ) - { - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - nConfLimit = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nConfLimit < 0 ) - goto usage; - break; - case 'I': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-I\" should be followed by an integer.\n" ); - goto usage; - } - nInsLimit = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nInsLimit < 0 ) - goto usage; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkLatchNum(pNtk) > 0 ) - { - fprintf( stdout, "Currently can only solve the miter for combinational circuits.\n" ); - return 0; - } - - clk = clock(); - if ( Abc_NtkIsStrash(pNtk) ) - { - RetValue = Abc_NtkMiterSat( pNtk, (sint64)nConfLimit, (sint64)nInsLimit, fVerbose, NULL, NULL ); - } - else - { - assert( Abc_NtkIsLogic(pNtk) ); - Abc_NtkToBdd( pNtk ); - RetValue = Abc_NtkMiterSat( pNtk, (sint64)nConfLimit, (sint64)nInsLimit, fVerbose, NULL, NULL ); - } - - // verify that the pattern is correct - if ( RetValue == 0 && Abc_NtkPoNum(pNtk) == 1 ) - { - //int i; - //Abc_Obj_t * pObj; - int * pSimInfo = Abc_NtkVerifySimulatePattern( pNtk, pNtk->pModel ); - if ( pSimInfo[0] != 1 ) - printf( "ERROR in Abc_NtkMiterSat(): Generated counter example is invalid.\n" ); - free( pSimInfo ); - /* - // print model - Abc_NtkForEachPi( pNtk, pObj, i ) - { - printf( "%d", (int)(pNtk->pModel[i] > 0) ); - if ( i == 70 ) - break; - } - printf( "\n" ); - */ - } - - if ( RetValue == -1 ) - printf( "UNDECIDED " ); - else if ( RetValue == 0 ) - printf( "SATISFIABLE " ); - else - printf( "UNSATISFIABLE " ); - //printf( "\n" ); - PRT( "Time", clock() - clk ); - return 0; - -usage: - fprintf( pErr, "usage: sat [-C num] [-I num] [-vh]\n" ); - fprintf( pErr, "\t solves the combinational miter using SAT solver MiniSat-1.14\n" ); - fprintf( pErr, "\t derives CNF from the current network and leave it unchanged\n" ); - fprintf( pErr, "\t-C num : limit on the number of conflicts [default = %d]\n", nConfLimit ); - fprintf( pErr, "\t-I num : limit on the number of inspections [default = %d]\n", nInsLimit ); - fprintf( pErr, "\t-v : prints verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandDSat( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - int RetValue; - int fVerbose; - int nConfLimit; - int nInsLimit; - int clk; - - extern int Abc_NtkDSat( Abc_Ntk_t * pNtk, sint64 nConfLimit, sint64 nInsLimit, int fVerbose ); - - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - fVerbose = 0; - nConfLimit = 100000; - nInsLimit = 0; - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "CIvh" ) ) != EOF ) - { - switch ( c ) - { - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - nConfLimit = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nConfLimit < 0 ) - goto usage; - break; - case 'I': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-I\" should be followed by an integer.\n" ); - goto usage; - } - nInsLimit = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( nInsLimit < 0 ) - goto usage; - break; - case 'v': - fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkLatchNum(pNtk) > 0 ) - { - fprintf( stdout, "Currently can only solve the miter for combinational circuits.\n" ); - return 0; - } - if ( Abc_NtkPoNum(pNtk) != 1 ) - { - fprintf( stdout, "Currently expects a single-output miter.\n" ); - return 0; - } - - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( stdout, "Currently only works for structurally hashed circuits.\n" ); - return 0; - } - - clk = clock(); - RetValue = Abc_NtkDSat( pNtk, (sint64)nConfLimit, (sint64)nInsLimit, fVerbose ); - // verify that the pattern is correct - if ( RetValue == 0 && Abc_NtkPoNum(pNtk) == 1 ) - { - //int i; - //Abc_Obj_t * pObj; - int * pSimInfo = Abc_NtkVerifySimulatePattern( pNtk, pNtk->pModel ); - if ( pSimInfo[0] != 1 ) - printf( "ERROR in Abc_NtkMiterSat(): Generated counter example is invalid.\n" ); - free( pSimInfo ); - /* - // print model - Abc_NtkForEachPi( pNtk, pObj, i ) - { - printf( "%d", (int)(pNtk->pModel[i] > 0) ); - if ( i == 70 ) - break; - } - printf( "\n" ); - */ - } - - if ( RetValue == -1 ) - printf( "UNDECIDED " ); - else if ( RetValue == 0 ) - printf( "SATISFIABLE " ); - else - printf( "UNSATISFIABLE " ); - //printf( "\n" ); - PRT( "Time", clock() - clk ); - return 0; - -usage: - fprintf( pErr, "usage: dsat [-C num] [-I num] [-vh]\n" ); - fprintf( pErr, "\t solves the combinational miter using SAT solver MiniSat-1.14\n" ); - fprintf( pErr, "\t derives CNF from the current network and leave it unchanged\n" ); - fprintf( pErr, "\t-C num : limit on the number of conflicts [default = %d]\n", nConfLimit ); - fprintf( pErr, "\t-I num : limit on the number of inspections [default = %d]\n", nInsLimit ); - fprintf( pErr, "\t-v : prints verbose information [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandProve( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk, * pNtkTemp; - Prove_Params_t Params, * pParams = &Params; - int c, clk, RetValue; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Prove_ParamsSetDefault( pParams ); - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "NCFLIrfbvh" ) ) != EOF ) - { - switch ( c ) - { - case 'N': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-N\" should be followed by an integer.\n" ); - goto usage; - } - pParams->nItersMax = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pParams->nItersMax < 0 ) - goto usage; - break; - case 'C': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" ); - goto usage; - } - pParams->nMiteringLimitStart = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pParams->nMiteringLimitStart < 0 ) - goto usage; - break; - case 'F': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-F\" should be followed by an integer.\n" ); - goto usage; - } - pParams->nFraigingLimitStart = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pParams->nFraigingLimitStart < 0 ) - goto usage; - break; - case 'L': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-L\" should be followed by an integer.\n" ); - goto usage; - } - pParams->nMiteringLimitLast = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pParams->nMiteringLimitLast < 0 ) - goto usage; - break; - case 'I': - if ( globalUtilOptind >= argc ) - { - fprintf( pErr, "Command line switch \"-I\" should be followed by an integer.\n" ); - goto usage; - } - pParams->nTotalInspectLimit = atoi(argv[globalUtilOptind]); - globalUtilOptind++; - if ( pParams->nTotalInspectLimit < 0 ) - goto usage; - break; - case 'r': - pParams->fUseRewriting ^= 1; - break; - case 'f': - pParams->fUseFraiging ^= 1; - break; - case 'b': - pParams->fUseBdds ^= 1; - break; - case 'v': - pParams->fVerbose ^= 1; - break; - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( Abc_NtkLatchNum(pNtk) > 0 ) - { - fprintf( stdout, "Currently can only solve the miter for combinational circuits.\n" ); - return 0; - } - if ( Abc_NtkCoNum(pNtk) != 1 ) - { - fprintf( stdout, "Currently can only solve the miter with one output.\n" ); - return 0; - } - clk = clock(); - - if ( Abc_NtkIsStrash(pNtk) ) - pNtkTemp = Abc_NtkDup( pNtk ); - else - pNtkTemp = Abc_NtkStrash( pNtk, 0, 0, 0 ); - - RetValue = Abc_NtkMiterProve( &pNtkTemp, pParams ); - - // verify that the pattern is correct - if ( RetValue == 0 ) - { - int * pSimInfo = Abc_NtkVerifySimulatePattern( pNtk, pNtkTemp->pModel ); - if ( pSimInfo[0] != 1 ) - printf( "ERROR in Abc_NtkMiterProve(): Generated counter-example is invalid.\n" ); - free( pSimInfo ); - } - - if ( RetValue == -1 ) - printf( "UNDECIDED " ); - else if ( RetValue == 0 ) - printf( "SATISFIABLE " ); - else - printf( "UNSATISFIABLE " ); - //printf( "\n" ); - - PRT( "Time", clock() - clk ); - // replace the current network - Abc_FrameReplaceCurrentNetwork( pAbc, pNtkTemp ); - return 0; - -usage: - fprintf( pErr, "usage: prove [-N num] [-C num] [-F num] [-L num] [-I num] [-rfbvh]\n" ); - fprintf( pErr, "\t solves combinational miter by rewriting, FRAIGing, and SAT\n" ); - fprintf( pErr, "\t replaces the current network by the cone modified by rewriting\n" ); - fprintf( pErr, "\t-N num : max number of iterations [default = %d]\n", pParams->nItersMax ); - fprintf( pErr, "\t-C num : max starting number of conflicts in mitering [default = %d]\n", pParams->nMiteringLimitStart ); - fprintf( pErr, "\t-F num : max starting number of conflicts in fraiging [default = %d]\n", pParams->nFraigingLimitStart ); - fprintf( pErr, "\t-L num : max last-gasp number of conflicts in mitering [default = %d]\n", pParams->nMiteringLimitLast ); - fprintf( pErr, "\t-I num : max number of clause inspections in all SAT calls [default = %d]\n", (int)pParams->nTotalInspectLimit ); - fprintf( pErr, "\t-r : toggle the use of rewriting [default = %s]\n", pParams->fUseRewriting? "yes": "no" ); - fprintf( pErr, "\t-f : toggle the use of FRAIGing [default = %s]\n", pParams->fUseFraiging? "yes": "no" ); - fprintf( pErr, "\t-b : toggle the use of BDDs [default = %s]\n", pParams->fUseBdds? "yes": "no" ); - fprintf( pErr, "\t-v : prints verbose information [default = %s]\n", pParams->fVerbose? "yes": "no" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandDebug( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - extern void Abc_NtkAutoDebug( Abc_Ntk_t * pNtk, int (*pFuncError) (Abc_Ntk_t *) ); - extern int Abc_NtkRetimeDebug( Abc_Ntk_t * pNtk ); - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsLogic(pNtk) ) - { - fprintf( pErr, "This command is applicable to logic networks.\n" ); - return 1; - } - - Abc_NtkAutoDebug( pNtk, Abc_NtkRetimeDebug ); - return 0; - -usage: - fprintf( pErr, "usage: debug [-h]\n" ); - fprintf( pErr, "\t performs automated debugging of the given procedure\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandTraceStart( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command is applicable to AIGs.\n" ); - return 1; - } -/* - Abc_HManStart(); - if ( !Abc_HManPopulate( pNtk ) ) - { - fprintf( pErr, "Failed to start the tracing database.\n" ); - return 1; - } -*/ - return 0; - -usage: - fprintf( pErr, "usage: trace_start [-h]\n" ); - fprintf( pErr, "\t starts verification tracing\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CommandTraceCheck( Abc_Frame_t * pAbc, int argc, char ** argv ) -{ - FILE * pOut, * pErr; - Abc_Ntk_t * pNtk; - int c; - - pNtk = Abc_FrameReadNtk(pAbc); - pOut = Abc_FrameReadOut(pAbc); - pErr = Abc_FrameReadErr(pAbc); - - // set defaults - Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) - { - switch ( c ) - { - case 'h': - goto usage; - default: - goto usage; - } - } - - if ( pNtk == NULL ) - { - fprintf( pErr, "Empty network.\n" ); - return 1; - } - if ( !Abc_NtkIsStrash(pNtk) ) - { - fprintf( pErr, "This command is applicable to AIGs.\n" ); - return 1; - } -/* - if ( !Abc_HManIsRunning(pNtk) ) - { - fprintf( pErr, "The tracing database is not available.\n" ); - return 1; - } - - if ( !Abc_HManVerify( 1, pNtk->Id ) ) - fprintf( pErr, "Verification failed.\n" ); - Abc_HManStop(); -*/ - return 0; - -usage: - fprintf( pErr, "usage: trace_check [-h]\n" ); - fprintf( pErr, "\t checks the current network using verification trace\n" ); - fprintf( pErr, "\t-h : print the command usage\n"); - return 1; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcAttach.c b/src/base/abci/abcAttach.c deleted file mode 100644 index d5d2aa16..00000000 --- a/src/base/abci/abcAttach.c +++ /dev/null @@ -1,404 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcAttach.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Attaches the library gates to the current network.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcAttach.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "main.h" -#include "mio.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -#define ATTACH_FULL (~((unsigned)0)) -#define ATTACH_MASK(n) ((~((unsigned)0)) >> (32-(n))) - -static void Abc_AttachSetupTruthTables( unsigned uTruths[][2] ); -static void Abc_AttachComputeTruth( char * pSop, unsigned uTruthsIn[][2], unsigned * uTruthNode ); -static Mio_Gate_t * Abc_AttachFind( Mio_Gate_t ** ppGates, unsigned ** puTruthGates, int nGates, unsigned * uTruthNode, int * Perm ); -static int Abc_AttachCompare( unsigned ** puTruthGates, int nGates, unsigned * uTruthNode ); -static int Abc_NodeAttach( Abc_Obj_t * pNode, Mio_Gate_t ** ppGates, unsigned ** puTruthGates, int nGates, unsigned uTruths[][2] ); -static void Abc_TruthPermute( char * pPerm, int nVars, unsigned * uTruthNode, unsigned * uTruthPerm ); - -static char ** s_pPerms = NULL; -static int s_nPerms; - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Attaches gates from the current library to the internal nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkAttach( Abc_Ntk_t * pNtk ) -{ - Mio_Library_t * pGenlib; - unsigned ** puTruthGates; - unsigned uTruths[6][2]; - Abc_Obj_t * pNode; - Mio_Gate_t ** ppGates; - int nGates, nFanins, i; - - assert( Abc_NtkIsSopLogic(pNtk) ); - - // check that the library is available - pGenlib = Abc_FrameReadLibGen(); - if ( pGenlib == NULL ) - { - printf( "The current library is not available.\n" ); - return 0; - } - - // start the truth tables - Abc_AttachSetupTruthTables( uTruths ); - - // collect all the gates - ppGates = Mio_CollectRoots( pGenlib, 6, (float)1.0e+20, 1, &nGates ); - - // derive the gate truth tables - puTruthGates = ALLOC( unsigned *, nGates ); - puTruthGates[0] = ALLOC( unsigned, 2 * nGates ); - for ( i = 1; i < nGates; i++ ) - puTruthGates[i] = puTruthGates[i-1] + 2; - for ( i = 0; i < nGates; i++ ) - Mio_DeriveTruthTable( ppGates[i], uTruths, Mio_GateReadInputs(ppGates[i]), 6, puTruthGates[i] ); - - // assign the gates to pNode->pCopy - Abc_NtkCleanCopy( pNtk ); - Abc_NtkForEachNode( pNtk, pNode, i ) - { - nFanins = Abc_ObjFaninNum(pNode); - if ( nFanins == 0 ) - { - if ( Abc_SopIsConst1(pNode->pData) ) - pNode->pCopy = (Abc_Obj_t *)Mio_LibraryReadConst1(pGenlib); - else - pNode->pCopy = (Abc_Obj_t *)Mio_LibraryReadConst0(pGenlib); - } - else if ( nFanins == 1 ) - { - if ( Abc_SopIsBuf(pNode->pData) ) - pNode->pCopy = (Abc_Obj_t *)Mio_LibraryReadBuf(pGenlib); - else - pNode->pCopy = (Abc_Obj_t *)Mio_LibraryReadInv(pGenlib); - } - else if ( nFanins > 6 ) - { - printf( "Cannot attach gate with more than 6 inputs to node %s.\n", Abc_ObjName(pNode) ); - free( puTruthGates[0] ); - free( puTruthGates ); - free( ppGates ); - return 0; - } - else if ( !Abc_NodeAttach( pNode, ppGates, puTruthGates, nGates, uTruths ) ) - { - printf( "Could not attach the library gate to node %s.\n", Abc_ObjName(pNode) ); - free( puTruthGates[0] ); - free( puTruthGates ); - free( ppGates ); - return 0; - } - } - free( puTruthGates[0] ); - free( puTruthGates ); - free( ppGates ); - FREE( s_pPerms ); - - // perform the final transformation - Abc_NtkForEachNode( pNtk, pNode, i ) - { - if ( pNode->pCopy == NULL ) - { - printf( "Some elementary gates (constant, buffer, or inverter) are missing in the library.\n" ); - return 0; - } - } - - // replace SOP representation by the gate representation - Abc_NtkForEachNode( pNtk, pNode, i ) - pNode->pData = pNode->pCopy, pNode->pCopy = NULL; - pNtk->ntkFunc = ABC_FUNC_MAP; - Extra_MmFlexStop( pNtk->pManFunc ); - pNtk->pManFunc = pGenlib; - - printf( "Library gates are successfully attached to the nodes.\n" ); - - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtk ) ) - { - printf( "Abc_NtkAttach: The network check has failed.\n" ); - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeAttach( Abc_Obj_t * pNode, Mio_Gate_t ** ppGates, unsigned ** puTruthGates, int nGates, unsigned uTruths[][2] ) -{ - int Perm[10]; - int pTempInts[10]; - unsigned uTruthNode[2]; - Abc_Obj_t * pFanin; - Mio_Gate_t * pGate; - int nFanins, i; - - // compute the node's truth table - Abc_AttachComputeTruth( pNode->pData, uTruths, uTruthNode ); - // find the matching gate and permutation - pGate = Abc_AttachFind( ppGates, puTruthGates, nGates, uTruthNode, Perm ); - if ( pGate == NULL ) - return 0; - // permute the fanins - nFanins = Abc_ObjFaninNum(pNode); - Abc_ObjForEachFanin( pNode, pFanin, i ) - pTempInts[i] = pFanin->Id; - for ( i = 0; i < nFanins; i++ ) - pNode->vFanins.pArray[Perm[i]] = pTempInts[i]; - // set the gate - pNode->pCopy = (Abc_Obj_t *)pGate; - return 1; -} - -/**Function************************************************************* - - Synopsis [Sets up the truth tables.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_AttachSetupTruthTables( unsigned uTruths[][2] ) -{ - int m, v; - for ( v = 0; v < 5; v++ ) - uTruths[v][0] = 0; - // set up the truth tables - for ( m = 0; m < 32; m++ ) - for ( v = 0; v < 5; v++ ) - if ( m & (1 << v) ) - uTruths[v][0] |= (1 << m); - // make adjustments for the case of 6 variables - for ( v = 0; v < 5; v++ ) - uTruths[v][1] = uTruths[v][0]; - uTruths[5][0] = 0; - uTruths[5][1] = ATTACH_FULL; -} - -/**Function************************************************************* - - Synopsis [Compute the truth table of the node's cover.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_AttachComputeTruth( char * pSop, unsigned uTruthsIn[][2], unsigned * uTruthRes ) -{ -// Mvc_Cube_t * pCube; - unsigned uSignCube[2]; - int Value; -// int nInputs = pCover->nBits/2; - int nInputs = 6; - int nFanins = Abc_SopGetVarNum(pSop); - char * pCube; - int k; - - // make sure that the number of input truth tables in equal to the number of gate inputs - assert( nInputs < 7 ); - - // clean the resulting truth table - uTruthRes[0] = 0; - uTruthRes[1] = 0; - if ( nInputs < 6 ) - { - // consider the case when only one unsigned can be used -// Mvc_CoverForEachCube( pCover, pCube ) - Abc_SopForEachCube( pSop, nFanins, pCube ) - { - uSignCube[0] = ATTACH_FULL; -// Mvc_CubeForEachVarValue( pCover, pCube, Var, Value ) - Abc_CubeForEachVar( pCube, Value, k ) - { - if ( Value == '0' ) - uSignCube[0] &= ~uTruthsIn[k][0]; - else if ( Value == '1' ) - uSignCube[0] &= uTruthsIn[k][0]; - } - uTruthRes[0] |= uSignCube[0]; - } - if ( Abc_SopGetPhase(pSop) == 0 ) - uTruthRes[0] = ~uTruthRes[0]; - if ( nInputs < 5 ) - uTruthRes[0] &= ATTACH_MASK(1<<nInputs); - } - else - { - // consider the case when two unsigneds should be used -// Mvc_CoverForEachCube( pCover, pCube ) - Abc_SopForEachCube( pSop, nFanins, pCube ) - { - uSignCube[0] = ATTACH_FULL; - uSignCube[1] = ATTACH_FULL; -// Mvc_CubeForEachVarValue( pCover, pCube, Var, Value ) - Abc_CubeForEachVar( pCube, Value, k ) - { - if ( Value == '0' ) - { - uSignCube[0] &= ~uTruthsIn[k][0]; - uSignCube[1] &= ~uTruthsIn[k][1]; - } - else if ( Value == '1' ) - { - uSignCube[0] &= uTruthsIn[k][0]; - uSignCube[1] &= uTruthsIn[k][1]; - } - } - uTruthRes[0] |= uSignCube[0]; - uTruthRes[1] |= uSignCube[1]; - } - - // complement if the SOP is complemented - if ( Abc_SopGetPhase(pSop) == 0 ) - { - uTruthRes[0] = ~uTruthRes[0]; - uTruthRes[1] = ~uTruthRes[1]; - } - } -} - -/**Function************************************************************* - - Synopsis [Find the gate by truth table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Mio_Gate_t * Abc_AttachFind( Mio_Gate_t ** ppGates, unsigned ** puTruthGates, int nGates, unsigned * uTruthNode, int * Perm ) -{ - unsigned uTruthPerm[2]; - int i, v, iNum; - - // try the gates without permutation - if ( (iNum = Abc_AttachCompare( puTruthGates, nGates, uTruthNode )) >= 0 ) - { - for ( v = 0; v < 6; v++ ) - Perm[v] = v; - return ppGates[iNum]; - } - // get permutations - if ( s_pPerms == NULL ) - { - s_pPerms = Extra_Permutations( 6 ); - s_nPerms = Extra_Factorial( 6 ); - } - // try permutations - for ( i = 0; i < s_nPerms; i++ ) - { - Abc_TruthPermute( s_pPerms[i], 6, uTruthNode, uTruthPerm ); - if ( (iNum = Abc_AttachCompare( puTruthGates, nGates, uTruthPerm )) >= 0 ) - { - for ( v = 0; v < 6; v++ ) - Perm[v] = (int)s_pPerms[i][v]; - return ppGates[iNum]; - } - } - return NULL; -} - -/**Function************************************************************* - - Synopsis [Find the gate by truth table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_AttachCompare( unsigned ** puTruthGates, int nGates, unsigned * uTruthNode ) -{ - int i; - for ( i = 0; i < nGates; i++ ) - if ( puTruthGates[i][0] == uTruthNode[0] && puTruthGates[i][1] == uTruthNode[1] ) - return i; - return -1; -} - -/**Function************************************************************* - - Synopsis [Permutes the 6-input truth table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_TruthPermute( char * pPerm, int nVars, unsigned * uTruthNode, unsigned * uTruthPerm ) -{ - int nMints, iMintPerm, iMint, v; - uTruthPerm[0] = uTruthPerm[1] = 0; - nMints = (1 << nVars); - for ( iMint = 0; iMint < nMints; iMint++ ) - { - if ( (uTruthNode[iMint>>5] & (1 << (iMint&31))) == 0 ) - continue; - iMintPerm = 0; - for ( v = 0; v < nVars; v++ ) - if ( iMint & (1 << v) ) - iMintPerm |= (1 << pPerm[v]); - uTruthPerm[iMintPerm>>5] |= (1 << (iMintPerm&31)); - } -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcAuto.c b/src/base/abci/abcAuto.c deleted file mode 100644 index 40212c17..00000000 --- a/src/base/abci/abcAuto.c +++ /dev/null @@ -1,239 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcAuto.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Computation of autosymmetries.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcAuto.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Abc_NtkAutoPrintAll( DdManager * dd, int nInputs, DdNode * pbOutputs[], int nOutputs, char * pInputNames[], char * pOutputNames[], int fNaive ); -static void Abc_NtkAutoPrintOne( DdManager * dd, int nInputs, DdNode * pbOutputs[], int Output, char * pInputNames[], char * pOutputNames[], int fNaive ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkAutoPrint( Abc_Ntk_t * pNtk, int Output, int fNaive, int fVerbose ) -{ - DdManager * dd; // the BDD manager used to hold shared BDDs - DdNode ** pbGlobal; // temporary storage for global BDDs - char ** pInputNames; // pointers to the CI names - char ** pOutputNames; // pointers to the CO names - int nOutputs, nInputs, i; - Vec_Ptr_t * vFuncsGlob; - Abc_Obj_t * pObj; - - // compute the global BDDs - if ( Abc_NtkBuildGlobalBdds(pNtk, 10000000, 1, 1, fVerbose) == NULL ) - return; - - // get information about the network - nInputs = Abc_NtkCiNum(pNtk); - nOutputs = Abc_NtkCoNum(pNtk); -// dd = pNtk->pManGlob; - dd = Abc_NtkGlobalBddMan( pNtk ); - - // complement the global functions - vFuncsGlob = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pObj, i ) - Vec_PtrPush( vFuncsGlob, Abc_ObjGlobalBdd(pObj) ); - pbGlobal = (DdNode **)Vec_PtrArray( vFuncsGlob ); - - // get the network names - pInputNames = Abc_NtkCollectCioNames( pNtk, 0 ); - pOutputNames = Abc_NtkCollectCioNames( pNtk, 1 ); - - // print the size of the BDDs - if ( fVerbose ) - printf( "Shared BDD size = %6d nodes.\n", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) ); - - // allocate additional variables - for ( i = 0; i < nInputs; i++ ) - Cudd_bddNewVar( dd ); - assert( Cudd_ReadSize(dd) == 2 * nInputs ); - - // create ZDD variables in the manager - Cudd_zddVarsFromBddVars( dd, 2 ); - - // perform the analysis of the primary output functions for auto-symmetry - if ( Output == -1 ) - Abc_NtkAutoPrintAll( dd, nInputs, pbGlobal, nOutputs, pInputNames, pOutputNames, fNaive ); - else - Abc_NtkAutoPrintOne( dd, nInputs, pbGlobal, Output, pInputNames, pOutputNames, fNaive ); - - // deref the PO functions -// Abc_NtkFreeGlobalBdds( pNtk ); - // stop the global BDD manager -// Extra_StopManager( pNtk->pManGlob ); -// pNtk->pManGlob = NULL; - Abc_NtkFreeGlobalBdds( pNtk, 1 ); - free( pInputNames ); - free( pOutputNames ); - Vec_PtrFree( vFuncsGlob ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkAutoPrintAll( DdManager * dd, int nInputs, DdNode * pbOutputs[], int nOutputs, char * pInputNames[], char * pOutputNames[], int fNaive ) -{ - DdNode * bSpace1, * bSpace2, * bCanVars, * bReduced, * zEquations; - double nMints; - int nSupp, SigCounter, o; - - int nAutos; - int nAutoSyms; - int nAutoSymsMax; - int nAutoSymsMaxSupp; - int nAutoSymOuts; - int nSuppSizeMax; - int clk; - - nAutoSymOuts = 0; - nAutoSyms = 0; - nAutoSymsMax = 0; - nAutoSymsMaxSupp = 0; - nSuppSizeMax = 0; - clk = clock(); - - SigCounter = 0; - for ( o = 0; o < nOutputs; o++ ) - { -// bSpace1 = Extra_bddSpaceFromFunctionFast( dd, pbOutputs[o] ); Cudd_Ref( bSpace1 ); - bSpace1 = Extra_bddSpaceFromFunction( dd, pbOutputs[o], pbOutputs[o] ); Cudd_Ref( bSpace1 ); - bCanVars = Extra_bddSpaceCanonVars( dd, bSpace1 ); Cudd_Ref( bCanVars ); - bReduced = Extra_bddSpaceReduce( dd, pbOutputs[o], bCanVars ); Cudd_Ref( bReduced ); - zEquations = Extra_bddSpaceEquations( dd, bSpace1 ); Cudd_Ref( zEquations ); - - nSupp = Cudd_SupportSize( dd, bSpace1 ); - nMints = Cudd_CountMinterm( dd, bSpace1, nSupp ); - nAutos = Extra_Base2LogDouble(nMints); - printf( "Output #%3d: Inputs = %2d. AutoK = %2d.\n", o, nSupp, nAutos ); - - if ( nAutos > 0 ) - { - nAutoSymOuts++; - nAutoSyms += nAutos; - if ( nAutoSymsMax < nAutos ) - { - nAutoSymsMax = nAutos; - nAutoSymsMaxSupp = nSupp; - } - } - if ( nSuppSizeMax < nSupp ) - nSuppSizeMax = nSupp; - - -//PRB( dd, bCanVars ); -//PRB( dd, bReduced ); -//Cudd_PrintMinterm( dd, bReduced ); -//printf( "The equations are:\n" ); -//Cudd_zddPrintCover( dd, zEquations ); -//printf( "\n" ); -//fflush( stdout ); - - bSpace2 = Extra_bddSpaceFromMatrixPos( dd, zEquations ); Cudd_Ref( bSpace2 ); -//PRB( dd, bSpace1 ); -//PRB( dd, bSpace2 ); - if ( bSpace1 != bSpace2 ) - printf( "Spaces are NOT EQUAL!\n" ); -// else -// printf( "Spaces are equal.\n" ); - - Cudd_RecursiveDeref( dd, bSpace1 ); - Cudd_RecursiveDeref( dd, bSpace2 ); - Cudd_RecursiveDeref( dd, bCanVars ); - Cudd_RecursiveDeref( dd, bReduced ); - Cudd_RecursiveDerefZdd( dd, zEquations ); - } - - printf( "The cumulative statistics for all outputs:\n" ); - printf( "Ins=%3d ", nInputs ); - printf( "InMax=%3d ", nSuppSizeMax ); - printf( "Outs=%3d ", nOutputs ); - printf( "Auto=%3d ", nAutoSymOuts ); - printf( "SumK=%3d ", nAutoSyms ); - printf( "KMax=%2d ", nAutoSymsMax ); - printf( "Supp=%3d ", nAutoSymsMaxSupp ); - printf( "Time=%4.2f ", (float)(clock() - clk)/(float)(CLOCKS_PER_SEC) ); - printf( "\n" ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkAutoPrintOne( DdManager * dd, int nInputs, DdNode * pbOutputs[], int Output, char * pInputNames[], char * pOutputNames[], int fNaive ) -{ - DdNode * bSpace1, * bCanVars, * bReduced, * zEquations; - double nMints; - int nSupp, SigCounter; - int nAutos; - - SigCounter = 0; - bSpace1 = Extra_bddSpaceFromFunctionFast( dd, pbOutputs[Output] ); Cudd_Ref( bSpace1 ); -// bSpace1 = Extra_bddSpaceFromFunction( dd, pbOutputs[Output], pbOutputs[Output] ); Cudd_Ref( bSpace1 ); - bCanVars = Extra_bddSpaceCanonVars( dd, bSpace1 ); Cudd_Ref( bCanVars ); - bReduced = Extra_bddSpaceReduce( dd, pbOutputs[Output], bCanVars ); Cudd_Ref( bReduced ); - zEquations = Extra_bddSpaceEquations( dd, bSpace1 ); Cudd_Ref( zEquations ); - - nSupp = Cudd_SupportSize( dd, bSpace1 ); - nMints = Cudd_CountMinterm( dd, bSpace1, nSupp ); - nAutos = Extra_Base2LogDouble(nMints); - printf( "Output #%3d: Inputs = %2d. AutoK = %2d.\n", Output, nSupp, nAutos ); - - Cudd_RecursiveDeref( dd, bSpace1 ); - Cudd_RecursiveDeref( dd, bCanVars ); - Cudd_RecursiveDeref( dd, bReduced ); - Cudd_RecursiveDerefZdd( dd, zEquations ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcBalance.c b/src/base/abci/abcBalance.c deleted file mode 100644 index f9b3384e..00000000 --- a/src/base/abci/abcBalance.c +++ /dev/null @@ -1,613 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcBalance.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Performs global balancing of the AIG by the number of levels.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcBalance.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Abc_NtkBalancePerform( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkAig, bool fDuplicate, bool fSelective, bool fUpdateLevel ); -static Abc_Obj_t * Abc_NodeBalance_rec( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNode, Vec_Vec_t * vStorage, int Level, bool fDuplicate, bool fSelective, bool fUpdateLevel ); -static Vec_Ptr_t * Abc_NodeBalanceCone( Abc_Obj_t * pNode, Vec_Vec_t * vSuper, int Level, int fDuplicate, bool fSelective ); -static int Abc_NodeBalanceCone_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vSuper, bool fFirst, bool fDuplicate, bool fSelective ); -static void Abc_NtkMarkCriticalNodes( Abc_Ntk_t * pNtk ); -static Vec_Ptr_t * Abc_NodeBalanceConeExor( Abc_Obj_t * pNode ); - - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Balances the AIG network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkBalance( Abc_Ntk_t * pNtk, bool fDuplicate, bool fSelective, bool fUpdateLevel ) -{ - extern void Abc_NtkHaigTranfer( Abc_Ntk_t * pNtkOld, Abc_Ntk_t * pNtkNew ); - Abc_Ntk_t * pNtkAig; - assert( Abc_NtkIsStrash(pNtk) ); - // compute the required times - if ( fSelective ) - { - Abc_NtkStartReverseLevels( pNtk, 0 ); - Abc_NtkMarkCriticalNodes( pNtk ); - } - // perform balancing - pNtkAig = Abc_NtkStartFrom( pNtk, ABC_NTK_STRASH, ABC_FUNC_AIG ); - // transfer HAIG - Abc_NtkHaigTranfer( pNtk, pNtkAig ); - // perform balancing - Abc_NtkBalancePerform( pNtk, pNtkAig, fDuplicate, fSelective, fUpdateLevel ); - Abc_NtkFinalize( pNtk, pNtkAig ); - // undo the required times - if ( fSelective ) - { - Abc_NtkStopReverseLevels( pNtk ); - Abc_NtkCleanMarkA( pNtk ); - } - if ( pNtk->pExdc ) - pNtkAig->pExdc = Abc_NtkDup( pNtk->pExdc ); - // make sure everything is okay - if ( !Abc_NtkCheck( pNtkAig ) ) - { - printf( "Abc_NtkBalance: The network check has failed.\n" ); - Abc_NtkDelete( pNtkAig ); - return NULL; - } - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Balances the AIG network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkBalancePerform( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkAig, bool fDuplicate, bool fSelective, bool fUpdateLevel ) -{ - int fCheck = 1; - ProgressBar * pProgress; - Vec_Vec_t * vStorage; - Abc_Obj_t * pNode, * pDriver; - int i; - - // set the level of PIs of AIG according to the arrival times of the old network - Abc_NtkSetNodeLevelsArrival( pNtk ); - // allocate temporary storage for supergates - vStorage = Vec_VecStart( 10 ); - // perform balancing of POs - pProgress = Extra_ProgressBarStart( stdout, Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - // strash the driver node - pDriver = Abc_ObjFanin0(pNode); - Abc_NodeBalance_rec( pNtkAig, pDriver, vStorage, 0, fDuplicate, fSelective, fUpdateLevel ); - } - Extra_ProgressBarStop( pProgress ); - Vec_VecFree( vStorage ); -} - -/**Function************************************************************* - - Synopsis [Finds the left bound on the next candidate to be paired.] - - Description [The nodes in the array are in the decreasing order of levels. - The last node in the array has the smallest level. By default it would be paired - with the next node on the left. However, it may be possible to pair it with some - other node on the left, in such a way that the new node is shared. This procedure - finds the index of the left-most node, which can be paired with the last node.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeBalanceFindLeft( Vec_Ptr_t * vSuper ) -{ - Abc_Obj_t * pNodeRight, * pNodeLeft; - int Current; - // if two or less nodes, pair with the first - if ( Vec_PtrSize(vSuper) < 3 ) - return 0; - // set the pointer to the one before the last - Current = Vec_PtrSize(vSuper) - 2; - pNodeRight = Vec_PtrEntry( vSuper, Current ); - // go through the nodes to the left of this one - for ( Current--; Current >= 0; Current-- ) - { - // get the next node on the left - pNodeLeft = Vec_PtrEntry( vSuper, Current ); - // if the level of this node is different, quit the loop - if ( Abc_ObjRegular(pNodeLeft)->Level != Abc_ObjRegular(pNodeRight)->Level ) - break; - } - Current++; - // get the node, for which the equality holds - pNodeLeft = Vec_PtrEntry( vSuper, Current ); - assert( Abc_ObjRegular(pNodeLeft)->Level == Abc_ObjRegular(pNodeRight)->Level ); - return Current; -} - -/**Function************************************************************* - - Synopsis [Moves closer to the end the node that is best for sharing.] - - Description [If there is no node with sharing, randomly chooses one of - the legal nodes.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeBalancePermute( Abc_Ntk_t * pNtkNew, Vec_Ptr_t * vSuper, int LeftBound ) -{ - Abc_Obj_t * pNode1, * pNode2, * pNode3; - int RightBound, i; - // get the right bound - RightBound = Vec_PtrSize(vSuper) - 2; - assert( LeftBound <= RightBound ); - if ( LeftBound == RightBound ) - return; - // get the two last nodes - pNode1 = Vec_PtrEntry( vSuper, RightBound + 1 ); - pNode2 = Vec_PtrEntry( vSuper, RightBound ); - // find the first node that can be shared - for ( i = RightBound; i >= LeftBound; i-- ) - { - pNode3 = Vec_PtrEntry( vSuper, i ); - if ( Abc_AigAndLookup( pNtkNew->pManFunc, pNode1, pNode3 ) ) - { - if ( pNode3 == pNode2 ) - return; - Vec_PtrWriteEntry( vSuper, i, pNode2 ); - Vec_PtrWriteEntry( vSuper, RightBound, pNode3 ); - return; - } - } -/* - // we did not find the node to share, randomize choice - { - int Choice = rand() % (RightBound - LeftBound + 1); - pNode3 = Vec_PtrEntry( vSuper, LeftBound + Choice ); - if ( pNode3 == pNode2 ) - return; - Vec_PtrWriteEntry( vSuper, LeftBound + Choice, pNode2 ); - Vec_PtrWriteEntry( vSuper, RightBound, pNode3 ); - } -*/ -} - -/**Function************************************************************* - - Synopsis [Rebalances the multi-input node rooted at pNodeOld.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeBalance_rec( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNodeOld, Vec_Vec_t * vStorage, int Level, bool fDuplicate, bool fSelective, bool fUpdateLevel ) -{ - Abc_Aig_t * pMan = pNtkNew->pManFunc; - Abc_Obj_t * pNodeNew, * pNode1, * pNode2; - Vec_Ptr_t * vSuper; - int i, LeftBound; - assert( !Abc_ObjIsComplement(pNodeOld) ); - // return if the result if known - if ( pNodeOld->pCopy ) - return pNodeOld->pCopy; - assert( Abc_ObjIsNode(pNodeOld) ); - // get the implication supergate -// Abc_NodeBalanceConeExor( pNodeOld ); - vSuper = Abc_NodeBalanceCone( pNodeOld, vStorage, Level, fDuplicate, fSelective ); - if ( vSuper->nSize == 0 ) - { // it means that the supergate contains two nodes in the opposite polarity - pNodeOld->pCopy = Abc_ObjNot(Abc_AigConst1(pNtkNew)); - return pNodeOld->pCopy; - } - // for each old node, derive the new well-balanced node - for ( i = 0; i < vSuper->nSize; i++ ) - { - pNodeNew = Abc_NodeBalance_rec( pNtkNew, Abc_ObjRegular(vSuper->pArray[i]), vStorage, Level + 1, fDuplicate, fSelective, fUpdateLevel ); - vSuper->pArray[i] = Abc_ObjNotCond( pNodeNew, Abc_ObjIsComplement(vSuper->pArray[i]) ); - } - if ( vSuper->nSize < 2 ) - printf( "BUG!\n" ); - // sort the new nodes by level in the decreasing order - Vec_PtrSort( vSuper, Abc_NodeCompareLevelsDecrease ); - // balance the nodes - assert( vSuper->nSize > 1 ); - while ( vSuper->nSize > 1 ) - { - // find the left bound on the node to be paired - LeftBound = (!fUpdateLevel)? 0 : Abc_NodeBalanceFindLeft( vSuper ); - // find the node that can be shared (if no such node, randomize choice) - Abc_NodeBalancePermute( pNtkNew, vSuper, LeftBound ); - // pull out the last two nodes - pNode1 = Vec_PtrPop(vSuper); - pNode2 = Vec_PtrPop(vSuper); - Abc_VecObjPushUniqueOrderByLevel( vSuper, Abc_AigAnd(pMan, pNode1, pNode2) ); - } - // make sure the balanced node is not assigned - assert( pNodeOld->pCopy == NULL ); - // mark the old node with the new node - pNodeOld->pCopy = vSuper->pArray[0]; - vSuper->nSize = 0; -// if ( Abc_ObjRegular(pNodeOld->pCopy) == Abc_AigConst1(pNtkNew) ) -// printf( "Constant node\n" ); -// assert( pNodeOld->Level >= Abc_ObjRegular(pNodeOld->pCopy)->Level ); - // update HAIG - if ( Abc_ObjRegular(pNodeOld->pCopy)->pNtk->pHaig ) - Hop_ObjCreateChoice( pNodeOld->pEquiv, Abc_ObjRegular(pNodeOld->pCopy)->pEquiv ); - return pNodeOld->pCopy; -} - -/**Function************************************************************* - - Synopsis [Collects the nodes in the cone delimited by fMarkA==1.] - - Description [Returns -1 if the AND-cone has the same node in both polarities. - Returns 1 if the AND-cone has the same node in the same polarity. Returns 0 - if the AND-cone has no repeated nodes.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NodeBalanceCone( Abc_Obj_t * pNode, Vec_Vec_t * vStorage, int Level, int fDuplicate, bool fSelective ) -{ - Vec_Ptr_t * vNodes; - int RetValue, i; - assert( !Abc_ObjIsComplement(pNode) ); - // extend the storage - if ( Vec_VecSize( vStorage ) <= Level ) - Vec_VecPush( vStorage, Level, 0 ); - // get the temporary array of nodes - vNodes = Vec_VecEntry( vStorage, Level ); - Vec_PtrClear( vNodes ); - // collect the nodes in the implication supergate - RetValue = Abc_NodeBalanceCone_rec( pNode, vNodes, 1, fDuplicate, fSelective ); - assert( vNodes->nSize > 1 ); - // unmark the visited nodes - for ( i = 0; i < vNodes->nSize; i++ ) - Abc_ObjRegular((Abc_Obj_t *)vNodes->pArray[i])->fMarkB = 0; - // if we found the node and its complement in the same implication supergate, - // return empty set of nodes (meaning that we should use constant-0 node) - if ( RetValue == -1 ) - vNodes->nSize = 0; - return vNodes; -} - - -/**Function************************************************************* - - Synopsis [Collects the nodes in the cone delimited by fMarkA==1.] - - Description [Returns -1 if the AND-cone has the same node in both polarities. - Returns 1 if the AND-cone has the same node in the same polarity. Returns 0 - if the AND-cone has no repeated nodes.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeBalanceCone_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vSuper, bool fFirst, bool fDuplicate, bool fSelective ) -{ - int RetValue1, RetValue2, i; - // check if the node is visited - if ( Abc_ObjRegular(pNode)->fMarkB ) - { - // check if the node occurs in the same polarity - for ( i = 0; i < vSuper->nSize; i++ ) - if ( vSuper->pArray[i] == pNode ) - return 1; - // check if the node is present in the opposite polarity - for ( i = 0; i < vSuper->nSize; i++ ) - if ( vSuper->pArray[i] == Abc_ObjNot(pNode) ) - return -1; - assert( 0 ); - return 0; - } - // if the new node is complemented or a PI, another gate begins - if ( !fFirst && (Abc_ObjIsComplement(pNode) || !Abc_ObjIsNode(pNode) || !fDuplicate && !fSelective && (Abc_ObjFanoutNum(pNode) > 1)) ) - { - Vec_PtrPush( vSuper, pNode ); - Abc_ObjRegular(pNode)->fMarkB = 1; - return 0; - } - assert( !Abc_ObjIsComplement(pNode) ); - assert( Abc_ObjIsNode(pNode) ); - // go through the branches - RetValue1 = Abc_NodeBalanceCone_rec( Abc_ObjChild0(pNode), vSuper, 0, fDuplicate, fSelective ); - RetValue2 = Abc_NodeBalanceCone_rec( Abc_ObjChild1(pNode), vSuper, 0, fDuplicate, fSelective ); - if ( RetValue1 == -1 || RetValue2 == -1 ) - return -1; - // return 1 if at least one branch has a duplicate - return RetValue1 || RetValue2; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeBalanceConeExor_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vSuper, bool fFirst ) -{ - int RetValue1, RetValue2, i; - // check if the node occurs in the same polarity - for ( i = 0; i < vSuper->nSize; i++ ) - if ( vSuper->pArray[i] == pNode ) - return 1; - // if the new node is complemented or a PI, another gate begins - if ( !fFirst && (!pNode->fExor || !Abc_ObjIsNode(pNode)) ) - { - Vec_PtrPush( vSuper, pNode ); - return 0; - } - assert( !Abc_ObjIsComplement(pNode) ); - assert( Abc_ObjIsNode(pNode) ); - assert( pNode->fExor ); - // go through the branches - RetValue1 = Abc_NodeBalanceConeExor_rec( Abc_ObjFanin0(Abc_ObjFanin0(pNode)), vSuper, 0 ); - RetValue2 = Abc_NodeBalanceConeExor_rec( Abc_ObjFanin1(Abc_ObjFanin0(pNode)), vSuper, 0 ); - if ( RetValue1 == -1 || RetValue2 == -1 ) - return -1; - // return 1 if at least one branch has a duplicate - return RetValue1 || RetValue2; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NodeBalanceConeExor( Abc_Obj_t * pNode ) -{ - Vec_Ptr_t * vSuper; - if ( !pNode->fExor ) - return NULL; - vSuper = Vec_PtrAlloc( 10 ); - Abc_NodeBalanceConeExor_rec( pNode, vSuper, 1 ); - printf( "%d ", Vec_PtrSize(vSuper) ); - Vec_PtrFree( vSuper ); - return NULL; -} - - - -/**Function************************************************************* - - Synopsis [Collects the nodes in the implication supergate.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NodeFindCone_rec( Abc_Obj_t * pNode ) -{ - Vec_Ptr_t * vNodes; - Abc_Obj_t * pNodeC, * pNodeT, * pNodeE; - int RetValue, i; - assert( !Abc_ObjIsComplement(pNode) ); - if ( Abc_ObjIsCi(pNode) ) - return NULL; - // start the new array - vNodes = Vec_PtrAlloc( 4 ); - // if the node is the MUX collect its fanins - if ( Abc_NodeIsMuxType(pNode) ) - { - pNodeC = Abc_NodeRecognizeMux( pNode, &pNodeT, &pNodeE ); - Vec_PtrPush( vNodes, Abc_ObjRegular(pNodeC) ); - Vec_PtrPushUnique( vNodes, Abc_ObjRegular(pNodeT) ); - Vec_PtrPushUnique( vNodes, Abc_ObjRegular(pNodeE) ); - } - else - { - // collect the nodes in the implication supergate - RetValue = Abc_NodeBalanceCone_rec( pNode, vNodes, 1, 1, 0 ); - assert( vNodes->nSize > 1 ); - // unmark the visited nodes - Vec_PtrForEachEntry( vNodes, pNode, i ) - Abc_ObjRegular(pNode)->fMarkB = 0; - // if we found the node and its complement in the same implication supergate, - // return empty set of nodes (meaning that we should use constant-0 node) - if ( RetValue == -1 ) - vNodes->nSize = 0; - } - // call for the fanin - Vec_PtrForEachEntry( vNodes, pNode, i ) - { - pNode = Abc_ObjRegular(pNode); - if ( pNode->pCopy ) - continue; - pNode->pCopy = (Abc_Obj_t *)Abc_NodeFindCone_rec( pNode ); - } - return vNodes; -} - -/**Function************************************************************* - - Synopsis [Attaches the implication supergates to internal nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkBalanceAttach( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode; - int i; - Abc_NtkCleanCopy( pNtk ); - Abc_NtkForEachCo( pNtk, pNode, i ) - { - pNode = Abc_ObjFanin0(pNode); - if ( pNode->pCopy ) - continue; - pNode->pCopy = (Abc_Obj_t *)Abc_NodeFindCone_rec( pNode ); - } -} - -/**Function************************************************************* - - Synopsis [Attaches the implication supergates to internal nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkBalanceDetach( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode; - int i; - Abc_NtkForEachNode( pNtk, pNode, i ) - if ( pNode->pCopy ) - { - Vec_PtrFree( (Vec_Ptr_t *)pNode->pCopy ); - pNode->pCopy = NULL; - } -} - -/**Function************************************************************* - - Synopsis [Compute levels of implication supergates.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkBalanceLevel_rec( Abc_Obj_t * pNode ) -{ - Vec_Ptr_t * vSuper; - Abc_Obj_t * pFanin; - int i, LevelMax; - assert( !Abc_ObjIsComplement(pNode) ); - if ( pNode->Level > 0 ) - return pNode->Level; - if ( Abc_ObjIsCi(pNode) ) - return 0; - vSuper = (Vec_Ptr_t *)pNode->pCopy; - assert( vSuper != NULL ); - LevelMax = 0; - Vec_PtrForEachEntry( vSuper, pFanin, i ) - { - pFanin = Abc_ObjRegular(pFanin); - Abc_NtkBalanceLevel_rec(pFanin); - if ( LevelMax < (int)pFanin->Level ) - LevelMax = pFanin->Level; - } - pNode->Level = LevelMax + 1; - return pNode->Level; -} - - -/**Function************************************************************* - - Synopsis [Compute levels of implication supergates.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkBalanceLevel( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode; - int i; - Abc_NtkForEachObj( pNtk, pNode, i ) - pNode->Level = 0; - Abc_NtkForEachCo( pNtk, pNode, i ) - Abc_NtkBalanceLevel_rec( Abc_ObjFanin0(pNode) ); -} - - -/**Function************************************************************* - - Synopsis [Marks the nodes on the critical and near critical paths.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMarkCriticalNodes( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode; - int i, Counter = 0; - Abc_NtkForEachNode( pNtk, pNode, i ) - if ( Abc_ObjRequiredLevel(pNode) - pNode->Level <= 1 ) - pNode->fMarkA = 1, Counter++; - printf( "The number of nodes on the critical paths = %6d (%5.2f %%)\n", Counter, 100.0 * Counter / Abc_NtkNodeNum(pNtk) ); -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcBmc.c b/src/base/abci/abcBmc.c deleted file mode 100644 index af6d237b..00000000 --- a/src/base/abci/abcBmc.c +++ /dev/null @@ -1,115 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcBmc.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Performs bounded model check.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcBmc.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "ivy.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -extern Ivy_Man_t * Abc_NtkIvyBefore( Abc_Ntk_t * pNtk, int fSeq, int fUseDc ); - -static void Abc_NtkBmcReport( Ivy_Man_t * pMan, Ivy_Man_t * pFrames, Ivy_Man_t * pFraig, Vec_Ptr_t * vMapping, int nFrames ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkBmc( Abc_Ntk_t * pNtk, int nFrames, int fInit, int fVerbose ) -{ - Ivy_FraigParams_t Params, * pParams = &Params; - Ivy_Man_t * pMan, * pFrames, * pFraig; - Vec_Ptr_t * vMapping; - // convert to IVY manager - pMan = Abc_NtkIvyBefore( pNtk, 0, 0 ); - // generate timeframes - pFrames = Ivy_ManFrames( pMan, Abc_NtkLatchNum(pNtk), nFrames, fInit, &vMapping ); - // fraig the timeframes - Ivy_FraigParamsDefault( pParams ); - pParams->nBTLimitNode = ABC_INFINITY; - pParams->fVerbose = 0; - pParams->fProve = 0; - pFraig = Ivy_FraigPerform( pFrames, pParams ); -printf( "Frames have %6d nodes. ", Ivy_ManNodeNum(pFrames) ); -printf( "Fraig has %6d nodes.\n", Ivy_ManNodeNum(pFraig) ); - // report the classes -// if ( fVerbose ) -// Abc_NtkBmcReport( pMan, pFrames, pFraig, vMapping, nFrames ); - // free stuff - Vec_PtrFree( vMapping ); - Ivy_ManStop( pFraig ); - Ivy_ManStop( pFrames ); - Ivy_ManStop( pMan ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkBmcReport( Ivy_Man_t * pMan, Ivy_Man_t * pFrames, Ivy_Man_t * pFraig, Vec_Ptr_t * vMapping, int nFrames ) -{ - Ivy_Obj_t * pFirst1, * pFirst2, * pFirst3; - int i, f, nIdMax, Prev2, Prev3; - nIdMax = Ivy_ManObjIdMax(pMan); - // check what is the number of nodes in each frame - Prev2 = Prev3 = 0; - for ( f = 0; f < nFrames; f++ ) - { - Ivy_ManForEachNode( pMan, pFirst1, i ) - { - pFirst2 = Ivy_Regular( Vec_PtrEntry(vMapping, f * nIdMax + pFirst1->Id) ); - if ( Ivy_ObjIsConst1(pFirst2) || pFirst2->Type == 0 ) - continue; - pFirst3 = Ivy_Regular( pFirst2->pEquiv ); - if ( Ivy_ObjIsConst1(pFirst3) || pFirst3->Type == 0 ) - continue; - break; - } - if ( f ) - printf( "Frame %3d : Strash = %5d Fraig = %5d\n", f, pFirst2->Id - Prev2, pFirst3->Id - Prev3 ); - Prev2 = pFirst2->Id; - Prev3 = pFirst3->Id; - } -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcCas.c b/src/base/abci/abcCas.c deleted file mode 100644 index 4ed7a774..00000000 --- a/src/base/abci/abcCas.c +++ /dev/null @@ -1,111 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcCas.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Decomposition of shared BDDs into LUT cascade.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcCas.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -/* - This LUT cascade synthesis algorithm is described in the paper: - A. Mishchenko and T. Sasao, "Encoding of Boolean functions and its - application to LUT cascade synthesis", Proc. IWLS '02, pp. 115-120. - http://www.eecs.berkeley.edu/~alanmi/publications/2002/iwls02_enc.pdf -*/ - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -extern int Abc_CascadeExperiment( char * pFileGeneric, DdManager * dd, DdNode ** pOutputs, int nInputs, int nOutputs, int nLutSize, int fCheck, int fVerbose ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkCascade( Abc_Ntk_t * pNtk, int nLutSize, int fCheck, int fVerbose ) -{ - DdManager * dd; - DdNode ** ppOutputs; - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pNode; - char * pFileGeneric; - int fBddSizeMax = 500000; - int fReorder = 1; - int i, clk = clock(); - - assert( Abc_NtkIsStrash(pNtk) ); - // compute the global BDDs - if ( Abc_NtkBuildGlobalBdds(pNtk, fBddSizeMax, 1, fReorder, fVerbose) == NULL ) - return NULL; - - if ( fVerbose ) - { - DdManager * dd = Abc_NtkGlobalBddMan( pNtk ); - printf( "Shared BDD size = %6d nodes. ", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) ); - PRT( "BDD construction time", clock() - clk ); - } - - // collect global BDDs - dd = Abc_NtkGlobalBddMan( pNtk ); - ppOutputs = ALLOC( DdNode *, Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pNode, i ) - ppOutputs[i] = Abc_ObjGlobalBdd(pNode); - - // call the decomposition - pFileGeneric = Extra_FileNameGeneric( pNtk->pSpec ); - if ( !Abc_CascadeExperiment( pFileGeneric, dd, ppOutputs, Abc_NtkCiNum(pNtk), Abc_NtkCoNum(pNtk), nLutSize, fCheck, fVerbose ) ) - { - // the LUT size is too small - } - - // for now, duplicate the network - pNtkNew = Abc_NtkDup( pNtk ); - - // cleanup - Abc_NtkFreeGlobalBdds( pNtk, 1 ); - free( ppOutputs ); - free( pFileGeneric ); - -// if ( pNtk->pExdc ) -// pNtkNew->pExdc = Abc_NtkDup( pNtk->pExdc ); - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkCollapse: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcClpBdd.c b/src/base/abci/abcClpBdd.c deleted file mode 100644 index 341ff5b0..00000000 --- a/src/base/abci/abcClpBdd.c +++ /dev/null @@ -1,162 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcCollapse.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Collapsing the network into two-levels.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcCollapse.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static Abc_Ntk_t * Abc_NtkFromGlobalBdds( Abc_Ntk_t * pNtk ); -static Abc_Obj_t * Abc_NodeFromGlobalBdds( Abc_Ntk_t * pNtkNew, DdManager * dd, DdNode * bFunc ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Collapses the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkCollapse( Abc_Ntk_t * pNtk, int fBddSizeMax, int fDualRail, int fReorder, int fVerbose ) -{ - Abc_Ntk_t * pNtkNew; - int clk = clock(); - - assert( Abc_NtkIsStrash(pNtk) ); - // compute the global BDDs - if ( Abc_NtkBuildGlobalBdds(pNtk, fBddSizeMax, 1, fReorder, fVerbose) == NULL ) - return NULL; - if ( fVerbose ) - { - DdManager * dd = Abc_NtkGlobalBddMan( pNtk ); - printf( "Shared BDD size = %6d nodes. ", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) ); - PRT( "BDD construction time", clock() - clk ); - } - - // create the new network - pNtkNew = Abc_NtkFromGlobalBdds( pNtk ); -// Abc_NtkFreeGlobalBdds( pNtk ); - Abc_NtkFreeGlobalBdds( pNtk, 1 ); - if ( pNtkNew == NULL ) - { -// Cudd_Quit( pNtk->pManGlob ); -// pNtk->pManGlob = NULL; - return NULL; - } -// Extra_StopManager( pNtk->pManGlob ); -// pNtk->pManGlob = NULL; - - // make the network minimum base - Abc_NtkMinimumBase( pNtkNew ); - - if ( pNtk->pExdc ) - pNtkNew->pExdc = Abc_NtkDup( pNtk->pExdc ); - - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkCollapse: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Derives the network with the given global BDD.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromGlobalBdds( Abc_Ntk_t * pNtk ) -{ - ProgressBar * pProgress; - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pNode, * pDriver, * pNodeNew; -// DdManager * dd = pNtk->pManGlob; - DdManager * dd = Abc_NtkGlobalBddMan( pNtk ); - int i; - // start the new network - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_BDD ); - // make sure the new manager has the same number of inputs - Cudd_bddIthVar( pNtkNew->pManFunc, dd->size-1 ); - // process the POs - pProgress = Extra_ProgressBarStart( stdout, Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - pDriver = Abc_ObjFanin0(pNode); - if ( Abc_ObjIsCi(pDriver) && !strcmp(Abc_ObjName(pNode), Abc_ObjName(pDriver)) ) - { - Abc_ObjAddFanin( pNode->pCopy, pDriver->pCopy ); - continue; - } -// pNodeNew = Abc_NodeFromGlobalBdds( pNtkNew, dd, Vec_PtrEntry(pNtk->vFuncsGlob, i) ); - pNodeNew = Abc_NodeFromGlobalBdds( pNtkNew, dd, Abc_ObjGlobalBdd(pNode) ); - Abc_ObjAddFanin( pNode->pCopy, pNodeNew ); - } - Extra_ProgressBarStop( pProgress ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Derives the network with the given global BDD.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeFromGlobalBdds( Abc_Ntk_t * pNtkNew, DdManager * dd, DdNode * bFunc ) -{ - Abc_Obj_t * pNodeNew, * pTemp; - int i; - // create a new node - pNodeNew = Abc_NtkCreateNode( pNtkNew ); - // add the fanins in the order, in which they appear in the reordered manager - Abc_NtkForEachCi( pNtkNew, pTemp, i ) - Abc_ObjAddFanin( pNodeNew, Abc_NtkCi(pNtkNew, dd->invperm[i]) ); - // transfer the function - pNodeNew->pData = Extra_TransferLevelByLevel( dd, pNtkNew->pManFunc, bFunc ); Cudd_Ref( pNodeNew->pData ); - return pNodeNew; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcClpSop.c b/src/base/abci/abcClpSop.c deleted file mode 100644 index de92243f..00000000 --- a/src/base/abci/abcClpSop.c +++ /dev/null @@ -1,53 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcCollapse.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Collapsing the network into two-levels.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcCollapse.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Collapses the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkCollapseSop( Abc_Ntk_t * pNtk, int fVerbose ) -{ - Abc_Ntk_t * pNtkNew; - pNtkNew = NULL; - return pNtkNew; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcCut.c b/src/base/abci/abcCut.c deleted file mode 100644 index d399ce5f..00000000 --- a/src/base/abci/abcCut.c +++ /dev/null @@ -1,620 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcCut.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Interface to cut computation.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcCut.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "cut.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Abc_NtkPrintCuts( void * p, Abc_Ntk_t * pNtk, int fSeq ); -static void Abc_NtkPrintCuts_( void * p, Abc_Ntk_t * pNtk, int fSeq ); - -extern int nTotal, nGood, nEqual; - -static Vec_Int_t * Abc_NtkGetNodeAttributes( Abc_Ntk_t * pNtk ); -static int Abc_NtkComputeArea( Abc_Ntk_t * pNtk, Cut_Man_t * p ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Computes the cuts for the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cut_Man_t * Abc_NtkCuts( Abc_Ntk_t * pNtk, Cut_Params_t * pParams ) -{ - ProgressBar * pProgress; - Cut_Man_t * p; - Abc_Obj_t * pObj, * pNode; - Vec_Ptr_t * vNodes; - Vec_Int_t * vChoices; - int i; - int clk = clock(); - - extern void Abc_NtkBalanceAttach( Abc_Ntk_t * pNtk ); - extern void Abc_NtkBalanceDetach( Abc_Ntk_t * pNtk ); - - nTotal = nGood = nEqual = 0; - - assert( Abc_NtkIsStrash(pNtk) ); - // start the manager - pParams->nIdsMax = Abc_NtkObjNumMax( pNtk ); - p = Cut_ManStart( pParams ); - // compute node attributes if local or global cuts are requested - if ( pParams->fGlobal || pParams->fLocal ) - { - extern Vec_Int_t * Abc_NtkGetNodeAttributes( Abc_Ntk_t * pNtk ); - Cut_ManSetNodeAttrs( p, Abc_NtkGetNodeAttributes(pNtk) ); - } - // prepare for cut dropping - if ( pParams->fDrop ) - Cut_ManSetFanoutCounts( p, Abc_NtkFanoutCounts(pNtk) ); - // set cuts for PIs - Abc_NtkForEachCi( pNtk, pObj, i ) - if ( Abc_ObjFanoutNum(pObj) > 0 ) - Cut_NodeSetTriv( p, pObj->Id ); - // compute cuts for internal nodes - vNodes = Abc_AigDfs( pNtk, 0, 1 ); // collects POs - vChoices = Vec_IntAlloc( 100 ); - pProgress = Extra_ProgressBarStart( stdout, Vec_PtrSize(vNodes) ); - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - // when we reached a CO, it is time to deallocate the cuts - if ( Abc_ObjIsCo(pObj) ) - { - if ( pParams->fDrop ) - Cut_NodeTryDroppingCuts( p, Abc_ObjFaninId0(pObj) ); - continue; - } - // skip constant node, it has no cuts -// if ( Abc_NodeIsConst(pObj) ) -// continue; - Extra_ProgressBarUpdate( pProgress, i, NULL ); - // compute the cuts to the internal node - Abc_NodeGetCuts( p, pObj, pParams->fDag, pParams->fTree ); - // consider dropping the fanins cuts - if ( pParams->fDrop ) - { - Cut_NodeTryDroppingCuts( p, Abc_ObjFaninId0(pObj) ); - Cut_NodeTryDroppingCuts( p, Abc_ObjFaninId1(pObj) ); - } - // add cuts due to choices - if ( Abc_AigNodeIsChoice(pObj) ) - { - Vec_IntClear( vChoices ); - for ( pNode = pObj; pNode; pNode = pNode->pData ) - Vec_IntPush( vChoices, pNode->Id ); - Cut_NodeUnionCuts( p, vChoices ); - } - } - Extra_ProgressBarStop( pProgress ); - Vec_PtrFree( vNodes ); - Vec_IntFree( vChoices ); - Cut_ManPrintStats( p ); -PRT( "TOTAL ", clock() - clk ); - printf( "Area = %d.\n", Abc_NtkComputeArea( pNtk, p ) ); -//Abc_NtkPrintCuts( p, pNtk, 0 ); -// Cut_ManPrintStatsToFile( p, pNtk->pSpec, clock() - clk ); - - // temporary printout of stats - if ( nTotal ) - printf( "Total cuts = %d. Good cuts = %d. Ratio = %5.2f\n", nTotal, nGood, ((double)nGood)/nTotal ); - return p; -} - -/**Function************************************************************* - - Synopsis [Cut computation using the oracle.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkCutsOracle( Abc_Ntk_t * pNtk, Cut_Oracle_t * p ) -{ - Abc_Obj_t * pObj; - Vec_Ptr_t * vNodes; - int i, clk = clock(); - int fDrop = Cut_OracleReadDrop(p); - - assert( Abc_NtkIsStrash(pNtk) ); - - // prepare cut droppping - if ( fDrop ) - Cut_OracleSetFanoutCounts( p, Abc_NtkFanoutCounts(pNtk) ); - - // set cuts for PIs - Abc_NtkForEachCi( pNtk, pObj, i ) - if ( Abc_ObjFanoutNum(pObj) > 0 ) - Cut_OracleNodeSetTriv( p, pObj->Id ); - - // compute cuts for internal nodes - vNodes = Abc_AigDfs( pNtk, 0, 1 ); // collects POs - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - // when we reached a CO, it is time to deallocate the cuts - if ( Abc_ObjIsCo(pObj) ) - { - if ( fDrop ) - Cut_OracleTryDroppingCuts( p, Abc_ObjFaninId0(pObj) ); - continue; - } - // skip constant node, it has no cuts -// if ( Abc_NodeIsConst(pObj) ) -// continue; - // compute the cuts to the internal node - Cut_OracleComputeCuts( p, pObj->Id, Abc_ObjFaninId0(pObj), Abc_ObjFaninId1(pObj), - Abc_ObjFaninC0(pObj), Abc_ObjFaninC1(pObj) ); - // consider dropping the fanins cuts - if ( fDrop ) - { - Cut_OracleTryDroppingCuts( p, Abc_ObjFaninId0(pObj) ); - Cut_OracleTryDroppingCuts( p, Abc_ObjFaninId1(pObj) ); - } - } - Vec_PtrFree( vNodes ); -//PRT( "Total", clock() - clk ); -//Abc_NtkPrintCuts_( p, pNtk, 0 ); -} - - -/**Function************************************************************* - - Synopsis [Computes the cuts for the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cut_Man_t * Abc_NtkSeqCuts( Abc_Ntk_t * pNtk, Cut_Params_t * pParams ) -{ -/* - Cut_Man_t * p; - Abc_Obj_t * pObj, * pNode; - int i, nIters, fStatus; - Vec_Int_t * vChoices; - int clk = clock(); - - assert( Abc_NtkIsSeq(pNtk) ); - assert( pParams->fSeq ); -// assert( Abc_NtkIsDfsOrdered(pNtk) ); - - // start the manager - pParams->nIdsMax = Abc_NtkObjNumMax( pNtk ); - pParams->nCutSet = Abc_NtkCutSetNodeNum( pNtk ); - p = Cut_ManStart( pParams ); - - // set cuts for the constant node and the PIs - pObj = Abc_AigConst1(pNtk); - if ( Abc_ObjFanoutNum(pObj) > 0 ) - Cut_NodeSetTriv( p, pObj->Id ); - Abc_NtkForEachPi( pNtk, pObj, i ) - { -//printf( "Setting trivial cut %d.\n", pObj->Id ); - Cut_NodeSetTriv( p, pObj->Id ); - } - // label the cutset nodes and set their number in the array - // assign the elementary cuts to the cutset nodes - Abc_SeqForEachCutsetNode( pNtk, pObj, i ) - { - assert( pObj->fMarkC == 0 ); - pObj->fMarkC = 1; - pObj->pCopy = (Abc_Obj_t *)i; - Cut_NodeSetTriv( p, pObj->Id ); -//printf( "Setting trivial cut %d.\n", pObj->Id ); - } - - // process the nodes - vChoices = Vec_IntAlloc( 100 ); - for ( nIters = 0; nIters < 10; nIters++ ) - { -//printf( "ITERATION %d:\n", nIters ); - // compute the cuts for the internal nodes - Abc_AigForEachAnd( pNtk, pObj, i ) - { - Abc_NodeGetCutsSeq( p, pObj, nIters==0 ); - // add cuts due to choices - if ( Abc_AigNodeIsChoice(pObj) ) - { - Vec_IntClear( vChoices ); - for ( pNode = pObj; pNode; pNode = pNode->pData ) - Vec_IntPush( vChoices, pNode->Id ); - Cut_NodeUnionCutsSeq( p, vChoices, (pObj->fMarkC ? (int)pObj->pCopy : -1), nIters==0 ); - } - } - // merge the new cuts with the old cuts - Abc_NtkForEachPi( pNtk, pObj, i ) - Cut_NodeNewMergeWithOld( p, pObj->Id ); - Abc_AigForEachAnd( pNtk, pObj, i ) - Cut_NodeNewMergeWithOld( p, pObj->Id ); - // for the cutset, transfer temp cuts to new cuts - fStatus = 0; - Abc_SeqForEachCutsetNode( pNtk, pObj, i ) - fStatus |= Cut_NodeTempTransferToNew( p, pObj->Id, i ); - if ( fStatus == 0 ) - break; - } - Vec_IntFree( vChoices ); - - // if the status is not finished, transfer new to old for the cutset - Abc_SeqForEachCutsetNode( pNtk, pObj, i ) - Cut_NodeNewMergeWithOld( p, pObj->Id ); - - // transfer the old cuts to the new positions - Abc_NtkForEachObj( pNtk, pObj, i ) - Cut_NodeOldTransferToNew( p, pObj->Id ); - - // unlabel the cutset nodes - Abc_SeqForEachCutsetNode( pNtk, pObj, i ) - pObj->fMarkC = 0; -if ( pParams->fVerbose ) -{ - Cut_ManPrintStats( p ); -PRT( "TOTAL ", clock() - clk ); -printf( "Converged after %d iterations.\n", nIters ); -} -//Abc_NtkPrintCuts( p, pNtk, 1 ); - return p; -*/ - return NULL; -} - -/**Function************************************************************* - - Synopsis [Computes area.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkComputeArea( Abc_Ntk_t * pNtk, Cut_Man_t * p ) -{ - Abc_Obj_t * pObj; - int Counter, i; - Counter = 0; - Abc_NtkForEachCo( pNtk, pObj, i ) - Counter += Cut_ManMappingArea_rec( p, Abc_ObjFaninId0(pObj) ); - return Counter; -} - -/**Function************************************************************* - - Synopsis [Computes the cuts for the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void * Abc_NodeGetCutsRecursive( void * p, Abc_Obj_t * pObj, int fDag, int fTree ) -{ - void * pList; - if ( pList = Abc_NodeReadCuts( p, pObj ) ) - return pList; - Abc_NodeGetCutsRecursive( p, Abc_ObjFanin0(pObj), fDag, fTree ); - Abc_NodeGetCutsRecursive( p, Abc_ObjFanin1(pObj), fDag, fTree ); - return Abc_NodeGetCuts( p, pObj, fDag, fTree ); -} - -/**Function************************************************************* - - Synopsis [Computes the cuts for the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void * Abc_NodeGetCuts( void * p, Abc_Obj_t * pObj, int fDag, int fTree ) -{ - Abc_Obj_t * pFanin; - int fDagNode, fTriv, TreeCode = 0; -// assert( Abc_NtkIsStrash(pObj->pNtk) ); - assert( Abc_ObjFaninNum(pObj) == 2 ); - - - // check if the node is a DAG node - fDagNode = (Abc_ObjFanoutNum(pObj) > 1 && !Abc_NodeIsMuxControlType(pObj)); - // increment the counter of DAG nodes - if ( fDagNode ) Cut_ManIncrementDagNodes( p ); - // add the trivial cut if the node is a DAG node, or if we compute all cuts - fTriv = fDagNode || !fDag; - // check if fanins are DAG nodes - if ( fTree ) - { - pFanin = Abc_ObjFanin0(pObj); - TreeCode |= (Abc_ObjFanoutNum(pFanin) > 1 && !Abc_NodeIsMuxControlType(pFanin)); - pFanin = Abc_ObjFanin1(pObj); - TreeCode |= ((Abc_ObjFanoutNum(pFanin) > 1 && !Abc_NodeIsMuxControlType(pFanin)) << 1); - } - - - // changes due to the global/local cut computation - { - Cut_Params_t * pParams = Cut_ManReadParams(p); - if ( pParams->fLocal ) - { - Vec_Int_t * vNodeAttrs = Cut_ManReadNodeAttrs(p); - fDagNode = Vec_IntEntry( vNodeAttrs, pObj->Id ); - if ( fDagNode ) Cut_ManIncrementDagNodes( p ); -// fTriv = fDagNode || !pParams->fGlobal; - fTriv = !Vec_IntEntry( vNodeAttrs, pObj->Id ); - TreeCode = 0; - pFanin = Abc_ObjFanin0(pObj); - TreeCode |= Vec_IntEntry( vNodeAttrs, pFanin->Id ); - pFanin = Abc_ObjFanin1(pObj); - TreeCode |= (Vec_IntEntry( vNodeAttrs, pFanin->Id ) << 1); - } - } - return Cut_NodeComputeCuts( p, pObj->Id, Abc_ObjFaninId0(pObj), Abc_ObjFaninId1(pObj), - Abc_ObjFaninC0(pObj), Abc_ObjFaninC1(pObj), fTriv, TreeCode ); -} - -/**Function************************************************************* - - Synopsis [Computes the cuts for the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeGetCutsSeq( void * p, Abc_Obj_t * pObj, int fTriv ) -{ -/* - int CutSetNum; - assert( Abc_NtkIsSeq(pObj->pNtk) ); - assert( Abc_ObjFaninNum(pObj) == 2 ); - fTriv = pObj->fMarkC ? 0 : fTriv; - CutSetNum = pObj->fMarkC ? (int)pObj->pCopy : -1; - Cut_NodeComputeCutsSeq( p, pObj->Id, Abc_ObjFaninId0(pObj), Abc_ObjFaninId1(pObj), - Abc_ObjFaninC0(pObj), Abc_ObjFaninC1(pObj), Seq_ObjFaninL0(pObj), Seq_ObjFaninL1(pObj), fTriv, CutSetNum ); -*/ -} - -/**Function************************************************************* - - Synopsis [Computes the cuts for the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void * Abc_NodeReadCuts( void * p, Abc_Obj_t * pObj ) -{ - return Cut_NodeReadCutsNew( p, pObj->Id ); -} - -/**Function************************************************************* - - Synopsis [Computes the cuts for the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeFreeCuts( void * p, Abc_Obj_t * pObj ) -{ - Cut_NodeFreeCuts( p, pObj->Id ); -} - -/**Function************************************************************* - - Synopsis [Computes the cuts for the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintCuts( void * p, Abc_Ntk_t * pNtk, int fSeq ) -{ - Cut_Man_t * pMan = p; - Cut_Cut_t * pList; - Abc_Obj_t * pObj; - int i; - printf( "Cuts of the network:\n" ); - Abc_NtkForEachObj( pNtk, pObj, i ) - { - pList = Abc_NodeReadCuts( p, pObj ); - printf( "Node %s:\n", Abc_ObjName(pObj) ); - Cut_CutPrintList( pList, fSeq ); - } -} - -/**Function************************************************************* - - Synopsis [Computes the cuts for the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintCuts_( void * p, Abc_Ntk_t * pNtk, int fSeq ) -{ - Cut_Man_t * pMan = p; - Cut_Cut_t * pList; - Abc_Obj_t * pObj; - pObj = Abc_NtkObj( pNtk, 2 * Abc_NtkObjNum(pNtk) / 3 ); - pList = Abc_NodeReadCuts( p, pObj ); - printf( "Node %s:\n", Abc_ObjName(pObj) ); - Cut_CutPrintList( pList, fSeq ); -} - - - - -/**Function************************************************************* - - Synopsis [Assigns global attributes randomly.] - - Description [Old code.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Int_t * Abc_NtkGetNodeAttributes( Abc_Ntk_t * pNtk ) -{ - Vec_Int_t * vAttrs; -// Vec_Ptr_t * vNodes; - Abc_Obj_t * pObj;//, * pTemp; - int i;//, k; - int nNodesTotal = 0, nMffcsTotal = 0; - extern Vec_Ptr_t * Abc_NodeMffsInsideCollect( Abc_Obj_t * pNode ); - - vAttrs = Vec_IntStart( Abc_NtkObjNumMax(pNtk) + 1 ); -// Abc_NtkForEachCi( pNtk, pObj, i ) -// Vec_IntWriteEntry( vAttrs, pObj->Id, 1 ); - - Abc_NtkForEachObj( pNtk, pObj, i ) - { - if ( Abc_ObjIsNode(pObj) ) - nNodesTotal++; - if ( Abc_ObjIsCo(pObj) && Abc_ObjIsNode(Abc_ObjFanin0(pObj)) ) - nMffcsTotal += Abc_NodeMffcSize( Abc_ObjFanin0(pObj) ); -// if ( Abc_ObjIsNode(pObj) && (rand() % 4 == 0) ) -// if ( Abc_ObjIsNode(pObj) && Abc_ObjFanoutNum(pObj) > 1 && !Abc_NodeIsMuxControlType(pObj) && (rand() % 3 == 0) ) - if ( Abc_ObjIsNode(pObj) && Abc_ObjFanoutNum(pObj) > 1 && !Abc_NodeIsMuxControlType(pObj) ) - { - int nMffc = Abc_NodeMffcSize(pObj); - nMffcsTotal += Abc_NodeMffcSize(pObj); -// printf( "%d ", nMffc ); - - if ( nMffc > 2 || Abc_ObjFanoutNum(pObj) > 8 ) - Vec_IntWriteEntry( vAttrs, pObj->Id, 1 ); - } - } -/* - Abc_NtkForEachObj( pNtk, pObj, i ) - { - if ( Vec_IntEntry( vAttrs, pObj->Id ) ) - { - vNodes = Abc_NodeMffsInsideCollect( pObj ); - Vec_PtrForEachEntry( vNodes, pTemp, k ) - if ( pTemp != pObj ) - Vec_IntWriteEntry( vAttrs, pTemp->Id, 0 ); - Vec_PtrFree( vNodes ); - } - } -*/ - printf( "Total nodes = %d. Total MFFC nodes = %d.\n", nNodesTotal, nMffcsTotal ); - return vAttrs; -} - -/**Function************************************************************* - - Synopsis [Assigns global attributes randomly.] - - Description [Old code.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkSubDagSize_rec( Abc_Obj_t * pObj, Vec_Int_t * vAttrs ) -{ - if ( Abc_NodeIsTravIdCurrent(pObj) ) - return 0; - Abc_NodeSetTravIdCurrent(pObj); - if ( Vec_IntEntry( vAttrs, pObj->Id ) ) - return 0; - if ( Abc_ObjIsCi(pObj) ) - return 1; - assert( Abc_ObjFaninNum(pObj) == 2 ); - return 1 + Abc_NtkSubDagSize_rec(Abc_ObjFanin0(pObj), vAttrs) + - Abc_NtkSubDagSize_rec(Abc_ObjFanin1(pObj), vAttrs); -} - -/**Function************************************************************* - - Synopsis [Assigns global attributes randomly.] - - Description [Old code.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Int_t * Abc_NtkGetNodeAttributes2( Abc_Ntk_t * pNtk ) -{ - Vec_Int_t * vAttrs; - Abc_Obj_t * pObj; - int i, nSize; - assert( Abc_NtkIsDfsOrdered(pNtk) ); - vAttrs = Vec_IntStart( Abc_NtkObjNumMax(pNtk) + 1 ); - Abc_NtkForEachObj( pNtk, pObj, i ) - { - // skip no-nodes and nodes without fanouts - if ( pObj->Id == 0 || !(Abc_ObjIsNode(pObj) && Abc_ObjFanoutNum(pObj) > 1 && !Abc_NodeIsMuxControlType(pObj)) ) - continue; - // the node has more than one fanout - count its sub-DAG size - Abc_NtkIncrementTravId( pNtk ); - nSize = Abc_NtkSubDagSize_rec( pObj, vAttrs ); - if ( nSize > 15 ) - Vec_IntWriteEntry( vAttrs, pObj->Id, 1 ); - } - return vAttrs; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcDar.c b/src/base/abci/abcDar.c deleted file mode 100644 index f7616abc..00000000 --- a/src/base/abci/abcDar.c +++ /dev/null @@ -1,1212 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcDar.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [DAG-aware rewriting.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcDar.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "aig.h" -#include "dar.h" -#include "cnf.h" -#include "fra.h" -#include "fraig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Converts the network from the AIG manager into ABC.] - - Description [Assumes that registers are ordered after PIs/POs.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Abc_NtkToDar( Abc_Ntk_t * pNtk, int fRegisters ) -{ - Aig_Man_t * pMan; - Aig_Obj_t * pObjNew; - Abc_Obj_t * pObj; - int i, nNodes, nDontCares; - // make sure the latches follow PIs/POs - if ( fRegisters ) - { - assert( Abc_NtkBoxNum(pNtk) == Abc_NtkLatchNum(pNtk) ); - Abc_NtkForEachCi( pNtk, pObj, i ) - if ( i < Abc_NtkPiNum(pNtk) ) - assert( Abc_ObjIsPi(pObj) ); - else - assert( Abc_ObjIsBo(pObj) ); - Abc_NtkForEachCo( pNtk, pObj, i ) - if ( i < Abc_NtkPoNum(pNtk) ) - assert( Abc_ObjIsPo(pObj) ); - else - assert( Abc_ObjIsBi(pObj) ); - // print warning about initial values - nDontCares = 0; - Abc_NtkForEachLatch( pNtk, pObj, i ) - if ( Abc_LatchIsInitDc(pObj) ) - { - Abc_LatchSetInit0(pObj); - nDontCares++; - } - if ( nDontCares ) - { - printf( "Warning: %d registers in this network have don't-care init values.\n", nDontCares ); - printf( "The don't-care are assumed to be 0. The result may not verify.\n" ); - printf( "Use command \"print_latch\" to see the init values of registers.\n" ); - printf( "Use command \"init\" to change the values.\n" ); - } - } - // create the manager - pMan = Aig_ManStart( Abc_NtkNodeNum(pNtk) + 100 ); - pMan->pName = Extra_UtilStrsav( pNtk->pName ); - // save the number of registers - if ( fRegisters ) - { - pMan->nRegs = Abc_NtkLatchNum(pNtk); - pMan->vFlopNums = Vec_IntStartNatural( pMan->nRegs ); - } - // transfer the pointers to the basic nodes - Abc_AigConst1(pNtk)->pCopy = (Abc_Obj_t *)Aig_ManConst1(pMan); - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pCopy = (Abc_Obj_t *)Aig_ObjCreatePi(pMan); - // complement the 1-values registers - if ( fRegisters ) - Abc_NtkForEachLatch( pNtk, pObj, i ) - if ( Abc_LatchIsInit1(pObj) ) - Abc_ObjFanout0(pObj)->pCopy = Abc_ObjNot(Abc_ObjFanout0(pObj)->pCopy); - // perform the conversion of the internal nodes (assumes DFS ordering) -// pMan->fAddStrash = 1; - Abc_NtkForEachNode( pNtk, pObj, i ) - { - pObj->pCopy = (Abc_Obj_t *)Aig_And( pMan, (Aig_Obj_t *)Abc_ObjChild0Copy(pObj), (Aig_Obj_t *)Abc_ObjChild1Copy(pObj) ); -// printf( "%d->%d ", pObj->Id, ((Aig_Obj_t *)pObj->pCopy)->Id ); - } - pMan->fAddStrash = 0; - // create the POs - Abc_NtkForEachCo( pNtk, pObj, i ) - Aig_ObjCreatePo( pMan, (Aig_Obj_t *)Abc_ObjChild0Copy(pObj) ); - // complement the 1-valued registers - if ( fRegisters ) - Aig_ManForEachLiSeq( pMan, pObjNew, i ) - if ( Abc_LatchIsInit1(Abc_ObjFanout0(Abc_NtkCo(pNtk,i))) ) - pObjNew->pFanin0 = Aig_Not(pObjNew->pFanin0); - // remove dangling nodes - if ( nNodes = Aig_ManCleanup( pMan ) ) - printf( "Abc_NtkToDar(): Unexpected %d dangling nodes when converting to AIG!\n", nNodes ); -Aig_ManDumpVerilog( pMan, "test.v" ); - if ( !Aig_ManCheck( pMan ) ) - { - printf( "Abc_NtkToDar: AIG check has failed.\n" ); - Aig_ManStop( pMan ); - return NULL; - } - return pMan; -} - -/**Function************************************************************* - - Synopsis [Converts the network from the AIG manager into ABC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromDar( Abc_Ntk_t * pNtkOld, Aig_Man_t * pMan ) -{ - Vec_Ptr_t * vNodes; - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pObjNew; - Aig_Obj_t * pObj; - int i; -// assert( Aig_ManRegNum(pMan) == Abc_NtkLatchNum(pNtkOld) ); - // perform strashing - pNtkNew = Abc_NtkStartFrom( pNtkOld, ABC_NTK_STRASH, ABC_FUNC_AIG ); - // transfer the pointers to the basic nodes - Aig_ManConst1(pMan)->pData = Abc_AigConst1(pNtkNew); - Aig_ManForEachPi( pMan, pObj, i ) - pObj->pData = Abc_NtkCi(pNtkNew, i); - // rebuild the AIG - vNodes = Aig_ManDfs( pMan ); - Vec_PtrForEachEntry( vNodes, pObj, i ) - if ( Aig_ObjIsBuf(pObj) ) - pObj->pData = (Abc_Obj_t *)Aig_ObjChild0Copy(pObj); - else - pObj->pData = Abc_AigAnd( pNtkNew->pManFunc, (Abc_Obj_t *)Aig_ObjChild0Copy(pObj), (Abc_Obj_t *)Aig_ObjChild1Copy(pObj) ); - Vec_PtrFree( vNodes ); - // connect the PO nodes - Aig_ManForEachPo( pMan, pObj, i ) - { - if ( pMan->nAsserts && i == Aig_ManPoNum(pMan) - pMan->nAsserts ) - break; - Abc_ObjAddFanin( Abc_NtkCo(pNtkNew, i), (Abc_Obj_t *)Aig_ObjChild0Copy(pObj) ); - } - // if there are assertions, add them - if ( pMan->nAsserts > 0 ) - Aig_ManForEachAssert( pMan, pObj, i ) - { - pObjNew = Abc_NtkCreateAssert(pNtkNew); - Abc_ObjAssignName( pObjNew, "assert_", Abc_ObjName(pObjNew) ); - Abc_ObjAddFanin( pObjNew, (Abc_Obj_t *)Aig_ObjChild0Copy(pObj) ); - } - if ( !Abc_NtkCheck( pNtkNew ) ) - fprintf( stdout, "Abc_NtkFromDar(): Network check has failed.\n" ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Converts the network from the AIG manager into ABC.] - - Description [This procedure should be called after seq sweeping, - which changes the number of registers.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromDarSeqSweep( Abc_Ntk_t * pNtkOld, Aig_Man_t * pMan ) -{ - Vec_Ptr_t * vNodes; - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pObjNew, * pLatch; - Aig_Obj_t * pObj, * pObjLo, * pObjLi; - int i; -// assert( Aig_ManRegNum(pMan) != Abc_NtkLatchNum(pNtkOld) ); - // perform strashing - pNtkNew = Abc_NtkStartFromNoLatches( pNtkOld, ABC_NTK_STRASH, ABC_FUNC_AIG ); - // transfer the pointers to the basic nodes - Aig_ManConst1(pMan)->pData = Abc_AigConst1(pNtkNew); - Aig_ManForEachPiSeq( pMan, pObj, i ) - pObj->pData = Abc_NtkCi(pNtkNew, i); - // create as many latches as there are registers in the manager - Aig_ManForEachLiLoSeq( pMan, pObjLi, pObjLo, i ) - { - pObjNew = Abc_NtkCreateLatch( pNtkNew ); - pObjLi->pData = Abc_NtkCreateBi( pNtkNew ); - pObjLo->pData = Abc_NtkCreateBo( pNtkNew ); - Abc_ObjAddFanin( pObjNew, pObjLi->pData ); - Abc_ObjAddFanin( pObjLo->pData, pObjNew ); - Abc_LatchSetInit0( pObjNew ); - } - if ( pMan->vFlopNums == NULL ) - Abc_NtkAddDummyBoxNames( pNtkNew ); - else - { - assert( Abc_NtkBoxNum(pNtkOld) == Abc_NtkLatchNum(pNtkOld) ); - Abc_NtkForEachLatch( pNtkNew, pObjNew, i ) - { - pLatch = Abc_NtkBox( pNtkOld, Vec_IntEntry( pMan->vFlopNums, i ) ); - Abc_ObjAssignName( pObjNew, Abc_ObjName(pLatch), NULL ); - Abc_ObjAssignName( Abc_ObjFanin0(pObjNew), Abc_ObjName(Abc_ObjFanin0(pLatch)), NULL ); - Abc_ObjAssignName( Abc_ObjFanout0(pObjNew), Abc_ObjName(Abc_ObjFanout0(pLatch)), NULL ); - } - } - // rebuild the AIG - vNodes = Aig_ManDfs( pMan ); - Vec_PtrForEachEntry( vNodes, pObj, i ) - if ( Aig_ObjIsBuf(pObj) ) - pObj->pData = (Abc_Obj_t *)Aig_ObjChild0Copy(pObj); - else - pObj->pData = Abc_AigAnd( pNtkNew->pManFunc, (Abc_Obj_t *)Aig_ObjChild0Copy(pObj), (Abc_Obj_t *)Aig_ObjChild1Copy(pObj) ); - Vec_PtrFree( vNodes ); - // connect the PO nodes - Aig_ManForEachPo( pMan, pObj, i ) - { - if ( pMan->nAsserts && i == Aig_ManPoNum(pMan) - pMan->nAsserts ) - break; - Abc_ObjAddFanin( Abc_NtkCo(pNtkNew, i), (Abc_Obj_t *)Aig_ObjChild0Copy(pObj) ); - } - // if there are assertions, add them - if ( pMan->nAsserts > 0 ) - Aig_ManForEachAssert( pMan, pObj, i ) - { - pObjNew = Abc_NtkCreateAssert(pNtkNew); - Abc_ObjAssignName( pObjNew, "assert_", Abc_ObjName(pObjNew) ); - Abc_ObjAddFanin( pObjNew, (Abc_Obj_t *)Aig_ObjChild0Copy(pObj) ); - } - if ( !Abc_NtkCheck( pNtkNew ) ) - fprintf( stdout, "Abc_NtkFromDar(): Network check has failed.\n" ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Converts the network from the AIG manager into ABC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromDarChoices( Abc_Ntk_t * pNtkOld, Aig_Man_t * pMan ) -{ - Vec_Ptr_t * vNodes; - Abc_Ntk_t * pNtkNew; - Aig_Obj_t * pObj, * pTemp; - int i; - assert( pMan->pEquivs != NULL ); - assert( Aig_ManBufNum(pMan) == 0 ); - // perform strashing - pNtkNew = Abc_NtkStartFrom( pNtkOld, ABC_NTK_STRASH, ABC_FUNC_AIG ); - // transfer the pointers to the basic nodes - Aig_ManConst1(pMan)->pData = Abc_AigConst1(pNtkNew); - Aig_ManForEachPi( pMan, pObj, i ) - pObj->pData = Abc_NtkCi(pNtkNew, i); - - // rebuild the AIG - vNodes = Aig_ManDfsChoices( pMan ); - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - pObj->pData = Abc_AigAnd( pNtkNew->pManFunc, (Abc_Obj_t *)Aig_ObjChild0Copy(pObj), (Abc_Obj_t *)Aig_ObjChild1Copy(pObj) ); - if ( pTemp = pMan->pEquivs[pObj->Id] ) - { - Abc_Obj_t * pAbcRepr, * pAbcObj; - assert( pTemp->pData != NULL ); - pAbcRepr = pObj->pData; - pAbcObj = pTemp->pData; - pAbcObj->pData = pAbcRepr->pData; - pAbcRepr->pData = pAbcObj; - } - } -//printf( "Total = %d. Collected = %d.\n", Aig_ManNodeNum(pMan), Vec_PtrSize(vNodes) ); - Vec_PtrFree( vNodes ); - // connect the PO nodes - Aig_ManForEachPo( pMan, pObj, i ) - Abc_ObjAddFanin( Abc_NtkCo(pNtkNew, i), (Abc_Obj_t *)Aig_ObjChild0Copy(pObj) ); - if ( !Abc_NtkCheck( pNtkNew ) ) - fprintf( stdout, "Abc_NtkFromDar(): Network check has failed.\n" ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Converts the network from the AIG manager into ABC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromDarSeq( Abc_Ntk_t * pNtkOld, Aig_Man_t * pMan ) -{ - Vec_Ptr_t * vNodes; - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pObjNew, * pFaninNew, * pFaninNew0, * pFaninNew1; - Aig_Obj_t * pObj; - int i; -// assert( Aig_ManLatchNum(pMan) > 0 ); - // perform strashing - pNtkNew = Abc_NtkStartFromNoLatches( pNtkOld, ABC_NTK_STRASH, ABC_FUNC_AIG ); - // transfer the pointers to the basic nodes - Aig_ManConst1(pMan)->pData = Abc_AigConst1(pNtkNew); - Aig_ManForEachPi( pMan, pObj, i ) - pObj->pData = Abc_NtkPi(pNtkNew, i); - // create latches of the new network - Aig_ManForEachObj( pMan, pObj, i ) - { - if ( !Aig_ObjIsLatch(pObj) ) - continue; - pObjNew = Abc_NtkCreateLatch( pNtkNew ); - pFaninNew0 = Abc_NtkCreateBi( pNtkNew ); - pFaninNew1 = Abc_NtkCreateBo( pNtkNew ); - Abc_ObjAddFanin( pObjNew, pFaninNew0 ); - Abc_ObjAddFanin( pFaninNew1, pObjNew ); - Abc_LatchSetInit0( pObjNew ); - pObj->pData = Abc_ObjFanout0( pObjNew ); - } - Abc_NtkAddDummyBoxNames( pNtkNew ); - // rebuild the AIG - vNodes = Aig_ManDfs( pMan ); - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - // add the first fanin - pObj->pData = pFaninNew0 = (Abc_Obj_t *)Aig_ObjChild0Copy(pObj); - if ( Aig_ObjIsBuf(pObj) ) - continue; - // add the second fanin - pFaninNew1 = (Abc_Obj_t *)Aig_ObjChild1Copy(pObj); - // create the new node - if ( Aig_ObjIsExor(pObj) ) - pObj->pData = pObjNew = Abc_AigXor( pNtkNew->pManFunc, pFaninNew0, pFaninNew1 ); - else - pObj->pData = pObjNew = Abc_AigAnd( pNtkNew->pManFunc, pFaninNew0, pFaninNew1 ); - } - Vec_PtrFree( vNodes ); - // connect the PO nodes - Aig_ManForEachPo( pMan, pObj, i ) - { - pFaninNew = (Abc_Obj_t *)Aig_ObjChild0Copy( pObj ); - Abc_ObjAddFanin( Abc_NtkPo(pNtkNew, i), pFaninNew ); - } - // connect the latches - Aig_ManForEachObj( pMan, pObj, i ) - { - if ( !Aig_ObjIsLatch(pObj) ) - continue; - pFaninNew = (Abc_Obj_t *)Aig_ObjChild0Copy( pObj ); - Abc_ObjAddFanin( Abc_ObjFanin0(Abc_ObjFanin0(pObj->pData)), pFaninNew ); - } - if ( !Abc_NtkCheck( pNtkNew ) ) - fprintf( stdout, "Abc_NtkFromIvySeq(): Network check has failed.\n" ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Collect latch values.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Int_t * Abc_NtkGetLatchValues( Abc_Ntk_t * pNtk ) -{ - Vec_Int_t * vInits; - Abc_Obj_t * pLatch; - int i; - vInits = Vec_IntAlloc( Abc_NtkLatchNum(pNtk) ); - Abc_NtkForEachLatch( pNtk, pLatch, i ) - { - assert( Abc_LatchIsInit1(pLatch) == 0 ); - Vec_IntPush( vInits, Abc_LatchIsInit1(pLatch) ); - } - return vInits; -} - -/**Function************************************************************* - - Synopsis [Performs verification after retiming.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkSecRetime( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2 ) -{ - int fRemove1, fRemove2; - Aig_Man_t * pMan1, * pMan2; - int * pArray; - - fRemove1 = (!Abc_NtkIsStrash(pNtk1)) && (pNtk1 = Abc_NtkStrash(pNtk1, 0, 0, 0)); - fRemove2 = (!Abc_NtkIsStrash(pNtk2)) && (pNtk2 = Abc_NtkStrash(pNtk2, 0, 0, 0)); - - - pMan1 = Abc_NtkToDar( pNtk1, 0 ); - pMan2 = Abc_NtkToDar( pNtk2, 0 ); - - Aig_ManPrintStats( pMan1 ); - Aig_ManPrintStats( pMan2 ); - -// pArray = Abc_NtkGetLatchValues(pNtk1); - pArray = NULL; - Aig_ManSeqStrash( pMan1, Abc_NtkLatchNum(pNtk1), pArray ); - free( pArray ); - -// pArray = Abc_NtkGetLatchValues(pNtk2); - pArray = NULL; - Aig_ManSeqStrash( pMan2, Abc_NtkLatchNum(pNtk2), pArray ); - free( pArray ); - - Aig_ManPrintStats( pMan1 ); - Aig_ManPrintStats( pMan2 ); - - Aig_ManStop( pMan1 ); - Aig_ManStop( pMan2 ); - - - if ( fRemove1 ) Abc_NtkDelete( pNtk1 ); - if ( fRemove2 ) Abc_NtkDelete( pNtk2 ); -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDar( Abc_Ntk_t * pNtk ) -{ - Abc_Ntk_t * pNtkAig = NULL; - Aig_Man_t * pMan; - extern void Fra_ManPartitionTest( Aig_Man_t * p, int nComLim ); - - assert( Abc_NtkIsStrash(pNtk) ); - // convert to the AIG manager - pMan = Abc_NtkToDar( pNtk, 0 ); - if ( pMan == NULL ) - return NULL; - - // perform computation -// Fra_ManPartitionTest( pMan, 4 ); - pNtkAig = Abc_NtkFromDar( pNtk, pMan ); - Aig_ManStop( pMan ); - - // make sure everything is okay - if ( pNtkAig && !Abc_NtkCheck( pNtkAig ) ) - { - printf( "Abc_NtkDar: The network check has failed.\n" ); - Abc_NtkDelete( pNtkAig ); - return NULL; - } - return pNtkAig; -} - - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDarFraig( Abc_Ntk_t * pNtk, int nConfLimit, int fDoSparse, int fProve, int fTransfer, int fSpeculate, int fChoicing, int fVerbose ) -{ - Fra_Par_t Pars, * pPars = &Pars; - Abc_Ntk_t * pNtkAig; - Aig_Man_t * pMan, * pTemp; - pMan = Abc_NtkToDar( pNtk, 0 ); - if ( pMan == NULL ) - return NULL; - Fra_ParamsDefault( pPars ); - pPars->nBTLimitNode = nConfLimit; - pPars->fChoicing = fChoicing; - pPars->fDoSparse = fDoSparse; - pPars->fSpeculate = fSpeculate; - pPars->fProve = fProve; - pPars->fVerbose = fVerbose; - pMan = Fra_FraigPerform( pTemp = pMan, pPars ); - if ( fChoicing ) - pNtkAig = Abc_NtkFromDarChoices( pNtk, pMan ); - else - pNtkAig = Abc_NtkFromDar( pNtk, pMan ); - Aig_ManStop( pTemp ); - Aig_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkCSweep( Abc_Ntk_t * pNtk, int nCutsMax, int nLeafMax, int fVerbose ) -{ - extern Aig_Man_t * Csw_Sweep( Aig_Man_t * pAig, int nCutsMax, int nLeafMax, int fVerbose ); - Abc_Ntk_t * pNtkAig; - Aig_Man_t * pMan, * pTemp; - pMan = Abc_NtkToDar( pNtk, 0 ); - if ( pMan == NULL ) - return NULL; - pMan = Csw_Sweep( pTemp = pMan, nCutsMax, nLeafMax, fVerbose ); - pNtkAig = Abc_NtkFromDar( pNtk, pMan ); - Aig_ManStop( pTemp ); - Aig_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDRewrite( Abc_Ntk_t * pNtk, Dar_RwrPar_t * pPars ) -{ - Aig_Man_t * pMan, * pTemp; - Abc_Ntk_t * pNtkAig; - int clk; - assert( Abc_NtkIsStrash(pNtk) ); - pMan = Abc_NtkToDar( pNtk, 0 ); - if ( pMan == NULL ) - return NULL; -// Aig_ManPrintStats( pMan ); -/* -// Aig_ManSupports( pMan ); - { - Vec_Vec_t * vParts; - vParts = Aig_ManPartitionSmart( pMan, 50, 1, NULL ); - Vec_VecFree( vParts ); - } -*/ - Dar_ManRewrite( pMan, pPars ); -// pMan = Dar_ManBalance( pTemp = pMan, pPars->fUpdateLevel ); -// Aig_ManStop( pTemp ); - -clk = clock(); - pMan = Aig_ManDup( pTemp = pMan, 0 ); - Aig_ManStop( pTemp ); -//PRT( "time", clock() - clk ); - -// Aig_ManPrintStats( pMan ); - pNtkAig = Abc_NtkFromDar( pNtk, pMan ); - Aig_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDRefactor( Abc_Ntk_t * pNtk, Dar_RefPar_t * pPars ) -{ - Aig_Man_t * pMan, * pTemp; - Abc_Ntk_t * pNtkAig; - int clk; - assert( Abc_NtkIsStrash(pNtk) ); - pMan = Abc_NtkToDar( pNtk, 0 ); - if ( pMan == NULL ) - return NULL; -// Aig_ManPrintStats( pMan ); - - Dar_ManRefactor( pMan, pPars ); -// pMan = Dar_ManBalance( pTemp = pMan, pPars->fUpdateLevel ); -// Aig_ManStop( pTemp ); - -clk = clock(); - pMan = Aig_ManDup( pTemp = pMan, 0 ); - Aig_ManStop( pTemp ); -//PRT( "time", clock() - clk ); - -// Aig_ManPrintStats( pMan ); - pNtkAig = Abc_NtkFromDar( pNtk, pMan ); - Aig_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDCompress2( Abc_Ntk_t * pNtk, int fBalance, int fUpdateLevel, int fVerbose ) -{ - Aig_Man_t * pMan, * pTemp; - Abc_Ntk_t * pNtkAig; - int clk; - assert( Abc_NtkIsStrash(pNtk) ); - pMan = Abc_NtkToDar( pNtk, 0 ); - if ( pMan == NULL ) - return NULL; -// Aig_ManPrintStats( pMan ); - -clk = clock(); - pMan = Dar_ManCompress2( pTemp = pMan, fBalance, fUpdateLevel, fVerbose ); - Aig_ManStop( pTemp ); -//PRT( "time", clock() - clk ); - -// Aig_ManPrintStats( pMan ); - pNtkAig = Abc_NtkFromDar( pNtk, pMan ); - Aig_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDChoice( Abc_Ntk_t * pNtk, int fBalance, int fUpdateLevel, int fVerbose ) -{ - Aig_Man_t * pMan, * pTemp; - Abc_Ntk_t * pNtkAig; - assert( Abc_NtkIsStrash(pNtk) ); - pMan = Abc_NtkToDar( pNtk, 0 ); - if ( pMan == NULL ) - return NULL; - pMan = Dar_ManChoice( pTemp = pMan, fBalance, fUpdateLevel, fVerbose ); - Aig_ManStop( pTemp ); - pNtkAig = Abc_NtkFromDarChoices( pNtk, pMan ); - Aig_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDrwsat( Abc_Ntk_t * pNtk, int fBalance, int fVerbose ) -{ - Aig_Man_t * pMan, * pTemp; - Abc_Ntk_t * pNtkAig; - int clk; - assert( Abc_NtkIsStrash(pNtk) ); - pMan = Abc_NtkToDar( pNtk, 0 ); - if ( pMan == NULL ) - return NULL; -// Aig_ManPrintStats( pMan ); - -clk = clock(); - pMan = Dar_ManRwsat( pTemp = pMan, fBalance, fVerbose ); - Aig_ManStop( pTemp ); -//PRT( "time", clock() - clk ); - -// Aig_ManPrintStats( pMan ); - pNtkAig = Abc_NtkFromDar( pNtk, pMan ); - Aig_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkConstructFromCnf( Abc_Ntk_t * pNtk, Cnf_Man_t * p, Vec_Ptr_t * vMapped ) -{ - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pNode, * pNodeNew; - Aig_Obj_t * pObj, * pLeaf; - Cnf_Cut_t * pCut; - Vec_Int_t * vCover; - unsigned uTruth; - int i, k, nDupGates; - // create the new network - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_SOP ); - // make the mapper point to the new network - Aig_ManConst1(p->pManAig)->pData = Abc_NtkCreateNodeConst1(pNtkNew); - Abc_NtkForEachCi( pNtk, pNode, i ) - Aig_ManPi(p->pManAig, i)->pData = pNode->pCopy; - // process the nodes in topological order - vCover = Vec_IntAlloc( 1 << 16 ); - Vec_PtrForEachEntry( vMapped, pObj, i ) - { - // create new node - pNodeNew = Abc_NtkCreateNode( pNtkNew ); - // add fanins according to the cut - pCut = pObj->pData; - Cnf_CutForEachLeaf( p->pManAig, pCut, pLeaf, k ) - Abc_ObjAddFanin( pNodeNew, pLeaf->pData ); - // add logic function - if ( pCut->nFanins < 5 ) - { - uTruth = 0xFFFF & *Cnf_CutTruth(pCut); - Cnf_SopConvertToVector( p->pSops[uTruth], p->pSopSizes[uTruth], vCover ); - pNodeNew->pData = Abc_SopCreateFromIsop( pNtkNew->pManFunc, pCut->nFanins, vCover ); - } - else - pNodeNew->pData = Abc_SopCreateFromIsop( pNtkNew->pManFunc, pCut->nFanins, pCut->vIsop[1] ); - // save the node - pObj->pData = pNodeNew; - } - Vec_IntFree( vCover ); - // add the CO drivers - Abc_NtkForEachCo( pNtk, pNode, i ) - { - pObj = Aig_ManPo(p->pManAig, i); - pNodeNew = Abc_ObjNotCond( Aig_ObjFanin0(pObj)->pData, Aig_ObjFaninC0(pObj) ); - Abc_ObjAddFanin( pNode->pCopy, pNodeNew ); - } - - // remove the constant node if not used - pNodeNew = (Abc_Obj_t *)Aig_ManConst1(p->pManAig)->pData; - if ( Abc_ObjFanoutNum(pNodeNew) == 0 ) - Abc_NtkDeleteObj( pNodeNew ); - // minimize the node -// Abc_NtkSweep( pNtkNew, 0 ); - // decouple the PO driver nodes to reduce the number of levels - nDupGates = Abc_NtkLogicMakeSimpleCos( pNtkNew, 1 ); -// if ( nDupGates && If_ManReadVerbose(pIfMan) ) -// printf( "Duplicated %d gates to decouple the CO drivers.\n", nDupGates ); - if ( !Abc_NtkCheck( pNtkNew ) ) - fprintf( stdout, "Abc_NtkConstructFromCnf(): Network check has failed.\n" ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDarToCnf( Abc_Ntk_t * pNtk, char * pFileName ) -{ - Vec_Ptr_t * vMapped; - Aig_Man_t * pMan; - Cnf_Man_t * pManCnf; - Cnf_Dat_t * pCnf; - Abc_Ntk_t * pNtkNew = NULL; - assert( Abc_NtkIsStrash(pNtk) ); - - // convert to the AIG manager - pMan = Abc_NtkToDar( pNtk, 0 ); - if ( pMan == NULL ) - return NULL; - if ( !Aig_ManCheck( pMan ) ) - { - printf( "Abc_NtkDarToCnf: AIG check has failed.\n" ); - Aig_ManStop( pMan ); - return NULL; - } - // perform balance - Aig_ManPrintStats( pMan ); - - // derive CNF - pCnf = Cnf_Derive( pMan, 0 ); - pManCnf = Cnf_ManRead(); - - // write the network for verification - vMapped = Cnf_ManScanMapping( pManCnf, 1, 0 ); - pNtkNew = Abc_NtkConstructFromCnf( pNtk, pManCnf, vMapped ); - Vec_PtrFree( vMapped ); - - // write CNF into a file - Cnf_DataWriteIntoFile( pCnf, pFileName, 0 ); - Cnf_DataFree( pCnf ); - Cnf_ClearMemory(); - - Aig_ManStop( pMan ); - return pNtkNew; -} - - -/**Function************************************************************* - - Synopsis [Solves combinational miter using a SAT solver.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDSat( Abc_Ntk_t * pNtk, sint64 nConfLimit, sint64 nInsLimit, int fVerbose ) -{ - sat_solver * pSat; - Aig_Man_t * pMan; - Cnf_Dat_t * pCnf; - int status, RetValue, clk = clock(); - Vec_Int_t * vCiIds; - - assert( Abc_NtkIsStrash(pNtk) ); - assert( Abc_NtkLatchNum(pNtk) == 0 ); - assert( Abc_NtkPoNum(pNtk) == 1 ); - - // conver to the manager - pMan = Abc_NtkToDar( pNtk, 0 ); - // derive CNF - pCnf = Cnf_Derive( pMan, 0 ); -// pCnf = Cnf_DeriveSimple( pMan, 0 ); - // convert into the SAT solver - pSat = Cnf_DataWriteIntoSolver( pCnf ); - vCiIds = Cnf_DataCollectPiSatNums( pCnf, pMan ); - Aig_ManStop( pMan ); - Cnf_DataFree( pCnf ); - // solve SAT - if ( pSat == NULL ) - { - Vec_IntFree( vCiIds ); -// printf( "Trivially unsat\n" ); - return 1; - } - - -// printf( "Created SAT problem with %d variable and %d clauses. ", sat_solver_nvars(pSat), sat_solver_nclauses(pSat) ); -// PRT( "Time", clock() - clk ); - - // simplify the problem - clk = clock(); - status = sat_solver_simplify(pSat); -// printf( "Simplified the problem to %d variables and %d clauses. ", sat_solver_nvars(pSat), sat_solver_nclauses(pSat) ); -// PRT( "Time", clock() - clk ); - if ( status == 0 ) - { - Vec_IntFree( vCiIds ); - sat_solver_delete( pSat ); -// printf( "The problem is UNSATISFIABLE after simplification.\n" ); - return 1; - } - - // solve the miter - clk = clock(); - if ( fVerbose ) - pSat->verbosity = 1; - status = sat_solver_solve( pSat, NULL, NULL, (sint64)nConfLimit, (sint64)nInsLimit, (sint64)0, (sint64)0 ); - if ( status == l_Undef ) - { -// printf( "The problem timed out.\n" ); - RetValue = -1; - } - else if ( status == l_True ) - { -// printf( "The problem is SATISFIABLE.\n" ); - RetValue = 0; - } - else if ( status == l_False ) - { -// printf( "The problem is UNSATISFIABLE.\n" ); - RetValue = 1; - } - else - assert( 0 ); -// PRT( "SAT sat_solver time", clock() - clk ); -// printf( "The number of conflicts = %d.\n", (int)pSat->sat_solver_stats.conflicts ); - - // if the problem is SAT, get the counterexample - if ( status == l_True ) - { - pNtk->pModel = Sat_SolverGetModel( pSat, vCiIds->pArray, vCiIds->nSize ); - } - // free the sat_solver - if ( fVerbose ) - Sat_SolverPrintStats( stdout, pSat ); -//sat_solver_store_write( pSat, "trace.cnf" ); -//sat_solver_store_free( pSat ); - sat_solver_delete( pSat ); - Vec_IntFree( vCiIds ); - return RetValue; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDarSeqSweep( Abc_Ntk_t * pNtk, int nFramesP, int nFramesK, int nMaxImps, int fRewrite, int fUseImps, int fLatchCorr, int fWriteImps, int fVerbose ) -{ - Fraig_Params_t Params; - Abc_Ntk_t * pNtkAig, * pNtkFraig; - Aig_Man_t * pMan, * pTemp; - int clk = clock(); - - // preprocess the miter by fraiging it - // (note that for each functional class, fraiging leaves one representative; - // so fraiging does not reduce the number of functions represented by nodes - Fraig_ParamsSetDefault( &Params ); - Params.nBTLimit = 100000; -// pNtkFraig = Abc_NtkFraig( pNtk, &Params, 0, 0 ); - pNtkFraig = Abc_NtkDup( pNtk ); -if ( fVerbose ) -{ -PRT( "Initial fraiging time", clock() - clk ); -} - - pMan = Abc_NtkToDar( pNtkFraig, 1 ); - Abc_NtkDelete( pNtkFraig ); - if ( pMan == NULL ) - return NULL; - - pMan = Fra_FraigInduction( pTemp = pMan, nFramesP, nFramesK, nMaxImps, fRewrite, fUseImps, fLatchCorr, fWriteImps, fVerbose, NULL ); - Aig_ManStop( pTemp ); - - if ( Aig_ManRegNum(pMan) < Abc_NtkLatchNum(pNtk) ) - pNtkAig = Abc_NtkFromDarSeqSweep( pNtk, pMan ); - else - pNtkAig = Abc_NtkFromDar( pNtk, pMan ); - Aig_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Computes latch correspondence.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDarLcorr( Abc_Ntk_t * pNtk, int nFramesP, int nConfMax, int fVerbose ) -{ - Aig_Man_t * pMan, * pTemp; - Abc_Ntk_t * pNtkAig; - pMan = Abc_NtkToDar( pNtk, 1 ); - if ( pMan == NULL ) - return NULL; - pMan = Fra_FraigLatchCorrespondence( pTemp = pMan, nFramesP, nConfMax, 0, fVerbose, NULL ); - Aig_ManStop( pTemp ); - if ( Aig_ManRegNum(pMan) < Abc_NtkLatchNum(pNtk) ) - pNtkAig = Abc_NtkFromDarSeqSweep( pNtk, pMan ); - else - pNtkAig = Abc_NtkFromDar( pNtk, pMan ); - Aig_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDarProve( Abc_Ntk_t * pNtk, int nFrames, int fRetimeFirst, int fVerbose, int fVeryVerbose ) -{ - Aig_Man_t * pMan; - int RetValue; - // derive the AIG manager - pMan = Abc_NtkToDar( pNtk, 1 ); - if ( pMan == NULL ) - { - printf( "Converting miter into AIG has failed.\n" ); - return -1; - } - assert( pMan->nRegs > 0 ); - // perform verification - RetValue = Fra_FraigSec( pMan, nFrames, fRetimeFirst, fVerbose, fVeryVerbose ); - Aig_ManStop( pMan ); - return RetValue; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDarSec( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nFrames, int fRetimeFirst, int fVerbose, int fVeryVerbose ) -{ -// Fraig_Params_t Params; - Aig_Man_t * pMan; - Abc_Ntk_t * pMiter;//, * pTemp; - int RetValue; - - // get the miter of the two networks - pMiter = Abc_NtkMiter( pNtk1, pNtk2, 0, 0 ); - if ( pMiter == NULL ) - { - printf( "Miter computation has failed.\n" ); - return 0; - } - RetValue = Abc_NtkMiterIsConstant( pMiter ); - if ( RetValue == 0 ) - { - extern void Abc_NtkVerifyReportErrorSeq( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int * pModel, int nFrames ); - printf( "Networks are NOT EQUIVALENT after structural hashing.\n" ); - // report the error - pMiter->pModel = Abc_NtkVerifyGetCleanModel( pMiter, nFrames ); - Abc_NtkVerifyReportErrorSeq( pNtk1, pNtk2, pMiter->pModel, nFrames ); - FREE( pMiter->pModel ); - Abc_NtkDelete( pMiter ); - return 0; - } - if ( RetValue == 1 ) - { - Abc_NtkDelete( pMiter ); - printf( "Networks are equivalent after structural hashing.\n" ); - return 1; - } - - // commented out because something became non-inductive -/* - // preprocess the miter by fraiging it - // (note that for each functional class, fraiging leaves one representative; - // so fraiging does not reduce the number of functions represented by nodes - Fraig_ParamsSetDefault( &Params ); - Params.nBTLimit = 100000; - pMiter = Abc_NtkFraig( pTemp = pMiter, &Params, 0, 0 ); - Abc_NtkDelete( pTemp ); - RetValue = Abc_NtkMiterIsConstant( pMiter ); - if ( RetValue == 0 ) - { - extern void Abc_NtkVerifyReportErrorSeq( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int * pModel, int nFrames ); - printf( "Networks are NOT EQUIVALENT after structural hashing.\n" ); - // report the error - pMiter->pModel = Abc_NtkVerifyGetCleanModel( pMiter, nFrames ); - Abc_NtkVerifyReportErrorSeq( pNtk1, pNtk2, pMiter->pModel, nFrames ); - FREE( pMiter->pModel ); - Abc_NtkDelete( pMiter ); - return 0; - } - if ( RetValue == 1 ) - { - Abc_NtkDelete( pMiter ); - printf( "Networks are equivalent after structural hashing.\n" ); - return 1; - } -*/ - // derive the AIG manager - pMan = Abc_NtkToDar( pMiter, 1 ); - Abc_NtkDelete( pMiter ); - if ( pMan == NULL ) - { - printf( "Converting miter into AIG has failed.\n" ); - return -1; - } - assert( pMan->nRegs > 0 ); - - // perform verification - RetValue = Fra_FraigSec( pMan, nFrames, fRetimeFirst, fVerbose, fVeryVerbose ); - Aig_ManStop( pMan ); - return RetValue; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDarLatchSweep( Abc_Ntk_t * pNtk, int fLatchSweep, int fVerbose ) -{ - Abc_Ntk_t * pNtkAig; - Aig_Man_t * pMan; - pMan = Abc_NtkToDar( pNtk, 1 ); - if ( pMan == NULL ) - return NULL; - Aig_ManSeqCleanup( pMan ); - if ( fLatchSweep ) - { - if ( pMan->nRegs ) - pMan = Aig_ManReduceLaches( pMan, fVerbose ); - if ( pMan->nRegs ) - pMan = Aig_ManConstReduce( pMan, fVerbose ); - } - pNtkAig = Abc_NtkFromDarSeqSweep( pNtk, pMan ); - Aig_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDarRetime( Abc_Ntk_t * pNtk, int nStepsMax, int fVerbose ) -{ - Abc_Ntk_t * pNtkAig; - Aig_Man_t * pMan, * pTemp; - pMan = Abc_NtkToDar( pNtk, 1 ); - if ( pMan == NULL ) - return NULL; -// Aig_ManReduceLachesCount( pMan ); - - pMan = Rtm_ManRetime( pTemp = pMan, 1, nStepsMax, 0 ); - Aig_ManStop( pTemp ); - -// pMan = Aig_ManReduceLaches( pMan, 1 ); -// pMan = Aig_ManConstReduce( pMan, 1 ); - - pNtkAig = Abc_NtkFromDarSeqSweep( pNtk, pMan ); - Aig_ManStop( pMan ); - return pNtkAig; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcDebug.c b/src/base/abci/abcDebug.c deleted file mode 100644 index 95b95d89..00000000 --- a/src/base/abci/abcDebug.c +++ /dev/null @@ -1,208 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcDebug.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Automated debugging procedures.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcDebug.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static int Abc_NtkCountFaninsTotal( Abc_Ntk_t * pNtk ); -static Abc_Ntk_t * Abc_NtkAutoDebugModify( Abc_Ntk_t * pNtk, int ObjNum, int fConst1 ); - -extern void Io_WriteBlifLogic( Abc_Ntk_t * pNtk, char * FileName, int fWriteLatches ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Takes a network and a procedure to test.] - - Description [The network demonstrates the bug in the procedure. - Procedure should return 1 if the bug is demonstrated.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkAutoDebug( Abc_Ntk_t * pNtk, int (*pFuncError) (Abc_Ntk_t *) ) -{ - Abc_Ntk_t * pNtkMod; - char * pFileName = "bug_found.blif"; - int i, nSteps, nIter, ModNum, RandNum = 1, clk, clkTotal = clock(); - assert( Abc_NtkIsLogic(pNtk) ); - srand( 0x123123 ); - // create internal copy of the network - pNtk = Abc_NtkDup(pNtk); - if ( !(*pFuncError)( pNtk ) ) - { - printf( "The original network does not cause the bug. Quitting.\n" ); - Abc_NtkDelete( pNtk ); - return; - } - // perform incremental modifications - for ( nIter = 0; ; nIter++ ) - { - clk = clock(); - // count how many ways of modifying the network exists - nSteps = 2 * Abc_NtkCountFaninsTotal(pNtk); - // try modifying the network as many times - RandNum ^= rand(); - for ( i = 0; i < nSteps; i++ ) - { - // get the shifted number of bug - ModNum = (i + RandNum) % nSteps; - // get the modified network - pNtkMod = Abc_NtkAutoDebugModify( pNtk, ModNum/2, ModNum%2 ); - // write the network - Io_WriteBlifLogic( pNtk, "bug_temp.blif", 1 ); - // check if the bug is still there - if ( (*pFuncError)( pNtkMod ) ) // bug is still there - { - Abc_NtkDelete( pNtk ); - pNtk = pNtkMod; - break; - } - else // no bug - Abc_NtkDelete( pNtkMod ); - } - printf( "Iter %6d : Latches = %6d. Nodes = %6d. Steps = %6d. Error step = %3d. ", - nIter, Abc_NtkLatchNum(pNtk), Abc_NtkNodeNum(pNtk), nSteps, i ); - PRT( "Time", clock() - clk ); - if ( i == nSteps ) // could not modify it while preserving the bug - break; - } - // write out the final network - Io_WriteBlifLogic( pNtk, pFileName, 1 ); - printf( "Final network written into file \"%s\". ", pFileName ); - PRT( "Total time", clock() - clkTotal ); - Abc_NtkDelete( pNtk ); -} - -/**Function************************************************************* - - Synopsis [Counts the total number of fanins.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkCountFaninsTotal( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pObj, * pFanin; - int i, k, Counter = 0; - Abc_NtkForEachObj( pNtk, pObj, i ) - Abc_ObjForEachFanin( pObj, pFanin, k ) - { - if ( !Abc_ObjIsNode(pObj) && !Abc_ObjIsPo(pObj) ) - continue; - if ( Abc_ObjIsPo(pObj) && Abc_NtkPoNum(pNtk) == 1 ) - continue; - if ( Abc_ObjIsNode(pObj) && Abc_NodeIsConst(pFanin) ) - continue; - Counter++; - } - return Counter; -} - -/**Function************************************************************* - - Synopsis [Returns the node and fanin to be modified.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkFindGivenFanin( Abc_Ntk_t * pNtk, int Step, Abc_Obj_t ** ppObj, Abc_Obj_t ** ppFanin ) -{ - Abc_Obj_t * pObj, * pFanin; - int i, k, Counter = 0; - Abc_NtkForEachObj( pNtk, pObj, i ) - Abc_ObjForEachFanin( pObj, pFanin, k ) - { - if ( !Abc_ObjIsNode(pObj) && !Abc_ObjIsPo(pObj) ) - continue; - if ( Abc_ObjIsPo(pObj) && Abc_NtkPoNum(pNtk) == 1 ) - continue; - if ( Abc_ObjIsNode(pObj) && Abc_NodeIsConst(pFanin) ) - continue; - if ( Counter++ == Step ) - { - *ppObj = pObj; - *ppFanin = pFanin; - return 1; - } - } - return 0; -} - -/**Function************************************************************* - - Synopsis [Perform modification with the given number.] - - Description [Modification consists of replacing the node by a constant.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkAutoDebugModify( Abc_Ntk_t * pNtkInit, int Step, int fConst1 ) -{ - extern void Abc_NtkCycleInitStateSop( Abc_Ntk_t * pNtk, int nFrames, int fVerbose ); - Abc_Ntk_t * pNtk; - Abc_Obj_t * pObj, * pFanin, * pConst; - // copy the network - pNtk = Abc_NtkDup( pNtkInit ); - assert( Abc_NtkNodeNum(pNtk) == Abc_NtkNodeNum(pNtkInit) ); - // find the object number - Abc_NtkFindGivenFanin( pNtk, Step, &pObj, &pFanin ); - // consider special case - if ( Abc_ObjIsPo(pObj) && Abc_NodeIsConst(pFanin) ) - { - Abc_NtkDeleteAll_rec( pObj ); - return pNtk; - } - // plug in a constant node - pConst = fConst1? Abc_NtkCreateNodeConst1(pNtk) : Abc_NtkCreateNodeConst0(pNtk); - Abc_ObjTransferFanout( pFanin, pConst ); - Abc_NtkDeleteAll_rec( pFanin ); - - Abc_NtkSweep( pNtk, 0 ); - Abc_NtkCleanupSeq( pNtk, 0, 0, 0 ); - Abc_NtkToSop( pNtk, 0 ); - Abc_NtkCycleInitStateSop( pNtk, 50, 0 ); - return pNtk; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcDress.c b/src/base/abci/abcDress.c deleted file mode 100644 index f8182532..00000000 --- a/src/base/abci/abcDress.c +++ /dev/null @@ -1,209 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcDress.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Transfers names from one netlist to the other.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcDress.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "io.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static stmm_table * Abc_NtkDressDeriveMapping( Abc_Ntk_t * pNtk ); -static void Abc_NtkDressTransferNames( Abc_Ntk_t * pNtk, stmm_table * tMapping, int fVerbose ); - -extern Abc_Ntk_t * Abc_NtkIvyFraig( Abc_Ntk_t * pNtk, int nConfLimit, int fDoSparse, int fProve, int fTransfer, int fVerbose ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Transfers names from one netlist to the other.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDress( Abc_Ntk_t * pNtkLogic, char * pFileName, int fVerbose ) -{ - Abc_Ntk_t * pNtkOrig, * pNtkLogicOrig; - Abc_Ntk_t * pMiter, * pMiterFraig; - stmm_table * tMapping; - - assert( Abc_NtkIsLogic(pNtkLogic) ); - - // get the original netlist - pNtkOrig = Io_ReadNetlist( pFileName, Io_ReadFileType(pFileName), 1 ); - if ( pNtkOrig == NULL ) - return; - assert( Abc_NtkIsNetlist(pNtkOrig) ); - - Abc_NtkCleanCopy(pNtkLogic); - Abc_NtkCleanCopy(pNtkOrig); - - // convert it into the logic network - pNtkLogicOrig = Abc_NtkToLogic( pNtkOrig ); - // check that the networks have the same PIs/POs/latches - if ( !Abc_NtkCompareSignals( pNtkLogic, pNtkLogicOrig, 1, 1 ) ) - { - Abc_NtkDelete( pNtkOrig ); - Abc_NtkDelete( pNtkLogicOrig ); - return; - } - - // convert the current logic network into an AIG - pMiter = Abc_NtkStrash( pNtkLogic, 1, 0, 0 ); - - // convert it into the AIG and make the netlist point to the AIG - Abc_NtkAppend( pMiter, pNtkLogicOrig, 1 ); - Abc_NtkTransferCopy( pNtkOrig ); - Abc_NtkDelete( pNtkLogicOrig ); - -if ( fVerbose ) -{ -printf( "After mitering:\n" ); -printf( "Logic: Nodes = %5d. Copy = %5d. \n", Abc_NtkNodeNum(pNtkLogic), Abc_NtkCountCopy(pNtkLogic) ); -printf( "Orig: Nodes = %5d. Copy = %5d. \n", Abc_NtkNodeNum(pNtkOrig), Abc_NtkCountCopy(pNtkOrig) ); -} - - // fraig the miter (miter nodes point to the fraiged miter) - pMiterFraig = Abc_NtkIvyFraig( pMiter, 100, 1, 0, 1, 0 ); - // make netlists point to the fraiged miter - Abc_NtkTransferCopy( pNtkLogic ); - Abc_NtkTransferCopy( pNtkOrig ); - Abc_NtkDelete( pMiter ); - -if ( fVerbose ) -{ -printf( "After fraiging:\n" ); -printf( "Logic: Nodes = %5d. Copy = %5d. \n", Abc_NtkNodeNum(pNtkLogic), Abc_NtkCountCopy(pNtkLogic) ); -printf( "Orig: Nodes = %5d. Copy = %5d. \n", Abc_NtkNodeNum(pNtkOrig), Abc_NtkCountCopy(pNtkOrig) ); -} - - // derive mapping from the fraiged nodes into their prototype nodes in the original netlist - tMapping = Abc_NtkDressDeriveMapping( pNtkOrig ); - - // transfer the names to the new netlist - Abc_NtkDressTransferNames( pNtkLogic, tMapping, fVerbose ); - - // clean up - stmm_free_table( tMapping ); - Abc_NtkDelete( pMiterFraig ); - Abc_NtkDelete( pNtkOrig ); -} - -/**Function************************************************************* - - Synopsis [Returns the mapping from the fraig nodes point into the nodes of the netlist.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -stmm_table * Abc_NtkDressDeriveMapping( Abc_Ntk_t * pNtk ) -{ - stmm_table * tResult; - Abc_Obj_t * pNode, * pNodeMap, * pNodeFraig; - int i; - assert( Abc_NtkIsNetlist(pNtk) ); - tResult = stmm_init_table(stmm_ptrcmp,stmm_ptrhash); - Abc_NtkForEachNode( pNtk, pNode, i ) - { - // get the fraiged node - pNodeFraig = Abc_ObjRegular(pNode->pCopy); - // if this node is already mapped, skip - if ( stmm_is_member( tResult, (char *)pNodeFraig ) ) - continue; - // get the mapping of this node - pNodeMap = Abc_ObjNotCond( pNode, Abc_ObjIsComplement(pNode->pCopy) ); - // add the mapping - stmm_insert( tResult, (char *)pNodeFraig, (char *)pNodeMap ); - } - return tResult; -} - -/**Function************************************************************* - - Synopsis [Attaches the names of to the new netlist.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDressTransferNames( Abc_Ntk_t * pNtk, stmm_table * tMapping, int fVerbose ) -{ - Abc_Obj_t * pNet, * pNode, * pNodeMap, * pNodeFraig; - char * pName; - int i, Counter = 0, CounterInv = 0, CounterInit = stmm_count(tMapping); - assert( Abc_NtkIsLogic(pNtk) ); - Abc_NtkForEachNode( pNtk, pNode, i ) - { - // if the node already has a name, quit - pName = Nm_ManFindNameById( pNtk->pManName, pNode->Id ); - if ( pName != NULL ) - continue; - // get the fraiged node - pNodeFraig = Abc_ObjRegular(pNode->pCopy); - // find the matching node of the original netlist - if ( !stmm_lookup( tMapping, (char *)pNodeFraig, (char **)&pNodeMap ) ) - continue; - // find the true match - pNodeMap = Abc_ObjNotCond( pNodeMap, Abc_ObjIsComplement(pNode->pCopy) ); - // get the name - pNet = Abc_ObjFanout0(Abc_ObjRegular(pNodeMap)); - pName = Nm_ManFindNameById( pNet->pNtk->pManName, pNet->Id ); - assert( pName != NULL ); - // set the name - if ( Abc_ObjIsComplement(pNodeMap) ) - { - Abc_ObjAssignName( pNode, pName, "_inv" ); - CounterInv++; - } - else - { - Abc_ObjAssignName( pNode, pName, NULL ); - Counter++; - } - // remove the name - stmm_delete( tMapping, (char **)&pNodeFraig, (char **)&pNodeMap ); - } - if ( fVerbose ) - { - printf( "Total number of names collected = %5d.\n", CounterInit ); - printf( "Total number of names assigned = %5d. (Dir = %5d. Compl = %5d.)\n", - Counter + CounterInv, Counter, CounterInv ); - } -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcDsd.c b/src/base/abci/abcDsd.c deleted file mode 100644 index c00a7d7c..00000000 --- a/src/base/abci/abcDsd.c +++ /dev/null @@ -1,551 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcDsd.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Decomposes the network using disjoint-support decomposition.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcDsd.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "dsd.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static Abc_Ntk_t * Abc_NtkDsdInternal( Abc_Ntk_t * pNtk, bool fVerbose, bool fPrint, bool fShort ); -static void Abc_NtkDsdConstruct( Dsd_Manager_t * pManDsd, Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew ); -static Abc_Obj_t * Abc_NtkDsdConstructNode( Dsd_Manager_t * pManDsd, Dsd_Node_t * pNodeDsd, Abc_Ntk_t * pNtkNew, int * pCounters ); - -static Vec_Ptr_t * Abc_NtkCollectNodesForDsd( Abc_Ntk_t * pNtk ); -static void Abc_NodeDecompDsdAndMux( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes, Dsd_Manager_t * pManDsd, bool fRecursive, int * pCounters ); -static bool Abc_NodeIsForDsd( Abc_Obj_t * pNode ); -static int Abc_NodeFindMuxVar( DdManager * dd, DdNode * bFunc, int nVars ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Derives the DSD network.] - - Description [Takes the strashed network (pNtk), derives global BDDs for - the combinational outputs of this network, and decomposes these BDDs using - disjoint support decomposition. Finally, constructs and return a new - network, which is topologically equivalent to the decomposition tree. - Allocates and frees a new BDD manager and a new DSD manager.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDsdGlobal( Abc_Ntk_t * pNtk, bool fVerbose, bool fPrint, bool fShort ) -{ - DdManager * dd; - Abc_Ntk_t * pNtkNew; - assert( Abc_NtkIsStrash(pNtk) ); - dd = Abc_NtkBuildGlobalBdds( pNtk, 10000000, 1, 1, fVerbose ); - if ( dd == NULL ) - return NULL; - if ( fVerbose ) - printf( "Shared BDD size = %6d nodes.\n", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) ); - // transform the result of mapping into a BDD network - pNtkNew = Abc_NtkDsdInternal( pNtk, fVerbose, fPrint, fShort ); - Extra_StopManager( dd ); - if ( pNtkNew == NULL ) - return NULL; - // copy EXDC network - if ( pNtk->pExdc ) - pNtkNew->pExdc = Abc_NtkDup( pNtk->pExdc ); - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkDsdGlobal: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Constructs the decomposed network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDsdInternal( Abc_Ntk_t * pNtk, bool fVerbose, bool fPrint, bool fShort ) -{ - char ** ppNamesCi, ** ppNamesCo; - Vec_Ptr_t * vFuncsGlob; - Dsd_Manager_t * pManDsd; - Abc_Ntk_t * pNtkNew; - DdManager * dd; - Abc_Obj_t * pObj; - int i; - - // complement the global functions - vFuncsGlob = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pObj, i ) - Vec_PtrPush( vFuncsGlob, Cudd_NotCond(Abc_ObjGlobalBdd(pObj), Abc_ObjFaninC0(pObj)) ); - - // perform the decomposition - dd = Abc_NtkGlobalBddMan(pNtk); - pManDsd = Dsd_ManagerStart( dd, Abc_NtkCiNum(pNtk), fVerbose ); - Dsd_Decompose( pManDsd, (DdNode **)vFuncsGlob->pArray, Abc_NtkCoNum(pNtk) ); - Vec_PtrFree( vFuncsGlob ); - Abc_NtkFreeGlobalBdds( pNtk, 0 ); - if ( pManDsd == NULL ) - { - Cudd_Quit( dd ); - return NULL; - } - - // start the new network - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_BDD ); - // make sure the new manager has enough inputs - Cudd_bddIthVar( pNtkNew->pManFunc, dd->size-1 ); - // put the results into the new network (save new CO drivers in old CO drivers) - Abc_NtkDsdConstruct( pManDsd, pNtk, pNtkNew ); - // finalize the new network - Abc_NtkFinalize( pNtk, pNtkNew ); - // fix the problem with complemented and duplicated CO edges - Abc_NtkLogicMakeSimpleCos( pNtkNew, 0 ); - if ( fPrint ) - { - ppNamesCi = Abc_NtkCollectCioNames( pNtk, 0 ); - ppNamesCo = Abc_NtkCollectCioNames( pNtk, 1 ); - Dsd_TreePrint( stdout, pManDsd, ppNamesCi, ppNamesCo, fShort, -1 ); - free( ppNamesCi ); - free( ppNamesCo ); - } - - // stop the DSD manager - Dsd_ManagerStop( pManDsd ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Constructs the decomposed network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDsdConstruct( Dsd_Manager_t * pManDsd, Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew ) -{ - Dsd_Node_t ** ppNodesDsd; - Dsd_Node_t * pNodeDsd; - Abc_Obj_t * pNode, * pNodeNew, * pDriver; - int i, nNodesDsd; - - // save the CI nodes in the DSD nodes - Dsd_NodeSetMark( Dsd_ManagerReadConst1(pManDsd), (int)Abc_NtkCreateNodeConst1(pNtkNew) ); - Abc_NtkForEachCi( pNtk, pNode, i ) - { - pNodeDsd = Dsd_ManagerReadInput( pManDsd, i ); - Dsd_NodeSetMark( pNodeDsd, (int)pNode->pCopy ); - } - - // collect DSD nodes in DFS order (leaves and const1 are not collected) - ppNodesDsd = Dsd_TreeCollectNodesDfs( pManDsd, &nNodesDsd ); - for ( i = 0; i < nNodesDsd; i++ ) - Abc_NtkDsdConstructNode( pManDsd, ppNodesDsd[i], pNtkNew, NULL ); - free( ppNodesDsd ); - - // set the pointers to the CO drivers - Abc_NtkForEachCo( pNtk, pNode, i ) - { - pDriver = Abc_ObjFanin0( pNode ); - if ( !Abc_ObjIsNode(pDriver) ) - continue; - if ( !Abc_AigNodeIsAnd(pDriver) ) - continue; - pNodeDsd = Dsd_ManagerReadRoot( pManDsd, i ); - pNodeNew = (Abc_Obj_t *)Dsd_NodeReadMark( Dsd_Regular(pNodeDsd) ); - assert( !Abc_ObjIsComplement(pNodeNew) ); - pDriver->pCopy = Abc_ObjNotCond( pNodeNew, Dsd_IsComplement(pNodeDsd) ); - } -} - -/**Function************************************************************* - - Synopsis [Performs DSD using the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NtkDsdConstructNode( Dsd_Manager_t * pManDsd, Dsd_Node_t * pNodeDsd, Abc_Ntk_t * pNtkNew, int * pCounters ) -{ - DdManager * ddDsd = Dsd_ManagerReadDd( pManDsd ); - DdManager * ddNew = pNtkNew->pManFunc; - Dsd_Node_t * pFaninDsd; - Abc_Obj_t * pNodeNew, * pFanin; - DdNode * bLocal, * bTemp, * bVar; - Dsd_Type_t Type; - int i, nDecs; - - // create the new node - pNodeNew = Abc_NtkCreateNode( pNtkNew ); - // add the fanins - Type = Dsd_NodeReadType( pNodeDsd ); - nDecs = Dsd_NodeReadDecsNum( pNodeDsd ); - assert( nDecs > 1 ); - for ( i = 0; i < nDecs; i++ ) - { - pFaninDsd = Dsd_NodeReadDec( pNodeDsd, i ); - pFanin = (Abc_Obj_t *)Dsd_NodeReadMark(Dsd_Regular(pFaninDsd)); - Abc_ObjAddFanin( pNodeNew, pFanin ); - assert( Type == DSD_NODE_OR || !Dsd_IsComplement(pFaninDsd) ); - } - - // create the local function depending on the type of the node - ddNew = pNtkNew->pManFunc; - switch ( Type ) - { - case DSD_NODE_CONST1: - { - bLocal = ddNew->one; Cudd_Ref( bLocal ); - break; - } - case DSD_NODE_OR: - { - bLocal = Cudd_Not(ddNew->one); Cudd_Ref( bLocal ); - for ( i = 0; i < nDecs; i++ ) - { - pFaninDsd = Dsd_NodeReadDec( pNodeDsd, i ); - bVar = Cudd_NotCond( ddNew->vars[i], Dsd_IsComplement(pFaninDsd) ); - bLocal = Cudd_bddOr( ddNew, bTemp = bLocal, bVar ); Cudd_Ref( bLocal ); - Cudd_RecursiveDeref( ddNew, bTemp ); - } - break; - } - case DSD_NODE_EXOR: - { - bLocal = Cudd_Not(ddNew->one); Cudd_Ref( bLocal ); - for ( i = 0; i < nDecs; i++ ) - { - bLocal = Cudd_bddXor( ddNew, bTemp = bLocal, ddNew->vars[i] ); Cudd_Ref( bLocal ); - Cudd_RecursiveDeref( ddNew, bTemp ); - } - break; - } - case DSD_NODE_PRIME: - { - if ( pCounters ) - { - if ( nDecs < 10 ) - pCounters[nDecs]++; - else - pCounters[10]++; - } - bLocal = Dsd_TreeGetPrimeFunction( ddDsd, pNodeDsd ); Cudd_Ref( bLocal ); - bLocal = Extra_TransferLevelByLevel( ddDsd, ddNew, bTemp = bLocal ); Cudd_Ref( bLocal ); -/* -if ( nDecs == 3 ) -{ -Extra_bddPrint( ddDsd, bTemp ); -printf( "\n" ); -} -*/ - Cudd_RecursiveDeref( ddDsd, bTemp ); - // bLocal is now in the new BDD manager - break; - } - default: - { - assert( 0 ); - break; - } - } - pNodeNew->pData = bLocal; - Dsd_NodeSetMark( pNodeDsd, (int)pNodeNew ); - return pNodeNew; -} - - - - - - -/**Function************************************************************* - - Synopsis [Recursively decomposes internal nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDsdLocal( Abc_Ntk_t * pNtk, bool fVerbose, bool fRecursive ) -{ - Dsd_Manager_t * pManDsd; - DdManager * dd = pNtk->pManFunc; - Vec_Ptr_t * vNodes; - int i; - int pCounters[11] = {0}; - - assert( Abc_NtkIsBddLogic(pNtk) ); - - // make the network minimum base - Abc_NtkMinimumBase( pNtk ); - - // start the DSD manager - pManDsd = Dsd_ManagerStart( dd, dd->size, 0 ); - - // collect nodes for decomposition - vNodes = Abc_NtkCollectNodesForDsd( pNtk ); - for ( i = 0; i < vNodes->nSize; i++ ) - Abc_NodeDecompDsdAndMux( vNodes->pArray[i], vNodes, pManDsd, fRecursive, pCounters ); - Vec_PtrFree( vNodes ); - - printf( "Number of non-decomposable functions:\n" ); - for ( i = 3; i < 10; i++ ) - printf( "Inputs = %d. Functions = %6d.\n", i, pCounters[i] ); - printf( "Inputs > %d. Functions = %6d.\n", 9, pCounters[10] ); - - // stop the DSD manager - Dsd_ManagerStop( pManDsd ); - - // make sure everything is okay - if ( !Abc_NtkCheck( pNtk ) ) - { - printf( "Abc_NtkDsdRecursive: The network check has failed.\n" ); - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Collects the nodes that may need decomposition.] - - Description [The nodes that do not need decomposition are those - whose BDD has more internal nodes than the support size.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NtkCollectNodesForDsd( Abc_Ntk_t * pNtk ) -{ - Vec_Ptr_t * vNodes; - Abc_Obj_t * pNode; - int i; - vNodes = Vec_PtrAlloc( 100 ); - Abc_NtkForEachNode( pNtk, pNode, i ) - { - if ( Abc_NodeIsForDsd(pNode) ) - Vec_PtrPush( vNodes, pNode ); - } - return vNodes; -} - -/**Function************************************************************* - - Synopsis [Performs decomposition of one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeDecompDsdAndMux( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes, Dsd_Manager_t * pManDsd, bool fRecursive, int * pCounters ) -{ - DdManager * dd = pNode->pNtk->pManFunc; - Abc_Obj_t * pRoot, * pFanin, * pNode1, * pNode2, * pNodeC; - Dsd_Node_t ** ppNodesDsd, * pNodeDsd, * pFaninDsd; - int i, nNodesDsd, iVar, fCompl; - - // try disjoint support decomposition - pNodeDsd = Dsd_DecomposeOne( pManDsd, pNode->pData ); - fCompl = Dsd_IsComplement( pNodeDsd ); - pNodeDsd = Dsd_Regular( pNodeDsd ); - - // determine what decomposition to use - if ( !fRecursive || Dsd_NodeReadDecsNum(pNodeDsd) != Abc_ObjFaninNum(pNode) ) - { // perform DSD - - // set the inputs - Abc_ObjForEachFanin( pNode, pFanin, i ) - { - pFaninDsd = Dsd_ManagerReadInput( pManDsd, i ); - Dsd_NodeSetMark( pFaninDsd, (int)pFanin ); - } - - // construct the intermediate nodes - ppNodesDsd = Dsd_TreeCollectNodesDfsOne( pManDsd, pNodeDsd, &nNodesDsd ); - for ( i = 0; i < nNodesDsd; i++ ) - { - pRoot = Abc_NtkDsdConstructNode( pManDsd, ppNodesDsd[i], pNode->pNtk, pCounters ); - if ( Abc_NodeIsForDsd(pRoot) && fRecursive ) - Vec_PtrPush( vNodes, pRoot ); - } - free( ppNodesDsd ); - - // remove the current fanins - Abc_ObjRemoveFanins( pNode ); - // add fanin to the root - Abc_ObjAddFanin( pNode, pRoot ); - // update the function to be that of buffer - Cudd_RecursiveDeref( dd, pNode->pData ); - pNode->pData = Cudd_NotCond( dd->vars[0], fCompl ); Cudd_Ref( pNode->pData ); - } - else // perform MUX-decomposition - { - // get the cofactoring variable - iVar = Abc_NodeFindMuxVar( dd, pNode->pData, Abc_ObjFaninNum(pNode) ); - pNodeC = Abc_ObjFanin( pNode, iVar ); - - // get the negative cofactor - pNode1 = Abc_NtkCloneObj( pNode ); - pNode1->pData = Cudd_Cofactor( dd, pNode->pData, Cudd_Not(dd->vars[iVar]) ); Cudd_Ref( pNode1->pData ); - Abc_NodeMinimumBase( pNode1 ); - if ( Abc_NodeIsForDsd(pNode1) ) - Vec_PtrPush( vNodes, pNode1 ); - - // get the positive cofactor - pNode2 = Abc_NtkCloneObj( pNode ); - pNode2->pData = Cudd_Cofactor( dd, pNode->pData, dd->vars[iVar] ); Cudd_Ref( pNode2->pData ); - Abc_NodeMinimumBase( pNode2 ); - if ( Abc_NodeIsForDsd(pNode2) ) - Vec_PtrPush( vNodes, pNode2 ); - - // remove the current fanins - Abc_ObjRemoveFanins( pNode ); - // add new fanins - Abc_ObjAddFanin( pNode, pNodeC ); - Abc_ObjAddFanin( pNode, pNode2 ); - Abc_ObjAddFanin( pNode, pNode1 ); - // update the function to be that of MUX - Cudd_RecursiveDeref( dd, pNode->pData ); - pNode->pData = Cudd_bddIte( dd, dd->vars[0], dd->vars[1], dd->vars[2] ); Cudd_Ref( pNode->pData ); - } -} - -/**Function************************************************************* - - Synopsis [Checks if the node should be decomposed by DSD.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -bool Abc_NodeIsForDsd( Abc_Obj_t * pNode ) -{ - DdManager * dd = pNode->pNtk->pManFunc; -// DdNode * bFunc, * bFunc0, * bFunc1; - assert( Abc_ObjIsNode(pNode) ); -// if ( Cudd_DagSize(pNode->pData)-1 > Abc_ObjFaninNum(pNode) ) -// return 1; -// return 0; - -/* - // this does not catch things like a(b+c), which should be decomposed - for ( bFunc = Cudd_Regular(pNode->pData); !cuddIsConstant(bFunc); ) - { - bFunc0 = Cudd_Regular( cuddE(bFunc) ); - bFunc1 = cuddT(bFunc); - if ( bFunc0 == b1 ) - bFunc = bFunc1; - else if ( bFunc1 == b1 || bFunc0 == bFunc1 ) - bFunc = bFunc0; - else - return 1; - } -*/ - if ( Abc_ObjFaninNum(pNode) > 2 ) - return 1; - return 0; -} - -/**Function************************************************************* - - Synopsis [Determines a cofactoring variable.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeFindMuxVar( DdManager * dd, DdNode * bFunc, int nVars ) -{ - DdNode * bVar, * bCof0, * bCof1; - int SuppSumMin = 1000000; - int i, nSSD, nSSQ, iVar; - -// printf( "\n\nCofactors:\n\n" ); - iVar = -1; - for ( i = 0; i < nVars; i++ ) - { - bVar = dd->vars[i]; - - bCof0 = Cudd_Cofactor( dd, bFunc, Cudd_Not(bVar) ); Cudd_Ref( bCof0 ); - bCof1 = Cudd_Cofactor( dd, bFunc, bVar ); Cudd_Ref( bCof1 ); - -// nodD = Cudd_DagSize(bCof0); -// nodQ = Cudd_DagSize(bCof1); -// printf( "+%02d: D=%2d. Q=%2d. ", i, nodD, nodQ ); -// printf( "S=%2d. D=%2d. ", nodD + nodQ, abs(nodD-nodQ) ); - - nSSD = Cudd_SupportSize( dd, bCof0 ); - nSSQ = Cudd_SupportSize( dd, bCof1 ); - -// printf( "SD=%2d. SQ=%2d. ", nSSD, nSSQ ); -// printf( "S=%2d. D=%2d. ", nSSD + nSSQ, abs(nSSD - nSSQ) ); -// printf( "Cost=%3d. ", Cost(nodD,nodQ,nSSD,nSSQ) ); -// printf( "\n" ); - - Cudd_RecursiveDeref( dd, bCof0 ); - Cudd_RecursiveDeref( dd, bCof1 ); - - if ( SuppSumMin > nSSD + nSSQ ) - { - SuppSumMin = nSSD + nSSQ; - iVar = i; - } - } - return iVar; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcEspresso.c b/src/base/abci/abcEspresso.c deleted file mode 100644 index 8f9c7277..00000000 --- a/src/base/abci/abcEspresso.c +++ /dev/null @@ -1,250 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcEspresso.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Procedures to minimize SOPs using Espresso.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcEspresso.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "espresso.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Abc_NodeEspresso( Abc_Obj_t * pNode ); -static pset_family Abc_SopToEspresso( char * pSop ); -static char * Abc_SopFromEspresso( Extra_MmFlex_t * pMan, pset_family Cover ); -static pset_family Abc_EspressoMinimize( pset_family pOnset, pset_family pDcset ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Minimizes SOP representations using Espresso.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkEspresso( Abc_Ntk_t * pNtk, int fVerbose ) -{ - Abc_Obj_t * pNode; - int i; - assert( Abc_NtkIsLogic(pNtk) ); - // convert the network to have SOPs - if ( Abc_NtkHasMapping(pNtk) ) - Abc_NtkMapToSop(pNtk); - else if ( Abc_NtkHasBdd(pNtk) ) - { - if ( !Abc_NtkBddToSop(pNtk, 0) ) - { - printf( "Abc_NtkEspresso(): Converting to SOPs has failed.\n" ); - return; - } - } - // minimize SOPs of all nodes - Abc_NtkForEachNode( pNtk, pNode, i ) - if ( i ) Abc_NodeEspresso( pNode ); -} - -/**Function************************************************************* - - Synopsis [Minimizes SOP representation of one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeEspresso( Abc_Obj_t * pNode ) -{ - extern void define_cube_size( int n ); - pset_family Cover; - int fCompl; - - assert( Abc_ObjIsNode(pNode) ); - // define the cube for this node - define_cube_size( Abc_ObjFaninNum(pNode) ); - // create the Espresso cover - fCompl = Abc_SopIsComplement( pNode->pData ); - Cover = Abc_SopToEspresso( pNode->pData ); - // perform minimization - Cover = Abc_EspressoMinimize( Cover, NULL ); // deletes also cover - // convert back onto the node's SOP representation - pNode->pData = Abc_SopFromEspresso( pNode->pNtk->pManFunc, Cover ); - if ( fCompl ) Abc_SopComplement( pNode->pData ); - sf_free(Cover); -} - -/**Function************************************************************* - - Synopsis [Converts SOP in ABC into SOP representation in Espresso.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -pset_family Abc_SopToEspresso( char * pSop ) -{ - char * pCube; - pset_family Cover; - pset set; - int nCubes, nVars, Value, v; - - if ( pSop == NULL ) - return NULL; - - nVars = Abc_SopGetVarNum(pSop); - nCubes = Abc_SopGetCubeNum(pSop); - assert( cube.size == 2 * nVars ); - - if ( Abc_SopIsConst0(pSop) ) - { - Cover = sf_new(0, cube.size); - return Cover; - } - if ( Abc_SopIsConst1(pSop) ) - { - Cover = sf_new(1, cube.size); - set = GETSET(Cover, Cover->count++); - set_copy( set, cube.fullset ); - return Cover; - } - - // create the cover - Cover = sf_new(nCubes, cube.size); - // fill in the cubes - Abc_SopForEachCube( pSop, nVars, pCube ) - { - set = GETSET(Cover, Cover->count++); - set_copy( set, cube.fullset ); - Abc_CubeForEachVar( pCube, Value, v ) - { - if ( Value == '0' ) - set_remove(set, 2*v+1); - else if ( Value == '1' ) - set_remove(set, 2*v); - } - } - return Cover; -} - -/**Function************************************************************* - - Synopsis [Converts SOP representation in Espresso into SOP in ABC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -char * Abc_SopFromEspresso( Extra_MmFlex_t * pMan, pset_family Cover ) -{ - pset set; - char * pSop, * pCube; - int Lit, nVars, nCubes, i, k; - - nVars = Cover->sf_size/2; - nCubes = Cover->count; - - pSop = Abc_SopStart( pMan, nCubes, nVars ); - - // go through the cubes - i = 0; - Abc_SopForEachCube( pSop, nVars, pCube ) - { - set = GETSET(Cover, i++); - for ( k = 0; k < nVars; k++ ) - { - Lit = GETINPUT(set, k); - if ( Lit == ZERO ) - pCube[k] = '0'; - else if ( Lit == ONE ) - pCube[k] = '1'; - } - } - return pSop; -} - - -/**Function************************************************************* - - Synopsis [Minimizes the cover using Espresso.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -pset_family Abc_EspressoMinimize( pset_family pOnset, pset_family pDcset ) -{ - pset_family pOffset; - int fNewDcset, i; - int fSimple = 0; - int fSparse = 0; - - if ( fSimple ) - { - for ( i = 0; i < cube.num_vars; i++ ) - pOnset = d1merge( pOnset, i ); - pOnset = sf_contain( pOnset ); - return pOnset; - } - - // create the dcset - fNewDcset = (pDcset == NULL); - if ( pDcset == NULL ) - pDcset = sf_new( 1, cube.size ); - pDcset->wsize = pOnset->wsize; - pDcset->sf_size = pOnset->sf_size; - - // derive the offset - if ( pDcset->sf_size == 0 || pDcset->count == 0 ) - pOffset = complement(cube1list(pOnset)); - else - pOffset = complement(cube2list(pOnset, pDcset)); - - // perform minimization - skip_make_sparse = !fSparse; - pOnset = espresso( pOnset, pDcset, pOffset ); - - // free covers - sf_free( pOffset ); - if ( fNewDcset ) - sf_free( pDcset ); - return pOnset; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcExtract.c b/src/base/abci/abcExtract.c deleted file mode 100644 index 52ea03a3..00000000 --- a/src/base/abci/abcExtract.c +++ /dev/null @@ -1,51 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcMvCost.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Calculating the cost of one MV block.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcMvCost.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_MvCostTest( Abc_Ntk_t * pNtk ) -{ - -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcFpga.c b/src/base/abci/abcFpga.c deleted file mode 100644 index 3bc9fbed..00000000 --- a/src/base/abci/abcFpga.c +++ /dev/null @@ -1,278 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcFpga.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Interface with the FPGA mapping package.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcFpga.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "fpgaInt.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static Fpga_Man_t * Abc_NtkToFpga( Abc_Ntk_t * pNtk, int fRecovery, float * pSwitching, int fLatchPaths, int fVerbose ); -static Abc_Ntk_t * Abc_NtkFromFpga( Fpga_Man_t * pMan, Abc_Ntk_t * pNtk ); -static Abc_Obj_t * Abc_NodeFromFpga_rec( Abc_Ntk_t * pNtkNew, Fpga_Node_t * pNodeFpga ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Interface with the FPGA mapping package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFpga( Abc_Ntk_t * pNtk, float DelayTarget, int fRecovery, int fSwitching, int fLatchPaths, int fVerbose ) -{ - int fShowSwitching = 1; - Abc_Ntk_t * pNtkNew; - Fpga_Man_t * pMan; - Vec_Int_t * vSwitching; - float * pSwitching = NULL; - - assert( Abc_NtkIsStrash(pNtk) ); - - // print a warning about choice nodes - if ( Abc_NtkGetChoiceNum( pNtk ) ) - printf( "Performing FPGA mapping with choices.\n" ); - - // compute switching activity - fShowSwitching |= fSwitching; - if ( fShowSwitching ) - { - extern Vec_Int_t * Sim_NtkComputeSwitching( Abc_Ntk_t * pNtk, int nPatterns ); - vSwitching = Sim_NtkComputeSwitching( pNtk, 4096 ); - pSwitching = (float *)vSwitching->pArray; - } - - // perform FPGA mapping - pMan = Abc_NtkToFpga( pNtk, fRecovery, pSwitching, fLatchPaths, fVerbose ); - if ( pSwitching ) Vec_IntFree( vSwitching ); - if ( pMan == NULL ) - return NULL; - Fpga_ManSetSwitching( pMan, fSwitching ); - Fpga_ManSetLatchPaths( pMan, fLatchPaths ); - Fpga_ManSetLatchNum( pMan, Abc_NtkLatchNum(pNtk) ); - Fpga_ManSetDelayTarget( pMan, DelayTarget ); - if ( !Fpga_Mapping( pMan ) ) - { - Fpga_ManFree( pMan ); - return NULL; - } - - // transform the result of mapping into a BDD network - pNtkNew = Abc_NtkFromFpga( pMan, pNtk ); - if ( pNtkNew == NULL ) - return NULL; - Fpga_ManFree( pMan ); - - // make the network minimum base - Abc_NtkMinimumBase( pNtkNew ); - - if ( pNtk->pExdc ) - pNtkNew->pExdc = Abc_NtkDup( pNtk->pExdc ); - - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkFpga: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Load the network into FPGA manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Fpga_Man_t * Abc_NtkToFpga( Abc_Ntk_t * pNtk, int fRecovery, float * pSwitching, int fLatchPaths, int fVerbose ) -{ - Fpga_Man_t * pMan; - ProgressBar * pProgress; - Fpga_Node_t * pNodeFpga; - Vec_Ptr_t * vNodes; - Abc_Obj_t * pNode, * pFanin, * pPrev; - float * pfArrivals; - int i; - - assert( Abc_NtkIsStrash(pNtk) ); - - // start the mapping manager and set its parameters - pMan = Fpga_ManCreate( Abc_NtkCiNum(pNtk), Abc_NtkCoNum(pNtk), fVerbose ); - if ( pMan == NULL ) - return NULL; - Fpga_ManSetAreaRecovery( pMan, fRecovery ); - Fpga_ManSetOutputNames( pMan, Abc_NtkCollectCioNames(pNtk, 1) ); - pfArrivals = Abc_NtkGetCiArrivalFloats(pNtk); - if ( fLatchPaths ) - { - for ( i = 0; i < Abc_NtkPiNum(pNtk); i++ ) - pfArrivals[i] = -FPGA_FLOAT_LARGE; - } - Fpga_ManSetInputArrivals( pMan, pfArrivals ); - - // create PIs and remember them in the old nodes - Abc_NtkCleanCopy( pNtk ); - Abc_AigConst1(pNtk)->pCopy = (Abc_Obj_t *)Fpga_ManReadConst1(pMan); - Abc_NtkForEachCi( pNtk, pNode, i ) - { - pNodeFpga = Fpga_ManReadInputs(pMan)[i]; - pNode->pCopy = (Abc_Obj_t *)pNodeFpga; - if ( pSwitching ) - Fpga_NodeSetSwitching( pNodeFpga, pSwitching[pNode->Id] ); - } - - // load the AIG into the mapper - vNodes = Abc_AigDfs( pNtk, 0, 0 ); - pProgress = Extra_ProgressBarStart( stdout, vNodes->nSize ); - Vec_PtrForEachEntry( vNodes, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - // add the node to the mapper - pNodeFpga = Fpga_NodeAnd( pMan, - Fpga_NotCond( Abc_ObjFanin0(pNode)->pCopy, Abc_ObjFaninC0(pNode) ), - Fpga_NotCond( Abc_ObjFanin1(pNode)->pCopy, Abc_ObjFaninC1(pNode) ) ); - assert( pNode->pCopy == NULL ); - // remember the node - pNode->pCopy = (Abc_Obj_t *)pNodeFpga; - if ( pSwitching ) - Fpga_NodeSetSwitching( pNodeFpga, pSwitching[pNode->Id] ); - // set up the choice node - if ( Abc_AigNodeIsChoice( pNode ) ) - for ( pPrev = pNode, pFanin = pNode->pData; pFanin; pPrev = pFanin, pFanin = pFanin->pData ) - { - Fpga_NodeSetNextE( (Fpga_Node_t *)pPrev->pCopy, (Fpga_Node_t *)pFanin->pCopy ); - Fpga_NodeSetRepr( (Fpga_Node_t *)pFanin->pCopy, (Fpga_Node_t *)pNode->pCopy ); - } - } - Extra_ProgressBarStop( pProgress ); - Vec_PtrFree( vNodes ); - - // set the primary outputs without copying the phase - Abc_NtkForEachCo( pNtk, pNode, i ) - Fpga_ManReadOutputs(pMan)[i] = (Fpga_Node_t *)Abc_ObjFanin0(pNode)->pCopy; - return pMan; -} - -/**Function************************************************************* - - Synopsis [Creates the mapped network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromFpga( Fpga_Man_t * pMan, Abc_Ntk_t * pNtk ) -{ - ProgressBar * pProgress; - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pNode, * pNodeNew; - int i, nDupGates; - // create the new network - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_BDD ); - // make the mapper point to the new network - Fpga_CutsCleanSign( pMan ); - Fpga_ManCleanData0( pMan ); - Abc_NtkForEachCi( pNtk, pNode, i ) - Fpga_NodeSetData0( Fpga_ManReadInputs(pMan)[i], (char *)pNode->pCopy ); - // set the constant node -// if ( Fpga_NodeReadRefs(Fpga_ManReadConst1(pMan)) > 0 ) - Fpga_NodeSetData0( Fpga_ManReadConst1(pMan), (char *)Abc_NtkCreateNodeConst1(pNtkNew) ); - // process the nodes in topological order - pProgress = Extra_ProgressBarStart( stdout, Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - pNodeNew = Abc_NodeFromFpga_rec( pNtkNew, Fpga_ManReadOutputs(pMan)[i] ); - assert( !Abc_ObjIsComplement(pNodeNew) ); - Abc_ObjFanin0(pNode)->pCopy = pNodeNew; - } - Extra_ProgressBarStop( pProgress ); - // finalize the new network - Abc_NtkFinalize( pNtk, pNtkNew ); - // remove the constant node if not used - pNodeNew = (Abc_Obj_t *)Fpga_NodeReadData0(Fpga_ManReadConst1(pMan)); - if ( Abc_ObjFanoutNum(pNodeNew) == 0 ) - Abc_NtkDeleteObj( pNodeNew ); - // decouple the PO driver nodes to reduce the number of levels - nDupGates = Abc_NtkLogicMakeSimpleCos( pNtkNew, 1 ); -// if ( nDupGates && Fpga_ManReadVerbose(pMan) ) -// printf( "Duplicated %d gates to decouple the CO drivers.\n", nDupGates ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Derive one node after FPGA mapping.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeFromFpga_rec( Abc_Ntk_t * pNtkNew, Fpga_Node_t * pNodeFpga ) -{ - Fpga_Cut_t * pCutBest; - Fpga_Node_t ** ppLeaves; - Abc_Obj_t * pNodeNew; - int i, nLeaves; - assert( !Fpga_IsComplement(pNodeFpga) ); - // return if the result if known - pNodeNew = (Abc_Obj_t *)Fpga_NodeReadData0( pNodeFpga ); - if ( pNodeNew ) - return pNodeNew; - assert( Fpga_NodeIsAnd(pNodeFpga) ); - // get the parameters of the best cut - pCutBest = Fpga_NodeReadCutBest( pNodeFpga ); - ppLeaves = Fpga_CutReadLeaves( pCutBest ); - nLeaves = Fpga_CutReadLeavesNum( pCutBest ); - // create a new node - pNodeNew = Abc_NtkCreateNode( pNtkNew ); - for ( i = 0; i < nLeaves; i++ ) - Abc_ObjAddFanin( pNodeNew, Abc_NodeFromFpga_rec(pNtkNew, ppLeaves[i]) ); - // derive the function of this node - pNodeNew->pData = Fpga_TruthsCutBdd( pNtkNew->pManFunc, pCutBest ); Cudd_Ref( pNodeNew->pData ); - Fpga_NodeSetData0( pNodeFpga, (char *)pNodeNew ); - return pNodeNew; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcFpgaFast.c b/src/base/abci/abcFpgaFast.c deleted file mode 100644 index 356b855e..00000000 --- a/src/base/abci/abcFpgaFast.c +++ /dev/null @@ -1,190 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcFpgaFast.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Fast FPGA mapper.] - - Author [Sungmin Cho] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcFpgaFast.c,v 1.00 2006/09/02 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "ivy.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -extern Ivy_Man_t * Abc_NtkIvyBefore( Abc_Ntk_t * pNtk, int fSeq, int fUseDc ); - -static Abc_Ntk_t * Ivy_ManFpgaToAbc( Abc_Ntk_t * pNtk, Ivy_Man_t * pMan ); -static Abc_Obj_t * Ivy_ManToAbcFast_rec( Abc_Ntk_t * pNtkNew, Ivy_Man_t * pMan, Ivy_Obj_t * pObjIvy, Vec_Int_t * vNodes ); - -static inline void Abc_ObjSetIvy2Abc( Ivy_Man_t * p, int IvyId, Abc_Obj_t * pObjAbc ) { assert(Vec_PtrEntry(p->pCopy, IvyId) == NULL); assert(!Abc_ObjIsComplement(pObjAbc)); Vec_PtrWriteEntry( p->pCopy, IvyId, pObjAbc ); } -static inline Abc_Obj_t * Abc_ObjGetIvy2Abc( Ivy_Man_t * p, int IvyId ) { return Vec_PtrEntry( p->pCopy, IvyId ); } - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Performs fast FPGA mapping of the network.] - - Description [Takes the AIG to be mapped, the LUT size, and verbosity - flag. Produces the new network by fast FPGA mapping of the current - network. If the current network in ABC in not an AIG, the user should - run command "strash" to make sure that the current network into an AIG - before calling this procedure.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFpgaFast( Abc_Ntk_t * pNtk, int nLutSize, int fRecovery, int fVerbose ) -{ - Ivy_Man_t * pMan; - Abc_Ntk_t * pNtkNew; - // make sure the network is an AIG - assert( Abc_NtkIsStrash(pNtk) ); - // convert the network into the AIG - pMan = Abc_NtkIvyBefore( pNtk, 0, 0 ); - // perform fast FPGA mapping - Ivy_FastMapPerform( pMan, nLutSize, fRecovery, fVerbose ); - // convert back into the ABC network - pNtkNew = Ivy_ManFpgaToAbc( pNtk, pMan ); - Ivy_FastMapStop( pMan ); - Ivy_ManStop( pMan ); - // make sure that the final network passes the test - if ( pNtkNew != NULL && !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkFastMap: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Constructs the ABC network after mapping.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Ivy_ManFpgaToAbc( Abc_Ntk_t * pNtk, Ivy_Man_t * pMan ) -{ - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pObjAbc, * pObj; - Ivy_Obj_t * pObjIvy; - Vec_Int_t * vNodes; - int i; - // start mapping from Ivy into Abc - pMan->pCopy = Vec_PtrStart( Ivy_ManObjIdMax(pMan) + 1 ); - // start the new ABC network - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_AIG ); - // transfer the pointers to the basic nodes - Abc_ObjSetIvy2Abc( pMan, Ivy_ManConst1(pMan)->Id, Abc_NtkCreateNodeConst1(pNtkNew) ); - Abc_NtkForEachCi( pNtkNew, pObjAbc, i ) - Abc_ObjSetIvy2Abc( pMan, Ivy_ManPi(pMan, i)->Id, pObjAbc ); - // recursively construct the network - vNodes = Vec_IntAlloc( 100 ); - Ivy_ManForEachPo( pMan, pObjIvy, i ) - { - // get the new ABC node corresponding to the old fanin of the PO in IVY - pObjAbc = Ivy_ManToAbcFast_rec( pNtkNew, pMan, Ivy_ObjFanin0(pObjIvy), vNodes ); - // consider the case of complemented fanin of the PO - if ( Ivy_ObjFaninC0(pObjIvy) ) // complement - { - if ( Abc_ObjIsCi(pObjAbc) ) - pObjAbc = Abc_NtkCreateNodeInv( pNtkNew, pObjAbc ); - else - { - // clone the node - pObj = Abc_NtkCloneObj( pObjAbc ); - // set complemented functions - pObj->pData = Hop_Not( pObjAbc->pData ); - // return the new node - pObjAbc = pObj; - } - } - Abc_ObjAddFanin( Abc_NtkCo(pNtkNew, i), pObjAbc ); - } - Vec_IntFree( vNodes ); - Vec_PtrFree( pMan->pCopy ); - pMan->pCopy = NULL; - // remove dangling nodes - Abc_NtkCleanup( pNtkNew, 0 ); - // fix CIs feeding directly into COs - Abc_NtkLogicMakeSimpleCos( pNtkNew, 0 ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Recursively construct the new node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Ivy_ManToAbcFast_rec( Abc_Ntk_t * pNtkNew, Ivy_Man_t * pMan, Ivy_Obj_t * pObjIvy, Vec_Int_t * vNodes ) -{ - Vec_Int_t Supp, * vSupp = &Supp; - Abc_Obj_t * pObjAbc, * pFaninAbc; - Ivy_Obj_t * pNodeIvy; - int i, Entry; - // skip the node if it is a constant or already processed - pObjAbc = Abc_ObjGetIvy2Abc( pMan, pObjIvy->Id ); - if ( pObjAbc ) - return pObjAbc; - assert( Ivy_ObjIsAnd(pObjIvy) || Ivy_ObjIsExor(pObjIvy) ); - // get the support of K-LUT - Ivy_FastMapReadSupp( pMan, pObjIvy, vSupp ); - // create new ABC node and its fanins - pObjAbc = Abc_NtkCreateNode( pNtkNew ); - Vec_IntForEachEntry( vSupp, Entry, i ) - { - pFaninAbc = Ivy_ManToAbcFast_rec( pNtkNew, pMan, Ivy_ManObj(pMan, Entry), vNodes ); - Abc_ObjAddFanin( pObjAbc, pFaninAbc ); - } - // collect the nodes used in the cut - Ivy_ManCollectCut( pMan, pObjIvy, vSupp, vNodes ); - // create the local function - Ivy_ManForEachNodeVec( pMan, vNodes, pNodeIvy, i ) - { - if ( i < Vec_IntSize(vSupp) ) - pNodeIvy->pEquiv = (Ivy_Obj_t *)Hop_IthVar( pNtkNew->pManFunc, i ); - else - pNodeIvy->pEquiv = (Ivy_Obj_t *)Hop_And( pNtkNew->pManFunc, (Hop_Obj_t *)Ivy_ObjChild0Equiv(pNodeIvy), (Hop_Obj_t *)Ivy_ObjChild1Equiv(pNodeIvy) ); - } - // set the local function - pObjAbc->pData = (Abc_Obj_t *)pObjIvy->pEquiv; - // set the node - Abc_ObjSetIvy2Abc( pMan, pObjIvy->Id, pObjAbc ); - return pObjAbc; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcFraig.c b/src/base/abci/abcFraig.c deleted file mode 100644 index be8a25f1..00000000 --- a/src/base/abci/abcFraig.c +++ /dev/null @@ -1,803 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcFraig.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Procedures interfacing with the FRAIG package.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcFraig.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "fraig.h" -#include "main.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -extern Abc_Ntk_t * Abc_NtkFromFraig( Fraig_Man_t * pMan, Abc_Ntk_t * pNtk ); -static Abc_Ntk_t * Abc_NtkFromFraig2( Fraig_Man_t * pMan, Abc_Ntk_t * pNtk ); -static Abc_Obj_t * Abc_NodeFromFraig_rec( Abc_Ntk_t * pNtkNew, Fraig_Node_t * pNodeFraig ); -static void Abc_NtkFromFraig2_rec( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNode, Vec_Ptr_t * vNodeReprs ); -extern Fraig_Node_t * Abc_NtkToFraigExdc( Fraig_Man_t * pMan, Abc_Ntk_t * pNtkMain, Abc_Ntk_t * pNtkExdc ); -static void Abc_NtkFraigRemapUsingExdc( Fraig_Man_t * pMan, Abc_Ntk_t * pNtk ); - -static int Abc_NtkFraigTrustCheck( Abc_Ntk_t * pNtk ); -static void Abc_NtkFraigTrustOne( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew ); -static Abc_Obj_t * Abc_NodeFraigTrust( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNode ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Interfaces the network with the FRAIG package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFraig( Abc_Ntk_t * pNtk, void * pParams, int fAllNodes, int fExdc ) -{ - Fraig_Params_t * pPars = pParams; - Abc_Ntk_t * pNtkNew; - Fraig_Man_t * pMan; - // check if EXDC is present - if ( fExdc && pNtk->pExdc == NULL ) - fExdc = 0, printf( "Warning: Networks has no EXDC.\n" ); - // perform fraiging - pMan = Abc_NtkToFraig( pNtk, pParams, fAllNodes, fExdc ); - // add algebraic choices -// if ( pPars->fChoicing ) -// Fraig_ManAddChoices( pMan, 0, 6 ); - // prove the miter if asked to - if ( pPars->fTryProve ) - Fraig_ManProveMiter( pMan ); - // reconstruct FRAIG in the new network - if ( fExdc ) - pNtkNew = Abc_NtkFromFraig2( pMan, pNtk ); - else - pNtkNew = Abc_NtkFromFraig( pMan, pNtk ); - Fraig_ManFree( pMan ); - if ( pNtk->pExdc ) - pNtkNew->pExdc = Abc_NtkDup( pNtk->pExdc ); - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkFraig: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Transforms the strashed network into FRAIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void * Abc_NtkToFraig( Abc_Ntk_t * pNtk, void * pParams, int fAllNodes, int fExdc ) -{ - int fInternal = ((Fraig_Params_t *)pParams)->fInternal; - Fraig_Man_t * pMan; - ProgressBar * pProgress; - Vec_Ptr_t * vNodes; - Abc_Obj_t * pNode; - int i; - - assert( Abc_NtkIsStrash(pNtk) ); - - // create the FRAIG manager - pMan = Fraig_ManCreate( pParams ); - - // map the constant node - Abc_NtkCleanCopy( pNtk ); - Abc_AigConst1(pNtk)->pCopy = (Abc_Obj_t *)Fraig_ManReadConst1(pMan); - // create PIs and remember them in the old nodes - Abc_NtkForEachCi( pNtk, pNode, i ) - pNode->pCopy = (Abc_Obj_t *)Fraig_ManReadIthVar(pMan, i); - - // perform strashing - vNodes = Abc_AigDfs( pNtk, fAllNodes, 0 ); - if ( !fInternal ) - pProgress = Extra_ProgressBarStart( stdout, vNodes->nSize ); - Vec_PtrForEachEntry( vNodes, pNode, i ) - { - if ( Abc_ObjFaninNum(pNode) == 0 ) - continue; - if ( !fInternal ) - Extra_ProgressBarUpdate( pProgress, i, NULL ); - pNode->pCopy = (Abc_Obj_t *)Fraig_NodeAnd( pMan, - Fraig_NotCond( Abc_ObjFanin0(pNode)->pCopy, Abc_ObjFaninC0(pNode) ), - Fraig_NotCond( Abc_ObjFanin1(pNode)->pCopy, Abc_ObjFaninC1(pNode) ) ); - } - if ( !fInternal ) - Extra_ProgressBarStop( pProgress ); - Vec_PtrFree( vNodes ); - - // use EXDC to change the mapping of nodes into FRAIG nodes - if ( fExdc ) - Abc_NtkFraigRemapUsingExdc( pMan, pNtk ); - - // set the primary outputs - Abc_NtkForEachCo( pNtk, pNode, i ) - Fraig_ManSetPo( pMan, (Fraig_Node_t *)Abc_ObjNotCond( Abc_ObjFanin0(pNode)->pCopy, Abc_ObjFaninC0(pNode) ) ); - return pMan; -} - -/**Function************************************************************* - - Synopsis [Derives EXDC node for the given network.] - - Description [Assumes that EXDCs of all POs are the same. - Returns the EXDC of the first PO.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Fraig_Node_t * Abc_NtkToFraigExdc( Fraig_Man_t * pMan, Abc_Ntk_t * pNtkMain, Abc_Ntk_t * pNtkExdc ) -{ - Abc_Ntk_t * pNtkStrash; - Abc_Obj_t * pObj; - Fraig_Node_t * gResult; - char ** ppNames; - int i, k; - // strash the EXDC network - pNtkStrash = Abc_NtkStrash( pNtkExdc, 0, 0, 0 ); - Abc_NtkCleanCopy( pNtkStrash ); - Abc_AigConst1(pNtkStrash)->pCopy = (Abc_Obj_t *)Fraig_ManReadConst1(pMan); - // set the mapping of the PI nodes - ppNames = Abc_NtkCollectCioNames( pNtkMain, 0 ); - Abc_NtkForEachCi( pNtkStrash, pObj, i ) - { - for ( k = 0; k < Abc_NtkCiNum(pNtkMain); k++ ) - if ( strcmp( Abc_ObjName(pObj), ppNames[k] ) == 0 ) - { - pObj->pCopy = (Abc_Obj_t *)Fraig_ManReadIthVar(pMan, k); - break; - } - assert( pObj->pCopy != NULL ); - } - free( ppNames ); - // build FRAIG for each node - Abc_AigForEachAnd( pNtkStrash, pObj, i ) - pObj->pCopy = (Abc_Obj_t *)Fraig_NodeAnd( pMan, - Fraig_NotCond( Abc_ObjFanin0(pObj)->pCopy, Abc_ObjFaninC0(pObj) ), - Fraig_NotCond( Abc_ObjFanin1(pObj)->pCopy, Abc_ObjFaninC1(pObj) ) ); - // get the EXDC to be returned - pObj = Abc_NtkPo( pNtkStrash, 0 ); - gResult = Fraig_NotCond( Abc_ObjFanin0(pObj)->pCopy, Abc_ObjFaninC0(pObj) ); - Abc_NtkDelete( pNtkStrash ); - return gResult; -} - - -/**Function************************************************************* - - Synopsis [Changes mapping of the old nodes into FRAIG nodes using EXDC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFraigRemapUsingExdc( Fraig_Man_t * pMan, Abc_Ntk_t * pNtk ) -{ - Fraig_Node_t * gNodeNew, * gNodeExdc; - stmm_table * tTable; - stmm_generator * gen; - Abc_Obj_t * pNode, * pNodeBest; - Abc_Obj_t * pClass, ** ppSlot; - Vec_Ptr_t * vNexts; - int i; - - // get the global don't-cares - assert( pNtk->pExdc ); - gNodeExdc = Abc_NtkToFraigExdc( pMan, pNtk, pNtk->pExdc ); - - // save the next pointers - vNexts = Vec_PtrStart( Abc_NtkObjNumMax(pNtk) ); - Abc_NtkForEachNode( pNtk, pNode, i ) - Vec_PtrWriteEntry( vNexts, pNode->Id, pNode->pNext ); - - // find the classes of AIG nodes which have FRAIG nodes assigned - Abc_NtkCleanNext( pNtk ); - tTable = stmm_init_table(stmm_ptrcmp,stmm_ptrhash); - Abc_NtkForEachNode( pNtk, pNode, i ) - if ( pNode->pCopy ) - { - gNodeNew = Fraig_NodeAnd( pMan, (Fraig_Node_t *)pNode->pCopy, Fraig_Not(gNodeExdc) ); - if ( !stmm_find_or_add( tTable, (char *)Fraig_Regular(gNodeNew), (char ***)&ppSlot ) ) - *ppSlot = NULL; - pNode->pNext = *ppSlot; - *ppSlot = pNode; - } - - // for reach non-trival class, find the node with minimum level, and replace other nodes by it - Abc_AigSetNodePhases( pNtk ); - stmm_foreach_item( tTable, gen, (char **)&gNodeNew, (char **)&pClass ) - { - if ( pClass->pNext == NULL ) - continue; - // find the node with minimum level - pNodeBest = pClass; - for ( pNode = pClass->pNext; pNode; pNode = pNode->pNext ) - if ( pNodeBest->Level > pNode->Level ) - pNodeBest = pNode; - // remap the class nodes - for ( pNode = pClass; pNode; pNode = pNode->pNext ) - pNode->pCopy = Abc_ObjNotCond( pNodeBest->pCopy, pNode->fPhase ^ pNodeBest->fPhase ); - } - stmm_free_table( tTable ); - - // restore the next pointers - Abc_NtkCleanNext( pNtk ); - Abc_NtkForEachNode( pNtk, pNode, i ) - pNode->pNext = Vec_PtrEntry( vNexts, pNode->Id ); - Vec_PtrFree( vNexts ); -} - -/**Function************************************************************* - - Synopsis [Transforms FRAIG into strashed network with choices.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromFraig( Fraig_Man_t * pMan, Abc_Ntk_t * pNtk ) -{ - ProgressBar * pProgress; - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pNode, * pNodeNew; - int i; - // create the new network - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_STRASH, ABC_FUNC_AIG ); - // make the mapper point to the new network - Abc_NtkForEachCi( pNtk, pNode, i ) - Fraig_NodeSetData1( Fraig_ManReadIthVar(pMan, i), (Fraig_Node_t *)pNode->pCopy ); - // set the constant node - Fraig_NodeSetData1( Fraig_ManReadConst1(pMan), (Fraig_Node_t *)Abc_AigConst1(pNtkNew) ); - // process the nodes in topological order - pProgress = Extra_ProgressBarStart( stdout, Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - pNodeNew = Abc_NodeFromFraig_rec( pNtkNew, Fraig_ManReadOutputs(pMan)[i] ); - Abc_ObjAddFanin( pNode->pCopy, pNodeNew ); - } - Extra_ProgressBarStop( pProgress ); - Abc_NtkReassignIds( pNtkNew ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Transforms into AIG one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeFromFraig_rec( Abc_Ntk_t * pNtkNew, Fraig_Node_t * pNodeFraig ) -{ - Abc_Obj_t * pRes, * pRes0, * pRes1, * pResMin, * pResCur; - Fraig_Node_t * pNodeTemp, * pNodeFraigR = Fraig_Regular(pNodeFraig); - void ** ppTail; - // check if the node was already considered - if ( pRes = (Abc_Obj_t *)Fraig_NodeReadData1(pNodeFraigR) ) - return Abc_ObjNotCond( pRes, Fraig_IsComplement(pNodeFraig) ); - // solve the children - pRes0 = Abc_NodeFromFraig_rec( pNtkNew, Fraig_NodeReadOne(pNodeFraigR) ); - pRes1 = Abc_NodeFromFraig_rec( pNtkNew, Fraig_NodeReadTwo(pNodeFraigR) ); - // derive the new node - pRes = Abc_AigAnd( pNtkNew->pManFunc, pRes0, pRes1 ); - pRes->fPhase = Fraig_NodeReadSimInv( pNodeFraigR ); - // if the node has an equivalence class, find its representative - if ( Fraig_NodeReadRepr(pNodeFraigR) == NULL && Fraig_NodeReadNextE(pNodeFraigR) != NULL ) - { - // go through the FRAIG nodes belonging to this equivalence class - // and find the representative node (the node with the smallest level) - pResMin = pRes; - for ( pNodeTemp = Fraig_NodeReadNextE(pNodeFraigR); pNodeTemp; pNodeTemp = Fraig_NodeReadNextE(pNodeTemp) ) - { - assert( Fraig_NodeReadData1(pNodeTemp) == NULL ); - pResCur = Abc_NodeFromFraig_rec( pNtkNew, pNodeTemp ); - if ( pResMin->Level > pResCur->Level ) - pResMin = pResCur; - } - // link the nodes in such a way that representative goes first - ppTail = &pResMin->pData; - if ( pRes != pResMin ) - { - *ppTail = pRes; - ppTail = &pRes->pData; - } - for ( pNodeTemp = Fraig_NodeReadNextE(pNodeFraigR); pNodeTemp; pNodeTemp = Fraig_NodeReadNextE(pNodeTemp) ) - { - pResCur = (Abc_Obj_t *)Fraig_NodeReadData1(pNodeTemp); - assert( pResCur ); - if ( pResMin == pResCur ) - continue; - *ppTail = pResCur; - ppTail = &pResCur->pData; - } - assert( *ppTail == NULL ); - - // update the phase of the node - pRes = Abc_ObjNotCond( pResMin, (pRes->fPhase ^ pResMin->fPhase) ); - } - Fraig_NodeSetData1( pNodeFraigR, (Fraig_Node_t *)pRes ); - return Abc_ObjNotCond( pRes, Fraig_IsComplement(pNodeFraig) ); -} - -/**Function************************************************************* - - Synopsis [Transforms FRAIG into strashed network without choices.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromFraig2( Fraig_Man_t * pMan, Abc_Ntk_t * pNtk ) -{ - ProgressBar * pProgress; - stmm_table * tTable; - Vec_Ptr_t * vNodeReprs; - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pNode, * pRepr, ** ppSlot; - int i; - - // map the nodes into their lowest level representives - tTable = stmm_init_table(stmm_ptrcmp,stmm_ptrhash); - pNode = Abc_AigConst1(pNtk); - if ( !stmm_find_or_add( tTable, (char *)Fraig_Regular(pNode->pCopy), (char ***)&ppSlot ) ) - *ppSlot = pNode; - Abc_NtkForEachCi( pNtk, pNode, i ) - if ( !stmm_find_or_add( tTable, (char *)Fraig_Regular(pNode->pCopy), (char ***)&ppSlot ) ) - *ppSlot = pNode; - Abc_NtkForEachNode( pNtk, pNode, i ) - if ( pNode->pCopy ) - { - if ( !stmm_find_or_add( tTable, (char *)Fraig_Regular(pNode->pCopy), (char ***)&ppSlot ) ) - *ppSlot = pNode; - else if ( (*ppSlot)->Level > pNode->Level ) - *ppSlot = pNode; - } - // save representatives for each node - vNodeReprs = Vec_PtrStart( Abc_NtkObjNumMax(pNtk) ); - Abc_NtkForEachNode( pNtk, pNode, i ) - if ( pNode->pCopy ) - { - if ( !stmm_lookup( tTable, (char *)Fraig_Regular(pNode->pCopy), (char **)&pRepr ) ) - assert( 0 ); - if ( pNode != pRepr ) - Vec_PtrWriteEntry( vNodeReprs, pNode->Id, pRepr ); - } - stmm_free_table( tTable ); - - // create the new network - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_STRASH, ABC_FUNC_AIG ); - - // perform strashing - Abc_AigSetNodePhases( pNtk ); - Abc_NtkIncrementTravId( pNtk ); - pProgress = Extra_ProgressBarStart( stdout, Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - Abc_NtkFromFraig2_rec( pNtkNew, Abc_ObjFanin0(pNode), vNodeReprs ); - } - Extra_ProgressBarStop( pProgress ); - Vec_PtrFree( vNodeReprs ); - - // finalize the network - Abc_NtkFinalize( pNtk, pNtkNew ); - return pNtkNew; -} - - -/**Function************************************************************* - - Synopsis [Transforms into AIG one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFromFraig2_rec( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNode, Vec_Ptr_t * vNodeReprs ) -{ - Abc_Obj_t * pRepr; - // skip the PIs and constants - if ( Abc_ObjFaninNum(pNode) < 2 ) - return; - // if this node is already visited, skip - if ( Abc_NodeIsTravIdCurrent( pNode ) ) - return; - // mark the node as visited - Abc_NodeSetTravIdCurrent( pNode ); - assert( Abc_ObjIsNode( pNode ) ); - // get the node's representative - if ( pRepr = Vec_PtrEntry(vNodeReprs, pNode->Id) ) - { - Abc_NtkFromFraig2_rec( pNtkNew, pRepr, vNodeReprs ); - pNode->pCopy = Abc_ObjNotCond( pRepr->pCopy, pRepr->fPhase ^ pNode->fPhase ); - return; - } - Abc_NtkFromFraig2_rec( pNtkNew, Abc_ObjFanin0(pNode), vNodeReprs ); - Abc_NtkFromFraig2_rec( pNtkNew, Abc_ObjFanin1(pNode), vNodeReprs ); - pNode->pCopy = Abc_AigAnd( pNtkNew->pManFunc, Abc_ObjChild0Copy(pNode), Abc_ObjChild1Copy(pNode) ); -} - - - -/**Function************************************************************* - - Synopsis [Interfaces the network with the FRAIG package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFraigTrust( Abc_Ntk_t * pNtk ) -{ - Abc_Ntk_t * pNtkNew; - - if ( !Abc_NtkIsSopLogic(pNtk) ) - { - printf( "Abc_NtkFraigTrust: Trust mode works for netlists and logic SOP networks.\n" ); - return NULL; - } - - if ( !Abc_NtkFraigTrustCheck(pNtk) ) - { - printf( "Abc_NtkFraigTrust: The network does not look like an AIG with choice nodes.\n" ); - return NULL; - } - - // perform strashing - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_STRASH, ABC_FUNC_AIG ); - Abc_NtkFraigTrustOne( pNtk, pNtkNew ); - Abc_NtkFinalize( pNtk, pNtkNew ); - Abc_NtkReassignIds( pNtkNew ); - - // print a warning about choice nodes - printf( "Warning: The resulting AIG contains %d choice nodes.\n", Abc_NtkGetChoiceNum( pNtkNew ) ); - - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkFraigTrust: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Checks whether the node can be processed in the trust mode.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkFraigTrustCheck( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode; - int i, nFanins; - Abc_NtkForEachNode( pNtk, pNode, i ) - { - nFanins = Abc_ObjFaninNum(pNode); - if ( nFanins < 2 ) - continue; - if ( nFanins == 2 && Abc_SopIsAndType(pNode->pData) ) - continue; - if ( !Abc_SopIsOrType(pNode->pData) ) - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Interfaces the network with the FRAIG package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFraigTrustOne( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew ) -{ - ProgressBar * pProgress; - Vec_Ptr_t * vNodes; - Abc_Obj_t * pNode, * pNodeNew, * pObj; - int i; - - // perform strashing - vNodes = Abc_NtkDfs( pNtk, 0 ); - pProgress = Extra_ProgressBarStart( stdout, vNodes->nSize ); - Vec_PtrForEachEntry( vNodes, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - // get the node - assert( Abc_ObjIsNode(pNode) ); - // strash the node - pNodeNew = Abc_NodeFraigTrust( pNtkNew, pNode ); - // get the old object - if ( Abc_NtkIsNetlist(pNtk) ) - pObj = Abc_ObjFanout0( pNode ); // the fanout net - else - pObj = pNode; // the node itself - // make sure the node is not yet strashed - assert( pObj->pCopy == NULL ); - // mark the old object with the new AIG node - pObj->pCopy = pNodeNew; - } - Vec_PtrFree( vNodes ); - Extra_ProgressBarStop( pProgress ); -} - -/**Function************************************************************* - - Synopsis [Transforms one node into a FRAIG in the trust mode.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeFraigTrust( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNode ) -{ - Abc_Obj_t * pSum, * pFanin; - void ** ppTail; - int i, nFanins, fCompl; - - assert( Abc_ObjIsNode(pNode) ); - // get the number of node's fanins - nFanins = Abc_ObjFaninNum( pNode ); - assert( nFanins == Abc_SopGetVarNum(pNode->pData) ); - // check if it is a constant - if ( nFanins == 0 ) - return Abc_ObjNotCond( Abc_AigConst1(pNtkNew), Abc_SopIsConst0(pNode->pData) ); - if ( nFanins == 1 ) - return Abc_ObjNotCond( Abc_ObjFanin0(pNode)->pCopy, Abc_SopIsInv(pNode->pData) ); - if ( nFanins == 2 && Abc_SopIsAndType(pNode->pData) ) - return Abc_AigAnd( pNtkNew->pManFunc, - Abc_ObjNotCond( Abc_ObjFanin0(pNode)->pCopy, !Abc_SopGetIthCareLit(pNode->pData,0) ), - Abc_ObjNotCond( Abc_ObjFanin1(pNode)->pCopy, !Abc_SopGetIthCareLit(pNode->pData,1) ) ); - assert( Abc_SopIsOrType(pNode->pData) ); - fCompl = Abc_SopGetIthCareLit(pNode->pData,0); - // get the root of the choice node (the first fanin) - pSum = Abc_ObjFanin0(pNode)->pCopy; - // connect other fanins - ppTail = &pSum->pData; - Abc_ObjForEachFanin( pNode, pFanin, i ) - { - if ( i == 0 ) - continue; - *ppTail = pFanin->pCopy; - ppTail = &pFanin->pCopy->pData; - // set the complemented bit of this cut - if ( fCompl ^ Abc_SopGetIthCareLit(pNode->pData, i) ) - pFanin->pCopy->fPhase = 1; - } - assert( *ppTail == NULL ); - return pSum; -} - - - - -/**Function************************************************************* - - Synopsis [Interfaces the network with the FRAIG package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkFraigStore( Abc_Ntk_t * pNtkAdd ) -{ - Vec_Ptr_t * vStore; - Abc_Ntk_t * pNtk; - // create the network to be stored - pNtk = Abc_NtkStrash( pNtkAdd, 0, 0, 0 ); - if ( pNtk == NULL ) - { - printf( "Abc_NtkFraigStore: Initial strashing has failed.\n" ); - return 0; - } - // get the network currently stored - vStore = Abc_FrameReadStore(); - if ( Vec_PtrSize(vStore) > 0 ) - { - // check that the networks have the same PIs - // reorder PIs of pNtk2 according to pNtk1 - if ( !Abc_NtkCompareSignals( pNtk, Vec_PtrEntry(vStore, 0), 1, 1 ) ) - { - printf( "Trying to store the network with different primary inputs.\n" ); - printf( "The previously stored networks are deleted and this one is added.\n" ); - Abc_NtkFraigStoreClean(); - } - } - Vec_PtrPush( vStore, pNtk ); -// printf( "The number of AIG nodes added to storage = %5d.\n", Abc_NtkNodeNum(pNtk) ); - return 1; -} - -/**Function************************************************************* - - Synopsis [Interfaces the network with the FRAIG package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFraigRestore() -{ - extern Abc_Ntk_t * Abc_NtkFraigPartitioned( Vec_Ptr_t * vStore, void * pParams ); - Fraig_Params_t Params; - Vec_Ptr_t * vStore; - Abc_Ntk_t * pNtk, * pFraig; - int nWords1, nWords2, nWordsMin; - int clk = clock(); - - // get the stored network - vStore = Abc_FrameReadStore(); - if ( Vec_PtrSize(vStore) == 0 ) - { - printf( "There are no network currently in storage.\n" ); - return NULL; - } -// printf( "Currently stored %d networks will be fraiged.\n", Vec_PtrSize(vStore) ); - pNtk = Vec_PtrEntry( vStore, 0 ); - - // swap the first and last network - // this should lead to the primary choice being "better" because of synthesis - pNtk = Vec_PtrPop( vStore ); - Vec_PtrPush( vStore, Vec_PtrEntry(vStore,0) ); - Vec_PtrWriteEntry( vStore, 0, pNtk ); - - // to determine the number of simulation patterns - // use the following strategy - // at least 64 words (32 words random and 32 words dynamic) - // no more than 256M for one circuit (128M + 128M) - nWords1 = 32; - nWords2 = (1<<27) / (Abc_NtkNodeNum(pNtk) + Abc_NtkCiNum(pNtk)); - nWordsMin = ABC_MIN( nWords1, nWords2 ); - - // set parameters for fraiging - Fraig_ParamsSetDefault( &Params ); - Params.nPatsRand = nWordsMin * 32; // the number of words of random simulation info - Params.nPatsDyna = nWordsMin * 32; // the number of words of dynamic simulation info - Params.nBTLimit = 1000; // the max number of backtracks to perform - Params.fFuncRed = 1; // performs only one level hashing - Params.fFeedBack = 1; // enables solver feedback - Params.fDist1Pats = 1; // enables distance-1 patterns - Params.fDoSparse = 1; // performs equiv tests for sparse functions - Params.fChoicing = 1; // enables recording structural choices - Params.fTryProve = 0; // tries to solve the final miter - Params.fVerbose = 0; // the verbosiness flag - - // perform partitioned computation of structural choices - pFraig = Abc_NtkFraigPartitioned( vStore, &Params ); - Abc_NtkFraigStoreClean(); -//PRT( "Total choicing time", clock() - clk ); - return pFraig; -} - -/**Function************************************************************* - - Synopsis [Interfaces the network with the FRAIG package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFraigStoreClean() -{ - Vec_Ptr_t * vStore; - Abc_Ntk_t * pNtk; - int i; - vStore = Abc_FrameReadStore(); - Vec_PtrForEachEntry( vStore, pNtk, i ) - Abc_NtkDelete( pNtk ); - Vec_PtrClear( vStore ); -} - -/**Function************************************************************* - - Synopsis [Checks the correctness of stored networks.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFraigStoreCheck( Abc_Ntk_t * pFraig ) -{ - Abc_Obj_t * pNode0, * pNode1; - int nPoOrig, nPoFinal, nStored; - int i, k; - // check that the PO functions are correct - nPoFinal = Abc_NtkPoNum(pFraig); - nStored = Abc_FrameReadStoreSize(); - assert( nPoFinal % nStored == 0 ); - nPoOrig = nPoFinal / nStored; - for ( i = 0; i < nPoOrig; i++ ) - { - pNode0 = Abc_ObjFanin0( Abc_NtkPo(pFraig, i) ); - for ( k = 1; k < nStored; k++ ) - { - pNode1 = Abc_ObjFanin0( Abc_NtkPo(pFraig, k*nPoOrig+i) ); - if ( pNode0 != pNode1 ) - printf( "Verification for PO #%d of network #%d has failed. The PO function is not used.\n", i+1, k+1 ); - } - } -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcFxu.c b/src/base/abci/abcFxu.c deleted file mode 100644 index 45515dd1..00000000 --- a/src/base/abci/abcFxu.c +++ /dev/null @@ -1,260 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcFxu.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Interface with the fast extract package.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcFxu.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "fxu.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static bool Abc_NtkFxuCheck( Abc_Ntk_t * pNtk ); -static void Abc_NtkFxuCollectInfo( Abc_Ntk_t * pNtk, Fxu_Data_t * p ); -static void Abc_NtkFxuReconstruct( Abc_Ntk_t * pNtk, Fxu_Data_t * p ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - - -/**Function************************************************************* - - Synopsis [Performs fast_extract on the current network.] - - Description [Takes the network and the maximum number of nodes to extract. - Uses the concurrent double-cube and single cube divisor extraction procedure. - Modifies the network in the end, after extracting all nodes. Note that - Ntk_NetworkSweep() may increase the performance of this procedure because - the single-literal nodes will not be created in the sparse matrix. Returns 1 - if the network has been changed.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -bool Abc_NtkFastExtract( Abc_Ntk_t * pNtk, Fxu_Data_t * p ) -{ - assert( Abc_NtkIsLogic(pNtk) ); - // if the network is already in the SOP form, it may come from BLIF file - // and it may not be SCC-free, in which case FXU will not work correctly - if ( Abc_NtkIsSopLogic(pNtk) ) - { // to make sure the SOPs are SCC-free -// Abc_NtkSopToBdd(pNtk); -// Abc_NtkBddToSop(pNtk); - } - // get the network in the SOP form - if ( !Abc_NtkToSop(pNtk, 0) ) - { - printf( "Abc_NtkFastExtract(): Converting to SOPs has failed.\n" ); - return 0; - } - // check if the network meets the requirements - if ( !Abc_NtkFxuCheck(pNtk) ) - { - printf( "Abc_NtkFastExtract: Nodes have duplicated or complemented fanins. FXU is not performed.\n" ); - return 0; - } - // sweep removes useless nodes - Abc_NtkCleanup( pNtk, 0 ); - // collect information about the covers - Abc_NtkFxuCollectInfo( pNtk, p ); - // call the fast extract procedure - if ( Fxu_FastExtract(p) > 0 ) - { - // update the network - Abc_NtkFxuReconstruct( pNtk, p ); - // make sure everything is okay - if ( !Abc_NtkCheck( pNtk ) ) - printf( "Abc_NtkFastExtract: The network check has failed.\n" ); - return 1; - } - else - printf( "Warning: The network has not been changed by \"fx\".\n" ); - return 0; -} - - -/**Function************************************************************* - - Synopsis [Makes sure the nodes do not have complemented and duplicated fanins.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -bool Abc_NtkFxuCheck( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode, * pFanin1, * pFanin2; - int n, i, k; - Abc_NtkForEachNode( pNtk, pNode, n ) - { - Abc_ObjForEachFanin( pNode, pFanin1, i ) - { - if ( i < 2 && Abc_ObjFaninC(pNode, i) ) - return 0; - Abc_ObjForEachFanin( pNode, pFanin2, k ) - { - if ( i == k ) - continue; - if ( pFanin1 == pFanin2 ) - return 0; - } - } - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Collect information about the network for fast_extract.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFxuCollectInfo( Abc_Ntk_t * pNtk, Fxu_Data_t * p ) -{ - Abc_Obj_t * pNode; - int i; - // add information to the manager - p->pManSop = pNtk->pManFunc; - p->vSops = Vec_PtrAlloc(0); - p->vFanins = Vec_PtrAlloc(0); - p->vSopsNew = Vec_PtrAlloc(0); - p->vFaninsNew = Vec_PtrAlloc(0); - Vec_PtrFill( p->vSops, Abc_NtkObjNumMax(pNtk), NULL ); - Vec_PtrFill( p->vFanins, Abc_NtkObjNumMax(pNtk), NULL ); - Vec_PtrFill( p->vSopsNew, Abc_NtkObjNumMax(pNtk) + p->nNodesExt, NULL ); - Vec_PtrFill( p->vFaninsNew, Abc_NtkObjNumMax(pNtk) + p->nNodesExt, NULL ); - // add SOPs and fanin array - Abc_NtkForEachNode( pNtk, pNode, i ) - { - if ( Abc_SopGetVarNum(pNode->pData) < 2 ) - continue; - if ( Abc_SopGetCubeNum(pNode->pData) < 1 ) - continue; - p->vSops->pArray[i] = pNode->pData; - p->vFanins->pArray[i] = &pNode->vFanins; - } - p->nNodesOld = Abc_NtkObjNumMax(pNtk); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFxuFreeInfo( Fxu_Data_t * p ) -{ - int i; - // free the arrays of new fanins - if ( p->vFaninsNew ) - for ( i = 0; i < p->vFaninsNew->nSize; i++ ) - if ( p->vFaninsNew->pArray[i] ) - Vec_IntFree( p->vFaninsNew->pArray[i] ); - // free the arrays - if ( p->vSops ) Vec_PtrFree( p->vSops ); - if ( p->vSopsNew ) Vec_PtrFree( p->vSopsNew ); - if ( p->vFanins ) Vec_PtrFree( p->vFanins ); - if ( p->vFaninsNew ) Vec_PtrFree( p->vFaninsNew ); - FREE( p ); -} - -/**Function************************************************************* - - Synopsis [Recostructs the network after FX.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFxuReconstruct( Abc_Ntk_t * pNtk, Fxu_Data_t * p ) -{ - Vec_Int_t * vFanins; - Abc_Obj_t * pNode, * pFanin; - int i, k; - - assert( p->vFanins->nSize < p->vFaninsNew->nSize ); - // create the new nodes - for ( i = p->vFanins->nSize; i < p->vFanins->nSize + p->nNodesNew; i++ ) - { - // start the node - pNode = Abc_NtkCreateNode( pNtk ); - assert( i == (int)pNode->Id ); - } - // update the old nodes - for ( i = 0; i < p->vFanins->nSize; i++ ) - { - // the new array of fanins - vFanins = p->vFaninsNew->pArray[i]; - if ( vFanins == NULL ) - continue; - // remove old fanins - pNode = Abc_NtkObj( pNtk, i ); - Abc_ObjRemoveFanins( pNode ); - // add new fanins - vFanins = p->vFaninsNew->pArray[i]; - for ( k = 0; k < vFanins->nSize; k++ ) - { - pFanin = Abc_NtkObj( pNtk, vFanins->pArray[k] ); - Abc_ObjAddFanin( pNode, pFanin ); - } - pNode->pData = p->vSopsNew->pArray[i]; - assert( pNode->pData != NULL ); - } - // set up the new nodes - for ( i = p->vFanins->nSize; i < p->vFanins->nSize + p->nNodesNew; i++ ) - { - // get the new node - pNode = Abc_NtkObj( pNtk, i ); - // add the fanins - vFanins = p->vFaninsNew->pArray[i]; - for ( k = 0; k < vFanins->nSize; k++ ) - { - pFanin = Abc_NtkObj( pNtk, vFanins->pArray[k] ); - Abc_ObjAddFanin( pNode, pFanin ); - } - pNode->pData = p->vSopsNew->pArray[i]; - assert( pNode->pData != NULL ); - } -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcGen.c b/src/base/abci/abcGen.c deleted file mode 100644 index bfb41374..00000000 --- a/src/base/abci/abcGen.c +++ /dev/null @@ -1,511 +0,0 @@ -/**CFile**************************************************************** - - FileName [abc_.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abc_.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -void Abc_WriteLayer( FILE * pFile, int nVars, int fSkip1 ); -void Abc_WriteComp( FILE * pFile ); -void Abc_WriteFullAdder( FILE * pFile ); - -void Abc_GenAdder( char * pFileName, int nVars ); -void Abc_GenSorter( char * pFileName, int nVars ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_GenAdder( char * pFileName, int nVars ) -{ - FILE * pFile; - int i; - - assert( nVars > 0 ); - - pFile = fopen( pFileName, "w" ); - fprintf( pFile, "# %d-bit ripple-carry adder generated by ABC on %s\n", nVars, Extra_TimeStamp() ); - fprintf( pFile, ".model Adder%02d\n", nVars ); - - fprintf( pFile, ".inputs" ); - for ( i = 0; i < nVars; i++ ) - fprintf( pFile, " a%02d", i ); - for ( i = 0; i < nVars; i++ ) - fprintf( pFile, " b%02d", i ); - fprintf( pFile, "\n" ); - - fprintf( pFile, ".outputs" ); - for ( i = 0; i <= nVars; i++ ) - fprintf( pFile, " y%02d", i ); - fprintf( pFile, "\n" ); - - fprintf( pFile, ".names c\n" ); - if ( nVars == 1 ) - fprintf( pFile, ".subckt FA a=a00 b=b00 cin=c s=y00 cout=y01\n" ); - else - { - fprintf( pFile, ".subckt FA a=a00 b=b00 cin=c s=y00 cout=%02d\n", 0 ); - for ( i = 1; i < nVars-1; i++ ) - fprintf( pFile, ".subckt FA a=a%02d b=b%02d cin=%02d s=y%02d cout=%02d\n", i, i, i-1, i, i ); - fprintf( pFile, ".subckt FA a=a%02d b=b%02d cin=%02d s=y%02d cout=y%02d\n", i, i, i-1, i, i+1 ); - } - fprintf( pFile, ".end\n" ); - fprintf( pFile, "\n" ); - - Abc_WriteFullAdder( pFile ); - fclose( pFile ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_GenSorter( char * pFileName, int nVars ) -{ - FILE * pFile; - int i, k, Counter, nDigits; - - assert( nVars > 1 ); - - pFile = fopen( pFileName, "w" ); - fprintf( pFile, "# %d-bit sorter generated by ABC on %s\n", nVars, Extra_TimeStamp() ); - fprintf( pFile, ".model Sorter%02d\n", nVars ); - - fprintf( pFile, ".inputs" ); - for ( i = 0; i < nVars; i++ ) - fprintf( pFile, " x%02d", i ); - fprintf( pFile, "\n" ); - - fprintf( pFile, ".outputs" ); - for ( i = 0; i < nVars; i++ ) - fprintf( pFile, " y%02d", i ); - fprintf( pFile, "\n" ); - - Counter = 0; - nDigits = Extra_Base10Log( (nVars-2)*nVars ); - if ( nVars == 2 ) - fprintf( pFile, ".subckt Comp a=x00 b=x01 x=y00 y=y01\n" ); - else - { - fprintf( pFile, ".subckt Layer0" ); - for ( k = 0; k < nVars; k++ ) - fprintf( pFile, " x%02d=x%02d", k, k ); - for ( k = 0; k < nVars; k++ ) - fprintf( pFile, " y%02d=%0*d", k, nDigits, Counter++ ); - fprintf( pFile, "\n" ); - Counter -= nVars; - for ( i = 1; i < nVars-2; i++ ) - { - fprintf( pFile, ".subckt Layer%d", (i&1) ); - for ( k = 0; k < nVars; k++ ) - fprintf( pFile, " x%02d=%0*d", k, nDigits, Counter++ ); - for ( k = 0; k < nVars; k++ ) - fprintf( pFile, " y%02d=%0*d", k, nDigits, Counter++ ); - fprintf( pFile, "\n" ); - Counter -= nVars; - } - fprintf( pFile, ".subckt Layer%d", (i&1) ); - for ( k = 0; k < nVars; k++ ) - fprintf( pFile, " x%02d=%0*d", k, nDigits, Counter++ ); - for ( k = 0; k < nVars; k++ ) - fprintf( pFile, " y%02d=y%02d", k, k ); - fprintf( pFile, "\n" ); - } - fprintf( pFile, ".end\n" ); - fprintf( pFile, "\n" ); - - Abc_WriteLayer( pFile, nVars, 0 ); - Abc_WriteLayer( pFile, nVars, 1 ); - Abc_WriteComp( pFile ); - fclose( pFile ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_WriteLayer( FILE * pFile, int nVars, int fSkip1 ) -{ - int i; - fprintf( pFile, ".model Layer%d\n", fSkip1 ); - fprintf( pFile, ".inputs" ); - for ( i = 0; i < nVars; i++ ) - fprintf( pFile, " x%02d", i ); - fprintf( pFile, "\n" ); - fprintf( pFile, ".outputs" ); - for ( i = 0; i < nVars; i++ ) - fprintf( pFile, " y%02d", i ); - fprintf( pFile, "\n" ); - if ( fSkip1 ) - { - fprintf( pFile, ".names x00 y00\n" ); - fprintf( pFile, "1 1\n" ); - i = 1; - } - else - i = 0; - for ( ; i + 1 < nVars; i += 2 ) - fprintf( pFile, ".subckt Comp a=x%02d b=x%02d x=y%02d y=y%02d\n", i, i+1, i, i+1 ); - if ( i < nVars ) - { - fprintf( pFile, ".names x%02d y%02d\n", i, i ); - fprintf( pFile, "1 1\n" ); - } - fprintf( pFile, ".end\n" ); - fprintf( pFile, "\n" ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_WriteComp( FILE * pFile ) -{ - fprintf( pFile, ".model Comp\n" ); - fprintf( pFile, ".inputs a b\n" ); - fprintf( pFile, ".outputs x y\n" ); - fprintf( pFile, ".names a b x\n" ); - fprintf( pFile, "11 1\n" ); - fprintf( pFile, ".names a b y\n" ); - fprintf( pFile, "1- 1\n" ); - fprintf( pFile, "-1 1\n" ); - fprintf( pFile, ".end\n" ); - fprintf( pFile, "\n" ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_WriteFullAdder( FILE * pFile ) -{ - fprintf( pFile, ".model FA\n" ); - fprintf( pFile, ".inputs a b cin\n" ); - fprintf( pFile, ".outputs s cout\n" ); - fprintf( pFile, ".names a b k\n" ); - fprintf( pFile, "10 1\n" ); - fprintf( pFile, "01 1\n" ); - fprintf( pFile, ".names k cin s\n" ); - fprintf( pFile, "10 1\n" ); - fprintf( pFile, "01 1\n" ); - fprintf( pFile, ".names a b cin cout\n" ); - fprintf( pFile, "11- 1\n" ); - fprintf( pFile, "1-1 1\n" ); - fprintf( pFile, "-11 1\n" ); - fprintf( pFile, ".end\n" ); - fprintf( pFile, "\n" ); -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_WriteCell( FILE * pFile ) -{ - fprintf( pFile, ".model cell\n" ); - fprintf( pFile, ".inputs px1 px2 py1 py2 x y\n" ); - fprintf( pFile, ".outputs fx fy\n" ); - fprintf( pFile, ".names x y a\n" ); - fprintf( pFile, "11 1\n" ); - fprintf( pFile, ".names px1 a x nx\n" ); - fprintf( pFile, "11- 1\n" ); - fprintf( pFile, "0-1 1\n" ); - fprintf( pFile, ".names py1 a y ny\n" ); - fprintf( pFile, "11- 1\n" ); - fprintf( pFile, "0-1 1\n" ); - fprintf( pFile, ".names px2 nx fx\n" ); - fprintf( pFile, "10 1\n" ); - fprintf( pFile, "01 1\n" ); - fprintf( pFile, ".names py2 ny fy\n" ); - fprintf( pFile, "10 1\n" ); - fprintf( pFile, "01 1\n" ); - fprintf( pFile, ".end\n" ); - fprintf( pFile, "\n" ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_GenMesh( char * pFileName, int nVars ) -{ - FILE * pFile; - int i, k; - - assert( nVars > 0 ); - - pFile = fopen( pFileName, "w" ); - fprintf( pFile, "# %dx%d mesh generated by ABC on %s\n", nVars, nVars, Extra_TimeStamp() ); - fprintf( pFile, ".model mesh%d\n", nVars ); - - for ( i = 0; i < nVars; i++ ) - for ( k = 0; k < nVars; k++ ) - { - fprintf( pFile, ".inputs" ); - fprintf( pFile, " p%d%dx1", i, k ); - fprintf( pFile, " p%d%dx2", i, k ); - fprintf( pFile, " p%d%dy1", i, k ); - fprintf( pFile, " p%d%dy2", i, k ); - fprintf( pFile, "\n" ); - } - fprintf( pFile, ".inputs" ); - for ( i = 0; i < nVars; i++ ) - fprintf( pFile, " v%02d v%02d", 2*i, 2*i+1 ); - fprintf( pFile, "\n" ); - - fprintf( pFile, ".outputs" ); - fprintf( pFile, " fx00" ); - fprintf( pFile, "\n" ); - - for ( i = 0; i < nVars; i++ ) // horizontal - for ( k = 0; k < nVars; k++ ) // vertical - { - fprintf( pFile, ".subckt cell" ); - fprintf( pFile, " px1=p%d%dx1", i, k ); - fprintf( pFile, " px2=p%d%dx2", i, k ); - fprintf( pFile, " py1=p%d%dy1", i, k ); - fprintf( pFile, " py2=p%d%dy2", i, k ); - if ( k == nVars - 1 ) - fprintf( pFile, " x=v%02d", i ); - else - fprintf( pFile, " x=fx%d%d", i, k+1 ); - if ( i == nVars - 1 ) - fprintf( pFile, " y=v%02d", nVars+k ); - else - fprintf( pFile, " y=fy%d%d", i+1, k ); - // outputs - fprintf( pFile, " fx=fx%d%d", i, k ); - fprintf( pFile, " fy=fy%d%d", i, k ); - fprintf( pFile, "\n" ); - } - fprintf( pFile, ".end\n" ); - fprintf( pFile, "\n" ); - fprintf( pFile, "\n" ); - - Abc_WriteCell( pFile ); - fclose( pFile ); -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_WriteKLut( FILE * pFile, int nLutSize ) -{ - int i, iVar, iNext, nPars = (1 << nLutSize); - fprintf( pFile, "\n" ); - fprintf( pFile, ".model lut%d\n", nLutSize ); - fprintf( pFile, ".inputs" ); - for ( i = 0; i < nPars; i++ ) - fprintf( pFile, " p%02d", i ); - fprintf( pFile, "\n" ); - fprintf( pFile, ".inputs" ); - for ( i = 0; i < nLutSize; i++ ) - fprintf( pFile, " i%d", i ); - fprintf( pFile, "\n" ); - fprintf( pFile, ".outputs o\n" ); - fprintf( pFile, ".names n01 o\n" ); - fprintf( pFile, "1 1\n" ); - // write internal MUXes - iVar = 0; - iNext = 2; - for ( i = 1; i < nPars; i++ ) - { - if ( i == iNext ) - { - iNext *= 2; - iVar++; - } - if ( iVar == nLutSize - 1 ) - fprintf( pFile, ".names i%d p%02d p%02d n%02d\n", iVar, 2*(i-nPars/2), 2*(i-nPars/2)+1, i ); - else - fprintf( pFile, ".names i%d n%02d n%02d n%02d\n", iVar, 2*i, 2*i+1, i ); - fprintf( pFile, "01- 1\n" ); - fprintf( pFile, "1-1 1\n" ); - } - fprintf( pFile, ".end\n" ); - fprintf( pFile, "\n" ); -} - -/**Function************************************************************* - - Synopsis [Generates structure of L K-LUTs implementing an N-var function.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_GenFpga( char * pFileName, int nLutSize, int nLuts, int nVars ) -{ - FILE * pFile; - int nVarsLut = (1 << nLutSize); // the number of LUT variables - int nVarsLog = Extra_Base2Log( nVars + nLuts - 1 ); // the number of encoding vars - int nVarsDeg = (1 << nVarsLog); // the number of LUT variables (total) - int nParsLut = nLuts * (1 << nLutSize); // the number of LUT params - int nParsVar = nLuts * nLutSize * nVarsLog; // the number of var params - int i, j, k; - - assert( nVars > 0 ); - - pFile = fopen( pFileName, "w" ); - fprintf( pFile, "# Structure with %d %d-LUTs for %d-var function generated by ABC on %s\n", nLuts, nLutSize, nVars, Extra_TimeStamp() ); - fprintf( pFile, ".model struct%dx%d_%d\n", nLuts, nLutSize, nVars ); - - fprintf( pFile, ".inputs" ); - for ( i = 0; i < nParsLut; i++ ) - fprintf( pFile, " pl%02d", i ); - fprintf( pFile, "\n" ); - - fprintf( pFile, ".inputs" ); - for ( i = 0; i < nParsVar; i++ ) - fprintf( pFile, " pv%02d", i ); - fprintf( pFile, "\n" ); - - fprintf( pFile, ".inputs" ); - for ( i = 0; i < nVars; i++ ) - fprintf( pFile, " v%02d", i ); - fprintf( pFile, "\n" ); - - fprintf( pFile, ".outputs" ); - fprintf( pFile, " v%02d", nVars + nLuts - 1 ); - fprintf( pFile, "\n" ); - fprintf( pFile, ".names Gnd\n" ); - fprintf( pFile, " 0\n" ); - - // generate LUTs - for ( i = 0; i < nLuts; i++ ) - { - fprintf( pFile, ".subckt lut%d", nLutSize ); - // generate config parameters - for ( k = 0; k < nVarsLut; k++ ) - fprintf( pFile, " p%02d=pl%02d", k, i * nVarsLut + k ); - // generate the inputs - for ( k = 0; k < nLutSize; k++ ) - fprintf( pFile, " i%d=s%02d", k, i * nLutSize + k ); - // generate the output - fprintf( pFile, " o=v%02d", nVars + i ); - fprintf( pFile, "\n" ); - } - - // generate LUT inputs - for ( i = 0; i < nLuts; i++ ) - { - for ( j = 0; j < nLutSize; j++ ) - { - fprintf( pFile, ".subckt lut%d", nVarsLog ); - // generate config parameters - for ( k = 0; k < nVarsDeg; k++ ) - { - if ( k < nVars + nLuts - 1 && k < nVars + i ) - fprintf( pFile, " p%02d=v%02d", k, k ); - else - fprintf( pFile, " p%02d=Gnd", k ); - } - // generate the inputs - for ( k = 0; k < nVarsLog; k++ ) - fprintf( pFile, " i%d=pv%02d", k, (i * nLutSize + j) * nVarsLog + k ); - // generate the output - fprintf( pFile, " o=s%02d", i * nLutSize + j ); - fprintf( pFile, "\n" ); - } - } - - fprintf( pFile, ".end\n" ); - fprintf( pFile, "\n" ); - - // generate LUTs - Abc_WriteKLut( pFile, nLutSize ); - if ( nVarsLog != nLutSize ) - Abc_WriteKLut( pFile, nVarsLog ); - fclose( pFile ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcHaig.c b/src/base/abci/abcHaig.c deleted file mode 100644 index d3513bbe..00000000 --- a/src/base/abci/abcHaig.c +++ /dev/null @@ -1,726 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcHaig.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Implements history AIG for combinational rewriting.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcHaig.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Start history AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkHaigStart( Abc_Ntk_t * pNtk ) -{ - Hop_Man_t * p; - Abc_Obj_t * pObj, * pTemp; - int i; - assert( Abc_NtkIsStrash(pNtk) ); - // check if the package is already started - if ( pNtk->pHaig ) - { - Abc_NtkHaigStop( pNtk ); - assert( pNtk->pHaig == NULL ); - printf( "Warning: Previous history AIG was removed.\n" ); - } - // make sure the data is clean - Abc_NtkForEachObj( pNtk, pObj, i ) - assert( pObj->pEquiv == NULL ); - // start the HOP package - p = Hop_ManStart(); - p->vObjs = Vec_PtrAlloc( 4096 ); - Vec_PtrPush( p->vObjs, Hop_ManConst1(p) ); - // map the constant node - Abc_AigConst1(pNtk)->pEquiv = Hop_ManConst1(p); - // map the CIs - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pEquiv = Hop_ObjCreatePi(p); - // map the internal nodes - Abc_NtkForEachNode( pNtk, pObj, i ) - pObj->pEquiv = Hop_And( p, Abc_ObjChild0Equiv(pObj), Abc_ObjChild1Equiv(pObj) ); - // map the choice nodes - if ( Abc_NtkGetChoiceNum( pNtk ) ) - { - // print warning about choice nodes - printf( "Warning: The choice nodes in the original AIG are converted into HAIG.\n" ); - Abc_NtkForEachNode( pNtk, pObj, i ) - { - if ( !Abc_AigNodeIsChoice( pObj ) ) - continue; - for ( pTemp = pObj->pData; pTemp; pTemp = pTemp->pData ) - Hop_ObjCreateChoice( pObj->pEquiv, pTemp->pEquiv ); - } - } - // make sure everything is okay - if ( !Hop_ManCheck(p) ) - { - printf( "Abc_NtkHaigStart: Check for History AIG has failed.\n" ); - Hop_ManStop(p); - return 0; - } - pNtk->pHaig = p; - return 1; -} - -/**Function************************************************************* - - Synopsis [Stops history AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkHaigStop( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pObj; - int i; - assert( Abc_NtkIsStrash(pNtk) ); - if ( pNtk->pHaig == NULL ) - { - printf( "Warning: History AIG is not allocated.\n" ); - return 1; - } - Abc_NtkForEachObj( pNtk, pObj, i ) - pObj->pEquiv = NULL; - Hop_ManStop( pNtk->pHaig ); - pNtk->pHaig = NULL; - return 1; -} - -/**Function************************************************************* - - Synopsis [Transfers the HAIG to the new network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkHaigTranfer( Abc_Ntk_t * pNtkOld, Abc_Ntk_t * pNtkNew ) -{ - Abc_Obj_t * pObj; - int i; - if ( pNtkOld->pHaig == NULL ) - return; - // transfer the package - assert( pNtkNew->pHaig == NULL ); - pNtkNew->pHaig = pNtkOld->pHaig; - pNtkOld->pHaig = NULL; - // transfer constant pointer - Abc_AigConst1(pNtkOld)->pCopy->pEquiv = Abc_AigConst1(pNtkOld)->pEquiv; - // transfer the CI pointers - Abc_NtkForEachCi( pNtkOld, pObj, i ) - pObj->pCopy->pEquiv = pObj->pEquiv; -} - - - -/**Function************************************************************* - - Synopsis [Collects the nodes in the classes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NtkHaigCollectMembers( Hop_Man_t * p ) -{ - Vec_Ptr_t * vObjs; - Hop_Obj_t * pObj; - int i; - vObjs = Vec_PtrAlloc( 4098 ); - Vec_PtrForEachEntry( p->vObjs, pObj, i ) - { - if ( pObj->pData == NULL ) - continue; - pObj->pData = Hop_ObjRepr( pObj ); - Vec_PtrPush( vObjs, pObj ); - } - return vObjs; -} - -/**Function************************************************************* - - Synopsis [Creates classes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NtkHaigCreateClasses( Vec_Ptr_t * vMembers ) -{ - Vec_Ptr_t * vClasses; - Hop_Obj_t * pObj, * pRepr; - int i; - - // count classes - vClasses = Vec_PtrAlloc( 4098 ); - Vec_PtrForEachEntry( vMembers, pObj, i ) - { - pRepr = pObj->pData; - assert( pRepr->pData == NULL ); - if ( pRepr->fMarkA == 0 ) // new - { - pRepr->fMarkA = 1; - Vec_PtrPush( vClasses, pRepr ); - } - } - - // set representatives as representatives - Vec_PtrForEachEntry( vClasses, pObj, i ) - { - pObj->fMarkA = 0; - pObj->pData = pObj; - } - - // go through the members and update - Vec_PtrForEachEntry( vMembers, pObj, i ) - { - pRepr = pObj->pData; - if ( ((Hop_Obj_t *)pRepr->pData)->Id > pObj->Id ) - pRepr->pData = pObj; - } - - // change representatives of the class - Vec_PtrForEachEntry( vMembers, pObj, i ) - { - pRepr = pObj->pData; - pObj->pData = pRepr->pData; - assert( ((Hop_Obj_t *)pObj->pData)->Id <= pObj->Id ); - } - - // update classes - Vec_PtrForEachEntry( vClasses, pObj, i ) - { - pRepr = pObj->pData; - assert( pRepr->pData == pRepr ); -// pRepr->pData = NULL; - Vec_PtrWriteEntry( vClasses, i, pRepr ); - Vec_PtrPush( vMembers, pObj ); - } - - Vec_PtrForEachEntry( vMembers, pObj, i ) - if ( pObj->pData == pObj ) - pObj->pData = NULL; - -/* - Vec_PtrForEachEntry( vMembers, pObj, i ) - { - printf( "ObjId = %4d : ", pObj->Id ); - if ( pObj->pData == NULL ) - { - printf( "NULL" ); - } - else - { - printf( "%4d", ((Hop_Obj_t *)pObj->pData)->Id ); - assert( ((Hop_Obj_t *)pObj->pData)->Id <= pObj->Id ); - } - printf( "\n" ); - } -*/ - return vClasses; -} - -/**Function************************************************************* - - Synopsis [Counts how many data members have non-trivial fanout.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkHaigCountFans( Hop_Man_t * p ) -{ - Hop_Obj_t * pObj; - int i, Counter = 0; - Vec_PtrForEachEntry( p->vObjs, pObj, i ) - { - if ( pObj->pData == NULL ) - continue; - if ( Hop_ObjRefs(pObj) > 0 ) - Counter++; - } - printf( "The number of class members with fanouts = %5d.\n", Counter ); - return Counter; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Hop_Obj_t * Hop_ObjReprHop( Hop_Obj_t * pObj ) -{ - Hop_Obj_t * pRepr; - assert( pObj->pNext != NULL ); - if ( pObj->pData == NULL ) - return pObj->pNext; - pRepr = pObj->pData; - assert( pRepr->pData == pRepr ); - return Hop_NotCond( pRepr->pNext, pObj->fPhase ^ pRepr->fPhase ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Hop_Obj_t * Hop_ObjChild0Hop( Hop_Obj_t * pObj ) { return Hop_NotCond( Hop_ObjReprHop(Hop_ObjFanin0(pObj)), Hop_ObjFaninC0(pObj) ); } -static inline Hop_Obj_t * Hop_ObjChild1Hop( Hop_Obj_t * pObj ) { return Hop_NotCond( Hop_ObjReprHop(Hop_ObjFanin1(pObj)), Hop_ObjFaninC1(pObj) ); } - -/**Function************************************************************* - - Synopsis [Stops history AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Hop_Man_t * Abc_NtkHaigReconstruct( Hop_Man_t * p ) -{ - Hop_Man_t * pNew; - Hop_Obj_t * pObj; - int i, Counter = 0; - Vec_PtrForEachEntry( p->vObjs, pObj, i ) - pObj->pNext = NULL; - // start the HOP package - pNew = Hop_ManStart(); - pNew->vObjs = Vec_PtrAlloc( p->nCreated ); - Vec_PtrPush( pNew->vObjs, Hop_ManConst1(pNew) ); - // map the constant node - Hop_ManConst1(p)->pNext = Hop_ManConst1(pNew); - // map the CIs - Hop_ManForEachPi( p, pObj, i ) - pObj->pNext = Hop_ObjCreatePi(pNew); - // map the internal nodes - Vec_PtrForEachEntry( p->vObjs, pObj, i ) - { - if ( !Hop_ObjIsNode(pObj) ) - continue; - pObj->pNext = Hop_And( pNew, Hop_ObjChild0Hop(pObj), Hop_ObjChild1Hop(pObj) ); -// assert( !Hop_IsComplement(pObj->pNext) ); - if ( Hop_ManConst1(pNew) == Hop_Regular(pObj->pNext) ) - Counter++; - if ( pObj->pData ) // member of the class - Hop_Regular(pObj->pNext)->pData = Hop_Regular(((Hop_Obj_t *)pObj->pData)->pNext); - } -// printf( " Counter = %d.\n", Counter ); - // transfer the POs - Hop_ManForEachPo( p, pObj, i ) - Hop_ObjCreatePo( pNew, Hop_ObjChild0Hop(pObj) ); - // check the new manager - if ( !Hop_ManCheck(pNew) ) - { - printf( "Abc_NtkHaigReconstruct: Check for History AIG has failed.\n" ); - Hop_ManStop(pNew); - return NULL; - } - return pNew; -} - - -/**Function************************************************************* - - Synopsis [Returns 1 if pOld is in the TFI of pNew.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkHaigCheckTfi_rec( Abc_Obj_t * pNode, Abc_Obj_t * pOld ) -{ - if ( pNode == NULL ) - return 0; - if ( pNode == pOld ) - return 1; - // check the trivial cases - if ( Abc_ObjIsCi(pNode) ) - return 0; - assert( Abc_ObjIsNode(pNode) ); - // if this node is already visited, skip - if ( Abc_NodeIsTravIdCurrent( pNode ) ) - return 0; - // mark the node as visited - Abc_NodeSetTravIdCurrent( pNode ); - // check the children - if ( Abc_NtkHaigCheckTfi_rec( Abc_ObjFanin0(pNode), pOld ) ) - return 1; - if ( Abc_NtkHaigCheckTfi_rec( Abc_ObjFanin1(pNode), pOld ) ) - return 1; - // check equivalent nodes - return Abc_NtkHaigCheckTfi_rec( pNode->pData, pOld ); -} - -/**Function************************************************************* - - Synopsis [Returns 1 if pOld is in the TFI of pNew.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkHaigCheckTfi( Abc_Ntk_t * pNtk, Abc_Obj_t * pOld, Abc_Obj_t * pNew ) -{ - assert( !Abc_ObjIsComplement(pOld) ); - assert( !Abc_ObjIsComplement(pNew) ); - Abc_NtkIncrementTravId(pNtk); - return Abc_NtkHaigCheckTfi_rec( pNew, pOld ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Abc_Obj_t * Hop_ObjChild0Next( Hop_Obj_t * pObj ) { return Abc_ObjNotCond( (Abc_Obj_t *)Hop_ObjFanin0(pObj)->pNext, Hop_ObjFaninC0(pObj) ); } -static inline Abc_Obj_t * Hop_ObjChild1Next( Hop_Obj_t * pObj ) { return Abc_ObjNotCond( (Abc_Obj_t *)Hop_ObjFanin1(pObj)->pNext, Hop_ObjFaninC1(pObj) ); } - -/**Function************************************************************* - - Synopsis [Stops history AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkHaigRecreateAig( Abc_Ntk_t * pNtk, Hop_Man_t * p ) -{ - Abc_Ntk_t * pNtkAig; - Abc_Obj_t * pObjOld, * pObjAbcThis, * pObjAbcRepr; - Hop_Obj_t * pObj; - int i; - assert( p->nCreated == Vec_PtrSize(p->vObjs) ); - - // start the new network - pNtkAig = Abc_NtkStartFrom( pNtk, ABC_NTK_STRASH, ABC_FUNC_AIG ); - - // transfer new nodes to the PIs of HOP - Hop_ManConst1(p)->pNext = (Hop_Obj_t *)Abc_AigConst1( pNtkAig ); - Hop_ManForEachPi( p, pObj, i ) - pObj->pNext = (Hop_Obj_t *)Abc_NtkCi( pNtkAig, i ); - - // construct new nodes - Vec_PtrForEachEntry( p->vObjs, pObj, i ) - { - if ( !Hop_ObjIsNode(pObj) ) - continue; - pObj->pNext = (Hop_Obj_t *)Abc_AigAnd( pNtkAig->pManFunc, Hop_ObjChild0Next(pObj), Hop_ObjChild1Next(pObj) ); - assert( !Hop_IsComplement(pObj->pNext) ); - } - - // set the COs - Abc_NtkForEachCo( pNtk, pObjOld, i ) - Abc_ObjAddFanin( pObjOld->pCopy, Hop_ObjChild0Next(Hop_ManPo(p,i)) ); - - // construct choice nodes - Vec_PtrForEachEntry( p->vObjs, pObj, i ) - { - // skip the node without choices - if ( pObj->pData == NULL ) - continue; - // skip the representative of the class - if ( pObj->pData == pObj ) - continue; - // do not create choices for constant 1 and PIs - if ( !Hop_ObjIsNode(pObj->pData) ) - continue; - // get the corresponding new nodes - pObjAbcThis = (Abc_Obj_t *)pObj->pNext; - pObjAbcRepr = (Abc_Obj_t *)((Hop_Obj_t *)pObj->pData)->pNext; - // the new node cannot be already in the class - assert( pObjAbcThis->pData == NULL ); - // the new node cannot have fanouts - assert( Abc_ObjFanoutNum(pObjAbcThis) == 0 ); - // these should be different nodes - assert( pObjAbcRepr != pObjAbcThis ); - // do not create choices if there is a path from pObjAbcThis to pObjAbcRepr - if ( !Abc_NtkHaigCheckTfi( pNtkAig, pObjAbcRepr, pObjAbcThis ) ) - { - // find the last node in the class - while ( pObjAbcRepr->pData ) - pObjAbcRepr = pObjAbcRepr->pData; - // add the new node at the end of the list - pObjAbcRepr->pData = pObjAbcThis; - } - } - - // finish the new network -// Abc_NtkFinalize( pNtk, pNtkAig ); -// Abc_AigCleanup( pNtkAig->pManFunc ); - // check correctness of the network - if ( !Abc_NtkCheck( pNtkAig ) ) - { - printf( "Abc_NtkHaigUse: The network check has failed.\n" ); - Abc_NtkDelete( pNtkAig ); - return NULL; - } - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Resets representatives.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkHaigResetReprsOld( Hop_Man_t * pMan ) -{ - Vec_Ptr_t * vMembers, * vClasses; - - // collect members of the classes and make them point to reprs - vMembers = Abc_NtkHaigCollectMembers( pMan ); - printf( "Collected %6d class members.\n", Vec_PtrSize(vMembers) ); - - // create classes - vClasses = Abc_NtkHaigCreateClasses( vMembers ); - printf( "Collected %6d classes. (Ave = %5.2f)\n", Vec_PtrSize(vClasses), - (float)(Vec_PtrSize(vMembers))/Vec_PtrSize(vClasses) ); - - Vec_PtrFree( vMembers ); - Vec_PtrFree( vClasses ); -} - -/**Function************************************************************* - - Synopsis [Resets representatives.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkHaigResetReprs( Hop_Man_t * p ) -{ - Hop_Obj_t * pObj, * pRepr; - int i, nClasses, nMembers, nFanouts, nNormals; - // clear self-classes - Vec_PtrForEachEntry( p->vObjs, pObj, i ) - { - // fix the strange situation of double-loop - pRepr = pObj->pData; - if ( pRepr && pRepr->pData == pObj ) - pRepr->pData = pRepr; - // remove self-loops - if ( pObj->pData == pObj ) - pObj->pData = NULL; - } - // set representatives - Vec_PtrForEachEntry( p->vObjs, pObj, i ) - { - if ( pObj->pData == NULL ) - continue; - // get representative of the node - pRepr = Hop_ObjRepr( pObj ); - pRepr->pData = pRepr; - // set the representative - pObj->pData = pRepr; - } - // make each class point to the smallest topological order - Vec_PtrForEachEntry( p->vObjs, pObj, i ) - { - if ( pObj->pData == NULL ) - continue; - pRepr = Hop_ObjRepr( pObj ); - if ( pRepr->Id > pObj->Id ) - { - pRepr->pData = pObj; - pObj->pData = pObj; - } - else - pObj->pData = pRepr; - } - // count classes, members, and fanouts - and verify - nMembers = nClasses = nFanouts = nNormals = 0; - Vec_PtrForEachEntry( p->vObjs, pObj, i ) - { - if ( pObj->pData == NULL ) - continue; - // count members - nMembers++; - // count the classes and fanouts - if ( pObj->pData == pObj ) - nClasses++; - else if ( Hop_ObjRefs(pObj) > 0 ) - nFanouts++; - else - nNormals++; - // compare representatives - pRepr = Hop_ObjRepr( pObj ); - assert( pObj->pData == pRepr ); - assert( pRepr->Id <= pObj->Id ); - } -// printf( "Nodes = %7d. Member = %7d. Classes = %6d. Fanouts = %6d. Normals = %6d.\n", -// Hop_ManNodeNum(p), nMembers, nClasses, nFanouts, nNormals ); - return nFanouts; -} - -/**Function************************************************************* - - Synopsis [Stops history AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkHaigUse( Abc_Ntk_t * pNtk ) -{ - Hop_Man_t * pMan, * pManTemp; - Abc_Ntk_t * pNtkAig; - Abc_Obj_t * pObj; - int i; - - // check if HAIG is available - assert( Abc_NtkIsStrash(pNtk) ); - if ( pNtk->pHaig == NULL ) - { - printf( "Warning: History AIG is not available.\n" ); - return NULL; - } - // convert HOP package into AIG with choices - // print HAIG stats -// Hop_ManPrintStats( pMan ); // USES DATA!!! - - // add the POs - Abc_NtkForEachCo( pNtk, pObj, i ) - Hop_ObjCreatePo( pNtk->pHaig, Abc_ObjChild0Equiv(pObj) ); - - // clean the old network - Abc_NtkForEachObj( pNtk, pObj, i ) - pObj->pEquiv = NULL; - pMan = pNtk->pHaig; - pNtk->pHaig = 0; - - // iteratively reconstruct the HOP manager to create choice nodes - while ( Abc_NtkHaigResetReprs( pMan ) ) - { - pMan = Abc_NtkHaigReconstruct( pManTemp = pMan ); - Hop_ManStop( pManTemp ); - } - - // traverse in the topological order and create new AIG - pNtkAig = Abc_NtkHaigRecreateAig( pNtk, pMan ); - Hop_ManStop( pMan ); - - // free HAIG - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Transform HOP manager into the one without loops.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkHopRemoveLoops( Abc_Ntk_t * pNtk, Hop_Man_t * pMan ) -{ - Abc_Ntk_t * pNtkAig; - Hop_Man_t * pManTemp; - - // iteratively reconstruct the HOP manager to create choice nodes - while ( Abc_NtkHaigResetReprs( pMan ) ) - { - pMan = Abc_NtkHaigReconstruct( pManTemp = pMan ); - Hop_ManStop( pManTemp ); - } - - // traverse in the topological order and create new AIG - pNtkAig = Abc_NtkHaigRecreateAig( pNtk, pMan ); - Hop_ManStop( pMan ); - return pNtkAig; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcIf.c b/src/base/abci/abcIf.c deleted file mode 100644 index bb56c22c..00000000 --- a/src/base/abci/abcIf.c +++ /dev/null @@ -1,497 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcIf.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Interface with the FPGA mapping package.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - November 21, 2006.] - - Revision [$Id: abcIf.c,v 1.00 2006/11/21 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "if.h" -#include "kit.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static If_Man_t * Abc_NtkToIf( Abc_Ntk_t * pNtk, If_Par_t * pPars ); -static Abc_Ntk_t * Abc_NtkFromIf( If_Man_t * pIfMan, Abc_Ntk_t * pNtk ); -extern Abc_Obj_t * Abc_NodeFromIf_rec( Abc_Ntk_t * pNtkNew, If_Man_t * pIfMan, If_Obj_t * pIfObj, Vec_Int_t * vCover ); -static Hop_Obj_t * Abc_NodeIfToHop( Hop_Man_t * pHopMan, If_Man_t * pIfMan, If_Obj_t * pIfObj ); -static Vec_Ptr_t * Abc_NtkFindGoodOrder( Abc_Ntk_t * pNtk ); - -extern void Abc_NtkBddReorder( Abc_Ntk_t * pNtk, int fVerbose ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Interface with the FPGA mapping package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkIf( Abc_Ntk_t * pNtk, If_Par_t * pPars ) -{ - Abc_Ntk_t * pNtkNew; - If_Man_t * pIfMan; - - assert( Abc_NtkIsStrash(pNtk) ); - - // get timing information - pPars->pTimesArr = Abc_NtkGetCiArrivalFloats(pNtk); - pPars->pTimesReq = NULL; - - // set the latch paths - if ( pPars->fLatchPaths && pPars->pTimesArr ) - { - int c; - for ( c = 0; c < Abc_NtkPiNum(pNtk); c++ ) - pPars->pTimesArr[c] = -ABC_INFINITY; - } - - // perform FPGA mapping - pIfMan = Abc_NtkToIf( pNtk, pPars ); - if ( pIfMan == NULL ) - return NULL; - if ( !If_ManPerformMapping( pIfMan ) ) - { - If_ManStop( pIfMan ); - return NULL; - } - - // transform the result of mapping into the new network - pNtkNew = Abc_NtkFromIf( pIfMan, pNtk ); - if ( pNtkNew == NULL ) - return NULL; - If_ManStop( pIfMan ); - - // duplicate EXDC - if ( pNtk->pExdc ) - pNtkNew->pExdc = Abc_NtkDup( pNtk->pExdc ); - - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkIf: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Load the network into FPGA manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -If_Man_t * Abc_NtkToIf( Abc_Ntk_t * pNtk, If_Par_t * pPars ) -{ - ProgressBar * pProgress; - If_Man_t * pIfMan; - Abc_Obj_t * pNode, * pFanin, * pPrev; - Vec_Ptr_t * vNodes; - int i; - - assert( Abc_NtkIsStrash(pNtk) ); -// vNodes = Abc_NtkFindGoodOrder( pNtk ); - vNodes = Abc_AigDfs( pNtk, 0, 0 ); - - // start the mapping manager and set its parameters - pIfMan = If_ManStart( pPars ); - - // print warning about excessive memory usage - if ( 1.0 * Abc_NtkObjNum(pNtk) * pIfMan->nObjBytes / (1<<30) > 1.0 ) - printf( "Warning: The mapper will allocate %.1f Gb for to represent the subject graph with %d AIG nodes.\n", - 1.0 * Abc_NtkObjNum(pNtk) * pIfMan->nObjBytes / (1<<30), Abc_NtkObjNum(pNtk) ); - - // create PIs and remember them in the old nodes - Abc_AigConst1(pNtk)->pCopy = (Abc_Obj_t *)If_ManConst1( pIfMan ); - Abc_NtkForEachCi( pNtk, pNode, i ) - { - pNode->pCopy = (Abc_Obj_t *)If_ManCreateCi( pIfMan ); -//printf( "AIG CI %2d -> IF CI %2d\n", pNode->Id, ((If_Obj_t *)pNode->pCopy)->Id ); - } - - // load the AIG into the mapper - pProgress = Extra_ProgressBarStart( stdout, Abc_NtkObjNumMax(pNtk) ); -// Abc_AigForEachAnd( pNtk, pNode, i ) - Vec_PtrForEachEntry( vNodes, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, "Initial" ); - // add the node to the mapper - pNode->pCopy = (Abc_Obj_t *)If_ManCreateAnd( pIfMan, - If_NotCond( (If_Obj_t *)Abc_ObjFanin0(pNode)->pCopy, Abc_ObjFaninC0(pNode) ), - If_NotCond( (If_Obj_t *)Abc_ObjFanin1(pNode)->pCopy, Abc_ObjFaninC1(pNode) ) ); - // set up the choice node - if ( Abc_AigNodeIsChoice( pNode ) ) - { - pIfMan->nChoices++; - for ( pPrev = pNode, pFanin = pNode->pData; pFanin; pPrev = pFanin, pFanin = pFanin->pData ) - If_ObjSetChoice( (If_Obj_t *)pPrev->pCopy, (If_Obj_t *)pFanin->pCopy ); - If_ManCreateChoice( pIfMan, (If_Obj_t *)pNode->pCopy ); - } -//printf( "AIG node %2d -> IF node %2d\n", pNode->Id, ((If_Obj_t *)pNode->pCopy)->Id ); - } - Extra_ProgressBarStop( pProgress ); - Vec_PtrFree( vNodes ); - - // set the primary outputs without copying the phase - Abc_NtkForEachCo( pNtk, pNode, i ) - If_ManCreateCo( pIfMan, If_NotCond( (If_Obj_t *)Abc_ObjFanin0(pNode)->pCopy, Abc_ObjFaninC0(pNode) ) ); - return pIfMan; -} - -/**Function************************************************************* - - Synopsis [Creates the mapped network.] - - Description [Assuming the copy field of the mapped nodes are NULL.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromIf( If_Man_t * pIfMan, Abc_Ntk_t * pNtk ) -{ - ProgressBar * pProgress; - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pNode, * pNodeNew; - Vec_Int_t * vCover; - int i, nDupGates; - // create the new network - if ( pIfMan->pPars->fUseBdds || pIfMan->pPars->fUseCnfs || pIfMan->pPars->fUseMv ) - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_BDD ); - else if ( pIfMan->pPars->fUseSops ) - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_SOP ); - else - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_AIG ); - // prepare the mapping manager - If_ManCleanNodeCopy( pIfMan ); - If_ManCleanCutData( pIfMan ); - // make the mapper point to the new network - If_ObjSetCopy( If_ManConst1(pIfMan), Abc_NtkCreateNodeConst1(pNtkNew) ); - Abc_NtkForEachCi( pNtk, pNode, i ) - If_ObjSetCopy( If_ManCi(pIfMan, i), pNode->pCopy ); - // process the nodes in topological order - vCover = Vec_IntAlloc( 1 << 16 ); - pProgress = Extra_ProgressBarStart( stdout, Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, "Final" ); - pNodeNew = Abc_NodeFromIf_rec( pNtkNew, pIfMan, If_ObjFanin0(If_ManCo(pIfMan, i)), vCover ); - pNodeNew = Abc_ObjNotCond( pNodeNew, If_ObjFaninC0(If_ManCo(pIfMan, i)) ); - Abc_ObjAddFanin( pNode->pCopy, pNodeNew ); - } - Extra_ProgressBarStop( pProgress ); - Vec_IntFree( vCover ); - // remove the constant node if not used - pNodeNew = (Abc_Obj_t *)If_ObjCopy( If_ManConst1(pIfMan) ); - if ( Abc_ObjFanoutNum(pNodeNew) == 0 ) - Abc_NtkDeleteObj( pNodeNew ); - // minimize the node - if ( pIfMan->pPars->fUseBdds || pIfMan->pPars->fUseCnfs || pIfMan->pPars->fUseMv ) - Abc_NtkSweep( pNtkNew, 0 ); - if ( pIfMan->pPars->fUseBdds ) - Abc_NtkBddReorder( pNtkNew, 0 ); - // decouple the PO driver nodes to reduce the number of levels - nDupGates = Abc_NtkLogicMakeSimpleCos( pNtkNew, 1 ); -// if ( nDupGates && If_ManReadVerbose(pIfMan) ) -// printf( "Duplicated %d gates to decouple the CO drivers.\n", nDupGates ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Derive one node after FPGA mapping.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeFromIf_rec( Abc_Ntk_t * pNtkNew, If_Man_t * pIfMan, If_Obj_t * pIfObj, Vec_Int_t * vCover ) -{ - Abc_Obj_t * pNodeNew; - If_Cut_t * pCutBest; - If_Obj_t * pIfLeaf; - int i; - // return if the result if known - pNodeNew = (Abc_Obj_t *)If_ObjCopy( pIfObj ); - if ( pNodeNew ) - return pNodeNew; - assert( pIfObj->Type == IF_AND ); - // get the parameters of the best cut - // create a new node - pNodeNew = Abc_NtkCreateNode( pNtkNew ); - pCutBest = If_ObjCutBest( pIfObj ); - if ( pIfMan->pPars->fUseCnfs || pIfMan->pPars->fUseMv ) - { - If_CutForEachLeafReverse( pIfMan, pCutBest, pIfLeaf, i ) - Abc_ObjAddFanin( pNodeNew, Abc_NodeFromIf_rec(pNtkNew, pIfMan, pIfLeaf, vCover) ); - } - else - { - If_CutForEachLeaf( pIfMan, pCutBest, pIfLeaf, i ) - Abc_ObjAddFanin( pNodeNew, Abc_NodeFromIf_rec(pNtkNew, pIfMan, pIfLeaf, vCover) ); - } - // set the level of the new node - pNodeNew->Level = Abc_ObjLevelNew( pNodeNew ); - // derive the function of this node - if ( pIfMan->pPars->fTruth ) - { - if ( pIfMan->pPars->fUseBdds ) - { - // transform truth table into the BDD - pNodeNew->pData = Kit_TruthToBdd( pNtkNew->pManFunc, If_CutTruth(pCutBest), If_CutLeaveNum(pCutBest), 0 ); Cudd_Ref(pNodeNew->pData); - } - else if ( pIfMan->pPars->fUseCnfs || pIfMan->pPars->fUseMv ) - { - // transform truth table into the BDD - pNodeNew->pData = Kit_TruthToBdd( pNtkNew->pManFunc, If_CutTruth(pCutBest), If_CutLeaveNum(pCutBest), 1 ); Cudd_Ref(pNodeNew->pData); - } - else if ( pIfMan->pPars->fUseSops ) - { - // transform truth table into the SOP - int RetValue = Kit_TruthIsop( If_CutTruth(pCutBest), If_CutLeaveNum(pCutBest), vCover, 1 ); - assert( RetValue == 0 || RetValue == 1 ); - // check the case of constant cover - if ( Vec_IntSize(vCover) == 0 || (Vec_IntSize(vCover) == 1 && Vec_IntEntry(vCover,0) == 0) ) - { - assert( RetValue == 0 ); - pNodeNew->pData = Abc_SopCreateAnd( pNtkNew->pManFunc, If_CutLeaveNum(pCutBest), NULL ); - pNodeNew = (Vec_IntSize(vCover) == 0) ? Abc_NtkCreateNodeConst0(pNtkNew) : Abc_NtkCreateNodeConst1(pNtkNew); - } - else - { - // derive the AIG for that tree - pNodeNew->pData = Abc_SopCreateFromIsop( pNtkNew->pManFunc, If_CutLeaveNum(pCutBest), vCover ); - if ( RetValue ) - Abc_SopComplement( pNodeNew->pData ); - } - } - else - { - extern Hop_Obj_t * Kit_TruthToHop( Hop_Man_t * pMan, unsigned * pTruth, int nVars, Vec_Int_t * vMemory ); - pNodeNew->pData = Kit_TruthToHop( pNtkNew->pManFunc, If_CutTruth(pCutBest), If_CutLeaveNum(pCutBest), vCover ); - } - // complement the node if the cut was complemented - if ( pCutBest->fCompl ) - Abc_NodeComplement( pNodeNew ); - } - else - pNodeNew->pData = Abc_NodeIfToHop( pNtkNew->pManFunc, pIfMan, pIfObj ); - If_ObjSetCopy( pIfObj, pNodeNew ); - return pNodeNew; -} - -/**Function************************************************************* - - Synopsis [Recursively derives the truth table for the cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Hop_Obj_t * Abc_NodeIfToHop_rec( Hop_Man_t * pHopMan, If_Man_t * pIfMan, If_Obj_t * pIfObj, Vec_Ptr_t * vVisited ) -{ - If_Cut_t * pCut; - Hop_Obj_t * gFunc, * gFunc0, * gFunc1; - // get the best cut - pCut = If_ObjCutBest(pIfObj); - // if the cut is visited, return the result - if ( If_CutData(pCut) ) - return If_CutData(pCut); - // compute the functions of the children - gFunc0 = Abc_NodeIfToHop_rec( pHopMan, pIfMan, pIfObj->pFanin0, vVisited ); - gFunc1 = Abc_NodeIfToHop_rec( pHopMan, pIfMan, pIfObj->pFanin1, vVisited ); - // get the function of the cut - gFunc = Hop_And( pHopMan, Hop_NotCond(gFunc0, pIfObj->fCompl0), Hop_NotCond(gFunc1, pIfObj->fCompl1) ); - assert( If_CutData(pCut) == NULL ); - If_CutSetData( pCut, gFunc ); - // add this cut to the visited list - Vec_PtrPush( vVisited, pCut ); - return gFunc; -} - -/**Function************************************************************* - - Synopsis [Derives the truth table for one cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Hop_Obj_t * Abc_NodeIfToHop( Hop_Man_t * pHopMan, If_Man_t * pIfMan, If_Obj_t * pIfObj ) -{ - If_Cut_t * pCut; - Hop_Obj_t * gFunc; - If_Obj_t * pLeaf; - int i; - // get the best cut - pCut = If_ObjCutBest(pIfObj); - assert( pCut->nLeaves > 1 ); - // set the leaf variables - If_CutForEachLeaf( pIfMan, pCut, pLeaf, i ) - If_CutSetData( If_ObjCutBest(pLeaf), Hop_IthVar(pHopMan, i) ); - // recursively compute the function while collecting visited cuts - Vec_PtrClear( pIfMan->vTemp ); - gFunc = Abc_NodeIfToHop_rec( pHopMan, pIfMan, pIfObj, pIfMan->vTemp ); -// printf( "%d ", Vec_PtrSize(p->vTemp) ); - // clean the cuts - If_CutForEachLeaf( pIfMan, pCut, pLeaf, i ) - If_CutSetData( If_ObjCutBest(pLeaf), NULL ); - Vec_PtrForEachEntry( pIfMan->vTemp, pCut, i ) - If_CutSetData( pCut, NULL ); - return gFunc; -} - - -/**Function************************************************************* - - Synopsis [Comparison for two nodes with the flow.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_ObjCompareFlow( Abc_Obj_t ** ppNode0, Abc_Obj_t ** ppNode1 ) -{ - float Flow0 = Abc_Int2Float((int)(*ppNode0)->pCopy); - float Flow1 = Abc_Int2Float((int)(*ppNode1)->pCopy); - if ( Flow0 > Flow1 ) - return -1; - if ( Flow0 < Flow1 ) - return 1; - return 0; -} - -/**Function************************************************************* - - Synopsis [Orders AIG nodes so that nodes from larger cones go first.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFindGoodOrder_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes ) -{ - if ( !Abc_ObjIsNode(pNode) ) - return; - assert( Abc_ObjIsNode( pNode ) ); - // 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_NtkFindGoodOrder_rec( Abc_ObjFanin0(pNode), vNodes ); - Abc_NtkFindGoodOrder_rec( Abc_ObjFanin1(pNode), vNodes ); - // add the node after the fanins have been added - Vec_PtrPush( vNodes, pNode ); -} - -/**Function************************************************************* - - Synopsis [Orders AIG nodes so that nodes from larger cones go first.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NtkFindGoodOrder( Abc_Ntk_t * pNtk ) -{ - Vec_Ptr_t * vNodes, * vCos; - Abc_Obj_t * pNode, * pFanin0, * pFanin1; - float Flow0, Flow1; - int i; - - // initialize the flow - Abc_AigConst1(pNtk)->pCopy = NULL; - Abc_NtkForEachCi( pNtk, pNode, i ) - pNode->pCopy = NULL; - // compute the flow - Abc_AigForEachAnd( pNtk, pNode, i ) - { - pFanin0 = Abc_ObjFanin0(pNode); - pFanin1 = Abc_ObjFanin1(pNode); - Flow0 = Abc_Int2Float((int)pFanin0->pCopy)/Abc_ObjFanoutNum(pFanin0); - Flow1 = Abc_Int2Float((int)pFanin1->pCopy)/Abc_ObjFanoutNum(pFanin1); - pNode->pCopy = (Abc_Obj_t *)Abc_Float2Int(Flow0 + Flow1+(float)1.0); - } - // find the flow of the COs - vCos = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pNode, i ) - { - pNode->pCopy = Abc_ObjFanin0(pNode)->pCopy; -// pNode->pCopy = (Abc_Obj_t *)Abc_Float2Int((float)Abc_ObjFanin0(pNode)->Level); - Vec_PtrPush( vCos, pNode ); - } - - // sort nodes in the increasing order of the flow - qsort( (Abc_Obj_t **)Vec_PtrArray(vCos), Abc_NtkCoNum(pNtk), - sizeof(Abc_Obj_t *), (int (*)(const void *, const void *))Abc_ObjCompareFlow ); - // verify sorting - pFanin0 = Vec_PtrEntry(vCos, 0); - pFanin1 = Vec_PtrEntryLast(vCos); - assert( Abc_Int2Float((int)pFanin0->pCopy) >= Abc_Int2Float((int)pFanin1->pCopy) ); - - // collect the nodes in the topological order from the new array - Abc_NtkIncrementTravId( pNtk ); - vNodes = Vec_PtrAlloc( 100 ); - Vec_PtrForEachEntry( vCos, pNode, i ) - { - Abc_NtkFindGoodOrder_rec( Abc_ObjFanin0(pNode), vNodes ); -// printf( "%.2f ", Abc_Int2Float((int)pNode->pCopy) ); - } - Vec_PtrFree( vCos ); - return vNodes; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcIvy.c b/src/base/abci/abcIvy.c deleted file mode 100644 index b878091b..00000000 --- a/src/base/abci/abcIvy.c +++ /dev/null @@ -1,1101 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcIvy.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Strashing of the current network.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcIvy.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "dec.h" -#include "ivy.h" -#include "fraig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static Abc_Ntk_t * Abc_NtkFromIvy( Abc_Ntk_t * pNtkOld, Ivy_Man_t * pMan ); -static Abc_Ntk_t * Abc_NtkFromIvySeq( Abc_Ntk_t * pNtkOld, Ivy_Man_t * pMan, int fHaig ); -static Ivy_Man_t * Abc_NtkToIvy( Abc_Ntk_t * pNtkOld ); - -static void Abc_NtkStrashPerformAig( Abc_Ntk_t * pNtk, Ivy_Man_t * pMan ); -static Ivy_Obj_t * Abc_NodeStrashAig( Ivy_Man_t * pMan, Abc_Obj_t * pNode ); -static Ivy_Obj_t * Abc_NodeStrashAigSopAig( Ivy_Man_t * pMan, Abc_Obj_t * pNode, char * pSop ); -static Ivy_Obj_t * Abc_NodeStrashAigExorAig( Ivy_Man_t * pMan, Abc_Obj_t * pNode, char * pSop ); -static Ivy_Obj_t * Abc_NodeStrashAigFactorAig( Ivy_Man_t * pMan, Abc_Obj_t * pNode, char * pSop ); -extern char * Mio_GateReadSop( void * pGate ); - -typedef int Abc_Edge_t; -static inline Abc_Edge_t Abc_EdgeCreate( int Id, int fCompl ) { return (Id << 1) | fCompl; } -static inline int Abc_EdgeId( Abc_Edge_t Edge ) { return Edge >> 1; } -static inline int Abc_EdgeIsComplement( Abc_Edge_t Edge ) { return Edge & 1; } -static inline Abc_Edge_t Abc_EdgeRegular( Abc_Edge_t Edge ) { return (Edge >> 1) << 1; } -static inline Abc_Edge_t Abc_EdgeNot( Abc_Edge_t Edge ) { return Edge ^ 1; } -static inline Abc_Edge_t Abc_EdgeNotCond( Abc_Edge_t Edge, int fCond ) { return Edge ^ fCond; } -static inline Abc_Edge_t Abc_EdgeFromNode( Abc_Obj_t * pNode ) { return Abc_EdgeCreate( Abc_ObjRegular(pNode)->Id, Abc_ObjIsComplement(pNode) ); } -static inline Abc_Obj_t * Abc_EdgeToNode( Abc_Ntk_t * p, Abc_Edge_t Edge ) { return Abc_ObjNotCond( Abc_NtkObj(p, Abc_EdgeId(Edge)), Abc_EdgeIsComplement(Edge) ); } - -static inline Abc_Obj_t * Abc_ObjFanin0Ivy( Abc_Ntk_t * p, Ivy_Obj_t * pObj ) { return Abc_ObjNotCond( Abc_EdgeToNode(p, Ivy_ObjFanin0(pObj)->TravId), Ivy_ObjFaninC0(pObj) ); } -static inline Abc_Obj_t * Abc_ObjFanin1Ivy( Abc_Ntk_t * p, Ivy_Obj_t * pObj ) { return Abc_ObjNotCond( Abc_EdgeToNode(p, Ivy_ObjFanin1(pObj)->TravId), Ivy_ObjFaninC1(pObj) ); } - -static Vec_Int_t * Abc_NtkCollectLatchValuesIvy( Abc_Ntk_t * pNtk, int fUseDcs ); - -extern int timeRetime; - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Prepares the IVY package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Ivy_Man_t * Abc_NtkIvyBefore( Abc_Ntk_t * pNtk, int fSeq, int fUseDc ) -{ - Ivy_Man_t * pMan; - int fCleanup = 1; -//timeRetime = clock(); - assert( !Abc_NtkIsNetlist(pNtk) ); - if ( Abc_NtkIsBddLogic(pNtk) ) - { - if ( !Abc_NtkBddToSop(pNtk, 0) ) - { - printf( "Abc_NtkIvyBefore(): Converting to SOPs has failed.\n" ); - return NULL; - } - } - if ( fSeq && Abc_NtkCountSelfFeedLatches(pNtk) ) - { - printf( "Warning: The network has %d self-feeding latches.\n", Abc_NtkCountSelfFeedLatches(pNtk) ); -// return NULL; - } - // print warning about choice nodes - if ( Abc_NtkGetChoiceNum( pNtk ) ) - printf( "Warning: The choice nodes in the initial AIG are removed by strashing.\n" ); - // convert to the AIG manager - pMan = Abc_NtkToIvy( pNtk ); - if ( !Ivy_ManCheck( pMan ) ) - { - printf( "AIG check has failed.\n" ); - Ivy_ManStop( pMan ); - return NULL; - } -// Ivy_ManPrintStats( pMan ); - if ( fSeq ) - { - int nLatches = Abc_NtkLatchNum(pNtk); - Vec_Int_t * vInit = Abc_NtkCollectLatchValuesIvy( pNtk, fUseDc ); - Ivy_ManMakeSeq( pMan, nLatches, vInit->pArray ); - Vec_IntFree( vInit ); -// Ivy_ManPrintStats( pMan ); - } -//timeRetime = clock() - timeRetime; - return pMan; -} - -/**Function************************************************************* - - Synopsis [Prepares the IVY package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkIvyAfter( Abc_Ntk_t * pNtk, Ivy_Man_t * pMan, int fSeq, int fHaig ) -{ - Abc_Ntk_t * pNtkAig; - int nNodes, fCleanup = 1; - // convert from the AIG manager - if ( fSeq ) - pNtkAig = Abc_NtkFromIvySeq( pNtk, pMan, fHaig ); - else - pNtkAig = Abc_NtkFromIvy( pNtk, pMan ); - // report the cleanup results - if ( !fHaig && fCleanup && (nNodes = Abc_AigCleanup(pNtkAig->pManFunc)) ) - printf( "Warning: AIG cleanup removed %d nodes (this is not a bug).\n", nNodes ); - // duplicate EXDC - if ( pNtk->pExdc ) - pNtkAig->pExdc = Abc_NtkDup( pNtk->pExdc ); - // make sure everything is okay - if ( !Abc_NtkCheck( pNtkAig ) ) - { - printf( "Abc_NtkStrash: The network check has failed.\n" ); - Abc_NtkDelete( pNtkAig ); - return NULL; - } - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkIvyStrash( Abc_Ntk_t * pNtk ) -{ - Abc_Ntk_t * pNtkAig; - Ivy_Man_t * pMan; - pMan = Abc_NtkIvyBefore( pNtk, 1, 0 ); - if ( pMan == NULL ) - return NULL; - pNtkAig = Abc_NtkIvyAfter( pNtk, pMan, 1, 0 ); - Ivy_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkIvyHaig( Abc_Ntk_t * pNtk, int nIters, int fUseZeroCost, int fVerbose ) -{ - Abc_Ntk_t * pNtkAig; - Ivy_Man_t * pMan; - int clk; -// int i; -/* -extern int nMoves; -extern int nMovesS; -extern int nClauses; -extern int timeInv; - -nMoves = 0; -nMovesS = 0; -nClauses = 0; -timeInv = 0; -*/ - pMan = Abc_NtkIvyBefore( pNtk, 1, 1 ); - if ( pMan == NULL ) - return NULL; -//timeRetime = clock(); - -clk = clock(); - Ivy_ManHaigStart( pMan, fVerbose ); -// Ivy_ManRewriteSeq( pMan, 0, 0 ); -// for ( i = 0; i < nIters; i++ ) -// Ivy_ManRewriteSeq( pMan, fUseZeroCost, 0 ); - -//printf( "%d ", Ivy_ManNodeNum(pMan) ); - Ivy_ManRewriteSeq( pMan, 0, 0 ); - Ivy_ManRewriteSeq( pMan, 0, 0 ); - Ivy_ManRewriteSeq( pMan, 1, 0 ); -//printf( "%d ", Ivy_ManNodeNum(pMan) ); -//printf( "%d ", Ivy_ManNodeNum(pMan->pHaig) ); -//PRT( " ", clock() - clk ); -//printf( "\n" ); -/* - printf( "Moves = %d. ", nMoves ); - printf( "MovesS = %d. ", nMovesS ); - printf( "Clauses = %d. ", nClauses ); - PRT( "Time", timeInv ); -*/ -// Ivy_ManRewriteSeq( pMan, 1, 0 ); -//printf( "Haig size = %d.\n", Ivy_ManNodeNum(pMan->pHaig) ); -// Ivy_ManHaigPostprocess( pMan, fVerbose ); -//timeRetime = clock() - timeRetime; - - // write working AIG into the current network -// pNtkAig = Abc_NtkIvyAfter( pNtk, pMan, 1, 0 ); - // write HAIG into the current network - pNtkAig = Abc_NtkIvyAfter( pNtk, pMan->pHaig, 1, 1 ); - - Ivy_ManHaigStop( pMan ); - Ivy_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkIvyCuts( Abc_Ntk_t * pNtk, int nInputs ) -{ - extern void Ivy_CutComputeAll( Ivy_Man_t * p, int nInputs ); - Ivy_Man_t * pMan; - pMan = Abc_NtkIvyBefore( pNtk, 1, 0 ); - if ( pMan == NULL ) - return; - Ivy_CutComputeAll( pMan, nInputs ); - Ivy_ManStop( pMan ); -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkIvyRewrite( Abc_Ntk_t * pNtk, int fUpdateLevel, int fUseZeroCost, int fVerbose ) -{ - Abc_Ntk_t * pNtkAig; - Ivy_Man_t * pMan; - pMan = Abc_NtkIvyBefore( pNtk, 0, 0 ); - if ( pMan == NULL ) - return NULL; -//timeRetime = clock(); - Ivy_ManRewritePre( pMan, fUpdateLevel, fUseZeroCost, fVerbose ); -//timeRetime = clock() - timeRetime; - pNtkAig = Abc_NtkIvyAfter( pNtk, pMan, 0, 0 ); - Ivy_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkIvyRewriteSeq( Abc_Ntk_t * pNtk, int fUseZeroCost, int fVerbose ) -{ - Abc_Ntk_t * pNtkAig; - Ivy_Man_t * pMan; - pMan = Abc_NtkIvyBefore( pNtk, 1, 1 ); - if ( pMan == NULL ) - return NULL; -//timeRetime = clock(); - Ivy_ManRewriteSeq( pMan, fUseZeroCost, fVerbose ); -//timeRetime = clock() - timeRetime; -// Ivy_ManRewriteSeq( pMan, 1, 0 ); -// Ivy_ManRewriteSeq( pMan, 1, 0 ); - pNtkAig = Abc_NtkIvyAfter( pNtk, pMan, 1, 0 ); - Ivy_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkIvyResyn0( Abc_Ntk_t * pNtk, int fUpdateLevel, int fVerbose ) -{ - Abc_Ntk_t * pNtkAig; - Ivy_Man_t * pMan, * pTemp; - pMan = Abc_NtkIvyBefore( pNtk, 0, 0 ); - if ( pMan == NULL ) - return NULL; - pMan = Ivy_ManResyn0( pTemp = pMan, fUpdateLevel, fVerbose ); - Ivy_ManStop( pTemp ); - pNtkAig = Abc_NtkIvyAfter( pNtk, pMan, 0, 0 ); - Ivy_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkIvyResyn( Abc_Ntk_t * pNtk, int fUpdateLevel, int fVerbose ) -{ - Abc_Ntk_t * pNtkAig; - Ivy_Man_t * pMan, * pTemp; - pMan = Abc_NtkIvyBefore( pNtk, 0, 0 ); - if ( pMan == NULL ) - return NULL; - pMan = Ivy_ManResyn( pTemp = pMan, fUpdateLevel, fVerbose ); - Ivy_ManStop( pTemp ); - pNtkAig = Abc_NtkIvyAfter( pNtk, pMan, 0, 0 ); - Ivy_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkIvySat( Abc_Ntk_t * pNtk, int nConfLimit, int fVerbose ) -{ - Ivy_FraigParams_t Params, * pParams = &Params; - Abc_Ntk_t * pNtkAig; - Ivy_Man_t * pMan, * pTemp; - pMan = Abc_NtkIvyBefore( pNtk, 0, 0 ); - if ( pMan == NULL ) - return NULL; - Ivy_FraigParamsDefault( pParams ); - pParams->nBTLimitMiter = nConfLimit; - pParams->fVerbose = fVerbose; -// pMan = Ivy_FraigPerform( pTemp = pMan, pParams ); - pMan = Ivy_FraigMiter( pTemp = pMan, pParams ); - Ivy_ManStop( pTemp ); - pNtkAig = Abc_NtkIvyAfter( pNtk, pMan, 0, 0 ); - Ivy_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Sets the final nodes to point to the original nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkTransferPointers( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkAig ) -{ - Abc_Obj_t * pObj; - Ivy_Obj_t * pObjIvy, * pObjFraig; - int i; - pObj = Abc_AigConst1(pNtk); - pObj->pCopy = Abc_AigConst1(pNtkAig); - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pCopy = Abc_NtkCi(pNtkAig, i); - Abc_NtkForEachCo( pNtk, pObj, i ) - pObj->pCopy = Abc_NtkCo(pNtkAig, i); - Abc_NtkForEachLatch( pNtk, pObj, i ) - pObj->pCopy = Abc_NtkBox(pNtkAig, i); - Abc_NtkForEachNode( pNtk, pObj, i ) - { - pObjIvy = (Ivy_Obj_t *)pObj->pCopy; - if ( pObjIvy == NULL ) - continue; - pObjFraig = Ivy_ObjEquiv( pObjIvy ); - if ( pObjFraig == NULL ) - continue; - pObj->pCopy = Abc_EdgeToNode( pNtkAig, Ivy_Regular(pObjFraig)->TravId ); - pObj->pCopy = Abc_ObjNotCond( pObj->pCopy, Ivy_IsComplement(pObjFraig) ); - } -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkIvyFraig( Abc_Ntk_t * pNtk, int nConfLimit, int fDoSparse, int fProve, int fTransfer, int fVerbose ) -{ - Ivy_FraigParams_t Params, * pParams = &Params; - Abc_Ntk_t * pNtkAig; - Ivy_Man_t * pMan, * pTemp; - pMan = Abc_NtkIvyBefore( pNtk, 0, 0 ); - if ( pMan == NULL ) - return NULL; - Ivy_FraigParamsDefault( pParams ); - pParams->nBTLimitNode = nConfLimit; - pParams->fVerbose = fVerbose; - pParams->fProve = fProve; - pParams->fDoSparse = fDoSparse; - pMan = Ivy_FraigPerform( pTemp = pMan, pParams ); - // transfer the pointers - if ( fTransfer == 1 ) - { - Vec_Ptr_t * vCopies; - vCopies = Abc_NtkSaveCopy( pNtk ); - pNtkAig = Abc_NtkIvyAfter( pNtk, pMan, 0, 0 ); - Abc_NtkLoadCopy( pNtk, vCopies ); - Vec_PtrFree( vCopies ); - Abc_NtkTransferPointers( pNtk, pNtkAig ); - } - else - pNtkAig = Abc_NtkIvyAfter( pNtk, pMan, 0, 0 ); - Ivy_ManStop( pTemp ); - Ivy_ManStop( pMan ); - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkIvyProve( Abc_Ntk_t ** ppNtk, void * pPars ) -{ - Prove_Params_t * pParams = pPars; - Abc_Ntk_t * pNtk = *ppNtk, * pNtkTemp; - Abc_Obj_t * pObj, * pFanin; - Ivy_Man_t * pMan; - int RetValue; - assert( Abc_NtkIsStrash(pNtk) || Abc_NtkIsLogic(pNtk) ); - // experiment with various parameters settings -// pParams->fUseBdds = 1; -// pParams->fBddReorder = 1; -// pParams->nTotalBacktrackLimit = 10000; - - // strash the network if it is not strashed already - if ( !Abc_NtkIsStrash(pNtk) ) - { - pNtk = Abc_NtkStrash( pNtkTemp = pNtk, 0, 1, 0 ); - Abc_NtkDelete( pNtkTemp ); - } - - // check the case when the 0000 simulation pattern detect the bug - pObj = Abc_NtkPo(pNtk,0); - pFanin = Abc_ObjFanin0(pObj); - if ( Abc_ObjFanin0(pObj)->fPhase != (unsigned)Abc_ObjFaninC0(pObj) ) - { - pNtk->pModel = ALLOC( int, Abc_NtkPiNum(pNtk) ); - memset( pNtk->pModel, 0, sizeof(int) * Abc_NtkPiNum(pNtk) ); - return 0; - } - - // if SAT only, solve without iteration - RetValue = Abc_NtkMiterSat( pNtk, 2*(sint64)pParams->nMiteringLimitStart, (sint64)0, 0, NULL, NULL ); - if ( RetValue >= 0 ) - return RetValue; - - // apply AIG rewriting - if ( pParams->fUseRewriting && Abc_NtkNodeNum(pNtk) > 500 ) - { - pParams->fUseRewriting = 0; - pNtk = Abc_NtkBalance( pNtkTemp = pNtk, 0, 0, 0 ); - Abc_NtkDelete( pNtkTemp ); - Abc_NtkRewrite( pNtk, 0, 0, 0, 0, 0 ); - pNtk = Abc_NtkBalance( pNtkTemp = pNtk, 0, 0, 0 ); - Abc_NtkDelete( pNtkTemp ); - Abc_NtkRewrite( pNtk, 0, 0, 0, 0, 0 ); - Abc_NtkRefactor( pNtk, 10, 16, 0, 0, 0, 0 ); - } - - // convert ABC network into IVY network - pMan = Abc_NtkIvyBefore( pNtk, 0, 0 ); - - // solve the CEC problem - RetValue = Ivy_FraigProve( &pMan, pParams ); - // convert IVY network into ABC network - pNtk = Abc_NtkIvyAfter( pNtkTemp = pNtk, pMan, 0, 0 ); - Abc_NtkDelete( pNtkTemp ); - // transfer model if given - pNtk->pModel = pMan->pData; pMan->pData = NULL; - Ivy_ManStop( pMan ); - - // try to prove it using brute force SAT - if ( RetValue < 0 && pParams->fUseBdds ) - { - if ( pParams->fVerbose ) - { - printf( "Attempting BDDs with node limit %d ...\n", pParams->nBddSizeLimit ); - fflush( stdout ); - } - pNtk = Abc_NtkCollapse( pNtkTemp = pNtk, pParams->nBddSizeLimit, 0, pParams->fBddReorder, 0 ); - if ( pNtk ) - { - Abc_NtkDelete( pNtkTemp ); - RetValue = ( (Abc_NtkNodeNum(pNtk) == 1) && (Abc_ObjFanin0(Abc_NtkPo(pNtk,0))->pData == Cudd_ReadLogicZero(pNtk->pManFunc)) ); - } - else - pNtk = pNtkTemp; - } - - // return the result - *ppNtk = pNtk; - return RetValue; -} - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkIvy( Abc_Ntk_t * pNtk ) -{ -// Abc_Ntk_t * pNtkAig; - Ivy_Man_t * pMan;//, * pTemp; - int fCleanup = 1; -// int nNodes; - int nLatches = Abc_NtkLatchNum(pNtk); - Vec_Int_t * vInit = Abc_NtkCollectLatchValuesIvy( pNtk, 0 ); - - assert( !Abc_NtkIsNetlist(pNtk) ); - if ( Abc_NtkIsBddLogic(pNtk) ) - { - if ( !Abc_NtkBddToSop(pNtk, 0) ) - { - Vec_IntFree( vInit ); - printf( "Abc_NtkIvy(): Converting to SOPs has failed.\n" ); - return NULL; - } - } - if ( Abc_NtkCountSelfFeedLatches(pNtk) ) - { - printf( "Warning: The network has %d self-feeding latches. Quitting.\n", Abc_NtkCountSelfFeedLatches(pNtk) ); - return NULL; - } - - // print warning about choice nodes - if ( Abc_NtkGetChoiceNum( pNtk ) ) - printf( "Warning: The choice nodes in the initial AIG are removed by strashing.\n" ); - - // convert to the AIG manager - pMan = Abc_NtkToIvy( pNtk ); - if ( !Ivy_ManCheck( pMan ) ) - { - Vec_IntFree( vInit ); - printf( "AIG check has failed.\n" ); - Ivy_ManStop( pMan ); - return NULL; - } - -// Ivy_MffcTest( pMan ); -// Ivy_ManPrintStats( pMan ); - -// pMan = Ivy_ManBalance( pTemp = pMan, 1 ); -// Ivy_ManStop( pTemp ); - -// Ivy_ManSeqRewrite( pMan, 0, 0 ); -// Ivy_ManTestCutsAlg( pMan ); -// Ivy_ManTestCutsBool( pMan ); -// Ivy_ManRewriteAlg( pMan, 1, 1 ); - -// pMan = Ivy_ManResyn( pTemp = pMan, 1, 0 ); -// Ivy_ManStop( pTemp ); - -// Ivy_ManTestCutsAll( pMan ); -// Ivy_ManTestCutsTravAll( pMan ); - -// Ivy_ManPrintStats( pMan ); - -// Ivy_ManPrintStats( pMan ); -// Ivy_ManRewritePre( pMan, 1, 0, 0 ); -// Ivy_ManPrintStats( pMan ); -// printf( "\n" ); - -// Ivy_ManPrintStats( pMan ); -// Ivy_ManMakeSeq( pMan, nLatches, pInit ); -// Ivy_ManPrintStats( pMan ); - -// Ivy_ManRequiredLevels( pMan ); - -// Ivy_FastMapPerform( pMan, 8 ); - Ivy_ManStop( pMan ); - return NULL; - - -/* - // convert from the AIG manager - pNtkAig = Abc_NtkFromIvy( pNtk, pMan ); -// pNtkAig = Abc_NtkFromIvySeq( pNtk, pMan ); - Ivy_ManStop( pMan ); - - // report the cleanup results - if ( fCleanup && (nNodes = Abc_AigCleanup(pNtkAig->pManFunc)) ) - printf( "Warning: AIG cleanup removed %d nodes (this is not a bug).\n", nNodes ); - // duplicate EXDC - if ( pNtk->pExdc ) - pNtkAig->pExdc = Abc_NtkDup( pNtk->pExdc ); - // make sure everything is okay - if ( !Abc_NtkCheck( pNtkAig ) ) - { - FREE( pInit ); - printf( "Abc_NtkStrash: The network check has failed.\n" ); - Abc_NtkDelete( pNtkAig ); - return NULL; - } - - FREE( pInit ); - return pNtkAig; -*/ -} - - - -/**Function************************************************************* - - Synopsis [Converts the network from the AIG manager into ABC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromIvy( Abc_Ntk_t * pNtkOld, Ivy_Man_t * pMan ) -{ - Vec_Int_t * vNodes; - Abc_Ntk_t * pNtk; - Abc_Obj_t * pObj, * pObjNew, * pFaninNew, * pFaninNew0, * pFaninNew1; - Ivy_Obj_t * pNode; - int i; - // perform strashing - pNtk = Abc_NtkStartFrom( pNtkOld, ABC_NTK_STRASH, ABC_FUNC_AIG ); - // transfer the pointers to the basic nodes - Ivy_ManConst1(pMan)->TravId = Abc_EdgeFromNode( Abc_AigConst1(pNtk) ); - Abc_NtkForEachCi( pNtkOld, pObj, i ) - Ivy_ManPi(pMan, i)->TravId = Abc_EdgeFromNode( pObj->pCopy ); - // rebuild the AIG - vNodes = Ivy_ManDfs( pMan ); - Ivy_ManForEachNodeVec( pMan, vNodes, pNode, i ) - { - // add the first fanin - pFaninNew0 = Abc_ObjFanin0Ivy( pNtk, pNode ); - if ( Ivy_ObjIsBuf(pNode) ) - { - pNode->TravId = Abc_EdgeFromNode( pFaninNew0 ); - continue; - } - // add the second fanin - pFaninNew1 = Abc_ObjFanin1Ivy( pNtk, pNode ); - // create the new node - if ( Ivy_ObjIsExor(pNode) ) - pObjNew = Abc_AigXor( pNtk->pManFunc, pFaninNew0, pFaninNew1 ); - else - pObjNew = Abc_AigAnd( pNtk->pManFunc, pFaninNew0, pFaninNew1 ); - pNode->TravId = Abc_EdgeFromNode( pObjNew ); - } - // connect the PO nodes - Abc_NtkForEachCo( pNtkOld, pObj, i ) - { - pFaninNew = Abc_ObjFanin0Ivy( pNtk, Ivy_ManPo(pMan, i) ); - Abc_ObjAddFanin( pObj->pCopy, pFaninNew ); - } - Vec_IntFree( vNodes ); - if ( !Abc_NtkCheck( pNtk ) ) - fprintf( stdout, "Abc_NtkFromIvy(): Network check has failed.\n" ); - return pNtk; -} - -/**Function************************************************************* - - Synopsis [Converts the network from the AIG manager into ABC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromIvySeq( Abc_Ntk_t * pNtkOld, Ivy_Man_t * pMan, int fHaig ) -{ - Vec_Int_t * vNodes, * vLatches; - Abc_Ntk_t * pNtk; - Abc_Obj_t * pObj, * pObjNew, * pFaninNew, * pFaninNew0, * pFaninNew1; - Ivy_Obj_t * pNode, * pTemp; - int i; -// assert( Ivy_ManLatchNum(pMan) > 0 ); - // perform strashing - pNtk = Abc_NtkStartFromNoLatches( pNtkOld, ABC_NTK_STRASH, ABC_FUNC_AIG ); - // transfer the pointers to the basic nodes - Ivy_ManConst1(pMan)->TravId = Abc_EdgeFromNode( Abc_AigConst1(pNtk) ); - Abc_NtkForEachPi( pNtkOld, pObj, i ) - Ivy_ManPi(pMan, i)->TravId = Abc_EdgeFromNode( pObj->pCopy ); - // create latches of the new network - vNodes = Ivy_ManDfsSeq( pMan, &vLatches ); - Ivy_ManForEachNodeVec( pMan, vLatches, pNode, i ) - { - pObjNew = Abc_NtkCreateLatch( pNtk ); - pFaninNew0 = Abc_NtkCreateBi( pNtk ); - pFaninNew1 = Abc_NtkCreateBo( pNtk ); - Abc_ObjAddFanin( pObjNew, pFaninNew0 ); - Abc_ObjAddFanin( pFaninNew1, pObjNew ); - if ( fHaig || Ivy_ObjInit(pNode) == IVY_INIT_DC ) - Abc_LatchSetInitDc( pObjNew ); - else if ( Ivy_ObjInit(pNode) == IVY_INIT_1 ) - Abc_LatchSetInit1( pObjNew ); - else if ( Ivy_ObjInit(pNode) == IVY_INIT_0 ) - Abc_LatchSetInit0( pObjNew ); - else assert( 0 ); - pNode->TravId = Abc_EdgeFromNode( pFaninNew1 ); - } - Abc_NtkAddDummyBoxNames( pNtk ); - // rebuild the AIG - Ivy_ManForEachNodeVec( pMan, vNodes, pNode, i ) - { - // add the first fanin - pFaninNew0 = Abc_ObjFanin0Ivy( pNtk, pNode ); - if ( Ivy_ObjIsBuf(pNode) ) - { - pNode->TravId = Abc_EdgeFromNode( pFaninNew0 ); - continue; - } - // add the second fanin - pFaninNew1 = Abc_ObjFanin1Ivy( pNtk, pNode ); - // create the new node - if ( Ivy_ObjIsExor(pNode) ) - pObjNew = Abc_AigXor( pNtk->pManFunc, pFaninNew0, pFaninNew1 ); - else - pObjNew = Abc_AigAnd( pNtk->pManFunc, pFaninNew0, pFaninNew1 ); - pNode->TravId = Abc_EdgeFromNode( pObjNew ); - // process the choice nodes - if ( fHaig && pNode->pEquiv && Ivy_ObjRefs(pNode) > 0 ) - { - pFaninNew = Abc_EdgeToNode( pNtk, pNode->TravId ); -// pFaninNew->fPhase = 0; - assert( !Ivy_IsComplement(pNode->pEquiv) ); - for ( pTemp = pNode->pEquiv; pTemp != pNode; pTemp = Ivy_Regular(pTemp->pEquiv) ) - { - pFaninNew1 = Abc_EdgeToNode( pNtk, pTemp->TravId ); -// pFaninNew1->fPhase = Ivy_IsComplement( pTemp->pEquiv ); - pFaninNew->pData = pFaninNew1; - pFaninNew = pFaninNew1; - } - pFaninNew->pData = NULL; -// printf( "Writing choice node %d.\n", pNode->Id ); - } - } - // connect the PO nodes - Abc_NtkForEachPo( pNtkOld, pObj, i ) - { - pFaninNew = Abc_ObjFanin0Ivy( pNtk, Ivy_ManPo(pMan, i) ); - Abc_ObjAddFanin( pObj->pCopy, pFaninNew ); - } - // connect the latches - Ivy_ManForEachNodeVec( pMan, vLatches, pNode, i ) - { - pFaninNew = Abc_ObjFanin0Ivy( pNtk, pNode ); - Abc_ObjAddFanin( Abc_ObjFanin0(Abc_NtkBox(pNtk, i)), pFaninNew ); - } - Vec_IntFree( vLatches ); - Vec_IntFree( vNodes ); - if ( !Abc_NtkCheck( pNtk ) ) - fprintf( stdout, "Abc_NtkFromIvySeq(): Network check has failed.\n" ); - return pNtk; -} - -/**Function************************************************************* - - Synopsis [Converts the network from the AIG manager into ABC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Ivy_Man_t * Abc_NtkToIvy( Abc_Ntk_t * pNtkOld ) -{ - Ivy_Man_t * pMan; - Abc_Obj_t * pObj; - Ivy_Obj_t * pFanin; - int i; - // create the manager - assert( Abc_NtkHasSop(pNtkOld) || Abc_NtkIsStrash(pNtkOld) ); - pMan = Ivy_ManStart(); - // create the PIs - if ( Abc_NtkIsStrash(pNtkOld) ) - Abc_AigConst1(pNtkOld)->pCopy = (Abc_Obj_t *)Ivy_ManConst1(pMan); - Abc_NtkForEachCi( pNtkOld, pObj, i ) - pObj->pCopy = (Abc_Obj_t *)Ivy_ObjCreatePi(pMan); - // perform the conversion of the internal nodes - Abc_NtkStrashPerformAig( pNtkOld, pMan ); - // create the POs - Abc_NtkForEachCo( pNtkOld, pObj, i ) - { - pFanin = (Ivy_Obj_t *)Abc_ObjFanin0(pObj)->pCopy; - pFanin = Ivy_NotCond( pFanin, Abc_ObjFaninC0(pObj) ); - Ivy_ObjCreatePo( pMan, pFanin ); - } - Ivy_ManCleanup( pMan ); - return pMan; -} - -/**Function************************************************************* - - Synopsis [Prepares the network for strashing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkStrashPerformAig( Abc_Ntk_t * pNtk, Ivy_Man_t * pMan ) -{ -// ProgressBar * pProgress; - Vec_Ptr_t * vNodes; - Abc_Obj_t * pNode; - int i; - vNodes = Abc_NtkDfs( pNtk, 0 ); -// pProgress = Extra_ProgressBarStart( stdout, vNodes->nSize ); - Vec_PtrForEachEntry( vNodes, pNode, i ) - { -// Extra_ProgressBarUpdate( pProgress, i, NULL ); - pNode->pCopy = (Abc_Obj_t *)Abc_NodeStrashAig( pMan, pNode ); - } -// Extra_ProgressBarStop( pProgress ); - Vec_PtrFree( vNodes ); -} - -/**Function************************************************************* - - Synopsis [Strashes one logic node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Ivy_Obj_t * Abc_NodeStrashAig( Ivy_Man_t * pMan, Abc_Obj_t * pNode ) -{ - int fUseFactor = 1; - char * pSop; - Ivy_Obj_t * pFanin0, * pFanin1; - - assert( Abc_ObjIsNode(pNode) ); - - // consider the case when the graph is an AIG - if ( Abc_NtkIsStrash(pNode->pNtk) ) - { - if ( Abc_AigNodeIsConst(pNode) ) - return Ivy_ManConst1(pMan); - pFanin0 = (Ivy_Obj_t *)Abc_ObjFanin0(pNode)->pCopy; - pFanin0 = Ivy_NotCond( pFanin0, Abc_ObjFaninC0(pNode) ); - pFanin1 = (Ivy_Obj_t *)Abc_ObjFanin1(pNode)->pCopy; - pFanin1 = Ivy_NotCond( pFanin1, Abc_ObjFaninC1(pNode) ); - return Ivy_And( pMan, pFanin0, pFanin1 ); - } - - // get the SOP of the node - if ( Abc_NtkHasMapping(pNode->pNtk) ) - pSop = Mio_GateReadSop(pNode->pData); - else - pSop = pNode->pData; - - // consider the constant node - if ( Abc_NodeIsConst(pNode) ) - return Ivy_NotCond( Ivy_ManConst1(pMan), Abc_SopIsConst0(pSop) ); - - // consider the special case of EXOR function - if ( Abc_SopIsExorType(pSop) ) - return Abc_NodeStrashAigExorAig( pMan, pNode, pSop ); - - // decide when to use factoring - if ( fUseFactor && Abc_ObjFaninNum(pNode) > 2 && Abc_SopGetCubeNum(pSop) > 1 ) - return Abc_NodeStrashAigFactorAig( pMan, pNode, pSop ); - return Abc_NodeStrashAigSopAig( pMan, pNode, pSop ); -} - -/**Function************************************************************* - - Synopsis [Strashes one logic node using its SOP.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Ivy_Obj_t * Abc_NodeStrashAigSopAig( Ivy_Man_t * pMan, Abc_Obj_t * pNode, char * pSop ) -{ - Abc_Obj_t * pFanin; - Ivy_Obj_t * pAnd, * pSum; - char * pCube; - int i, nFanins; - - // get the number of node's fanins - nFanins = Abc_ObjFaninNum( pNode ); - assert( nFanins == Abc_SopGetVarNum(pSop) ); - // go through the cubes of the node's SOP - pSum = Ivy_Not( Ivy_ManConst1(pMan) ); - Abc_SopForEachCube( pSop, nFanins, pCube ) - { - // create the AND of literals - pAnd = Ivy_ManConst1(pMan); - Abc_ObjForEachFanin( pNode, pFanin, i ) // pFanin can be a net - { - if ( pCube[i] == '1' ) - pAnd = Ivy_And( pMan, pAnd, (Ivy_Obj_t *)pFanin->pCopy ); - else if ( pCube[i] == '0' ) - pAnd = Ivy_And( pMan, pAnd, Ivy_Not((Ivy_Obj_t *)pFanin->pCopy) ); - } - // add to the sum of cubes - pSum = Ivy_Or( pMan, pSum, pAnd ); - } - // decide whether to complement the result - if ( Abc_SopIsComplement(pSop) ) - pSum = Ivy_Not(pSum); - return pSum; -} - -/**Function************************************************************* - - Synopsis [Strashed n-input XOR function.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Ivy_Obj_t * Abc_NodeStrashAigExorAig( Ivy_Man_t * pMan, Abc_Obj_t * pNode, char * pSop ) -{ - Abc_Obj_t * pFanin; - Ivy_Obj_t * pSum; - int i, nFanins; - // get the number of node's fanins - nFanins = Abc_ObjFaninNum( pNode ); - assert( nFanins == Abc_SopGetVarNum(pSop) ); - // go through the cubes of the node's SOP - pSum = Ivy_Not( Ivy_ManConst1(pMan) ); - for ( i = 0; i < nFanins; i++ ) - { - pFanin = Abc_ObjFanin( pNode, i ); - pSum = Ivy_Exor( pMan, pSum, (Ivy_Obj_t *)pFanin->pCopy ); - } - if ( Abc_SopIsComplement(pSop) ) - pSum = Ivy_Not(pSum); - return pSum; -} - -/**Function************************************************************* - - Synopsis [Strashes one logic node using its SOP.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Ivy_Obj_t * Abc_NodeStrashAigFactorAig( Ivy_Man_t * pMan, Abc_Obj_t * pRoot, char * pSop ) -{ - Dec_Graph_t * pFForm; - Dec_Node_t * pNode; - Ivy_Obj_t * pAnd; - int i; - -// extern Ivy_Obj_t * Dec_GraphToNetworkAig( Ivy_Man_t * pMan, Dec_Graph_t * pGraph ); - extern Ivy_Obj_t * Dec_GraphToNetworkIvy( Ivy_Man_t * pMan, Dec_Graph_t * pGraph ); - -// assert( 0 ); - - // perform factoring - pFForm = Dec_Factor( pSop ); - // collect the fanins - Dec_GraphForEachLeaf( pFForm, pNode, i ) - pNode->pFunc = Abc_ObjFanin(pRoot,i)->pCopy; - // perform strashing -// pAnd = Dec_GraphToNetworkAig( pMan, pFForm ); - pAnd = Dec_GraphToNetworkIvy( pMan, pFForm ); -// pAnd = NULL; - - Dec_GraphFree( pFForm ); - return pAnd; -} - -/**Function************************************************************* - - Synopsis [Strashes one logic node using its SOP.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Int_t * Abc_NtkCollectLatchValuesIvy( Abc_Ntk_t * pNtk, int fUseDcs ) -{ - Abc_Obj_t * pLatch; - Vec_Int_t * vArray; - int i; - vArray = Vec_IntAlloc( Abc_NtkLatchNum(pNtk) ); - Abc_NtkForEachLatch( pNtk, pLatch, i ) - { - if ( fUseDcs || Abc_LatchIsInitDc(pLatch) ) - Vec_IntPush( vArray, IVY_INIT_DC ); - else if ( Abc_LatchIsInit1(pLatch) ) - Vec_IntPush( vArray, IVY_INIT_1 ); - else if ( Abc_LatchIsInit0(pLatch) ) - Vec_IntPush( vArray, IVY_INIT_0 ); - else assert( 0 ); - } - return vArray; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcLut.c b/src/base/abci/abcLut.c deleted file mode 100644 index afa76cc8..00000000 --- a/src/base/abci/abcLut.c +++ /dev/null @@ -1,786 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcLut.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Superchoicing for K-LUTs.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcLut.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "cut.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -#define SCL_LUT_MAX 6 // the maximum LUT size -#define SCL_VARS_MAX 15 // the maximum number of variables -#define SCL_NODE_MAX 1000 // the maximum number of nodes - -typedef struct Abc_ManScl_t_ Abc_ManScl_t; -struct Abc_ManScl_t_ -{ - // paramers - int nLutSize; // the LUT size - int nCutSizeMax; // the max number of leaves of the cone - int nNodesMax; // the max number of divisors in the cone - int nWords; // the number of machine words in sim info - // structural representation of the cone - Vec_Ptr_t * vLeaves; // leaves of the cut - Vec_Ptr_t * vVolume; // volume of the cut - int pBSet[SCL_VARS_MAX]; // bound set - // functional representation of the cone - unsigned * uTruth; // truth table of the cone - // representation of truth tables - unsigned ** uVars; // elementary truth tables - unsigned ** uSims; // truth tables of the nodes - unsigned ** uCofs; // truth tables of the cofactors -}; - -static Vec_Ptr_t * s_pLeaves = NULL; - -static Cut_Man_t * Abc_NtkStartCutManForScl( Abc_Ntk_t * pNtk, int nLutSize ); -static Abc_ManScl_t * Abc_ManSclStart( int nLutSize, int nCutSizeMax, int nNodesMax ); -static void Abc_ManSclStop( Abc_ManScl_t * p ); -static void Abc_NodeLutMap( Cut_Man_t * pManCuts, Abc_Obj_t * pObj ); - -static Abc_Obj_t * Abc_NodeSuperChoiceLut( Abc_ManScl_t * pManScl, Abc_Obj_t * pObj ); -static int Abc_NodeDecomposeStep( Abc_ManScl_t * pManScl ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Performs superchoicing for K-LUTs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkSuperChoiceLut( Abc_Ntk_t * pNtk, int nLutSize, int nCutSizeMax, int fVerbose ) -{ - ProgressBar * pProgress; - Abc_ManCut_t * pManCut; - Abc_ManScl_t * pManScl; - Cut_Man_t * pManCuts; - Abc_Obj_t * pObj, * pFanin, * pObjTop; - int i, LevelMax, nNodes; - int nNodesTried, nNodesDec, nNodesExist, nNodesUsed; - - assert( Abc_NtkIsSopLogic(pNtk) ); - if ( nLutSize < 3 || nLutSize > SCL_LUT_MAX ) - { - printf( "LUT size (%d) does not belong to the interval: 3 <= LUT size <= %d\n", nLutSize, SCL_LUT_MAX ); - return 0; - } - if ( nCutSizeMax <= nLutSize || nCutSizeMax > SCL_VARS_MAX ) - { - printf( "Cut size (%d) does not belong to the interval: LUT size (%d) < Cut size <= %d\n", nCutSizeMax, nLutSize, SCL_VARS_MAX ); - return 0; - } - - assert( nLutSize <= SCL_LUT_MAX ); - assert( nCutSizeMax <= SCL_VARS_MAX ); - nNodesTried = nNodesDec = nNodesExist = nNodesUsed = 0; - - // set the delays of the CIs - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->Level = 0; - -//Abc_NtkLevel( pNtk ); - - // start the managers - pManScl = Abc_ManSclStart( nLutSize, nCutSizeMax, 1000 ); - pManCuts = Abc_NtkStartCutManForScl( pNtk, nLutSize ); - pManCut = Abc_NtkManCutStart( nCutSizeMax, 100000, 100000, 100000 ); - s_pLeaves = Abc_NtkManCutReadCutSmall( pManCut ); - pManScl->vVolume = Abc_NtkManCutReadVisited( pManCut ); - - // process each internal node (assuming topological order of nodes!!!) - nNodes = Abc_NtkObjNumMax(pNtk); - pProgress = Extra_ProgressBarStart( stdout, nNodes ); - Abc_NtkForEachObj( pNtk, pObj, i ) - { -// if ( i != nNodes-1 ) -// continue; - Extra_ProgressBarUpdate( pProgress, i, NULL ); - if ( i >= nNodes ) - break; - if ( Abc_ObjFaninNum(pObj) != 2 ) - continue; - nNodesTried++; - - // map this node using regular cuts -// pObj->Level = 0; - Abc_NodeLutMap( pManCuts, pObj ); - // compute the cut - pManScl->vLeaves = Abc_NodeFindCut( pManCut, pObj, 0 ); - if ( Vec_PtrSize(pManScl->vLeaves) <= nLutSize ) - continue; - // get the volume of the cut - if ( Vec_PtrSize(pManScl->vVolume) > SCL_NODE_MAX ) - continue; - nNodesDec++; - - // decompose the cut - pObjTop = Abc_NodeSuperChoiceLut( pManScl, pObj ); - if ( pObjTop == NULL ) - continue; - nNodesExist++; - - // if there is no delay improvement, skip; otherwise, update level - if ( pObjTop->Level >= pObj->Level ) - { - Abc_NtkDeleteObj_rec( pObjTop, 1 ); - continue; - } - pObj->Level = pObjTop->Level; - nNodesUsed++; - } - Extra_ProgressBarStop( pProgress ); - - // delete the managers - Abc_ManSclStop( pManScl ); - Abc_NtkManCutStop( pManCut ); - Cut_ManStop( pManCuts ); - - // get the largest arrival time - LevelMax = 0; - Abc_NtkForEachCo( pNtk, pObj, i ) - { - pFanin = Abc_ObjFanin0( pObj ); - // skip inv/buf - if ( Abc_ObjFaninNum(pFanin) == 1 ) - pFanin = Abc_ObjFanin0( pFanin ); - // get the new level - LevelMax = ABC_MAX( LevelMax, (int)pFanin->Level ); - } - - if ( fVerbose ) - printf( "Try = %d. Dec = %d. Exist = %d. Use = %d. SUPER = %d levels of %d-LUTs.\n", - nNodesTried, nNodesDec, nNodesExist, nNodesUsed, LevelMax, nLutSize ); -// if ( fVerbose ) -// printf( "The network is superchoiced for %d levels of %d-LUTs.\n", LevelMax, nLutSize ); - - // clean the data field - Abc_NtkForEachObj( pNtk, pObj, i ) - pObj->pNext = NULL; - - // check - if ( !Abc_NtkCheck( pNtk ) ) - { - printf( "Abc_NtkSuperChoiceLut: The network check has failed.\n" ); - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Performs LUT mapping of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeLutMap( Cut_Man_t * pManCuts, Abc_Obj_t * pObj ) -{ - Cut_Cut_t * pCut; - Abc_Obj_t * pFanin; - int i, DelayMax; - pCut = (Cut_Cut_t *)Abc_NodeGetCutsRecursive( pManCuts, pObj, 0, 0 ); - assert( pCut != NULL ); - assert( pObj->Level == 0 ); - // go through the cuts - pObj->Level = ABC_INFINITY; - for ( pCut = pCut->pNext; pCut; pCut = pCut->pNext ) - { - DelayMax = 0; - for ( i = 0; i < (int)pCut->nLeaves; i++ ) - { - pFanin = Abc_NtkObj( pObj->pNtk, pCut->pLeaves[i] ); -// assert( Abc_ObjIsCi(pFanin) || pFanin->Level > 0 ); // should hold if node ordering is topological - if ( DelayMax < (int)pFanin->Level ) - DelayMax = pFanin->Level; - } - if ( (int)pObj->Level > DelayMax ) - pObj->Level = DelayMax; - } - assert( pObj->Level < ABC_INFINITY ); - pObj->Level++; -// printf( "%d(%d) ", pObj->Id, pObj->Level ); -} - -/**Function************************************************************* - - Synopsis [Starts the cut manager for rewriting.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cut_Man_t * Abc_NtkStartCutManForScl( Abc_Ntk_t * pNtk, int nLutSize ) -{ - static Cut_Params_t Params, * pParams = &Params; - Cut_Man_t * pManCut; - Abc_Obj_t * pObj; - int i; - // start the cut manager - memset( pParams, 0, sizeof(Cut_Params_t) ); - pParams->nVarsMax = nLutSize; // the max cut size ("k" of the k-feasible cuts) - pParams->nKeepMax = 500; // the max number of cuts kept at a node - pParams->fTruth = 0; // compute truth tables - pParams->fFilter = 1; // filter dominated cuts - pParams->fSeq = 0; // compute sequential cuts - pParams->fDrop = 0; // drop cuts on the fly - pParams->fVerbose = 0; // the verbosiness flag - pParams->nIdsMax = Abc_NtkObjNumMax( pNtk ); - pManCut = Cut_ManStart( pParams ); - if ( pParams->fDrop ) - Cut_ManSetFanoutCounts( pManCut, Abc_NtkFanoutCounts(pNtk) ); - // set cuts for PIs - Abc_NtkForEachCi( pNtk, pObj, i ) - if ( Abc_ObjFanoutNum(pObj) > 0 ) - Cut_NodeSetTriv( pManCut, pObj->Id ); - return pManCut; -} - -/**Function************************************************************* - - Synopsis [Starts the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_ManScl_t * Abc_ManSclStart( int nLutSize, int nCutSizeMax, int nNodesMax ) -{ - Abc_ManScl_t * p; - int i, k; - assert( sizeof(unsigned) == 4 ); - p = ALLOC( Abc_ManScl_t, 1 ); - memset( p, 0, sizeof(Abc_ManScl_t) ); - p->nLutSize = nLutSize; - p->nCutSizeMax = nCutSizeMax; - p->nNodesMax = nNodesMax; - p->nWords = Extra_TruthWordNum(nCutSizeMax); - // allocate simulation info - p->uVars = (unsigned **)Extra_ArrayAlloc( nCutSizeMax, p->nWords, 4 ); - p->uSims = (unsigned **)Extra_ArrayAlloc( nNodesMax, p->nWords, 4 ); - p->uCofs = (unsigned **)Extra_ArrayAlloc( 2 << nLutSize, p->nWords, 4 ); - memset( p->uVars[0], 0, nCutSizeMax * p->nWords * 4 ); - // assign elementary truth tables - for ( k = 0; k < p->nCutSizeMax; k++ ) - for ( i = 0; i < p->nWords * 32; i++ ) - if ( i & (1 << k) ) - p->uVars[k][i>>5] |= (1 << (i&31)); - // other data structures -// p->vBound = Vec_IntAlloc( nCutSizeMax ); - return p; -} - -/**Function************************************************************* - - Synopsis [Stops the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManSclStop( Abc_ManScl_t * p ) -{ -// Vec_IntFree( p->vBound ); - free( p->uVars ); - free( p->uSims ); - free( p->uCofs ); - free( p ); -} - - -/**Function************************************************************* - - Synopsis [Performs superchoicing for one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned * Abc_NodeSuperChoiceTruth( Abc_ManScl_t * pManScl ) -{ - Abc_Obj_t * pObj; - unsigned * puData0, * puData1, * puData; - char * pSop; - int i, k; - // set elementary truth tables - Vec_PtrForEachEntry( pManScl->vLeaves, pObj, i ) - pObj->pNext = (Abc_Obj_t *)pManScl->uVars[i]; - // compute truth tables for internal nodes - Vec_PtrForEachEntry( pManScl->vVolume, pObj, i ) - { - // set storage for the node's simulation info - pObj->pNext = (Abc_Obj_t *)pManScl->uSims[i]; - // get pointer to the simulation info - puData = (unsigned *)pObj->pNext; - puData0 = (unsigned *)Abc_ObjFanin0(pObj)->pNext; - puData1 = (unsigned *)Abc_ObjFanin1(pObj)->pNext; - // simulate - pSop = pObj->pData; - if ( pSop[0] == '0' && pSop[1] == '0' ) - for ( k = 0; k < pManScl->nWords; k++ ) - puData[k] = ~puData0[k] & ~puData1[k]; - else if ( pSop[0] == '0' ) - for ( k = 0; k < pManScl->nWords; k++ ) - puData[k] = ~puData0[k] & puData1[k]; - else if ( pSop[1] == '0' ) - for ( k = 0; k < pManScl->nWords; k++ ) - puData[k] = puData0[k] & ~puData1[k]; - else - for ( k = 0; k < pManScl->nWords; k++ ) - puData[k] = puData0[k] & puData1[k]; - } - return puData; -} - -/**Function************************************************************* - - Synopsis [Performs superchoicing for one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeSuperChoiceCollect2_rec( Abc_Obj_t * pObj, Vec_Ptr_t * vVolume ) -{ - if ( pObj->fMarkC ) - return; - pObj->fMarkC = 1; - assert( Abc_ObjFaninNum(pObj) == 2 ); - Abc_NodeSuperChoiceCollect2_rec( Abc_ObjFanin0(pObj), vVolume ); - Abc_NodeSuperChoiceCollect2_rec( Abc_ObjFanin1(pObj), vVolume ); - Vec_PtrPush( vVolume, pObj ); -} - -/**Function************************************************************* - - Synopsis [Performs superchoicing for one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeSuperChoiceCollect2( Abc_Obj_t * pRoot, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vVolume ) -{ - Abc_Obj_t * pObj; - int i; - Vec_PtrForEachEntry( vLeaves, pObj, i ) - pObj->fMarkC = 1; - Vec_PtrClear( vVolume ); - Abc_NodeSuperChoiceCollect2_rec( pRoot, vVolume ); - Vec_PtrForEachEntry( vLeaves, pObj, i ) - pObj->fMarkC = 0; - Vec_PtrForEachEntry( vVolume, pObj, i ) - pObj->fMarkC = 0; -} - -/**Function************************************************************* - - Synopsis [Performs superchoicing for one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeSuperChoiceCollect_rec( Abc_Obj_t * pObj, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vVolume ) -{ - if ( pObj->fMarkB ) - { - Vec_PtrPush( vLeaves, pObj ); - pObj->fMarkB = 0; - } - if ( pObj->fMarkC ) - return; - pObj->fMarkC = 1; - assert( Abc_ObjFaninNum(pObj) == 2 ); - Abc_NodeSuperChoiceCollect_rec( Abc_ObjFanin0(pObj), vLeaves, vVolume ); - Abc_NodeSuperChoiceCollect_rec( Abc_ObjFanin1(pObj), vLeaves, vVolume ); - Vec_PtrPush( vVolume, pObj ); -} - -/**Function************************************************************* - - Synopsis [Performs superchoicing for one node.] - - Description [Orders the leaves topologically.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeSuperChoiceCollect( Abc_Obj_t * pRoot, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vVolume ) -{ - Abc_Obj_t * pObj; - int i, nLeaves; - nLeaves = Vec_PtrSize(vLeaves); - Vec_PtrForEachEntry( vLeaves, pObj, i ) - pObj->fMarkB = pObj->fMarkC = 1; - Vec_PtrClear( vVolume ); - Vec_PtrClear( vLeaves ); - Abc_NodeSuperChoiceCollect_rec( pRoot, vLeaves, vVolume ); - assert( Vec_PtrSize(vLeaves) == nLeaves ); - Vec_PtrForEachEntry( vLeaves, pObj, i ) - pObj->fMarkC = 0; - Vec_PtrForEachEntry( vVolume, pObj, i ) - pObj->fMarkC = 0; -} - -/**Function************************************************************* - - Synopsis [Performs superchoicing for one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeLeavesRemove( Vec_Ptr_t * vLeaves, unsigned uPhase, int nVars ) -{ - int i; - for ( i = nVars - 1; i >= 0; i-- ) - if ( uPhase & (1 << i) ) - Vec_PtrRemove( vLeaves, Vec_PtrEntry(vLeaves, i) ); -} - -/**Function************************************************************* - - Synopsis [Performs superchoicing for one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeGetLevel( Abc_Obj_t * pObj ) -{ - Abc_Obj_t * pFanin; - int i, Level; - Level = 0; - Abc_ObjForEachFanin( pObj, pFanin, i ) - Level = ABC_MAX( Level, (int)pFanin->Level ); - return Level + 1; -} - -/**Function************************************************************* - - Synopsis [Performs superchoicing for one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeSuperChoiceLut( Abc_ManScl_t * p, Abc_Obj_t * pObj ) -{ - Abc_Obj_t * pFanin, * pObjNew; - int i, nVars, uSupport, nSuppVars; - // collect the cone using DFS (excluding leaves) - Abc_NodeSuperChoiceCollect2( pObj, p->vLeaves, p->vVolume ); - assert( Vec_PtrEntryLast(p->vVolume) == pObj ); - // compute the truth table - p->uTruth = Abc_NodeSuperChoiceTruth( p ); - // get the support of this truth table - nVars = Vec_PtrSize(p->vLeaves); - uSupport = Extra_TruthSupport(p->uTruth, nVars); - nSuppVars = Extra_WordCountOnes(uSupport); - assert( nSuppVars <= nVars ); - if ( nSuppVars == 0 ) - { - pObj->Level = 0; - return NULL; - } - if ( nSuppVars == 1 ) - { - // find the variable - for ( i = 0; i < nVars; i++ ) - if ( uSupport & (1 << i) ) - break; - assert( i < nVars ); - pFanin = Vec_PtrEntry( p->vLeaves, i ); - pObj->Level = pFanin->Level; - return NULL; - } - // support-minimize the truth table - if ( nSuppVars != nVars ) - { - Extra_TruthShrink( p->uCofs[0], p->uTruth, nSuppVars, nVars, uSupport ); - Extra_TruthCopy( p->uTruth, p->uCofs[0], nVars ); - Abc_NodeLeavesRemove( p->vLeaves, ((1 << nVars) - 1) & ~uSupport, nVars ); - } -// return NULL; - // decompose the truth table recursively - while ( Vec_PtrSize(p->vLeaves) > p->nLutSize ) - if ( !Abc_NodeDecomposeStep( p ) ) - { - Vec_PtrForEachEntry( p->vLeaves, pFanin, i ) - if ( Abc_ObjIsNode(pFanin) && Abc_ObjFanoutNum(pFanin) == 0 ) - Abc_NtkDeleteObj_rec( pFanin, 1 ); - return NULL; - } - // create the topmost node - pObjNew = Abc_NtkCreateNode( pObj->pNtk ); - Vec_PtrForEachEntry( p->vLeaves, pFanin, i ) - Abc_ObjAddFanin( pObjNew, pFanin ); - // create the function - pObjNew->pData = Abc_SopCreateFromTruth( pObj->pNtk->pManFunc, Vec_PtrSize(p->vLeaves), p->uTruth ); // need ISOP - pObjNew->Level = Abc_NodeGetLevel( pObjNew ); - return pObjNew; -} - -/**Function************************************************************* - - Synopsis [Procedure used for sorting the nodes in increasing order of levels.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeCompareLevelsInc( int * pp1, int * pp2 ) -{ - Abc_Obj_t * pNode1, * pNode2; - pNode1 = Vec_PtrEntry(s_pLeaves, *pp1); - pNode2 = Vec_PtrEntry(s_pLeaves, *pp2); - if ( pNode1->Level < pNode2->Level ) - return -1; - if ( pNode1->Level > pNode2->Level ) - return 1; - return 0; -} - -/**Function************************************************************* - - Synopsis [Selects the earliest arriving nodes from the array.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeDecomposeSort( Abc_Obj_t ** pLeaves, int nVars, int * pBSet, int nLutSize ) -{ - Abc_Obj_t * pTemp[SCL_VARS_MAX]; - int i, k, kBest, LevelMin; - assert( nLutSize < nVars ); - assert( nVars <= SCL_VARS_MAX ); - // copy nodes into the internal storage -// printf( "(" ); - for ( i = 0; i < nVars; i++ ) - { - pTemp[i] = pLeaves[i]; -// printf( " %d", pLeaves[i]->Level ); - } -// printf( " )\n" ); - // choose one node at a time - for ( i = 0; i < nLutSize; i++ ) - { - kBest = -1; - LevelMin = ABC_INFINITY; - for ( k = 0; k < nVars; k++ ) - if ( pTemp[k] && LevelMin > (int)pTemp[k]->Level ) - { - LevelMin = pTemp[k]->Level; - kBest = k; - } - pBSet[i] = kBest; - pTemp[kBest] = NULL; - } -} - -/**Function************************************************************* - - Synopsis [Performs superchoicing for one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeDecomposeStep( Abc_ManScl_t * p ) -{ - static char pCofClasses[1<<SCL_LUT_MAX][1<<SCL_LUT_MAX]; - static char nCofClasses[1<<SCL_LUT_MAX]; - Abc_Ntk_t * pNtk; - Abc_Obj_t * pObjNew, * pFanin, * pNodesNew[SCL_LUT_MAX]; - unsigned * pTruthCof, * pTruthClass, * pTruth, uPhase; - int i, k, c, v, w, nVars, nVarsNew, nClasses, nCofs; - // set the network - pNtk = ((Abc_Obj_t *)Vec_PtrEntry(p->vLeaves, 0))->pNtk; - // find the earliest nodes - nVars = Vec_PtrSize(p->vLeaves); - assert( nVars > p->nLutSize ); -/* - for ( v = 0; v < nVars; v++ ) - p->pBSet[v] = v; - qsort( (void *)p->pBSet, nVars, sizeof(int), - (int (*)(const void *, const void *)) Abc_NodeCompareLevelsInc ); -*/ - Abc_NodeDecomposeSort( (Abc_Obj_t **)Vec_PtrArray(p->vLeaves), Vec_PtrSize(p->vLeaves), p->pBSet, p->nLutSize ); - assert( ((Abc_Obj_t *)Vec_PtrEntry(p->vLeaves, p->pBSet[0]))->Level <= - ((Abc_Obj_t *)Vec_PtrEntry(p->vLeaves, p->pBSet[1]))->Level ); - // cofactor w.r.t. the selected variables - Extra_TruthCopy( p->uCofs[1], p->uTruth, nVars ); - c = 2; - for ( v = 0; v < p->nLutSize; v++ ) - for ( k = 0; k < (1<<v); k++ ) - { - Extra_TruthCopy( p->uCofs[c], p->uCofs[c/2], nVars ); - Extra_TruthCopy( p->uCofs[c+1], p->uCofs[c/2], nVars ); - Extra_TruthCofactor0( p->uCofs[c], nVars, p->pBSet[v] ); - Extra_TruthCofactor1( p->uCofs[c+1], nVars, p->pBSet[v] ); - c += 2; - } - assert( c == (2 << p->nLutSize) ); - // count unique cofactors - nClasses = 0; - nCofs = (1 << p->nLutSize); - for ( i = 0; i < nCofs; i++ ) - { - pTruthCof = p->uCofs[ nCofs + i ]; - for ( k = 0; k < nClasses; k++ ) - { - pTruthClass = p->uCofs[ nCofs + pCofClasses[k][0] ]; - if ( Extra_TruthIsEqual( pTruthCof, pTruthClass, nVars ) ) - { - pCofClasses[k][ nCofClasses[k]++ ] = i; - break; - } - } - if ( k != nClasses ) - continue; - // not found - pCofClasses[nClasses][0] = i; - nCofClasses[nClasses] = 1; - nClasses++; - if ( nClasses > nCofs/2 ) - return 0; - } - // the number of cofactors is acceptable - nVarsNew = Extra_Base2Log( nClasses ); - assert( nVarsNew < p->nLutSize ); - // create the remainder truth table - // for each class of cofactors, multiply cofactor truth table by its code - Extra_TruthClear( p->uTruth, nVars ); - for ( k = 0; k < nClasses; k++ ) - { - pTruthClass = p->uCofs[ nCofs + pCofClasses[k][0] ]; - for ( v = 0; v < nVarsNew; v++ ) - if ( k & (1 << v) ) - Extra_TruthAnd( pTruthClass, pTruthClass, p->uVars[p->pBSet[v]], nVars ); - else - Extra_TruthSharp( pTruthClass, pTruthClass, p->uVars[p->pBSet[v]], nVars ); - Extra_TruthOr( p->uTruth, p->uTruth, pTruthClass, nVars ); - } - // create nodes - pTruth = p->uCofs[0]; - for ( v = 0; v < nVarsNew; v++ ) - { - Extra_TruthClear( pTruth, p->nLutSize ); - for ( k = 0; k < nClasses; k++ ) - if ( k & (1 << v) ) - for ( i = 0; i < nCofClasses[k]; i++ ) - { - pTruthCof = p->uCofs[1]; - Extra_TruthFill( pTruthCof, p->nLutSize ); - for ( w = 0; w < p->nLutSize; w++ ) - if ( pCofClasses[k][i] & (1 << (p->nLutSize-1-w)) ) - Extra_TruthAnd( pTruthCof, pTruthCof, p->uVars[w], p->nLutSize ); - else - Extra_TruthSharp( pTruthCof, pTruthCof, p->uVars[w], p->nLutSize ); - Extra_TruthOr( pTruth, pTruth, pTruthCof, p->nLutSize ); - } - // implement the node - pObjNew = Abc_NtkCreateNode( pNtk ); - for ( i = 0; i < p->nLutSize; i++ ) - { - pFanin = Vec_PtrEntry( p->vLeaves, p->pBSet[i] ); - Abc_ObjAddFanin( pObjNew, pFanin ); - } - // create the function - pObjNew->pData = Abc_SopCreateFromTruth( pNtk->pManFunc, p->nLutSize, pTruth ); // need ISOP - pObjNew->Level = Abc_NodeGetLevel( pObjNew ); - pNodesNew[v] = pObjNew; - } - // put the new nodes back into the list - for ( v = 0; v < nVarsNew; v++ ) - Vec_PtrWriteEntry( p->vLeaves, p->pBSet[v], pNodesNew[v] ); - // compute the variables that should be removed - uPhase = 0; - for ( v = nVarsNew; v < p->nLutSize; v++ ) - uPhase |= (1 << p->pBSet[v]); - // remove entries from the array - Abc_NodeLeavesRemove( p->vLeaves, uPhase, nVars ); - // update truth table - Extra_TruthShrink( p->uCofs[0], p->uTruth, nVars - p->nLutSize + nVarsNew, nVars, ((1 << nVars) - 1) & ~uPhase ); - Extra_TruthCopy( p->uTruth, p->uCofs[0], nVars ); - assert( !Extra_TruthVarInSupport( p->uTruth, nVars, nVars - p->nLutSize + nVarsNew ) ); - return 1; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcMap.c b/src/base/abci/abcMap.c deleted file mode 100644 index d4d50923..00000000 --- a/src/base/abci/abcMap.c +++ /dev/null @@ -1,657 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcMap.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Interface with the SC mapping package.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcMap.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "main.h" -#include "mio.h" -#include "mapper.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static Map_Man_t * Abc_NtkToMap( Abc_Ntk_t * pNtk, double DelayTarget, int fRecovery, float * pSwitching, int fVerbose ); -static Abc_Ntk_t * Abc_NtkFromMap( Map_Man_t * pMan, Abc_Ntk_t * pNtk ); -static Abc_Obj_t * Abc_NodeFromMap_rec( Abc_Ntk_t * pNtkNew, Map_Node_t * pNodeMap, int fPhase ); -static Abc_Obj_t * Abc_NodeFromMapPhase_rec( Abc_Ntk_t * pNtkNew, Map_Node_t * pNodeMap, int fPhase ); -static Abc_Obj_t * Abc_NodeFromMapSuper_rec( Abc_Ntk_t * pNtkNew, Map_Node_t * pNodeMap, Map_Super_t * pSuper, Abc_Obj_t * pNodePis[], int nNodePis ); - -static Abc_Ntk_t * Abc_NtkFromMapSuperChoice( Map_Man_t * pMan, Abc_Ntk_t * pNtk ); -static void Abc_NodeSuperChoice( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNode ); -static void Abc_NodeFromMapCutPhase( Abc_Ntk_t * pNtkNew, Map_Cut_t * pCut, int fPhase ); -static Abc_Obj_t * Abc_NodeFromMapSuperChoice_rec( Abc_Ntk_t * pNtkNew, Map_Super_t * pSuper, Abc_Obj_t * pNodePis[], int nNodePis ); - - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Interface with the mapping package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkMap( Abc_Ntk_t * pNtk, double DelayTarget, int fRecovery, int fSwitching, int fVerbose ) -{ - int fShowSwitching = 1; - Abc_Ntk_t * pNtkNew; - Map_Man_t * pMan; - Vec_Int_t * vSwitching; - float * pSwitching = NULL; - int clk; - - assert( Abc_NtkIsStrash(pNtk) ); - - // check that the library is available - if ( Abc_FrameReadLibGen() == NULL ) - { - printf( "The current library is not available.\n" ); - return 0; - } - - // derive the supergate library - if ( Abc_FrameReadLibSuper() == NULL && Abc_FrameReadLibGen() ) - { - printf( "A simple supergate library is derived from gate library \"%s\".\n", - Mio_LibraryReadName(Abc_FrameReadLibGen()) ); - Map_SuperLibDeriveFromGenlib( Abc_FrameReadLibGen() ); - } - - // print a warning about choice nodes - if ( Abc_NtkGetChoiceNum( pNtk ) ) - printf( "Performing mapping with choices.\n" ); - - // compute switching activity - fShowSwitching |= fSwitching; - if ( fShowSwitching ) - { - extern Vec_Int_t * Sim_NtkComputeSwitching( Abc_Ntk_t * pNtk, int nPatterns ); - vSwitching = Sim_NtkComputeSwitching( pNtk, 4096 ); - pSwitching = (float *)vSwitching->pArray; - } - - // perform the mapping - pMan = Abc_NtkToMap( pNtk, DelayTarget, fRecovery, pSwitching, fVerbose ); - if ( pSwitching ) Vec_IntFree( vSwitching ); - if ( pMan == NULL ) - return NULL; -clk = clock(); - Map_ManSetSwitching( pMan, fSwitching ); - if ( !Map_Mapping( pMan ) ) - { - Map_ManFree( pMan ); - return NULL; - } -// Map_ManPrintStatsToFile( pNtk->pSpec, Map_ManReadAreaFinal(pMan), Map_ManReadRequiredGlo(pMan), clock()-clk ); - - // reconstruct the network after mapping - pNtkNew = Abc_NtkFromMap( pMan, pNtk ); - if ( pNtkNew == NULL ) - return NULL; - Map_ManFree( pMan ); - - if ( pNtk->pExdc ) - pNtkNew->pExdc = Abc_NtkDup( pNtk->pExdc ); - - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkMap: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Load the network into manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Map_Man_t * Abc_NtkToMap( Abc_Ntk_t * pNtk, double DelayTarget, int fRecovery, float * pSwitching, int fVerbose ) -{ - Map_Man_t * pMan; - ProgressBar * pProgress; - Map_Node_t * pNodeMap; - Vec_Ptr_t * vNodes; - Abc_Obj_t * pNode, * pFanin, * pPrev; - int i; - - assert( Abc_NtkIsStrash(pNtk) ); - - // start the mapping manager and set its parameters - pMan = Map_ManCreate( Abc_NtkPiNum(pNtk) + Abc_NtkLatchNum(pNtk), Abc_NtkPoNum(pNtk) + Abc_NtkLatchNum(pNtk), fVerbose ); - if ( pMan == NULL ) - return NULL; - Map_ManSetAreaRecovery( pMan, fRecovery ); - Map_ManSetOutputNames( pMan, Abc_NtkCollectCioNames(pNtk, 1) ); - Map_ManSetDelayTarget( pMan, (float)DelayTarget ); - Map_ManSetInputArrivals( pMan, (Map_Time_t *)Abc_NtkGetCiArrivalTimes(pNtk) ); - - // create PIs and remember them in the old nodes - Abc_NtkCleanCopy( pNtk ); - Abc_AigConst1(pNtk)->pCopy = (Abc_Obj_t *)Map_ManReadConst1(pMan); - Abc_NtkForEachCi( pNtk, pNode, i ) - { - pNodeMap = Map_ManReadInputs(pMan)[i]; - pNode->pCopy = (Abc_Obj_t *)pNodeMap; - if ( pSwitching ) - Map_NodeSetSwitching( pNodeMap, pSwitching[pNode->Id] ); - } - - // load the AIG into the mapper - vNodes = Abc_AigDfs( pNtk, 0, 0 ); - pProgress = Extra_ProgressBarStart( stdout, vNodes->nSize ); - Vec_PtrForEachEntry( vNodes, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - // add the node to the mapper - pNodeMap = Map_NodeAnd( pMan, - Map_NotCond( Abc_ObjFanin0(pNode)->pCopy, Abc_ObjFaninC0(pNode) ), - Map_NotCond( Abc_ObjFanin1(pNode)->pCopy, Abc_ObjFaninC1(pNode) ) ); - assert( pNode->pCopy == NULL ); - // remember the node - pNode->pCopy = (Abc_Obj_t *)pNodeMap; - if ( pSwitching ) - Map_NodeSetSwitching( pNodeMap, pSwitching[pNode->Id] ); - // set up the choice node - if ( Abc_AigNodeIsChoice( pNode ) ) - for ( pPrev = pNode, pFanin = pNode->pData; pFanin; pPrev = pFanin, pFanin = pFanin->pData ) - { - Map_NodeSetNextE( (Map_Node_t *)pPrev->pCopy, (Map_Node_t *)pFanin->pCopy ); - Map_NodeSetRepr( (Map_Node_t *)pFanin->pCopy, (Map_Node_t *)pNode->pCopy ); - } - } - Extra_ProgressBarStop( pProgress ); - Vec_PtrFree( vNodes ); - - // set the primary outputs in the required phase - Abc_NtkForEachCo( pNtk, pNode, i ) - Map_ManReadOutputs(pMan)[i] = Map_NotCond( (Map_Node_t *)Abc_ObjFanin0(pNode)->pCopy, Abc_ObjFaninC0(pNode) ); - return pMan; -} - -/**Function************************************************************* - - Synopsis [Creates the mapped network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromMap( Map_Man_t * pMan, Abc_Ntk_t * pNtk ) -{ - ProgressBar * pProgress; - Abc_Ntk_t * pNtkNew; - Map_Node_t * pNodeMap; - Abc_Obj_t * pNode, * pNodeNew; - int i, nDupGates; - // create the new network - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_MAP ); - // make the mapper point to the new network - Map_ManCleanData( pMan ); - Abc_NtkForEachCi( pNtk, pNode, i ) - Map_NodeSetData( Map_ManReadInputs(pMan)[i], 1, (char *)pNode->pCopy ); - // assign the mapping of the required phase to the POs - pProgress = Extra_ProgressBarStart( stdout, Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - pNodeMap = Map_ManReadOutputs(pMan)[i]; - pNodeNew = Abc_NodeFromMap_rec( pNtkNew, Map_Regular(pNodeMap), !Map_IsComplement(pNodeMap) ); - assert( !Abc_ObjIsComplement(pNodeNew) ); - Abc_ObjAddFanin( pNode->pCopy, pNodeNew ); - } - Extra_ProgressBarStop( pProgress ); - // decouple the PO driver nodes to reduce the number of levels - nDupGates = Abc_NtkLogicMakeSimpleCos( pNtkNew, 1 ); -// if ( nDupGates && Map_ManReadVerbose(pMan) ) -// printf( "Duplicated %d gates to decouple the CO drivers.\n", nDupGates ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Constructs the nodes corrresponding to one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeFromMap_rec( Abc_Ntk_t * pNtkNew, Map_Node_t * pNodeMap, int fPhase ) -{ - Abc_Obj_t * pNodeNew, * pNodeInv; - - // check the case of constant node - if ( Map_NodeIsConst(pNodeMap) ) - return fPhase? Abc_NtkCreateNodeConst1(pNtkNew) : Abc_NtkCreateNodeConst0(pNtkNew); - - // check if the phase is already implemented - pNodeNew = (Abc_Obj_t *)Map_NodeReadData( pNodeMap, fPhase ); - if ( pNodeNew ) - return pNodeNew; - - // implement the node if the best cut is assigned - if ( Map_NodeReadCutBest(pNodeMap, fPhase) != NULL ) - return Abc_NodeFromMapPhase_rec( pNtkNew, pNodeMap, fPhase ); - - // if the cut is not assigned, implement the node - assert( Map_NodeReadCutBest(pNodeMap, !fPhase) != NULL || Map_NodeIsConst(pNodeMap) ); - pNodeNew = Abc_NodeFromMapPhase_rec( pNtkNew, pNodeMap, !fPhase ); - - // add the inverter - pNodeInv = Abc_NtkCreateNode( pNtkNew ); - Abc_ObjAddFanin( pNodeInv, pNodeNew ); - pNodeInv->pData = Mio_LibraryReadInv(Map_ManReadGenLib(Map_NodeReadMan(pNodeMap))); - - // set the inverter - Map_NodeSetData( pNodeMap, fPhase, (char *)pNodeInv ); - return pNodeInv; -} - -/**Function************************************************************* - - Synopsis [Constructs the nodes corrresponding to one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeFromMapPhase_rec( Abc_Ntk_t * pNtkNew, Map_Node_t * pNodeMap, int fPhase ) -{ - Abc_Obj_t * pNodePIs[10]; - Abc_Obj_t * pNodeNew; - Map_Node_t ** ppLeaves; - Map_Cut_t * pCutBest; - Map_Super_t * pSuperBest; - unsigned uPhaseBest; - int i, fInvPin, nLeaves; - - // make sure the node can be implemented in this phase - assert( Map_NodeReadCutBest(pNodeMap, fPhase) != NULL || Map_NodeIsConst(pNodeMap) ); - // check if the phase is already implemented - pNodeNew = (Abc_Obj_t *)Map_NodeReadData( pNodeMap, fPhase ); - if ( pNodeNew ) - return pNodeNew; - - // get the information about the best cut - pCutBest = Map_NodeReadCutBest( pNodeMap, fPhase ); - pSuperBest = Map_CutReadSuperBest( pCutBest, fPhase ); - uPhaseBest = Map_CutReadPhaseBest( pCutBest, fPhase ); - nLeaves = Map_CutReadLeavesNum( pCutBest ); - ppLeaves = Map_CutReadLeaves( pCutBest ); - - // collect the PI nodes - for ( i = 0; i < nLeaves; i++ ) - { - fInvPin = ((uPhaseBest & (1 << i)) > 0); - pNodePIs[i] = Abc_NodeFromMap_rec( pNtkNew, ppLeaves[i], !fInvPin ); - assert( pNodePIs[i] != NULL ); - } - - // implement the supergate - pNodeNew = Abc_NodeFromMapSuper_rec( pNtkNew, pNodeMap, pSuperBest, pNodePIs, nLeaves ); - Map_NodeSetData( pNodeMap, fPhase, (char *)pNodeNew ); - return pNodeNew; -} - -/**Function************************************************************* - - Synopsis [Constructs the nodes corrresponding to one supergate.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeFromMapSuper_rec( Abc_Ntk_t * pNtkNew, Map_Node_t * pNodeMap, Map_Super_t * pSuper, Abc_Obj_t * pNodePis[], int nNodePis ) -{ - Mio_Gate_t * pRoot; - Map_Super_t ** ppFanins; - Abc_Obj_t * pNodeNew, * pNodeFanin; - int nFanins, Number, i; - - // get the parameters of the supergate - pRoot = Map_SuperReadRoot(pSuper); - if ( pRoot == NULL ) - { - Number = Map_SuperReadNum(pSuper); - if ( Number < nNodePis ) - { - return pNodePis[Number]; - } - else - { -// assert( 0 ); - /* It might happen that a super gate with 5 inputs is constructed that - * actually depends only on the first four variables; i.e the fifth is a - * don't care -- in that case we connect constant node for the fifth - * (since the cut only has 4 variables). An interesting question is what - * if the first variable (and not the fifth one is the redundant one; - * can that happen?) */ - return Abc_NtkCreateNodeConst0(pNtkNew); - } - } - - // get information about the fanins of the supergate - nFanins = Map_SuperReadFaninNum( pSuper ); - ppFanins = Map_SuperReadFanins( pSuper ); - // create a new node with these fanins - pNodeNew = Abc_NtkCreateNode( pNtkNew ); - for ( i = 0; i < nFanins; i++ ) - { - pNodeFanin = Abc_NodeFromMapSuper_rec( pNtkNew, pNodeMap, ppFanins[i], pNodePis, nNodePis ); - Abc_ObjAddFanin( pNodeNew, pNodeFanin ); - } - pNodeNew->pData = pRoot; - return pNodeNew; -} - - - - - -/**Function************************************************************* - - Synopsis [Interface with the mapping package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkSuperChoice( Abc_Ntk_t * pNtk ) -{ - Abc_Ntk_t * pNtkNew; - - Map_Man_t * pMan; - - assert( Abc_NtkIsStrash(pNtk) ); - - // check that the library is available - if ( Abc_FrameReadLibGen() == NULL ) - { - printf( "The current library is not available.\n" ); - return 0; - } - - // derive the supergate library - if ( Abc_FrameReadLibSuper() == NULL && Abc_FrameReadLibGen() ) - { - printf( "A simple supergate library is derived from gate library \"%s\".\n", - Mio_LibraryReadName(Abc_FrameReadLibGen()) ); - Map_SuperLibDeriveFromGenlib( Abc_FrameReadLibGen() ); - } - - // print a warning about choice nodes - if ( Abc_NtkGetChoiceNum( pNtk ) ) - printf( "Performing mapping with choices.\n" ); - - // perform the mapping - pMan = Abc_NtkToMap( pNtk, -1, 1, NULL, 0 ); - if ( pMan == NULL ) - return NULL; - if ( !Map_Mapping( pMan ) ) - { - Map_ManFree( pMan ); - return NULL; - } - - // reconstruct the network after mapping - pNtkNew = Abc_NtkFromMapSuperChoice( pMan, pNtk ); - if ( pNtkNew == NULL ) - return NULL; - Map_ManFree( pMan ); - - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkMap: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - - -/**Function************************************************************* - - Synopsis [Creates the mapped network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromMapSuperChoice( Map_Man_t * pMan, Abc_Ntk_t * pNtk ) -{ - extern Abc_Ntk_t * Abc_NtkMulti( Abc_Ntk_t * pNtk, int nThresh, int nFaninMax, int fCnf, int fMulti, int fSimple, int fFactor ); - ProgressBar * pProgress; - Abc_Ntk_t * pNtkNew, * pNtkNew2; - Abc_Obj_t * pNode; - int i; - - // save the pointer to the mapped nodes - Abc_NtkForEachCi( pNtk, pNode, i ) - pNode->pNext = pNode->pCopy; - Abc_NtkForEachPo( pNtk, pNode, i ) - pNode->pNext = pNode->pCopy; - Abc_NtkForEachNode( pNtk, pNode, i ) - pNode->pNext = pNode->pCopy; - - // duplicate the network - pNtkNew2 = Abc_NtkDup( pNtk ); - pNtkNew = Abc_NtkMulti( pNtkNew2, 0, 20, 0, 0, 1, 0 ); - if ( !Abc_NtkBddToSop( pNtkNew, 0 ) ) - { - printf( "Abc_NtkFromMapSuperChoice(): Converting to SOPs has failed.\n" ); - return NULL; - } - - // set the old network to point to the new network - Abc_NtkForEachCi( pNtk, pNode, i ) - pNode->pCopy = pNode->pCopy->pCopy; - Abc_NtkForEachPo( pNtk, pNode, i ) - pNode->pCopy = pNode->pCopy->pCopy; - Abc_NtkForEachNode( pNtk, pNode, i ) - pNode->pCopy = pNode->pCopy->pCopy; - Abc_NtkDelete( pNtkNew2 ); - - // set the pointers from the mapper to the new nodes - Abc_NtkForEachCi( pNtk, pNode, i ) - { - Map_NodeSetData( Map_ManReadInputs(pMan)[i], 0, (char *)Abc_NtkCreateNodeInv(pNtkNew,pNode->pCopy) ); - Map_NodeSetData( Map_ManReadInputs(pMan)[i], 1, (char *)pNode->pCopy ); - } - Abc_NtkForEachNode( pNtk, pNode, i ) - { -// if ( Abc_NodeIsConst(pNode) ) -// continue; - Map_NodeSetData( (Map_Node_t *)pNode->pNext, 0, (char *)Abc_NtkCreateNodeInv(pNtkNew,pNode->pCopy) ); - Map_NodeSetData( (Map_Node_t *)pNode->pNext, 1, (char *)pNode->pCopy ); - } - - // assign the mapping of the required phase to the POs - pProgress = Extra_ProgressBarStart( stdout, Abc_NtkObjNumMax(pNtk) ); - Abc_NtkForEachNode( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); -// if ( Abc_NodeIsConst(pNode) ) -// continue; - Abc_NodeSuperChoice( pNtkNew, pNode ); - } - Extra_ProgressBarStop( pProgress ); - return pNtkNew; -} - - -/**Function************************************************************* - - Synopsis [Creates the mapped network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeSuperChoice( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNode ) -{ - Map_Node_t * pMapNode = (Map_Node_t *)pNode->pNext; - Map_Cut_t * pCuts, * pTemp; - - pCuts = Map_NodeReadCuts(pMapNode); - for ( pTemp = Map_CutReadNext(pCuts); pTemp; pTemp = Map_CutReadNext(pTemp) ) - { - Abc_NodeFromMapCutPhase( pNtkNew, pTemp, 0 ); - Abc_NodeFromMapCutPhase( pNtkNew, pTemp, 1 ); - } -} - - -/**Function************************************************************* - - Synopsis [Constructs the nodes corrresponding to one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeFromMapCutPhase( Abc_Ntk_t * pNtkNew, Map_Cut_t * pCut, int fPhase ) -{ - Abc_Obj_t * pNodePIs[10]; - Map_Node_t ** ppLeaves; - Map_Super_t * pSuperBest; - unsigned uPhaseBest; - int i, fInvPin, nLeaves; - - pSuperBest = Map_CutReadSuperBest( pCut, fPhase ); - if ( pSuperBest == NULL ) - return; - - // get the information about the best cut - uPhaseBest = Map_CutReadPhaseBest( pCut, fPhase ); - nLeaves = Map_CutReadLeavesNum( pCut ); - ppLeaves = Map_CutReadLeaves( pCut ); - - // collect the PI nodes - for ( i = 0; i < nLeaves; i++ ) - { - fInvPin = ((uPhaseBest & (1 << i)) > 0); - pNodePIs[i] = (Abc_Obj_t *)Map_NodeReadData( ppLeaves[i], !fInvPin ); - assert( pNodePIs[i] != NULL ); - } - - // implement the supergate - Abc_NodeFromMapSuperChoice_rec( pNtkNew, pSuperBest, pNodePIs, nLeaves ); -} - - -/**Function************************************************************* - - Synopsis [Constructs the nodes corrresponding to one supergate.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeFromMapSuperChoice_rec( Abc_Ntk_t * pNtkNew, Map_Super_t * pSuper, Abc_Obj_t * pNodePis[], int nNodePis ) -{ - Mio_Gate_t * pRoot; - Map_Super_t ** ppFanins; - Abc_Obj_t * pNodeNew, * pNodeFanin; - int nFanins, Number, i; - - // get the parameters of the supergate - pRoot = Map_SuperReadRoot(pSuper); - if ( pRoot == NULL ) - { - Number = Map_SuperReadNum(pSuper); - if ( Number < nNodePis ) - { - return pNodePis[Number]; - } - else - { -// assert( 0 ); - /* It might happen that a super gate with 5 inputs is constructed that - * actually depends only on the first four variables; i.e the fifth is a - * don't care -- in that case we connect constant node for the fifth - * (since the cut only has 4 variables). An interesting question is what - * if the first variable (and not the fifth one is the redundant one; - * can that happen?) */ - return Abc_NtkCreateNodeConst0(pNtkNew); - } - } - - // get information about the fanins of the supergate - nFanins = Map_SuperReadFaninNum( pSuper ); - ppFanins = Map_SuperReadFanins( pSuper ); - // create a new node with these fanins - pNodeNew = Abc_NtkCreateNode( pNtkNew ); - for ( i = 0; i < nFanins; i++ ) - { - pNodeFanin = Abc_NodeFromMapSuperChoice_rec( pNtkNew, ppFanins[i], pNodePis, nNodePis ); - Abc_ObjAddFanin( pNodeNew, pNodeFanin ); - } - pNodeNew->pData = Abc_SopRegister( pNtkNew->pManFunc, Mio_GateReadSop(pRoot) ); - return pNodeNew; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcMeasure.c b/src/base/abci/abcMeasure.c deleted file mode 100644 index 6604a0c4..00000000 --- a/src/base/abci/abcMeasure.c +++ /dev/null @@ -1,478 +0,0 @@ -/**CFile**************************************************************** - - FileName [abc_.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abc_.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "kit.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintMeasures( unsigned * pTruth, int nVars ) -{ - unsigned uCofs[10][32]; - int i, k, nOnes; - - // total pairs - nOnes = Kit_TruthCountOnes( uCofs[0], nVars ); - printf( "Total = %d.\n", nOnes * ((1 << nVars) - nOnes) ); - - // print measures for individual variables - for ( i = 0; i < nVars; i++ ) - { - Kit_TruthUniqueNew( uCofs[0], pTruth, nVars, i ); - nOnes = Kit_TruthCountOnes( uCofs[0], nVars ); - printf( "%7d ", nOnes ); - } - printf( "\n" ); - - // consider pairs - for ( i = 0; i < nVars; i++ ) - for ( k = 0; k < nVars; k++ ) - { - if ( i == k ) - { - printf( " " ); - continue; - } - Kit_TruthCofactor0New( uCofs[0], pTruth, nVars, i ); - Kit_TruthCofactor1New( uCofs[1], pTruth, nVars, i ); - - Kit_TruthCofactor0New( uCofs[2], uCofs[0], nVars, k ); // 00 - Kit_TruthCofactor1New( uCofs[3], uCofs[0], nVars, k ); // 01 - Kit_TruthCofactor0New( uCofs[4], uCofs[1], nVars, k ); // 10 - Kit_TruthCofactor1New( uCofs[5], uCofs[1], nVars, k ); // 11 - - Kit_TruthAndPhase( uCofs[6], uCofs[2], uCofs[5], nVars, 0, 1 ); // 00 & 11' - Kit_TruthAndPhase( uCofs[7], uCofs[2], uCofs[5], nVars, 1, 0 ); // 00' & 11 - Kit_TruthAndPhase( uCofs[8], uCofs[3], uCofs[4], nVars, 0, 1 ); // 01 & 10' - Kit_TruthAndPhase( uCofs[9], uCofs[3], uCofs[4], nVars, 1, 0 ); // 01' & 10 - - nOnes = Kit_TruthCountOnes( uCofs[6], nVars ) + - Kit_TruthCountOnes( uCofs[7], nVars ) + - Kit_TruthCountOnes( uCofs[8], nVars ) + - Kit_TruthCountOnes( uCofs[9], nVars ); - - printf( "%7d ", nOnes ); - if ( k == nVars - 1 ) - printf( "\n" ); - } - printf( "\n" ); -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_Ntk4VarObjPrint_rec( Abc_Obj_t * pObj ) -{ - if ( pObj == Abc_AigConst1(pObj->pNtk) ) - { - printf( "1" ); - return; - } - if ( Abc_ObjIsPi(pObj) ) - { - printf( "%c", pObj->Id - 1 + 'a' ); - return; - } - - printf( "(" ); - Abc_Ntk4VarObjPrint_rec( Abc_ObjFanin0(pObj) ); - if ( Abc_ObjFaninC0(pObj) ) - printf( "\'" ); - Abc_Ntk4VarObjPrint_rec( Abc_ObjFanin1(pObj) ); - if ( Abc_ObjFaninC1(pObj) ) - printf( "\'" ); - printf( ")" ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned Abc_Ntk4VarObj( Vec_Ptr_t * vNodes ) -{ - Abc_Obj_t * pObj; - unsigned uTruth0, uTruth1; - int i; - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - uTruth0 = (unsigned)(Abc_ObjFanin0(pObj)->pCopy); - uTruth1 = (unsigned)(Abc_ObjFanin1(pObj)->pCopy); - if ( Abc_ObjFaninC0(pObj) ) - uTruth0 = ~uTruth0; - if ( Abc_ObjFaninC1(pObj) ) - uTruth1 = ~uTruth1; - pObj->pCopy = (void *)(uTruth0 & uTruth1); - } - return uTruth0 & uTruth1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_Ntk4VarTable( Abc_Ntk_t * pNtk ) -{ - static unsigned u4VarTruths[4] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00 }; - static unsigned u4VarTts[222] = { - 0x0000, 0x0001, 0x0003, 0x0006, 0x0007, 0x000f, 0x0016, 0x0017, 0x0018, 0x0019, - 0x001b, 0x001e, 0x001f, 0x003c, 0x003d, 0x003f, 0x0069, 0x006b, 0x006f, 0x007e, - 0x007f, 0x00ff, 0x0116, 0x0117, 0x0118, 0x0119, 0x011a, 0x011b, 0x011e, 0x011f, - 0x012c, 0x012d, 0x012f, 0x013c, 0x013d, 0x013e, 0x013f, 0x0168, 0x0169, 0x016a, - 0x016b, 0x016e, 0x016f, 0x017e, 0x017f, 0x0180, 0x0181, 0x0182, 0x0183, 0x0186, - 0x0187, 0x0189, 0x018b, 0x018f, 0x0196, 0x0197, 0x0198, 0x0199, 0x019a, 0x019b, - 0x019e, 0x019f, 0x01a8, 0x01a9, 0x01aa, 0x01ab, 0x01ac, 0x01ad, 0x01ae, 0x01af, - 0x01bc, 0x01bd, 0x01be, 0x01bf, 0x01e8, 0x01e9, 0x01ea, 0x01eb, 0x01ee, 0x01ef, - 0x01fe, 0x033c, 0x033d, 0x033f, 0x0356, 0x0357, 0x0358, 0x0359, 0x035a, 0x035b, - 0x035e, 0x035f, 0x0368, 0x0369, 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f, - 0x037c, 0x037d, 0x037e, 0x03c0, 0x03c1, 0x03c3, 0x03c5, 0x03c6, 0x03c7, 0x03cf, - 0x03d4, 0x03d5, 0x03d6, 0x03d7, 0x03d8, 0x03d9, 0x03db, 0x03dc, 0x03dd, 0x03de, - 0x03fc, 0x0660, 0x0661, 0x0662, 0x0663, 0x0666, 0x0667, 0x0669, 0x066b, 0x066f, - 0x0672, 0x0673, 0x0676, 0x0678, 0x0679, 0x067a, 0x067b, 0x067e, 0x0690, 0x0691, - 0x0693, 0x0696, 0x0697, 0x069f, 0x06b0, 0x06b1, 0x06b2, 0x06b3, 0x06b4, 0x06b5, - 0x06b6, 0x06b7, 0x06b9, 0x06bd, 0x06f0, 0x06f1, 0x06f2, 0x06f6, 0x06f9, 0x0776, - 0x0778, 0x0779, 0x077a, 0x077e, 0x07b0, 0x07b1, 0x07b4, 0x07b5, 0x07b6, 0x07bc, - 0x07e0, 0x07e1, 0x07e2, 0x07e3, 0x07e6, 0x07e9, 0x07f0, 0x07f1, 0x07f2, 0x07f8, - 0x0ff0, 0x1668, 0x1669, 0x166a, 0x166b, 0x166e, 0x167e, 0x1681, 0x1683, 0x1686, - 0x1687, 0x1689, 0x168b, 0x168e, 0x1696, 0x1697, 0x1698, 0x1699, 0x169a, 0x169b, - 0x169e, 0x16a9, 0x16ac, 0x16ad, 0x16bc, 0x16e9, 0x177e, 0x178e, 0x1796, 0x1798, - 0x179a, 0x17ac, 0x17e8, 0x18e7, 0x19e1, 0x19e3, 0x19e6, 0x1bd8, 0x1be4, 0x1ee1, - 0x3cc3, 0x6996 - }; - int Counters[222] = {0}; - Vec_Ptr_t * vNodes; - Abc_Obj_t * pObj; - unsigned uTruth; - int i, k, Count = 0; - - unsigned short * puCanons = NULL; - unsigned char * puMap = NULL; - Extra_Truth4VarNPN( &puCanons, NULL, NULL, &puMap ); - - // set elementary truth tables - assert( Abc_NtkPiNum(pNtk) == 4 ); - Abc_AigConst1(pNtk)->pCopy = (void *)0xFFFFFFFF; - Abc_NtkForEachPi( pNtk, pObj, i ) - pObj->pCopy = (void *)u4VarTruths[i]; - - // create truth tables - Abc_NtkForEachPo( pNtk, pObj, i ) - { - vNodes = Abc_NtkDfsNodes( pNtk, &pObj, 1 ); - if ( Vec_PtrSize(vNodes) == 0 ) - uTruth = (unsigned)Abc_ObjFanin0(pObj)->pCopy; - else - uTruth = Abc_Ntk4VarObj( vNodes ); - - if ( (uTruth & 0xFFFF) < (~uTruth & 0xFFFF) ) - uTruth = uTruth & 0xFFFF; - else - uTruth = ~uTruth & 0xFFFF; - - for ( k = 0; k < 222; k++ ) - if ( u4VarTts[k] == uTruth ) - break; - if ( k == 222 ) - continue; -/* -// if ( uTruth == 1725 ) - if ( k == 96 ) - { - printf( "%d : ", Vec_PtrSize(vNodes) ); - Abc_Ntk4VarObjPrint_rec( Abc_ObjFanin0(pObj) ); - printf( "\n" ); - } -*/ - Counters[k]++; - -// Counters[ puMap[uTruth & 0xFFFF] ]++; - Vec_PtrFree( vNodes ); - } - free( puCanons ); - free( puMap ); - - Count = 0; - for ( k = 0; k < 222; k++ ) - { - printf( "%d/%x/%d ", k, u4VarTts[k], Counters[k] ); - Count += Counters[k]; - } - printf( " Total = %d\n", Count ); -} - - - - -/**Function************************************************************* - - Synopsis [Returns 1 if there are no more than 2 unique cofactors.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkPrintOneDecompCheckCofList( unsigned * uCofs, int nCofs ) -{ - int i, Ind = -1; - assert( nCofs > 2 ); - for ( i = 1; i < nCofs; i++ ) - { - if ( uCofs[i] == uCofs[0] ) - continue; - if ( Ind == -1 ) - { - Ind = i; - continue; - } - if ( uCofs[i] == uCofs[Ind] ) - continue; - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Checks all cofactors with the given mask.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkPrintOneDecompCheck( unsigned * uCofs, int nCofs, unsigned uMask ) -{ - unsigned pCofs[32][32]; - int nCofNums[32] = {0}; - int uMasks[32]; - int nGroups = 0; - int i, k; - for ( i = 0; i < nCofs; i++ ) - { - // find group of this cof - for ( k = 0; k < nGroups; k++ ) - if ( (int)(i & uMask) == uMasks[k] ) - break; - if ( k == nGroups ) - { - uMasks[k] = (i & uMask); - nGroups++; - } - // save cof in the group - pCofs[k][ nCofNums[k]++ ] = uCofs[i]; - assert( nCofNums[k] <= 32 ); - assert( nGroups <= 32 ); - } - // check the groups - for ( i = 0; i < nGroups; i++ ) - if ( !Abc_NtkPrintOneDecompCheckCofList(pCofs[i], nCofNums[i]) ) - return 0; - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintOneDecomp_rec( unsigned * uCofs, int nCofs, int nVars, unsigned uMask, int * pBestSize, unsigned * puBestMask ) -{ - unsigned uMaskNew; - int v, last, Counter = 0; - // find the last variable in the mask - for ( v = 0; v < nVars; v++ ) - if ( uMask & (1<<v) ) - { - last = v; - Counter++; - } - if ( Counter > 3 ) - return; - // try adding one variable after the last - for ( v = last + 1; v < nVars; v++ ) - { - uMaskNew = uMask | (1 << v); - if ( !Abc_NtkPrintOneDecompCheck( uCofs, nCofs, uMaskNew ) ) - continue; - if ( *pBestSize < Counter + 1 ) - { - *pBestSize = Counter + 1; - *puBestMask = uMaskNew; - } - // try other masks - Abc_NtkPrintOneDecomp_rec( uCofs, nCofs, nVars, uMaskNew, pBestSize, puBestMask ); - } -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintOneDecomp( unsigned * pTruth, int nVars ) -{ - int BoundSet = 6; - unsigned uCofs[64], uMask, uBestMask = 0; - int i, nCofs, nMints, nMintShift, BestSize = 1; - - assert( nVars > BoundSet ); - assert( nVars <= BoundSet + 5 ); // at most 5 variable cofactors - - // collect the cofactors - nCofs = (1 << BoundSet); - nMints = (1 << (nVars-BoundSet)); - nMintShift = 0; - uMask = Kit_CubeMask( nMints ); - for ( i = 0; i < nCofs; i++ ) - { - uCofs[i] = (pTruth[nMintShift/32] >> (nMintShift % 32)) & uMask; - nMintShift += nMints; - } - - // try removing variables - for ( i = 0; i < BoundSet; i++ ) - Abc_NtkPrintOneDecomp_rec( uCofs, nCofs, nVars, (1 << i), &BestSize, &uBestMask ); - - printf( "Best size = %d ", BestSize ); - printf( "Best mask = " ); - Extra_PrintBinary( stdout, &uBestMask, nVars ); - printf( "\n" ); -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintOneDec( unsigned * pTruth, int nVars ) -{ - unsigned uCof[(1<<11)], * pOut = uCof, * pIn = pTruth, * pTemp; - int nDiffs[16]; - int Order[16]; - int i, fChange, Temp, Counter; - - // find the ordering - for ( i = 0; i < nVars; i++ ) - { - Kit_TruthUniqueNew( uCof, pTruth, nVars, i ); - nDiffs[i] = Kit_TruthCountOnes( uCof, nVars ); - Order[i] = i; - } - - // permute truth table to least active variable first - Counter = 0; - do { - fChange = 0; - for ( i = 0; i < nVars-1; i++ ) - { - if ( nDiffs[i] <= nDiffs[i+1] ) - continue; - fChange = 1; - Counter++; - - Temp = nDiffs[i]; - nDiffs[i] = nDiffs[i+1]; - nDiffs[i+1] = Temp; - - Temp = Order[i]; - Order[i] = Order[i+1]; - Order[i+1] = Temp; - - Extra_TruthSwapAdjacentVars( pOut, pIn, nVars, i ); - pTemp = pIn; pIn = pOut; pOut = pTemp; - } - } while ( fChange ); - - // swap if it was moved an even number of times - if ( Counter & 1 ) - Extra_TruthCopy( pOut, pIn, nVars ); - - // call the decomposition - Abc_NtkPrintOneDecomp( pTruth, nVars ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcMini.c b/src/base/abci/abcMini.c deleted file mode 100644 index 92985423..00000000 --- a/src/base/abci/abcMini.c +++ /dev/null @@ -1,153 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcMini.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Interface to the minimalistic AIG package.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcMini.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static Hop_Man_t * Abc_NtkToMini( Abc_Ntk_t * pNtk ); -static Abc_Ntk_t * Abc_NtkFromMini( Abc_Ntk_t * pNtkOld, Hop_Man_t * pMan ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Gives the current ABC network to AIG manager for processing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkMiniBalance( Abc_Ntk_t * pNtk ) -{ - Abc_Ntk_t * pNtkAig; - Hop_Man_t * pMan, * pTemp; - assert( Abc_NtkIsStrash(pNtk) ); - // convert to the AIG manager - pMan = Abc_NtkToMini( pNtk ); - if ( pMan == NULL ) - return NULL; - if ( !Hop_ManCheck( pMan ) ) - { - printf( "AIG check has failed.\n" ); - Hop_ManStop( pMan ); - return NULL; - } - // perform balance - Hop_ManPrintStats( pMan ); -// Hop_ManDumpBlif( pMan, "aig_temp.blif" ); - pMan = Hop_ManBalance( pTemp = pMan, 1 ); - Hop_ManStop( pTemp ); - Hop_ManPrintStats( pMan ); - // convert from the AIG manager - pNtkAig = Abc_NtkFromMini( pNtk, pMan ); - if ( pNtkAig == NULL ) - return NULL; - Hop_ManStop( pMan ); - // make sure everything is okay - if ( !Abc_NtkCheck( pNtkAig ) ) - { - printf( "Abc_NtkStrash: The network check has failed.\n" ); - Abc_NtkDelete( pNtkAig ); - return NULL; - } - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Converts the network from the AIG manager into ABC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Hop_Man_t * Abc_NtkToMini( Abc_Ntk_t * pNtk ) -{ - Hop_Man_t * pMan; - Abc_Obj_t * pObj; - int i; - // create the manager - pMan = Hop_ManStart(); - // transfer the pointers to the basic nodes - Abc_AigConst1(pNtk)->pCopy = (Abc_Obj_t *)Hop_ManConst1(pMan); - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pCopy = (Abc_Obj_t *)Hop_ObjCreatePi(pMan); - // perform the conversion of the internal nodes (assumes DFS ordering) - Abc_NtkForEachNode( pNtk, pObj, i ) - pObj->pCopy = (Abc_Obj_t *)Hop_And( pMan, (Hop_Obj_t *)Abc_ObjChild0Copy(pObj), (Hop_Obj_t *)Abc_ObjChild1Copy(pObj) ); - // create the POs - Abc_NtkForEachCo( pNtk, pObj, i ) - Hop_ObjCreatePo( pMan, (Hop_Obj_t *)Abc_ObjChild0Copy(pObj) ); - Hop_ManCleanup( pMan ); - return pMan; -} - -/**Function************************************************************* - - Synopsis [Converts the network from the AIG manager into ABC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFromMini( Abc_Ntk_t * pNtk, Hop_Man_t * pMan ) -{ - Vec_Ptr_t * vNodes; - Abc_Ntk_t * pNtkNew; - Hop_Obj_t * pObj; - int i; - // perform strashing - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_STRASH, ABC_FUNC_AIG ); - // transfer the pointers to the basic nodes - Hop_ManConst1(pMan)->pData = Abc_AigConst1(pNtkNew); - Hop_ManForEachPi( pMan, pObj, i ) - pObj->pData = Abc_NtkCi(pNtkNew, i); - // rebuild the AIG - vNodes = Hop_ManDfs( pMan ); - Vec_PtrForEachEntry( vNodes, pObj, i ) - pObj->pData = Abc_AigAnd( pNtkNew->pManFunc, (Abc_Obj_t *)Hop_ObjChild0Copy(pObj), (Abc_Obj_t *)Hop_ObjChild1Copy(pObj) ); - Vec_PtrFree( vNodes ); - // connect the PO nodes - Hop_ManForEachPo( pMan, pObj, i ) - Abc_ObjAddFanin( Abc_NtkCo(pNtkNew, i), (Abc_Obj_t *)Hop_ObjChild0Copy(pObj) ); - if ( !Abc_NtkCheck( pNtkNew ) ) - fprintf( stdout, "Abc_NtkFromMini(): Network check has failed.\n" ); - return pNtkNew; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcMiter.c b/src/base/abci/abcMiter.c deleted file mode 100644 index adda6653..00000000 --- a/src/base/abci/abcMiter.c +++ /dev/null @@ -1,1138 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcMiter.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Procedures to derive the miter of two circuits.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcMiter.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static Abc_Ntk_t * Abc_NtkMiterInt( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int fComb, int nPartSize ); -static void Abc_NtkMiterPrepare( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, Abc_Ntk_t * pNtkMiter, int fComb, int nPartSize ); -static void Abc_NtkMiterAddOne( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkMiter ); -static void Abc_NtkMiterFinalize( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, Abc_Ntk_t * pNtkMiter, int fComb, int nPartSize ); -static void Abc_NtkAddFrame( Abc_Ntk_t * pNetNew, Abc_Ntk_t * pNet, int iFrame ); - -// to be exported -typedef void (*AddFrameMapping)( Abc_Obj_t*, Abc_Obj_t*, int, void*); -extern Abc_Ntk_t * Abc_NtkFrames2( Abc_Ntk_t * pNtk, int nFrames, int fInitial, AddFrameMapping addFrameMapping, void* arg ); -static void Abc_NtkAddFrame2( Abc_Ntk_t * pNtkFrames, Abc_Ntk_t * pNtk, int iFrame, Vec_Ptr_t * vNodes, AddFrameMapping addFrameMapping, void* arg ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Derives the miter of two networks.] - - Description [Preprocesses the networks to make sure that they are strashed.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkMiter( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int fComb, int nPartSize ) -{ - Abc_Ntk_t * pTemp = NULL; - int fRemove1, fRemove2; - assert( Abc_NtkHasOnlyLatchBoxes(pNtk1) ); - assert( Abc_NtkHasOnlyLatchBoxes(pNtk2) ); - // check that the networks have the same PIs/POs/latches - if ( !Abc_NtkCompareSignals( pNtk1, pNtk2, 0, fComb ) ) - return NULL; - // make sure the circuits are strashed - fRemove1 = (!Abc_NtkIsStrash(pNtk1)) && (pNtk1 = Abc_NtkStrash(pNtk1, 0, 0, 0)); - fRemove2 = (!Abc_NtkIsStrash(pNtk2)) && (pNtk2 = Abc_NtkStrash(pNtk2, 0, 0, 0)); - if ( pNtk1 && pNtk2 ) - pTemp = Abc_NtkMiterInt( pNtk1, pNtk2, fComb, nPartSize ); - if ( fRemove1 ) Abc_NtkDelete( pNtk1 ); - if ( fRemove2 ) Abc_NtkDelete( pNtk2 ); - return pTemp; -} - -/**Function************************************************************* - - Synopsis [Derives the miter of two sequential networks.] - - Description [Assumes that the networks are strashed.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkMiterInt( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int fComb, int nPartSize ) -{ - char Buffer[1000]; - Abc_Ntk_t * pNtkMiter; - - assert( Abc_NtkIsStrash(pNtk1) ); - assert( Abc_NtkIsStrash(pNtk2) ); - - // start the new network - pNtkMiter = Abc_NtkAlloc( ABC_NTK_STRASH, ABC_FUNC_AIG, 1 ); - sprintf( Buffer, "%s_%s_miter", pNtk1->pName, pNtk2->pName ); - pNtkMiter->pName = Extra_UtilStrsav(Buffer); - - // perform strashing - Abc_NtkMiterPrepare( pNtk1, pNtk2, pNtkMiter, fComb, nPartSize ); - Abc_NtkMiterAddOne( pNtk1, pNtkMiter ); - Abc_NtkMiterAddOne( pNtk2, pNtkMiter ); - Abc_NtkMiterFinalize( pNtk1, pNtk2, pNtkMiter, fComb, nPartSize ); - Abc_AigCleanup(pNtkMiter->pManFunc); - - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkMiter ) ) - { - printf( "Abc_NtkMiter: The network check has failed.\n" ); - Abc_NtkDelete( pNtkMiter ); - return NULL; - } - return pNtkMiter; -} - -/**Function************************************************************* - - Synopsis [Prepares the network for mitering.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMiterPrepare( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, Abc_Ntk_t * pNtkMiter, int fComb, int nPartSize ) -{ - Abc_Obj_t * pObj, * pObjNew; - int i; - // clean the copy field in all objects -// Abc_NtkCleanCopy( pNtk1 ); -// Abc_NtkCleanCopy( pNtk2 ); - Abc_AigConst1(pNtk1)->pCopy = Abc_AigConst1(pNtkMiter); - Abc_AigConst1(pNtk2)->pCopy = Abc_AigConst1(pNtkMiter); - - if ( fComb ) - { - // create new PIs and remember them in the old PIs - Abc_NtkForEachCi( pNtk1, pObj, i ) - { - pObjNew = Abc_NtkCreatePi( pNtkMiter ); - // remember this PI in the old PIs - pObj->pCopy = pObjNew; - pObj = Abc_NtkCi(pNtk2, i); - pObj->pCopy = pObjNew; - // add name - Abc_ObjAssignName( pObjNew, Abc_ObjName(pObj), NULL ); - } - if ( nPartSize <= 0 ) - { - // create the only PO - pObjNew = Abc_NtkCreatePo( pNtkMiter ); - // add the PO name - Abc_ObjAssignName( pObjNew, "miter", NULL ); - } - } - else - { - // create new PIs and remember them in the old PIs - Abc_NtkForEachPi( pNtk1, pObj, i ) - { - pObjNew = Abc_NtkCreatePi( pNtkMiter ); - // remember this PI in the old PIs - pObj->pCopy = pObjNew; - pObj = Abc_NtkPi(pNtk2, i); - pObj->pCopy = pObjNew; - // add name - Abc_ObjAssignName( pObjNew, Abc_ObjName(pObj), NULL ); - } - if ( nPartSize <= 0 ) - { - // create the only PO - pObjNew = Abc_NtkCreatePo( pNtkMiter ); - // add the PO name - Abc_ObjAssignName( pObjNew, "miter", NULL ); - } - // create the latches - Abc_NtkForEachLatch( pNtk1, pObj, i ) - { - pObjNew = Abc_NtkDupBox( pNtkMiter, pObj, 0 ); - // add names - Abc_ObjAssignName( pObjNew, Abc_ObjName(pObj), "_1" ); - Abc_ObjAssignName( Abc_ObjFanin0(pObjNew), Abc_ObjName(Abc_ObjFanin0(pObj)), "_1" ); - Abc_ObjAssignName( Abc_ObjFanout0(pObjNew), Abc_ObjName(Abc_ObjFanout0(pObj)), "_1" ); - } - Abc_NtkForEachLatch( pNtk2, pObj, i ) - { - pObjNew = Abc_NtkDupBox( pNtkMiter, pObj, 0 ); - // add name - Abc_ObjAssignName( pObjNew, Abc_ObjName(pObj), "_2" ); - Abc_ObjAssignName( Abc_ObjFanin0(pObjNew), Abc_ObjName(Abc_ObjFanin0(pObj)), "_2" ); - Abc_ObjAssignName( Abc_ObjFanout0(pObjNew), Abc_ObjName(Abc_ObjFanout0(pObj)), "_2" ); - } - } -} - -/**Function************************************************************* - - Synopsis [Performs mitering for one network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMiterAddOne( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkMiter ) -{ - Abc_Obj_t * pNode; - int i; - assert( Abc_NtkIsDfsOrdered(pNtk) ); - Abc_AigForEachAnd( pNtk, pNode, i ) - pNode->pCopy = Abc_AigAnd( pNtkMiter->pManFunc, Abc_ObjChild0Copy(pNode), Abc_ObjChild1Copy(pNode) ); -} - -/**Function************************************************************* - - Synopsis [Performs mitering for one network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMiterAddCone( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkMiter, Abc_Obj_t * pRoot ) -{ - Vec_Ptr_t * vNodes; - Abc_Obj_t * pNode; - int i; - // map the constant nodes - Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkMiter); - // perform strashing - vNodes = Abc_NtkDfsNodes( pNtk, &pRoot, 1 ); - Vec_PtrForEachEntry( vNodes, pNode, i ) - if ( Abc_AigNodeIsAnd(pNode) ) - pNode->pCopy = Abc_AigAnd( pNtkMiter->pManFunc, Abc_ObjChild0Copy(pNode), Abc_ObjChild1Copy(pNode) ); - Vec_PtrFree( vNodes ); -} - - -/**Function************************************************************* - - Synopsis [Finalizes the miter by adding the output part.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMiterFinalize( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, Abc_Ntk_t * pNtkMiter, int fComb, int nPartSize ) -{ - Vec_Ptr_t * vPairs; - Abc_Obj_t * pMiter, * pNode; - int i; - // collect the PO pairs from both networks - vPairs = Vec_PtrAlloc( 100 ); - if ( fComb ) - { - // collect the CO nodes for the miter - Abc_NtkForEachCo( pNtk1, pNode, i ) - { - Vec_PtrPush( vPairs, Abc_ObjChild0Copy(pNode) ); - pNode = Abc_NtkCo( pNtk2, i ); - Vec_PtrPush( vPairs, Abc_ObjChild0Copy(pNode) ); - } - } - else - { - // collect the PO nodes for the miter - Abc_NtkForEachPo( pNtk1, pNode, i ) - { - Vec_PtrPush( vPairs, Abc_ObjChild0Copy(pNode) ); - pNode = Abc_NtkPo( pNtk2, i ); - Vec_PtrPush( vPairs, Abc_ObjChild0Copy(pNode) ); - } - // connect new latches - Abc_NtkForEachLatch( pNtk1, pNode, i ) - Abc_ObjAddFanin( Abc_ObjFanin0(pNode)->pCopy, Abc_ObjChild0Copy(Abc_ObjFanin0(pNode)) ); - Abc_NtkForEachLatch( pNtk2, pNode, i ) - Abc_ObjAddFanin( Abc_ObjFanin0(pNode)->pCopy, Abc_ObjChild0Copy(Abc_ObjFanin0(pNode)) ); - } - // add the miter - if ( nPartSize <= 0 ) - { - pMiter = Abc_AigMiter( pNtkMiter->pManFunc, vPairs ); - Abc_ObjAddFanin( Abc_NtkPo(pNtkMiter,0), pMiter ); - Vec_PtrFree( vPairs ); - } - else - { - char Buffer[1024]; - Vec_Ptr_t * vPairsPart; - int nParts, i, k, iCur; - assert( Vec_PtrSize(vPairs) == 2 * Abc_NtkCoNum(pNtk1) ); - // create partitions - nParts = Abc_NtkCoNum(pNtk1) / nPartSize + (int)((Abc_NtkCoNum(pNtk1) % nPartSize) > 0); - vPairsPart = Vec_PtrAlloc( nPartSize ); - for ( i = 0; i < nParts; i++ ) - { - Vec_PtrClear( vPairsPart ); - for ( k = 0; k < nPartSize; k++ ) - { - iCur = i * nPartSize + k; - if ( iCur >= Abc_NtkCoNum(pNtk1) ) - break; - Vec_PtrPush( vPairsPart, Vec_PtrEntry(vPairs, 2*iCur ) ); - Vec_PtrPush( vPairsPart, Vec_PtrEntry(vPairs, 2*iCur+1) ); - } - pMiter = Abc_AigMiter( pNtkMiter->pManFunc, vPairsPart ); - pNode = Abc_NtkCreatePo( pNtkMiter ); - Abc_ObjAddFanin( pNode, pMiter ); - // assign the name to the node - if ( nPartSize == 1 ) - sprintf( Buffer, "%s", Abc_ObjName(Abc_NtkCo(pNtk1,i)) ); - else - sprintf( Buffer, "%d", i ); - Abc_ObjAssignName( pNode, "miter_", Buffer ); - } - Vec_PtrFree( vPairsPart ); - Vec_PtrFree( vPairs ); - } -} - - - -/**Function************************************************************* - - Synopsis [Derives the AND of two miters.] - - Description [The network should have the same names of PIs.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkMiterAnd( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int fOr, int fCompl2 ) -{ - char Buffer[1000]; - Abc_Ntk_t * pNtkMiter; - Abc_Obj_t * pOutput1, * pOutput2; - Abc_Obj_t * pRoot1, * pRoot2, * pMiter; - - assert( Abc_NtkIsStrash(pNtk1) ); - assert( Abc_NtkIsStrash(pNtk2) ); - assert( 1 == Abc_NtkCoNum(pNtk1) ); - assert( 1 == Abc_NtkCoNum(pNtk2) ); - assert( 0 == Abc_NtkLatchNum(pNtk1) ); - assert( 0 == Abc_NtkLatchNum(pNtk2) ); - assert( Abc_NtkCiNum(pNtk1) == Abc_NtkCiNum(pNtk2) ); - assert( Abc_NtkHasOnlyLatchBoxes(pNtk1) ); - assert( Abc_NtkHasOnlyLatchBoxes(pNtk2) ); - - // start the new network - pNtkMiter = Abc_NtkAlloc( ABC_NTK_STRASH, ABC_FUNC_AIG, 1 ); -// sprintf( Buffer, "%s_%s_miter", pNtk1->pName, pNtk2->pName ); - sprintf( Buffer, "product" ); - pNtkMiter->pName = Extra_UtilStrsav(Buffer); - - // perform strashing - Abc_NtkMiterPrepare( pNtk1, pNtk2, pNtkMiter, 1, -1 ); - Abc_NtkMiterAddOne( pNtk1, pNtkMiter ); - Abc_NtkMiterAddOne( pNtk2, pNtkMiter ); -// Abc_NtkMiterFinalize( pNtk1, pNtk2, pNtkMiter, 1 ); - pRoot1 = Abc_NtkPo(pNtk1,0); - pRoot2 = Abc_NtkPo(pNtk2,0); - pOutput1 = Abc_ObjNotCond( Abc_ObjFanin0(pRoot1)->pCopy, Abc_ObjFaninC0(pRoot1) ); - pOutput2 = Abc_ObjNotCond( Abc_ObjFanin0(pRoot2)->pCopy, Abc_ObjFaninC0(pRoot2) ^ fCompl2 ); - - // create the miter of the two outputs - if ( fOr ) - pMiter = Abc_AigOr( pNtkMiter->pManFunc, pOutput1, pOutput2 ); - else - pMiter = Abc_AigAnd( pNtkMiter->pManFunc, pOutput1, pOutput2 ); - Abc_ObjAddFanin( Abc_NtkPo(pNtkMiter,0), pMiter ); - - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkMiter ) ) - { - printf( "Abc_NtkMiterAnd: The network check has failed.\n" ); - Abc_NtkDelete( pNtkMiter ); - return NULL; - } - return pNtkMiter; -} - - -/**Function************************************************************* - - Synopsis [Derives the cofactor of the miter w.r.t. the set of vars.] - - Description [The array of variable values contains -1/0/1 for each PI. - -1 means this PI remains, 0/1 means this PI is set to 0/1.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkMiterCofactor( Abc_Ntk_t * pNtk, Vec_Int_t * vPiValues ) -{ - char Buffer[1000]; - Abc_Ntk_t * pNtkMiter; - Abc_Obj_t * pRoot, * pOutput1; - int Value, i; - - assert( Abc_NtkIsStrash(pNtk) ); - assert( 1 == Abc_NtkCoNum(pNtk) ); - assert( Abc_NtkHasOnlyLatchBoxes(pNtk) ); - - // start the new network - pNtkMiter = Abc_NtkAlloc( ABC_NTK_STRASH, ABC_FUNC_AIG, 1 ); - sprintf( Buffer, "%s_miter", pNtk->pName ); - pNtkMiter->pName = Extra_UtilStrsav(Buffer); - - // get the root output - pRoot = Abc_NtkCo( pNtk, 0 ); - - // perform strashing - Abc_NtkMiterPrepare( pNtk, pNtk, pNtkMiter, 1, -1 ); - // set the first cofactor - Vec_IntForEachEntry( vPiValues, Value, i ) - { - if ( Value == -1 ) - continue; - if ( Value == 0 ) - { - Abc_NtkCi(pNtk, i)->pCopy = Abc_ObjNot( Abc_AigConst1(pNtkMiter) ); - continue; - } - if ( Value == 1 ) - { - Abc_NtkCi(pNtk, i)->pCopy = Abc_AigConst1(pNtkMiter); - continue; - } - assert( 0 ); - } - // add the first cofactor - Abc_NtkMiterAddCone( pNtk, pNtkMiter, pRoot ); - - // save the output - pOutput1 = Abc_ObjNotCond( Abc_ObjFanin0(pRoot)->pCopy, Abc_ObjFaninC0(pRoot) ); - - // create the miter of the two outputs - Abc_ObjAddFanin( Abc_NtkPo(pNtkMiter,0), pOutput1 ); - - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkMiter ) ) - { - printf( "Abc_NtkMiterCofactor: The network check has failed.\n" ); - Abc_NtkDelete( pNtkMiter ); - return NULL; - } - return pNtkMiter; -} -/**Function************************************************************* - - Synopsis [Derives the miter of two cofactors of one output.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkMiterForCofactors( Abc_Ntk_t * pNtk, int Out, int In1, int In2 ) -{ - char Buffer[1000]; - Abc_Ntk_t * pNtkMiter; - Abc_Obj_t * pRoot, * pOutput1, * pOutput2, * pMiter; - - assert( Abc_NtkIsStrash(pNtk) ); - assert( Out < Abc_NtkCoNum(pNtk) ); - assert( In1 < Abc_NtkCiNum(pNtk) ); - assert( In2 < Abc_NtkCiNum(pNtk) ); - assert( Abc_NtkHasOnlyLatchBoxes(pNtk) ); - - // start the new network - pNtkMiter = Abc_NtkAlloc( ABC_NTK_STRASH, ABC_FUNC_AIG, 1 ); - sprintf( Buffer, "%s_miter", Abc_ObjName(Abc_NtkCo(pNtk, Out)) ); - pNtkMiter->pName = Extra_UtilStrsav(Buffer); - - // get the root output - pRoot = Abc_NtkCo( pNtk, Out ); - - // perform strashing - Abc_NtkMiterPrepare( pNtk, pNtk, pNtkMiter, 1, -1 ); - // set the first cofactor - Abc_NtkCi(pNtk, In1)->pCopy = Abc_ObjNot( Abc_AigConst1(pNtkMiter) ); - if ( In2 >= 0 ) - Abc_NtkCi(pNtk, In2)->pCopy = Abc_AigConst1(pNtkMiter); - // add the first cofactor - Abc_NtkMiterAddCone( pNtk, pNtkMiter, pRoot ); - - // save the output - pOutput1 = Abc_ObjFanin0(pRoot)->pCopy; - - // set the second cofactor - Abc_NtkCi(pNtk, In1)->pCopy = Abc_AigConst1(pNtkMiter); - if ( In2 >= 0 ) - Abc_NtkCi(pNtk, In2)->pCopy = Abc_ObjNot( Abc_AigConst1(pNtkMiter) ); - // add the second cofactor - Abc_NtkMiterAddCone( pNtk, pNtkMiter, pRoot ); - - // save the output - pOutput2 = Abc_ObjFanin0(pRoot)->pCopy; - - // create the miter of the two outputs - pMiter = Abc_AigXor( pNtkMiter->pManFunc, pOutput1, pOutput2 ); - Abc_ObjAddFanin( Abc_NtkPo(pNtkMiter,0), pMiter ); - - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkMiter ) ) - { - printf( "Abc_NtkMiter: The network check has failed.\n" ); - Abc_NtkDelete( pNtkMiter ); - return NULL; - } - return pNtkMiter; -} - - -/**Function************************************************************* - - Synopsis [Derives the miter of two cofactors of one output.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkMiterQuantify( Abc_Ntk_t * pNtk, int In, int fExist ) -{ - Abc_Ntk_t * pNtkMiter; - Abc_Obj_t * pRoot, * pOutput1, * pOutput2, * pMiter; - - assert( Abc_NtkIsStrash(pNtk) ); - assert( 1 == Abc_NtkCoNum(pNtk) ); - assert( In < Abc_NtkCiNum(pNtk) ); - assert( Abc_NtkHasOnlyLatchBoxes(pNtk) ); - - // start the new network - pNtkMiter = Abc_NtkAlloc( ABC_NTK_STRASH, ABC_FUNC_AIG, 1 ); - pNtkMiter->pName = Extra_UtilStrsav( Abc_ObjName(Abc_NtkCo(pNtk, 0)) ); - - // get the root output - pRoot = Abc_NtkCo( pNtk, 0 ); - - // perform strashing - Abc_NtkMiterPrepare( pNtk, pNtk, pNtkMiter, 1, -1 ); - // set the first cofactor - Abc_NtkCi(pNtk, In)->pCopy = Abc_ObjNot( Abc_AigConst1(pNtkMiter) ); - // add the first cofactor - Abc_NtkMiterAddCone( pNtk, pNtkMiter, pRoot ); - // save the output -// pOutput1 = Abc_ObjFanin0(pRoot)->pCopy; - pOutput1 = Abc_ObjNotCond( Abc_ObjFanin0(pRoot)->pCopy, Abc_ObjFaninC0(pRoot) ); - - // set the second cofactor - Abc_NtkCi(pNtk, In)->pCopy = Abc_AigConst1(pNtkMiter); - // add the second cofactor - Abc_NtkMiterAddCone( pNtk, pNtkMiter, pRoot ); - // save the output -// pOutput2 = Abc_ObjFanin0(pRoot)->pCopy; - pOutput2 = Abc_ObjNotCond( Abc_ObjFanin0(pRoot)->pCopy, Abc_ObjFaninC0(pRoot) ); - - // create the miter of the two outputs - if ( fExist ) - pMiter = Abc_AigOr( pNtkMiter->pManFunc, pOutput1, pOutput2 ); - else - pMiter = Abc_AigAnd( pNtkMiter->pManFunc, pOutput1, pOutput2 ); - Abc_ObjAddFanin( Abc_NtkPo(pNtkMiter,0), pMiter ); - - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkMiter ) ) - { - printf( "Abc_NtkMiter: The network check has failed.\n" ); - Abc_NtkDelete( pNtkMiter ); - return NULL; - } - return pNtkMiter; -} - -/**Function************************************************************* - - Synopsis [Quantifies all the PIs existentially from the only PO of the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkMiterQuantifyPis( Abc_Ntk_t * pNtk ) -{ - Abc_Ntk_t * pNtkTemp; - Abc_Obj_t * pObj; - int i; - assert( Abc_NtkHasOnlyLatchBoxes(pNtk) ); - - Abc_NtkForEachPi( pNtk, pObj, i ) - { - if ( Abc_ObjFanoutNum(pObj) == 0 ) - continue; - pNtk = Abc_NtkMiterQuantify( pNtkTemp = pNtk, i, 1 ); - Abc_NtkDelete( pNtkTemp ); - } - - return pNtk; -} - - - - -/**Function************************************************************* - - Synopsis [Checks the status of the miter.] - - Description [Return 0 if the miter is sat for at least one output. - Return 1 if the miter is unsat for all its outputs. Returns -1 if the - miter is undecided for some outputs.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkMiterIsConstant( Abc_Ntk_t * pMiter ) -{ - Abc_Obj_t * pNodePo, * pChild; - int i; - assert( Abc_NtkIsStrash(pMiter) ); - Abc_NtkForEachPo( pMiter, pNodePo, i ) - { - pChild = Abc_ObjChild0( pNodePo ); - if ( Abc_AigNodeIsConst(pChild) ) - { - assert( Abc_ObjRegular(pChild) == Abc_AigConst1(pMiter) ); - if ( !Abc_ObjIsComplement(pChild) ) - { - // if the miter is constant 1, return immediately -// printf( "MITER IS CONSTANT 1!\n" ); - return 0; - } - } - // if the miter is undecided (or satisfiable), return immediately - else - return -1; - } - // return 1, meaning all outputs are constant zero - return 1; -} - -/**Function************************************************************* - - Synopsis [Reports the status of the miter.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMiterReport( Abc_Ntk_t * pMiter ) -{ - Abc_Obj_t * pChild, * pNode; - int i; - if ( Abc_NtkPoNum(pMiter) == 1 ) - { - pChild = Abc_ObjChild0( Abc_NtkPo(pMiter,0) ); - if ( Abc_AigNodeIsConst(pChild) ) - { - if ( Abc_ObjIsComplement(pChild) ) - printf( "Unsatisfiable.\n" ); - else - printf( "Satisfiable. (Constant 1).\n" ); - } - else - printf( "Satisfiable.\n" ); - } - else - { - Abc_NtkForEachPo( pMiter, pNode, i ) - { - pChild = Abc_ObjChild0( Abc_NtkPo(pMiter,i) ); - printf( "Output #%2d : ", i ); - if ( Abc_AigNodeIsConst(pChild) ) - { - if ( Abc_ObjIsComplement(pChild) ) - printf( "Unsatisfiable.\n" ); - else - printf( "Satisfiable. (Constant 1).\n" ); - } - else - printf( "Satisfiable.\n" ); - } - } -} - - -/**Function************************************************************* - - Synopsis [Derives the timeframes of the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFrames( Abc_Ntk_t * pNtk, int nFrames, int fInitial ) -{ - char Buffer[1000]; - ProgressBar * pProgress; - Abc_Ntk_t * pNtkFrames; - Abc_Obj_t * pLatch, * pLatchOut; - int i, Counter; - assert( nFrames > 0 ); - assert( Abc_NtkIsStrash(pNtk) ); - assert( Abc_NtkIsDfsOrdered(pNtk) ); - assert( Abc_NtkHasOnlyLatchBoxes(pNtk) ); - // start the new network - pNtkFrames = Abc_NtkAlloc( ABC_NTK_STRASH, ABC_FUNC_AIG, 1 ); - sprintf( Buffer, "%s_%d_frames", pNtk->pName, nFrames ); - pNtkFrames->pName = Extra_UtilStrsav(Buffer); - // map the constant nodes - Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkFrames); - // create new latches (or their initial values) and remember them in the new latches - if ( !fInitial ) - { - Abc_NtkForEachLatch( pNtk, pLatch, i ) - Abc_NtkDupBox( pNtkFrames, pLatch, 1 ); - } - else - { - Counter = 0; - Abc_NtkForEachLatch( pNtk, pLatch, i ) - { - pLatchOut = Abc_ObjFanout0(pLatch); - if ( Abc_LatchIsInitNone(pLatch) || Abc_LatchIsInitDc(pLatch) ) // don't-care initial value - create a new PI - { - pLatchOut->pCopy = Abc_NtkCreatePi(pNtkFrames); - Abc_ObjAssignName( pLatchOut->pCopy, Abc_ObjName(pLatchOut), NULL ); - Counter++; - } - else - pLatchOut->pCopy = Abc_ObjNotCond( Abc_AigConst1(pNtkFrames), Abc_LatchIsInit0(pLatch) ); - } - if ( Counter ) - printf( "Warning: %d uninitialized latches are replaced by free PI variables.\n", Counter ); - } - - // create the timeframes - pProgress = Extra_ProgressBarStart( stdout, nFrames ); - for ( i = 0; i < nFrames; i++ ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - Abc_NtkAddFrame( pNtkFrames, pNtk, i ); - } - Extra_ProgressBarStop( pProgress ); - - // connect the new latches to the outputs of the last frame - if ( !fInitial ) - { - // we cannot use pLatch->pCopy here because pLatch->pCopy is used for temporary storage of strashed values - Abc_NtkForEachLatch( pNtk, pLatch, i ) - Abc_ObjAddFanin( Abc_ObjFanin0(pLatch)->pCopy, Abc_ObjFanout0(pLatch)->pCopy ); - } - - // remove dangling nodes - Abc_AigCleanup( pNtkFrames->pManFunc ); - // reorder the latches - Abc_NtkOrderCisCos( pNtkFrames ); - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkFrames ) ) - { - printf( "Abc_NtkFrames: The network check has failed.\n" ); - Abc_NtkDelete( pNtkFrames ); - return NULL; - } - return pNtkFrames; -} - -/**Function************************************************************* - - Synopsis [Adds one time frame to the new network.] - - Description [Assumes that the latches of the old network point - to the outputs of the previous frame of the new network (pLatch->pCopy). - In the end, updates the latches of the old network to point to the - outputs of the current frame of the new network.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkAddFrame( Abc_Ntk_t * pNtkFrames, Abc_Ntk_t * pNtk, int iFrame ) -{ - char Buffer[10]; - Abc_Obj_t * pNode, * pLatch; - int i; - // create the prefix to be added to the node names - sprintf( Buffer, "_%02d", iFrame ); - // add the new PI nodes - Abc_NtkForEachPi( pNtk, pNode, i ) - Abc_ObjAssignName( Abc_NtkDupObj(pNtkFrames, pNode, 0), Abc_ObjName(pNode), Buffer ); - // add the internal nodes - Abc_AigForEachAnd( pNtk, pNode, i ) - pNode->pCopy = Abc_AigAnd( pNtkFrames->pManFunc, Abc_ObjChild0Copy(pNode), Abc_ObjChild1Copy(pNode) ); - // add the new POs - Abc_NtkForEachPo( pNtk, pNode, i ) - { - Abc_ObjAssignName( Abc_NtkDupObj(pNtkFrames, pNode, 0), Abc_ObjName(pNode), Buffer ); - Abc_ObjAddFanin( pNode->pCopy, Abc_ObjChild0Copy(pNode) ); - } - // add the new asserts - Abc_NtkForEachAssert( pNtk, pNode, i ) - { - Abc_ObjAssignName( Abc_NtkDupObj(pNtkFrames, pNode, 0), Abc_ObjName(pNode), Buffer ); - Abc_ObjAddFanin( pNode->pCopy, Abc_ObjChild0Copy(pNode) ); - } - // transfer the implementation of the latch inputs to the latch outputs - Abc_NtkForEachLatch( pNtk, pLatch, i ) - pLatch->pCopy = Abc_ObjChild0Copy(Abc_ObjFanin0(pLatch)); - Abc_NtkForEachLatch( pNtk, pLatch, i ) - Abc_ObjFanout0(pLatch)->pCopy = pLatch->pCopy; -} - - - -/**Function************************************************************* - - Synopsis [Derives the timeframes of the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFrames2( Abc_Ntk_t * pNtk, int nFrames, int fInitial, AddFrameMapping addFrameMapping, void* arg ) -{ -/* - char Buffer[1000]; - ProgressBar * pProgress; - Abc_Ntk_t * pNtkFrames; - Vec_Ptr_t * vNodes; - Abc_Obj_t * pLatch, * pLatchNew; - int i, Counter; - assert( nFrames > 0 ); - assert( Abc_NtkIsStrash(pNtk) ); - // start the new network - pNtkFrames = Abc_NtkAlloc( ABC_NTK_STRASH, ABC_FUNC_AIG, 1 ); - sprintf( Buffer, "%s_%d_frames", pNtk->pName, nFrames ); - pNtkFrames->pName = Extra_UtilStrsav(Buffer); - // create new latches (or their initial values) and remember them in the new latches - if ( !fInitial ) - { - Abc_NtkForEachLatch( pNtk, pLatch, i ) { - Abc_NtkDupObj( pNtkFrames, pLatch ); - if (addFrameMapping) addFrameMapping(pLatch->pCopy, pLatch, 0, arg); - } - } - else - { - Counter = 0; - Abc_NtkForEachLatch( pNtk, pLatch, i ) - { - if ( Abc_LatchIsInitDc(pLatch) ) // don't-care initial value - create a new PI - { - pLatch->pCopy = Abc_NtkCreatePi(pNtkFrames); - Abc_ObjAssignName( pLatch->pCopy, Abc_ObjName(pLatch), NULL ); - Counter++; - } - else { - pLatch->pCopy = Abc_ObjNotCond( Abc_AigConst1(pNtkFrames), Abc_LatchIsInit0(pLatch) ); - } - - if (addFrameMapping) addFrameMapping(pLatch->pCopy, pLatch, 0, arg); - } - if ( Counter ) - printf( "Warning: %d uninitialized latches are replaced by free PI variables.\n", Counter ); - } - - // create the timeframes - vNodes = Abc_NtkDfs( pNtk, 0 ); - pProgress = Extra_ProgressBarStart( stdout, nFrames ); - for ( i = 0; i < nFrames; i++ ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - Abc_NtkAddFrame2( pNtkFrames, pNtk, i, vNodes, addFrameMapping, arg ); - } - Extra_ProgressBarStop( pProgress ); - Vec_PtrFree( vNodes ); - - // connect the new latches to the outputs of the last frame - if ( !fInitial ) - { - Abc_NtkForEachLatch( pNtk, pLatch, i ) - { - pLatchNew = Abc_NtkBox(pNtkFrames, i); - Abc_ObjAddFanin( pLatchNew, pLatch->pCopy ); - Abc_ObjAssignName( pLatchNew, Abc_ObjName(pLatch), NULL ); - } - } - Abc_NtkForEachLatch( pNtk, pLatch, i ) - pLatch->pNext = NULL; - - // remove dangling nodes - Abc_AigCleanup( pNtkFrames->pManFunc ); - - // reorder the latches - Abc_NtkOrderCisCos( pNtkFrames ); - - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtkFrames ) ) - { - printf( "Abc_NtkFrames: The network check has failed.\n" ); - Abc_NtkDelete( pNtkFrames ); - return NULL; - } - return pNtkFrames; -*/ - return NULL; -} - -/**Function************************************************************* - - Synopsis [Adds one time frame to the new network.] - - Description [Assumes that the latches of the old network point - to the outputs of the previous frame of the new network (pLatch->pCopy). - In the end, updates the latches of the old network to point to the - outputs of the current frame of the new network.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkAddFrame2( Abc_Ntk_t * pNtkFrames, Abc_Ntk_t * pNtk, int iFrame, Vec_Ptr_t * vNodes, AddFrameMapping addFrameMapping, void* arg ) -{ -/* - char Buffer[10]; - Abc_Obj_t * pNode, * pNodeNew, * pLatch; - Abc_Obj_t * pConst1, * pConst1New; - int i; - // get the constant nodes - pConst1 = Abc_AigConst1(pNtk); - pConst1New = Abc_AigConst1(pNtkFrames); - // create the prefix to be added to the node names - sprintf( Buffer, "_%02d", iFrame ); - // add the new PI nodes - Abc_NtkForEachPi( pNtk, pNode, i ) - { - pNodeNew = Abc_NtkDupObj( pNtkFrames, pNode ); - Abc_ObjAssignName( pNodeNew, Abc_ObjName(pNode), Buffer ); - if (addFrameMapping) addFrameMapping(pNodeNew, pNode, iFrame, arg); - } - // add the internal nodes - Vec_PtrForEachEntry( vNodes, pNode, i ) - { - if ( pNode == pConst1 ) - pNodeNew = pConst1New; - else - pNodeNew = Abc_AigAnd( pNtkFrames->pManFunc, Abc_ObjChild0Copy(pNode), Abc_ObjChild1Copy(pNode) ); - pNode->pCopy = pNodeNew; - if (addFrameMapping) addFrameMapping(pNodeNew, pNode, iFrame, arg); - } - // add the new POs - Abc_NtkForEachPo( pNtk, pNode, i ) - { - pNodeNew = Abc_NtkDupObj( pNtkFrames, pNode ); - Abc_ObjAddFanin( pNodeNew, Abc_ObjChild0Copy(pNode) ); - Abc_ObjAssignName( pNodeNew, Abc_ObjName(pNode), Buffer ); - if (addFrameMapping) addFrameMapping(pNodeNew, pNode, iFrame, arg); - } - // transfer the implementation of the latch drivers to the latches - - // it is important that these two steps are performed it two loops - // and not in the same loop - Abc_NtkForEachLatch( pNtk, pLatch, i ) - pLatch->pNext = Abc_ObjChild0Copy(pLatch); - Abc_NtkForEachLatch( pNtk, pLatch, i ) - pLatch->pCopy = pLatch->pNext; - - Abc_NtkForEachLatch( pNtk, pLatch, i ) - { - if (addFrameMapping) { - // don't give Mike complemented pointers because he doesn't like it - if (Abc_ObjIsComplement(pLatch->pCopy)) { - pNodeNew = Abc_NtkCreateNode( pNtkFrames ); - Abc_ObjAddFanin( pNodeNew, pLatch->pCopy ); - assert(Abc_ObjFaninNum(pNodeNew) == 1); - pNodeNew->Level = 1 + Abc_ObjRegular(pLatch->pCopy)->Level; - - pLatch->pNext = pNodeNew; - pLatch->pCopy = pNodeNew; - } - addFrameMapping(pLatch->pCopy, pLatch, iFrame+1, arg); - } - } -*/ -} - - - -/**Function************************************************************* - - Synopsis [Splits the miter into two logic cones combined by an EXOR] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDemiter( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNodeC, * pNodeA, * pNodeB, * pNode; - Abc_Obj_t * pPoNew; - Vec_Ptr_t * vNodes1, * vNodes2; - int nCommon, i; - - assert( Abc_NtkIsStrash(pNtk) ); - assert( Abc_NtkPoNum(pNtk) == 1 ); - if ( !Abc_NodeIsExorType(Abc_ObjFanin0(Abc_NtkPo(pNtk,0))) ) - { - printf( "The root of the miter is not an EXOR gate.\n" ); - return 0; - } - pNodeC = Abc_NodeRecognizeMux( Abc_ObjFanin0(Abc_NtkPo(pNtk,0)), &pNodeA, &pNodeB ); - assert( Abc_ObjRegular(pNodeA) == Abc_ObjRegular(pNodeB) ); - if ( Abc_ObjFaninC0(Abc_NtkPo(pNtk,0)) ) - { - pNodeA = Abc_ObjNot(pNodeA); - pNodeB = Abc_ObjNot(pNodeB); - } - - // add the PO corresponding to control input - pPoNew = Abc_NtkCreatePo( pNtk ); - Abc_ObjAddFanin( pPoNew, pNodeC ); - Abc_ObjAssignName( pPoNew, "addOut1", NULL ); - - // add the PO corresponding to other input - pPoNew = Abc_NtkCreatePo( pNtk ); - Abc_ObjAddFanin( pPoNew, pNodeB ); - Abc_ObjAssignName( pPoNew, "addOut2", NULL ); - - // mark the nodes in the first cone - pNodeB = Abc_ObjRegular(pNodeB); - vNodes1 = Abc_NtkDfsNodes( pNtk, &pNodeC, 1 ); - vNodes2 = Abc_NtkDfsNodes( pNtk, &pNodeB, 1 ); - - Vec_PtrForEachEntry( vNodes1, pNode, i ) - pNode->fMarkA = 1; - nCommon = 0; - Vec_PtrForEachEntry( vNodes2, pNode, i ) - nCommon += pNode->fMarkA; - Vec_PtrForEachEntry( vNodes1, pNode, i ) - pNode->fMarkA = 0; - - printf( "First cone = %6d. Second cone = %6d. Common = %6d.\n", vNodes1->nSize, vNodes2->nSize, nCommon ); - Vec_PtrFree( vNodes1 ); - Vec_PtrFree( vNodes2 ); - - // reorder the latches - Abc_NtkOrderCisCos( pNtk ); - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtk ) ) - printf( "Abc_NtkDemiter: The network check has failed.\n" ); - return 1; -} - -/**Function************************************************************* - - Synopsis [Computes OR or AND of the POs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkCombinePos( Abc_Ntk_t * pNtk, int fAnd ) -{ - Abc_Obj_t * pNode, * pMiter; - int i; - assert( Abc_NtkIsStrash(pNtk) ); -// assert( Abc_NtkLatchNum(pNtk) == 0 ); - if ( Abc_NtkPoNum(pNtk) == 1 ) - return 1; - // start the result - if ( fAnd ) - pMiter = Abc_AigConst1(pNtk); - else - pMiter = Abc_ObjNot( Abc_AigConst1(pNtk) ); - // perform operations on the POs - Abc_NtkForEachPo( pNtk, pNode, i ) - if ( fAnd ) - pMiter = Abc_AigAnd( pNtk->pManFunc, pMiter, Abc_ObjChild0(pNode) ); - else - pMiter = Abc_AigOr( pNtk->pManFunc, pMiter, Abc_ObjChild0(pNode) ); - // remove the POs and their names - for ( i = Abc_NtkPoNum(pNtk) - 1; i >= 0; i-- ) - Abc_NtkDeleteObj( Abc_NtkPo(pNtk, i) ); - assert( Abc_NtkPoNum(pNtk) == 0 ); - // create the new PO - pNode = Abc_NtkCreatePo( pNtk ); - Abc_ObjAddFanin( pNode, pMiter ); - Abc_ObjAssignName( pNode, "miter", NULL ); - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtk ) ) - { - printf( "Abc_NtkOrPos: The network check has failed.\n" ); - return 0; - } - return 1; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcMulti.c b/src/base/abci/abcMulti.c deleted file mode 100644 index e93360a0..00000000 --- a/src/base/abci/abcMulti.c +++ /dev/null @@ -1,643 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcMulti.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Procedures which transform an AIG into multi-input AND-graph.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcMulti.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Abc_NtkMultiInt( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew ); -static Abc_Obj_t * Abc_NtkMulti_rec( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNodeOld ); - -static DdNode * Abc_NtkMultiDeriveBdd_rec( DdManager * dd, Abc_Obj_t * pNodeOld, Vec_Ptr_t * vFanins ); -static DdNode * Abc_NtkMultiDeriveBdd( DdManager * dd, Abc_Obj_t * pNodeOld, Vec_Ptr_t * vFaninsOld ); - -static void Abc_NtkMultiSetBounds( Abc_Ntk_t * pNtk, int nThresh, int nFaninMax ); -static void Abc_NtkMultiSetBoundsCnf( Abc_Ntk_t * pNtk ); -static void Abc_NtkMultiSetBoundsMulti( Abc_Ntk_t * pNtk, int nThresh ); -static void Abc_NtkMultiSetBoundsSimple( Abc_Ntk_t * pNtk ); -static void Abc_NtkMultiSetBoundsFactor( Abc_Ntk_t * pNtk ); -static void Abc_NtkMultiCone( Abc_Obj_t * pNode, Vec_Ptr_t * vCone ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Transforms the AIG into nodes.] - - Description [Threhold is the max number of nodes duplicated at a node.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkMulti( Abc_Ntk_t * pNtk, int nThresh, int nFaninMax, int fCnf, int fMulti, int fSimple, int fFactor ) -{ - Abc_Ntk_t * pNtkNew; - - assert( Abc_NtkIsStrash(pNtk) ); - assert( nThresh >= 0 ); - assert( nFaninMax > 1 ); - - // print a warning about choice nodes - if ( Abc_NtkGetChoiceNum( pNtk ) ) - printf( "Warning: The choice nodes in the AIG are removed by renoding.\n" ); - - // define the boundary - if ( fCnf ) - Abc_NtkMultiSetBoundsCnf( pNtk ); - else if ( fMulti ) - Abc_NtkMultiSetBoundsMulti( pNtk, nThresh ); - else if ( fSimple ) - Abc_NtkMultiSetBoundsSimple( pNtk ); - else if ( fFactor ) - Abc_NtkMultiSetBoundsFactor( pNtk ); - else - Abc_NtkMultiSetBounds( pNtk, nThresh, nFaninMax ); - - // perform renoding for this boundary - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_BDD ); - Abc_NtkMultiInt( pNtk, pNtkNew ); - Abc_NtkFinalize( pNtk, pNtkNew ); - - // make the network minimum base - Abc_NtkMinimumBase( pNtkNew ); - - // fix the problem with complemented and duplicated CO edges - Abc_NtkLogicMakeSimpleCos( pNtkNew, 0 ); - - // report the number of CNF objects - if ( fCnf ) - { -// int nClauses = Abc_NtkGetClauseNum(pNtkNew) + 2*Abc_NtkPoNum(pNtkNew) + 2*Abc_NtkLatchNum(pNtkNew); -// printf( "CNF variables = %d. CNF clauses = %d.\n", Abc_NtkNodeNum(pNtkNew), nClauses ); - } -//printf( "Maximum fanin = %d.\n", Abc_NtkGetFaninMax(pNtkNew) ); - - if ( pNtk->pExdc ) - pNtkNew->pExdc = Abc_NtkDup( pNtk->pExdc ); - // make sure everything is okay - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkMulti: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Transforms the AIG into nodes.] - - Description [Threhold is the max number of nodes duplicated at a node.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMultiInt( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew ) -{ - ProgressBar * pProgress; - Abc_Obj_t * pNode, * pConst1, * pNodeNew; - int i; - - // set the constant node - pConst1 = Abc_AigConst1(pNtk); - if ( Abc_ObjFanoutNum(pConst1) > 0 ) - { - pNodeNew = Abc_NtkCreateNode( pNtkNew ); - pNodeNew->pData = Cudd_ReadOne( pNtkNew->pManFunc ); Cudd_Ref( pNodeNew->pData ); - pConst1->pCopy = pNodeNew; - } - - // perform renoding for POs - pProgress = Extra_ProgressBarStart( stdout, Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - if ( Abc_ObjIsCi(Abc_ObjFanin0(pNode)) ) - continue; - Abc_NtkMulti_rec( pNtkNew, Abc_ObjFanin0(pNode) ); - } - Extra_ProgressBarStop( pProgress ); - - // clean the boundaries and data field in the old network - Abc_NtkForEachObj( pNtk, pNode, i ) - { - pNode->fMarkA = 0; - pNode->pData = NULL; - } -} - -/**Function************************************************************* - - Synopsis [Find the best multi-input node rooted at the given node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NtkMulti_rec( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNodeOld ) -{ - Vec_Ptr_t * vCone; - Abc_Obj_t * pNodeNew; - int i; - - assert( !Abc_ObjIsComplement(pNodeOld) ); - // return if the result if known - if ( pNodeOld->pCopy ) - return pNodeOld->pCopy; - assert( Abc_ObjIsNode(pNodeOld) ); - assert( !Abc_AigNodeIsConst(pNodeOld) ); - assert( pNodeOld->fMarkA ); - -//printf( "%d ", Abc_NodeMffcSizeSupp(pNodeOld) ); - - // collect the renoding cone - vCone = Vec_PtrAlloc( 10 ); - Abc_NtkMultiCone( pNodeOld, vCone ); - - // create a new node - pNodeNew = Abc_NtkCreateNode( pNtkNew ); - for ( i = 0; i < vCone->nSize; i++ ) - Abc_ObjAddFanin( pNodeNew, Abc_NtkMulti_rec(pNtkNew, vCone->pArray[i]) ); - - // derive the function of this node - pNodeNew->pData = Abc_NtkMultiDeriveBdd( pNtkNew->pManFunc, pNodeOld, vCone ); - Cudd_Ref( pNodeNew->pData ); - Vec_PtrFree( vCone ); - - // remember the node - pNodeOld->pCopy = pNodeNew; - return pNodeOld->pCopy; -} - - -/**Function************************************************************* - - Synopsis [Derives the local BDD of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -DdNode * Abc_NtkMultiDeriveBdd( DdManager * dd, Abc_Obj_t * pNodeOld, Vec_Ptr_t * vFaninsOld ) -{ - Abc_Obj_t * pFaninOld; - DdNode * bFunc; - int i; - assert( !Abc_AigNodeIsConst(pNodeOld) ); - assert( Abc_ObjIsNode(pNodeOld) ); - // set the elementary BDD variables for the input nodes - for ( i = 0; i < vFaninsOld->nSize; i++ ) - { - pFaninOld = vFaninsOld->pArray[i]; - pFaninOld->pData = Cudd_bddIthVar( dd, i ); Cudd_Ref( pFaninOld->pData ); - pFaninOld->fMarkC = 1; - } - // call the recursive BDD computation - bFunc = Abc_NtkMultiDeriveBdd_rec( dd, pNodeOld, vFaninsOld ); Cudd_Ref( bFunc ); - // dereference the intermediate nodes - for ( i = 0; i < vFaninsOld->nSize; i++ ) - { - pFaninOld = vFaninsOld->pArray[i]; - Cudd_RecursiveDeref( dd, pFaninOld->pData ); - pFaninOld->fMarkC = 0; - } - Cudd_Deref( bFunc ); - return bFunc; -} - -/**Function************************************************************* - - Synopsis [Derives the local BDD of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -DdNode * Abc_NtkMultiDeriveBdd_rec( DdManager * dd, Abc_Obj_t * pNode, Vec_Ptr_t * vFanins ) -{ - DdNode * bFunc, * bFunc0, * bFunc1; - assert( !Abc_ObjIsComplement(pNode) ); - // if the result is available return - if ( pNode->fMarkC ) - { - assert( pNode->pData ); // network has a cycle - return pNode->pData; - } - // mark the node as visited - pNode->fMarkC = 1; - Vec_PtrPush( vFanins, pNode ); - // compute the result for both branches - bFunc0 = Abc_NtkMultiDeriveBdd_rec( dd, Abc_ObjFanin(pNode,0), vFanins ); Cudd_Ref( bFunc0 ); - bFunc1 = Abc_NtkMultiDeriveBdd_rec( dd, Abc_ObjFanin(pNode,1), vFanins ); Cudd_Ref( bFunc1 ); - bFunc0 = Cudd_NotCond( bFunc0, Abc_ObjFaninC0(pNode) ); - bFunc1 = Cudd_NotCond( bFunc1, Abc_ObjFaninC1(pNode) ); - // get the final result - bFunc = Cudd_bddAnd( dd, bFunc0, bFunc1 ); Cudd_Ref( bFunc ); - Cudd_RecursiveDeref( dd, bFunc0 ); - Cudd_RecursiveDeref( dd, bFunc1 ); - // set the result - pNode->pData = bFunc; - assert( pNode->pData ); - return bFunc; -} - - - -/**Function************************************************************* - - Synopsis [Limits the cones to be no more than the given size.] - - Description [Returns 1 if the last cone was limited. Returns 0 if no changes.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkMultiLimit_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vCone, int nFaninMax, int fCanStop, int fFirst ) -{ - int nNodes0, nNodes1; - assert( !Abc_ObjIsComplement(pNode) ); - // check if the node should be added to the fanins - if ( !fFirst && (pNode->fMarkA || !Abc_ObjIsNode(pNode)) ) - { - Vec_PtrPushUnique( vCone, pNode ); - return 0; - } - // if we cannot stop in this branch, collect all nodes - if ( !fCanStop ) - { - Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,0), vCone, nFaninMax, 0, 0 ); - Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,1), vCone, nFaninMax, 0, 0 ); - return 0; - } - // if we can stop, try the left branch first, and return if we stopped - assert( vCone->nSize == 0 ); - if ( Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,0), vCone, nFaninMax, 1, 0 ) ) - return 1; - // save the number of nodes in the left branch and call for the right branch - nNodes0 = vCone->nSize; - assert( nNodes0 <= nFaninMax ); - Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,1), vCone, nFaninMax, 0, 0 ); - // check the number of nodes - if ( vCone->nSize <= nFaninMax ) - return 0; - // the number of nodes exceeds the limit - - // get the number of nodes in the right branch - vCone->nSize = 0; - Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,1), vCone, nFaninMax, 0, 0 ); - // if this number exceeds the limit, solve the problem for this branch - if ( vCone->nSize > nFaninMax ) - { - int RetValue; - vCone->nSize = 0; - RetValue = Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,1), vCone, nFaninMax, 1, 0 ); - assert( RetValue == 1 ); - return 1; - } - - nNodes1 = vCone->nSize; - assert( nNodes1 <= nFaninMax ); - if ( nNodes0 >= nNodes1 ) - { // the left branch is larger - cut it - assert( Abc_ObjFanin(pNode,0)->fMarkA == 0 ); - Abc_ObjFanin(pNode,0)->fMarkA = 1; - } - else - { // the right branch is larger - cut it - assert( Abc_ObjFanin(pNode,1)->fMarkA == 0 ); - Abc_ObjFanin(pNode,1)->fMarkA = 1; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Limits the cones to be no more than the given size.] - - Description [Returns 1 if the last cone was limited. Returns 0 if no changes.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkMultiLimit( Abc_Obj_t * pNode, Vec_Ptr_t * vCone, int nFaninMax ) -{ - vCone->nSize = 0; - return Abc_NtkMultiLimit_rec( pNode, vCone, nFaninMax, 1, 1 ); -} - -/**Function************************************************************* - - Synopsis [Sets the expansion boundary for multi-input nodes.] - - Description [The boundary includes the set of PIs and all nodes such that - when expanding over the node we duplicate no more than nThresh nodes.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMultiSetBounds( Abc_Ntk_t * pNtk, int nThresh, int nFaninMax ) -{ - Vec_Ptr_t * vCone = Vec_PtrAlloc(10); - Abc_Obj_t * pNode; - int i, nFanouts, nConeSize; - - // make sure the mark is not set - Abc_NtkForEachObj( pNtk, pNode, i ) - assert( pNode->fMarkA == 0 ); - - // mark the nodes where expansion stops using pNode->fMarkA - Abc_NtkForEachNode( pNtk, pNode, i ) - { - // skip PI/PO nodes -// if ( Abc_NodeIsConst(pNode) ) -// continue; - // mark the nodes with multiple fanouts - nFanouts = Abc_ObjFanoutNum(pNode); - nConeSize = Abc_NodeMffcSize(pNode); - if ( (nFanouts - 1) * nConeSize > nThresh ) - pNode->fMarkA = 1; - } - - // mark the PO drivers - Abc_NtkForEachCo( pNtk, pNode, i ) - Abc_ObjFanin0(pNode)->fMarkA = 1; - - // make sure the fanin limit is met - Abc_NtkForEachNode( pNtk, pNode, i ) - { - // skip PI/PO nodes -// if ( Abc_NodeIsConst(pNode) ) -// continue; - if ( pNode->fMarkA == 0 ) - continue; - // continue cutting branches until it meets the fanin limit - while ( Abc_NtkMultiLimit(pNode, vCone, nFaninMax) ); - assert( vCone->nSize <= nFaninMax ); - } - Vec_PtrFree(vCone); -/* - // make sure the fanin limit is met - Abc_NtkForEachNode( pNtk, pNode, i ) - { - // skip PI/PO nodes -// if ( Abc_NodeIsConst(pNode) ) -// continue; - if ( pNode->fMarkA == 0 ) - continue; - Abc_NtkMultiCone( pNode, vCone ); - assert( vCone->nSize <= nFaninMax ); - } -*/ -} - -/**Function************************************************************* - - Synopsis [Sets the expansion boundary for conversion into CNF.] - - Description [The boundary includes the set of PIs, the roots of MUXes, - the nodes with multiple fanouts and the nodes with complemented outputs.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMultiSetBoundsCnf( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode; - int i, nMuxes; - - // make sure the mark is not set - Abc_NtkForEachObj( pNtk, pNode, i ) - assert( pNode->fMarkA == 0 ); - - // mark the nodes where expansion stops using pNode->fMarkA - Abc_NtkForEachNode( pNtk, pNode, i ) - { - // skip PI/PO nodes -// if ( Abc_NodeIsConst(pNode) ) -// continue; - // mark the nodes with multiple fanouts - if ( Abc_ObjFanoutNum(pNode) > 1 ) - pNode->fMarkA = 1; - // mark the nodes that are roots of MUXes - if ( Abc_NodeIsMuxType( pNode ) ) - { - pNode->fMarkA = 1; - Abc_ObjFanin0( Abc_ObjFanin0(pNode) )->fMarkA = 1; - Abc_ObjFanin0( Abc_ObjFanin1(pNode) )->fMarkA = 1; - Abc_ObjFanin1( Abc_ObjFanin0(pNode) )->fMarkA = 1; - Abc_ObjFanin1( Abc_ObjFanin1(pNode) )->fMarkA = 1; - } - else // mark the complemented edges - { - if ( Abc_ObjFaninC0(pNode) ) - Abc_ObjFanin0(pNode)->fMarkA = 1; - if ( Abc_ObjFaninC1(pNode) ) - Abc_ObjFanin1(pNode)->fMarkA = 1; - } - } - - // mark the PO drivers - Abc_NtkForEachCo( pNtk, pNode, i ) - Abc_ObjFanin0(pNode)->fMarkA = 1; - - // count the number of MUXes - nMuxes = 0; - Abc_NtkForEachNode( pNtk, pNode, i ) - { - // skip PI/PO nodes -// if ( Abc_NodeIsConst(pNode) ) -// continue; - if ( Abc_NodeIsMuxType(pNode) && - Abc_ObjFanin0(pNode)->fMarkA == 0 && - Abc_ObjFanin1(pNode)->fMarkA == 0 ) - nMuxes++; - } -// printf( "The number of MUXes detected = %d (%5.2f %% of logic).\n", nMuxes, 300.0*nMuxes/Abc_NtkNodeNum(pNtk) ); -} - -/**Function************************************************************* - - Synopsis [Sets the expansion boundary for conversion into multi-input AND graph.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMultiSetBoundsMulti( Abc_Ntk_t * pNtk, int nThresh ) -{ - Abc_Obj_t * pNode; - int i, nFanouts, nConeSize; - - // make sure the mark is not set - Abc_NtkForEachObj( pNtk, pNode, i ) - assert( pNode->fMarkA == 0 ); - - // mark the nodes where expansion stops using pNode->fMarkA - Abc_NtkForEachNode( pNtk, pNode, i ) - { - // skip PI/PO nodes -// if ( Abc_NodeIsConst(pNode) ) -// continue; - // mark the nodes with multiple fanouts -// if ( Abc_ObjFanoutNum(pNode) > 1 ) -// pNode->fMarkA = 1; - // mark the nodes with multiple fanouts - nFanouts = Abc_ObjFanoutNum(pNode); - nConeSize = Abc_NodeMffcSizeStop(pNode); - if ( (nFanouts - 1) * nConeSize > nThresh ) - pNode->fMarkA = 1; - // mark the children if they are pointed by the complemented edges - if ( Abc_ObjFaninC0(pNode) ) - Abc_ObjFanin0(pNode)->fMarkA = 1; - if ( Abc_ObjFaninC1(pNode) ) - Abc_ObjFanin1(pNode)->fMarkA = 1; - } - - // mark the PO drivers - Abc_NtkForEachCo( pNtk, pNode, i ) - Abc_ObjFanin0(pNode)->fMarkA = 1; -} - -/**Function************************************************************* - - Synopsis [Sets a simple boundary.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMultiSetBoundsSimple( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode; - int i; - // make sure the mark is not set - Abc_NtkForEachObj( pNtk, pNode, i ) - assert( pNode->fMarkA == 0 ); - // mark the nodes where expansion stops using pNode->fMarkA - Abc_NtkForEachNode( pNtk, pNode, i ) - pNode->fMarkA = 1; -} - -/**Function************************************************************* - - Synopsis [Sets a factor-cut boundary.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMultiSetBoundsFactor( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode; - int i; - // make sure the mark is not set - Abc_NtkForEachObj( pNtk, pNode, i ) - assert( pNode->fMarkA == 0 ); - // mark the nodes where expansion stops using pNode->fMarkA - Abc_NtkForEachNode( pNtk, pNode, i ) - pNode->fMarkA = (pNode->vFanouts.nSize > 1 && !Abc_NodeIsMuxControlType(pNode)); - // mark the PO drivers - Abc_NtkForEachCo( pNtk, pNode, i ) - Abc_ObjFanin0(pNode)->fMarkA = 1; -} - -/**Function************************************************************* - - Synopsis [Collects the fanins of a large node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMultiCone_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vCone ) -{ - assert( !Abc_ObjIsComplement(pNode) ); - if ( pNode->fMarkA || !Abc_ObjIsNode(pNode) ) - { - Vec_PtrPushUnique( vCone, pNode ); - return; - } - Abc_NtkMultiCone_rec( Abc_ObjFanin(pNode,0), vCone ); - Abc_NtkMultiCone_rec( Abc_ObjFanin(pNode,1), vCone ); -} - -/**Function************************************************************* - - Synopsis [Collects the fanins of a large node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMultiCone( Abc_Obj_t * pNode, Vec_Ptr_t * vCone ) -{ - assert( !Abc_ObjIsComplement(pNode) ); - assert( Abc_ObjIsNode(pNode) ); - vCone->nSize = 0; - Abc_NtkMultiCone_rec( Abc_ObjFanin(pNode,0), vCone ); - Abc_NtkMultiCone_rec( Abc_ObjFanin(pNode,1), vCone ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcMv.c b/src/base/abci/abcMv.c deleted file mode 100644 index 2858b8a7..00000000 --- a/src/base/abci/abcMv.c +++ /dev/null @@ -1,369 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcMv.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Multi-valued decomposition.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcMv.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Mv_Man_t_ Mv_Man_t; -struct Mv_Man_t_ -{ - int nInputs; // the number of 4-valued input variables - int nFuncs; // the number of 4-valued functions - DdManager * dd; // representation of functions - DdNode * bValues[15][4]; // representation of i-sets - DdNode * bValueDcs[15][4]; // representation of i-sets don't-cares - DdNode * bFuncs[15]; // representation of functions -}; - -static void Abc_MvDecompose( Mv_Man_t * p ); -static void Abc_MvPrintStats( Mv_Man_t * p ); -static void Abc_MvRead( Mv_Man_t * p ); -static void Abc_MvDeref( Mv_Man_t * p ); -static DdNode * Abc_MvReadCube( DdManager * dd, char * pLine, int nVars ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_MvExperiment() -{ - Mv_Man_t * p; - // get the functions - p = ALLOC( Mv_Man_t, 1 ); - memset( p, 0, sizeof(Mv_Man_t) ); - p->dd = Cudd_Init( 32, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 ); - p->nFuncs = 15; - p->nInputs = 9; - Abc_MvRead( p ); - // process the functions - Abc_MvPrintStats( p ); -// Cudd_ReduceHeap( p->dd, CUDD_REORDER_SYMM_SIFT, 1 ); -// Abc_MvPrintStats( p ); - // try detecting support reducing bound set - Abc_MvDecompose( p ); - - // remove the manager - Abc_MvDeref( p ); - Extra_StopManager( p->dd ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_MvPrintStats( Mv_Man_t * p ) -{ - int i, v; - for ( i = 0; i < 15; i++ ) - { - printf( "%2d : ", i ); - printf( "%3d (%2d) ", Cudd_DagSize(p->bFuncs[i])-1, Cudd_SupportSize(p->dd, p->bFuncs[i]) ); - for ( v = 0; v < 4; v++ ) - printf( "%d = %3d (%2d) ", v, Cudd_DagSize(p->bValues[i][v])-1, Cudd_SupportSize(p->dd, p->bValues[i][v]) ); - printf( "\n" ); - } -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -DdNode * Abc_MvReadCube( DdManager * dd, char * pLine, int nVars ) -{ - DdNode * bCube, * bVar, * bTemp; - int i; - bCube = Cudd_ReadOne(dd); Cudd_Ref( bCube ); - for ( i = 0; i < nVars; i++ ) - { - if ( pLine[i] == '-' ) - continue; - else if ( pLine[i] == '0' ) // 0 - bVar = Cudd_Not( Cudd_bddIthVar(dd, 29-i) ); - else if ( pLine[i] == '1' ) // 1 - bVar = Cudd_bddIthVar(dd, 29-i); - else assert(0); - bCube = Cudd_bddAnd( dd, bTemp = bCube, bVar ); Cudd_Ref( bCube ); - Cudd_RecursiveDeref( dd, bTemp ); - } - Cudd_Deref( bCube ); - return bCube; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_MvRead( Mv_Man_t * p ) -{ - FILE * pFile; - char Buffer[1000], * pLine; - DdNode * bCube, * bTemp, * bProd, * bVar0, * bVar1, * bCubeSum; - int i, v; - - // start the cube - bCubeSum = Cudd_ReadLogicZero(p->dd); Cudd_Ref( bCubeSum ); - - // start the values - for ( i = 0; i < 15; i++ ) - for ( v = 0; v < 4; v++ ) - { - p->bValues[i][v] = Cudd_ReadLogicZero(p->dd); Cudd_Ref( p->bValues[i][v] ); - p->bValueDcs[i][v] = Cudd_ReadLogicZero(p->dd); Cudd_Ref( p->bValueDcs[i][v] ); - } - - // read the file - pFile = fopen( "input.pla", "r" ); - while ( fgets( Buffer, 1000, pFile ) ) - { - if ( Buffer[0] == '#' ) - continue; - if ( Buffer[0] == '.' ) - { - if ( Buffer[1] == 'e' ) - break; - continue; - } - - // get the cube - bCube = Abc_MvReadCube( p->dd, Buffer, 18 ); Cudd_Ref( bCube ); - - // add it to the values of the output functions - pLine = Buffer + 19; - for ( i = 0; i < 15; i++ ) - { - if ( pLine[2*i] == '-' && pLine[2*i+1] == '-' ) - { - for ( v = 0; v < 4; v++ ) - { - p->bValueDcs[i][v] = Cudd_bddOr( p->dd, bTemp = p->bValueDcs[i][v], bCube ); Cudd_Ref( p->bValueDcs[i][v] ); - Cudd_RecursiveDeref( p->dd, bTemp ); - } - continue; - } - else if ( pLine[2*i] == '0' && pLine[2*i+1] == '0' ) // 0 - v = 0; - else if ( pLine[2*i] == '1' && pLine[2*i+1] == '0' ) // 1 - v = 1; - else if ( pLine[2*i] == '0' && pLine[2*i+1] == '1' ) // 2 - v = 2; - else if ( pLine[2*i] == '1' && pLine[2*i+1] == '1' ) // 3 - v = 3; - else assert( 0 ); - // add the value - p->bValues[i][v] = Cudd_bddOr( p->dd, bTemp = p->bValues[i][v], bCube ); Cudd_Ref( p->bValues[i][v] ); - Cudd_RecursiveDeref( p->dd, bTemp ); - } - - // add the cube - bCubeSum = Cudd_bddOr( p->dd, bTemp = bCubeSum, bCube ); Cudd_Ref( bCubeSum ); - Cudd_RecursiveDeref( p->dd, bTemp ); - Cudd_RecursiveDeref( p->dd, bCube ); - } - - // add the complement of the domain to all values - for ( i = 0; i < 15; i++ ) - for ( v = 0; v < 4; v++ ) - { - if ( p->bValues[i][v] == Cudd_Not(Cudd_ReadOne(p->dd)) ) - continue; - p->bValues[i][v] = Cudd_bddOr( p->dd, bTemp = p->bValues[i][v], p->bValueDcs[i][v] ); Cudd_Ref( p->bValues[i][v] ); - Cudd_RecursiveDeref( p->dd, bTemp ); - p->bValues[i][v] = Cudd_bddOr( p->dd, bTemp = p->bValues[i][v], Cudd_Not(bCubeSum) ); Cudd_Ref( p->bValues[i][v] ); - Cudd_RecursiveDeref( p->dd, bTemp ); - } - printf( "Domain = %5.2f %%.\n", 100.0*Cudd_CountMinterm(p->dd, bCubeSum, 32)/Cudd_CountMinterm(p->dd, Cudd_ReadOne(p->dd), 32) ); - Cudd_RecursiveDeref( p->dd, bCubeSum ); - - // create each output function - for ( i = 0; i < 15; i++ ) - { - p->bFuncs[i] = Cudd_ReadLogicZero(p->dd); Cudd_Ref( p->bFuncs[i] ); - for ( v = 0; v < 4; v++ ) - { - bVar0 = Cudd_NotCond( Cudd_bddIthVar(p->dd, 30), ((v & 1) == 0) ); - bVar1 = Cudd_NotCond( Cudd_bddIthVar(p->dd, 31), ((v & 2) == 0) ); - bCube = Cudd_bddAnd( p->dd, bVar0, bVar1 ); Cudd_Ref( bCube ); - bProd = Cudd_bddAnd( p->dd, p->bValues[i][v], bCube ); Cudd_Ref( bProd ); - Cudd_RecursiveDeref( p->dd, bCube ); - // add the value - p->bFuncs[i] = Cudd_bddOr( p->dd, bTemp = p->bFuncs[i], bProd ); Cudd_Ref( p->bFuncs[i] ); - Cudd_RecursiveDeref( p->dd, bTemp ); - Cudd_RecursiveDeref( p->dd, bProd ); - } - } -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_MvDeref( Mv_Man_t * p ) -{ - int i, v; - for ( i = 0; i < 15; i++ ) - for ( v = 0; v < 4; v++ ) - { - Cudd_RecursiveDeref( p->dd, p->bValues[i][v] ); - Cudd_RecursiveDeref( p->dd, p->bValueDcs[i][v] ); - } - for ( i = 0; i < 15; i++ ) - Cudd_RecursiveDeref( p->dd, p->bFuncs[i] ); -} - - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_MvDecompose( Mv_Man_t * p ) -{ - DdNode * bCofs[16], * bVarCube1, * bVarCube2, * bVarCube, * bCube, * bVar0, * bVar1;//, * bRes; - int k, i1, i2, v1, v2;//, c1, c2, Counter; - - bVar0 = Cudd_bddIthVar(p->dd, 30); - bVar1 = Cudd_bddIthVar(p->dd, 31); - bCube = Cudd_bddAnd( p->dd, bVar0, bVar1 ); Cudd_Ref( bCube ); - - for ( k = 0; k < p->nFuncs; k++ ) - { - printf( "FUNCTION %d\n", k ); - for ( i1 = 0; i1 < p->nFuncs; i1++ ) - for ( i2 = i1+1; i2 < p->nFuncs; i2++ ) - { - Vec_Ptr_t * vCofs; - - for ( v1 = 0; v1 < 4; v1++ ) - { - bVar0 = Cudd_NotCond( Cudd_bddIthVar(p->dd, 29-2*i1 ), ((v1 & 1) == 0) ); - bVar1 = Cudd_NotCond( Cudd_bddIthVar(p->dd, 29-2*i1-1), ((v1 & 2) == 0) ); - bVarCube1 = Cudd_bddAnd( p->dd, bVar0, bVar1 ); Cudd_Ref( bVarCube1 ); - for ( v2 = 0; v2 < 4; v2++ ) - { - bVar0 = Cudd_NotCond( Cudd_bddIthVar(p->dd, 29-2*i2 ), ((v2 & 1) == 0) ); - bVar1 = Cudd_NotCond( Cudd_bddIthVar(p->dd, 29-2*i2-1), ((v2 & 2) == 0) ); - bVarCube2 = Cudd_bddAnd( p->dd, bVar0, bVar1 ); Cudd_Ref( bVarCube2 ); - bVarCube = Cudd_bddAnd( p->dd, bVarCube1, bVarCube2 ); Cudd_Ref( bVarCube ); - bCofs[v1 * 4 + v2] = Cudd_Cofactor( p->dd, p->bFuncs[k], bVarCube ); Cudd_Ref( bCofs[v1 * 4 + v2] ); - Cudd_RecursiveDeref( p->dd, bVarCube ); - Cudd_RecursiveDeref( p->dd, bVarCube2 ); - } - Cudd_RecursiveDeref( p->dd, bVarCube1 ); - } -/* - // check the compatibility of cofactors - Counter = 0; - for ( c1 = 0; c1 < 16; c1++ ) - { - for ( c2 = 0; c2 <= c1; c2++ ) - printf( " " ); - for ( c2 = c1+1; c2 < 16; c2++ ) - { - bRes = Cudd_bddAndAbstract( p->dd, bCofs[c1], bCofs[c2], bCube ); Cudd_Ref( bRes ); - if ( bRes == Cudd_ReadOne(p->dd) ) - { - printf( "+" ); - Counter++; - } - else - { - printf( " " ); - } - Cudd_RecursiveDeref( p->dd, bRes ); - } - printf( "\n" ); - } -*/ - - vCofs = Vec_PtrAlloc( 16 ); - for ( v1 = 0; v1 < 4; v1++ ) - for ( v2 = 0; v2 < 4; v2++ ) - Vec_PtrPushUnique( vCofs, bCofs[v1 * 4 + v2] ); - printf( "%d ", Vec_PtrSize(vCofs) ); - Vec_PtrFree( vCofs ); - - // free the cofactors - for ( v1 = 0; v1 < 4; v1++ ) - for ( v2 = 0; v2 < 4; v2++ ) - Cudd_RecursiveDeref( p->dd, bCofs[v1 * 4 + v2] ); - - printf( "\n" ); -// printf( "%2d, %2d : %3d\n", i1, i2, Counter ); - } - } - - Cudd_RecursiveDeref( p->dd, bCube ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcNtbdd.c b/src/base/abci/abcNtbdd.c deleted file mode 100644 index f127811e..00000000 --- a/src/base/abci/abcNtbdd.c +++ /dev/null @@ -1,582 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcNtbdd.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Procedures to translate between the BDD and the network.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcNtbdd.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Abc_NtkBddToMuxesPerform( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew ); -static Abc_Obj_t * Abc_NodeBddToMuxes( Abc_Obj_t * pNodeOld, Abc_Ntk_t * pNtkNew ); -static Abc_Obj_t * Abc_NodeBddToMuxes_rec( DdManager * dd, DdNode * bFunc, Abc_Ntk_t * pNtkNew, st_table * tBdd2Node ); -static DdNode * Abc_NodeGlobalBdds_rec( DdManager * dd, Abc_Obj_t * pNode, int nBddSizeMax, int fDropInternal, ProgressBar * pProgress, int * pCounter, int fVerbose ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Constructs the network isomorphic to the given BDD.] - - Description [Assumes that the BDD depends on the variables whose indexes - correspond to the names in the array (pNamesPi). Otherwise, returns NULL. - The resulting network comes with one node, whose functionality is - equal to the given BDD. To decompose this BDD into the network of - multiplexers use Abc_NtkBddToMuxes(). To decompose this BDD into - an And-Inverter Graph, use Abc_NtkStrash().] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkDeriveFromBdd( DdManager * dd, DdNode * bFunc, char * pNamePo, Vec_Ptr_t * vNamesPi ) -{ - Abc_Ntk_t * pNtk; - Vec_Ptr_t * vNamesPiFake = NULL; - Abc_Obj_t * pNode, * pNodePi, * pNodePo; - DdNode * bSupp, * bTemp; - char * pName; - int i; - - // supply fake names if real names are not given - if ( pNamePo == NULL ) - pNamePo = "F"; - if ( vNamesPi == NULL ) - { - vNamesPiFake = Abc_NodeGetFakeNames( dd->size ); - vNamesPi = vNamesPiFake; - } - - // make sure BDD depends on the variables whose index - // does not exceed the size of the array with PI names - bSupp = Cudd_Support( dd, bFunc ); Cudd_Ref( bSupp ); - for ( bTemp = bSupp; bTemp != Cudd_ReadOne(dd); bTemp = cuddT(bTemp) ) - if ( (int)Cudd_NodeReadIndex(bTemp) >= Vec_PtrSize(vNamesPi) ) - break; - Cudd_RecursiveDeref( dd, bSupp ); - if ( bTemp != Cudd_ReadOne(dd) ) - return NULL; - - // start the network - pNtk = Abc_NtkAlloc( ABC_NTK_LOGIC, ABC_FUNC_BDD, 1 ); - pNtk->pName = Extra_UtilStrsav(pNamePo); - // make sure the new manager has enough inputs - Cudd_bddIthVar( pNtk->pManFunc, Vec_PtrSize(vNamesPi) ); - // add the PIs corresponding to the names - Vec_PtrForEachEntry( vNamesPi, pName, i ) - Abc_ObjAssignName( Abc_NtkCreatePi(pNtk), pName, NULL ); - // create the node - pNode = Abc_NtkCreateNode( pNtk ); - pNode->pData = Cudd_bddTransfer( dd, pNtk->pManFunc, bFunc ); Cudd_Ref(pNode->pData); - Abc_NtkForEachPi( pNtk, pNodePi, i ) - Abc_ObjAddFanin( pNode, pNodePi ); - // create the only PO - pNodePo = Abc_NtkCreatePo( pNtk ); - Abc_ObjAddFanin( pNodePo, pNode ); - Abc_ObjAssignName( pNodePo, pNamePo, NULL ); - // make the network minimum base - Abc_NtkMinimumBase( pNtk ); - if ( vNamesPiFake ) - Abc_NodeFreeNames( vNamesPiFake ); - if ( !Abc_NtkCheck( pNtk ) ) - fprintf( stdout, "Abc_NtkDeriveFromBdd(): Network check has failed.\n" ); - return pNtk; -} - - - -/**Function************************************************************* - - Synopsis [Creates the network isomorphic to the union of local BDDs of the nodes.] - - Description [The nodes of the local BDDs are converted into the network nodes - with logic functions equal to the MUX.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkBddToMuxes( Abc_Ntk_t * pNtk ) -{ - Abc_Ntk_t * pNtkNew; - assert( Abc_NtkIsBddLogic(pNtk) ); - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_SOP ); - Abc_NtkBddToMuxesPerform( pNtk, pNtkNew ); - Abc_NtkFinalize( pNtk, pNtkNew ); - // make sure everything is okay - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkBddToMuxes: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Converts the network to MUXes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkBddToMuxesPerform( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew ) -{ - ProgressBar * pProgress; - Abc_Obj_t * pNode, * pNodeNew; - Vec_Ptr_t * vNodes; - int i; - // perform conversion in the topological order - vNodes = Abc_NtkDfs( pNtk, 0 ); - pProgress = Extra_ProgressBarStart( stdout, vNodes->nSize ); - Vec_PtrForEachEntry( vNodes, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - // convert one node - assert( Abc_ObjIsNode(pNode) ); - pNodeNew = Abc_NodeBddToMuxes( pNode, pNtkNew ); - // mark the old node with the new one - assert( pNode->pCopy == NULL ); - pNode->pCopy = pNodeNew; - } - Vec_PtrFree( vNodes ); - Extra_ProgressBarStop( pProgress ); -} - -/**Function************************************************************* - - Synopsis [Converts the node to MUXes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeBddToMuxes( Abc_Obj_t * pNodeOld, Abc_Ntk_t * pNtkNew ) -{ - DdManager * dd = pNodeOld->pNtk->pManFunc; - DdNode * bFunc = pNodeOld->pData; - Abc_Obj_t * pFaninOld, * pNodeNew; - st_table * tBdd2Node; - int i; - // create the table mapping BDD nodes into the ABC nodes - tBdd2Node = st_init_table( st_ptrcmp, st_ptrhash ); - // add the constant and the elementary vars - Abc_ObjForEachFanin( pNodeOld, pFaninOld, i ) - st_insert( tBdd2Node, (char *)Cudd_bddIthVar(dd, i), (char *)pFaninOld->pCopy ); - // create the new nodes recursively - pNodeNew = Abc_NodeBddToMuxes_rec( dd, Cudd_Regular(bFunc), pNtkNew, tBdd2Node ); - st_free_table( tBdd2Node ); - if ( Cudd_IsComplement(bFunc) ) - pNodeNew = Abc_NtkCreateNodeInv( pNtkNew, pNodeNew ); - return pNodeNew; -} - -/**Function************************************************************* - - Synopsis [Converts the node to MUXes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeBddToMuxes_rec( DdManager * dd, DdNode * bFunc, Abc_Ntk_t * pNtkNew, st_table * tBdd2Node ) -{ - Abc_Obj_t * pNodeNew, * pNodeNew0, * pNodeNew1, * pNodeNewC; - assert( !Cudd_IsComplement(bFunc) ); - if ( bFunc == b1 ) - return Abc_NtkCreateNodeConst1(pNtkNew); - if ( st_lookup( tBdd2Node, (char *)bFunc, (char **)&pNodeNew ) ) - return pNodeNew; - // solve for the children nodes - pNodeNew0 = Abc_NodeBddToMuxes_rec( dd, Cudd_Regular(cuddE(bFunc)), pNtkNew, tBdd2Node ); - if ( Cudd_IsComplement(cuddE(bFunc)) ) - pNodeNew0 = Abc_NtkCreateNodeInv( pNtkNew, pNodeNew0 ); - pNodeNew1 = Abc_NodeBddToMuxes_rec( dd, cuddT(bFunc), pNtkNew, tBdd2Node ); - if ( !st_lookup( tBdd2Node, (char *)Cudd_bddIthVar(dd, bFunc->index), (char **)&pNodeNewC ) ) - assert( 0 ); - // create the MUX node - pNodeNew = Abc_NtkCreateNodeMux( pNtkNew, pNodeNewC, pNodeNew1, pNodeNew0 ); - st_insert( tBdd2Node, (char *)bFunc, (char *)pNodeNew ); - return pNodeNew; -} - - -/**Function************************************************************* - - Synopsis [Derives global BDDs for the COs of the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -DdManager * Abc_NtkBuildGlobalBdds( Abc_Ntk_t * pNtk, int nBddSizeMax, int fDropInternal, int fReorder, int fVerbose ) -{ - ProgressBar * pProgress; - Abc_Obj_t * pObj, * pFanin; - Vec_Att_t * pAttMan; - DdManager * dd; - DdNode * bFunc; - int i, k, Counter; - - // remove dangling nodes - Abc_AigCleanup( pNtk->pManFunc ); - - // start the manager - assert( Abc_NtkGlobalBdd(pNtk) == NULL ); - dd = Cudd_Init( Abc_NtkCiNum(pNtk), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 ); - pAttMan = Vec_AttAlloc( 0, Abc_NtkObjNumMax(pNtk) + 1, dd, Extra_StopManager, NULL, Cudd_RecursiveDeref ); - Vec_PtrWriteEntry( pNtk->vAttrs, VEC_ATTR_GLOBAL_BDD, pAttMan ); - - // set reordering - if ( fReorder ) - Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT ); - - // assign the constant node BDD - pObj = Abc_AigConst1(pNtk); - if ( Abc_ObjFanoutNum(pObj) > 0 ) - { - bFunc = dd->one; - Abc_ObjSetGlobalBdd( pObj, bFunc ); Cudd_Ref( bFunc ); - } - // set the elementary variables - Abc_NtkForEachCi( pNtk, pObj, i ) - if ( Abc_ObjFanoutNum(pObj) > 0 ) - { - bFunc = dd->vars[i]; -// bFunc = dd->vars[Abc_NtkCiNum(pNtk) - 1 - i]; - Abc_ObjSetGlobalBdd( pObj, bFunc ); Cudd_Ref( bFunc ); - } - - // collect the global functions of the COs - Counter = 0; - // construct the BDDs - pProgress = Extra_ProgressBarStart( stdout, Abc_NtkNodeNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pObj, i ) - { - bFunc = Abc_NodeGlobalBdds_rec( dd, Abc_ObjFanin0(pObj), nBddSizeMax, fDropInternal, pProgress, &Counter, fVerbose ); - if ( bFunc == NULL ) - { - if ( fVerbose ) - printf( "Constructing global BDDs is aborted.\n" ); - Abc_NtkFreeGlobalBdds( pNtk, 0 ); - Cudd_Quit( dd ); - return NULL; - } - bFunc = Cudd_NotCond( bFunc, Abc_ObjFaninC0(pObj) ); Cudd_Ref( bFunc ); - Abc_ObjSetGlobalBdd( pObj, bFunc ); - } - Extra_ProgressBarStop( pProgress ); - -/* - // derefence the intermediate BDDs - Abc_NtkForEachNode( pNtk, pObj, i ) - if ( pObj->pCopy ) - { - Cudd_RecursiveDeref( dd, (DdNode *)pObj->pCopy ); - pObj->pCopy = NULL; - } -*/ -/* - // make sure all nodes are derefed - Abc_NtkForEachObj( pNtk, pObj, i ) - { - if ( pObj->pCopy != NULL ) - printf( "Abc_NtkBuildGlobalBdds() error: Node %d has BDD assigned\n", pObj->Id ); - if ( pObj->vFanouts.nSize > 0 ) - printf( "Abc_NtkBuildGlobalBdds() error: Node %d has refs assigned\n", pObj->Id ); - } -*/ - // reset references - Abc_NtkForEachObj( pNtk, pObj, i ) - if ( !Abc_ObjIsBox(pObj) && !Abc_ObjIsBo(pObj) ) - Abc_ObjForEachFanin( pObj, pFanin, k ) - pFanin->vFanouts.nSize++; - - // reorder one more time - if ( fReorder ) - { - Cudd_ReduceHeap( dd, CUDD_REORDER_SYMM_SIFT, 1 ); - Cudd_AutodynDisable( dd ); - } -// Cudd_PrintInfo( dd, stdout ); - return dd; -} - -/**Function************************************************************* - - Synopsis [Derives the global BDD for one AIG node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -DdNode * Abc_NodeGlobalBdds_rec( DdManager * dd, Abc_Obj_t * pNode, int nBddSizeMax, int fDropInternal, ProgressBar * pProgress, int * pCounter, int fVerbose ) -{ - DdNode * bFunc, * bFunc0, * bFunc1, * bFuncC; - int fDetectMuxes = 1; - assert( !Abc_ObjIsComplement(pNode) ); - if ( Cudd_ReadKeys(dd)-Cudd_ReadDead(dd) > (unsigned)nBddSizeMax ) - { - Extra_ProgressBarStop( pProgress ); - if ( fVerbose ) - printf( "The number of live nodes reached %d.\n", nBddSizeMax ); - fflush( stdout ); - return NULL; - } - // if the result is available return - if ( Abc_ObjGlobalBdd(pNode) == NULL ) - { - Abc_Obj_t * pNodeC, * pNode0, * pNode1; - pNode0 = Abc_ObjFanin0(pNode); - pNode1 = Abc_ObjFanin1(pNode); - // check for the special case when it is MUX/EXOR - if ( fDetectMuxes && - Abc_ObjGlobalBdd(pNode0) == NULL && Abc_ObjGlobalBdd(pNode1) == NULL && - Abc_ObjIsNode(pNode0) && Abc_ObjFanoutNum(pNode0) == 1 && - Abc_ObjIsNode(pNode1) && Abc_ObjFanoutNum(pNode1) == 1 && - Abc_NodeIsMuxType(pNode) ) - { - // deref the fanins - pNode0->vFanouts.nSize--; - pNode1->vFanouts.nSize--; - // recognize the MUX - pNodeC = Abc_NodeRecognizeMux( pNode, &pNode1, &pNode0 ); - assert( Abc_ObjFanoutNum(pNodeC) > 1 ); - // dereference the control once (the second time it will be derefed when BDDs are computed) - pNodeC->vFanouts.nSize--; - - // compute the result for all branches - bFuncC = Abc_NodeGlobalBdds_rec( dd, pNodeC, nBddSizeMax, fDropInternal, pProgress, pCounter, fVerbose ); - if ( bFuncC == NULL ) - return NULL; - Cudd_Ref( bFuncC ); - bFunc0 = Abc_NodeGlobalBdds_rec( dd, Abc_ObjRegular(pNode0), nBddSizeMax, fDropInternal, pProgress, pCounter, fVerbose ); - if ( bFunc0 == NULL ) - return NULL; - Cudd_Ref( bFunc0 ); - bFunc1 = Abc_NodeGlobalBdds_rec( dd, Abc_ObjRegular(pNode1), nBddSizeMax, fDropInternal, pProgress, pCounter, fVerbose ); - if ( bFunc1 == NULL ) - return NULL; - Cudd_Ref( bFunc1 ); - - // complement the branch BDDs - bFunc0 = Cudd_NotCond( bFunc0, Abc_ObjIsComplement(pNode0) ); - bFunc1 = Cudd_NotCond( bFunc1, Abc_ObjIsComplement(pNode1) ); - // get the final result - bFunc = Cudd_bddIte( dd, bFuncC, bFunc1, bFunc0 ); Cudd_Ref( bFunc ); - Cudd_RecursiveDeref( dd, bFunc0 ); - Cudd_RecursiveDeref( dd, bFunc1 ); - Cudd_RecursiveDeref( dd, bFuncC ); - // add the number of used nodes - (*pCounter) += 3; - } - else - { - // compute the result for both branches - bFunc0 = Abc_NodeGlobalBdds_rec( dd, Abc_ObjFanin(pNode,0), nBddSizeMax, fDropInternal, pProgress, pCounter, fVerbose ); - if ( bFunc0 == NULL ) - return NULL; - Cudd_Ref( bFunc0 ); - bFunc1 = Abc_NodeGlobalBdds_rec( dd, Abc_ObjFanin(pNode,1), nBddSizeMax, fDropInternal, pProgress, pCounter, fVerbose ); - if ( bFunc1 == NULL ) - return NULL; - Cudd_Ref( bFunc1 ); - bFunc0 = Cudd_NotCond( bFunc0, Abc_ObjFaninC0(pNode) ); - bFunc1 = Cudd_NotCond( bFunc1, Abc_ObjFaninC1(pNode) ); - // get the final result - bFunc = Cudd_bddAnd( dd, bFunc0, bFunc1 ); Cudd_Ref( bFunc ); - Cudd_RecursiveDeref( dd, bFunc0 ); - Cudd_RecursiveDeref( dd, bFunc1 ); - // add the number of used nodes - (*pCounter)++; - } - // set the result - assert( Abc_ObjGlobalBdd(pNode) == NULL ); - Abc_ObjSetGlobalBdd( pNode, bFunc ); - // increment the progress bar - if ( pProgress ) - Extra_ProgressBarUpdate( pProgress, *pCounter, NULL ); - } - // prepare the return value - bFunc = Abc_ObjGlobalBdd(pNode); - // dereference BDD at the node - if ( --pNode->vFanouts.nSize == 0 && fDropInternal ) - { - Cudd_Deref( bFunc ); - Abc_ObjSetGlobalBdd( pNode, NULL ); - } - return bFunc; -} - -/**Function************************************************************* - - Synopsis [Frees the global BDDs of the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -DdManager * Abc_NtkFreeGlobalBdds( Abc_Ntk_t * pNtk, int fFreeMan ) -{ - return Abc_NtkAttrFree( pNtk, VEC_ATTR_GLOBAL_BDD, fFreeMan ); -} - -/**Function************************************************************* - - Synopsis [Returns the shared size of global BDDs of the COs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkSizeOfGlobalBdds( Abc_Ntk_t * pNtk ) -{ - Vec_Ptr_t * vFuncsGlob; - Abc_Obj_t * pObj; - int RetValue, i; - // complement the global functions - vFuncsGlob = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pObj, i ) - Vec_PtrPush( vFuncsGlob, Abc_ObjGlobalBdd(pObj) ); - RetValue = Cudd_SharingSize( (DdNode **)Vec_PtrArray(vFuncsGlob), Vec_PtrSize(vFuncsGlob) ); - Vec_PtrFree( vFuncsGlob ); - return RetValue; -} - -/**Function************************************************************* - - Synopsis [Computes the BDD of the logic cone of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -double Abc_NtkSpacePercentage( Abc_Obj_t * pNode ) -{ - /* - Vec_Ptr_t * vNodes; - Abc_Obj_t * pObj, * pNodeR; - DdManager * dd; - DdNode * bFunc; - double Result; - int i; - pNodeR = Abc_ObjRegular(pNode); - assert( Abc_NtkIsStrash(pNodeR->pNtk) ); - Abc_NtkCleanCopy( pNodeR->pNtk ); - // get the CIs in the support of the node - vNodes = Abc_NtkNodeSupport( pNodeR->pNtk, &pNodeR, 1 ); - // start the manager - dd = Cudd_Init( Vec_PtrSize(vNodes), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 ); - Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT ); - // assign elementary BDDs for the CIs - Vec_PtrForEachEntry( vNodes, pObj, i ) - pObj->pCopy = (Abc_Obj_t *)dd->vars[i]; - // build the BDD of the cone - bFunc = Abc_NodeGlobalBdds_rec( dd, pNodeR, 10000000, 1, NULL, NULL, 1 ); Cudd_Ref( bFunc ); - bFunc = Cudd_NotCond( bFunc, pNode != pNodeR ); - // count minterms - Result = Cudd_CountMinterm( dd, bFunc, dd->size ); - // get the percentagle - Result *= 100.0; - for ( i = 0; i < dd->size; i++ ) - Result /= 2; - // clean up - Cudd_Quit( dd ); - Vec_PtrFree( vNodes ); - return Result; - */ - return 0.0; -} - - - - -/**Function************************************************************* - - Synopsis [Experiment with BDD-based representation of implications.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkBddImplicationTest() -{ - DdManager * dd; - DdNode * bImp, * bSum, * bTemp; - int nVars = 200; - int nImps = 200; - int i, clk; -clk = clock(); - dd = Cudd_Init( nVars, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 ); - Cudd_AutodynEnable( dd, CUDD_REORDER_SIFT ); - bSum = b0; Cudd_Ref( bSum ); - for ( i = 0; i < nImps; i++ ) - { - printf( "." ); - bImp = Cudd_bddAnd( dd, dd->vars[rand()%nVars], dd->vars[rand()%nVars] ); Cudd_Ref( bImp ); - bSum = Cudd_bddOr( dd, bTemp = bSum, bImp ); Cudd_Ref( bSum ); - Cudd_RecursiveDeref( dd, bTemp ); - Cudd_RecursiveDeref( dd, bImp ); - } - printf( "The BDD before = %d.\n", Cudd_DagSize(bSum) ); - Cudd_ReduceHeap( dd, CUDD_REORDER_SIFT, 1 ); - printf( "The BDD after = %d.\n", Cudd_DagSize(bSum) ); -PRT( "Time", clock() - clk ); - Cudd_RecursiveDeref( dd, bSum ); - Cudd_Quit( dd ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcOdc.c b/src/base/abci/abcOdc.c deleted file mode 100644 index d6e59328..00000000 --- a/src/base/abci/abcOdc.c +++ /dev/null @@ -1,1134 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcOdc.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Scalable computation of observability don't-cares.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcOdc.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -#define ABC_DC_MAX_NODES (1<<15) - -typedef unsigned short Odc_Lit_t; - -typedef struct Odc_Obj_t_ Odc_Obj_t; // 16 bytes -struct Odc_Obj_t_ -{ - Odc_Lit_t iFan0; // first fanin - Odc_Lit_t iFan1; // second fanin - Odc_Lit_t iNext; // next node in the hash table - unsigned short TravId; // the traversal ID - unsigned uData; // the computed data - unsigned uMask; // the variable mask -}; - -typedef struct Odc_Man_t_ Odc_Man_t; -struct Odc_Man_t_ -{ - // dont'-care parameters - int nVarsMax; // the max number of cut variables - int nLevels; // the number of ODC levels - int fVerbose; // the verbosiness flag - int fVeryVerbose;// the verbosiness flag to print per-node stats - int nPercCutoff; // cutoff percentage - - // windowing - Abc_Obj_t * pNode; // the node for windowing - Vec_Ptr_t * vLeaves; // the number of the cut - Vec_Ptr_t * vRoots; // the roots of the cut - Vec_Ptr_t * vBranches; // additional inputs - - // internal AIG package - // objects - int nPis; // number of PIs (nVarsMax + 32) - int nObjs; // number of objects (Const1, PIs, ANDs) - int nObjsAlloc; // number of objects allocated - Odc_Obj_t * pObjs; // objects - Odc_Lit_t iRoot; // the root object - unsigned short nTravIds; // the number of travIDs - // structural hashing - Odc_Lit_t * pTable; // hash table - int nTableSize; // hash table size - Vec_Int_t * vUsedSpots; // the used spots - - // truth tables - int nBits; // the number of bits - int nWords; // the number of words - Vec_Ptr_t * vTruths; // truth tables for each node - Vec_Ptr_t * vTruthsElem; // elementary truth tables for the PIs - unsigned * puTruth; // the place where the resulting truth table does - - // statistics - int nWins; // the number of windows processed - int nWinsEmpty; // the number of empty windows - int nSimsEmpty; // the number of empty simulation infos - int nQuantsOver; // the number of quantification overflows - int nWinsFinish; // the number of windows that finished - int nTotalDcs; // total percentage of DCs - - // runtime - int timeClean; // windowing - int timeWin; // windowing - int timeMiter; // computing the miter - int timeSim; // simulation - int timeQuant; // quantification - int timeTruth; // truth table - int timeTotal; // useful runtime - int timeAbort; // aborted runtime -}; - - -// quantity of different objects -static inline int Odc_PiNum( Odc_Man_t * p ) { return p->nPis; } -static inline int Odc_NodeNum( Odc_Man_t * p ) { return p->nObjs - p->nPis - 1; } -static inline int Odc_ObjNum( Odc_Man_t * p ) { return p->nObjs; } - -// complemented attributes of objects -static inline int Odc_IsComplement( Odc_Lit_t Lit ) { return Lit & (Odc_Lit_t)1; } -static inline Odc_Lit_t Odc_Regular( Odc_Lit_t Lit ) { return Lit & ~(Odc_Lit_t)1; } -static inline Odc_Lit_t Odc_Not( Odc_Lit_t Lit ) { return Lit ^ (Odc_Lit_t)1; } -static inline Odc_Lit_t Odc_NotCond( Odc_Lit_t Lit, int c ) { return Lit ^ (Odc_Lit_t)(c!=0); } - -// specialized Literals -static inline Odc_Lit_t Odc_Const0() { return 1; } -static inline Odc_Lit_t Odc_Const1() { return 0; } -static inline Odc_Lit_t Odc_Var( Odc_Man_t * p, int i ) { assert( i >= 0 && i < p->nPis ); return (i+1) << 1; } -static inline int Odc_IsConst( Odc_Lit_t Lit ) { return Lit < (Odc_Lit_t)2; } -static inline int Odc_IsTerm( Odc_Man_t * p, Odc_Lit_t Lit ) { return (int)(Lit>>1) <= p->nPis; } - -// accessing internal storage -static inline Odc_Obj_t * Odc_ObjNew( Odc_Man_t * p ) { assert( p->nObjs < p->nObjsAlloc ); return p->pObjs + p->nObjs++; } -static inline Odc_Lit_t Odc_Obj2Lit( Odc_Man_t * p, Odc_Obj_t * pObj ) { assert( pObj ); return (pObj - p->pObjs) << 1; } -static inline Odc_Obj_t * Odc_Lit2Obj( Odc_Man_t * p, Odc_Lit_t Lit ) { assert( !(Lit & 1) && (int)(Lit>>1) < p->nObjs ); return p->pObjs + (Lit>>1); } - -// fanins and their complements -static inline Odc_Lit_t Odc_ObjChild0( Odc_Obj_t * pObj ) { return pObj->iFan0; } -static inline Odc_Lit_t Odc_ObjChild1( Odc_Obj_t * pObj ) { return pObj->iFan1; } -static inline Odc_Lit_t Odc_ObjFanin0( Odc_Obj_t * pObj ) { return Odc_Regular(pObj->iFan0); } -static inline Odc_Lit_t Odc_ObjFanin1( Odc_Obj_t * pObj ) { return Odc_Regular(pObj->iFan1); } -static inline int Odc_ObjFaninC0( Odc_Obj_t * pObj ) { return Odc_IsComplement(pObj->iFan0); } -static inline int Odc_ObjFaninC1( Odc_Obj_t * pObj ) { return Odc_IsComplement(pObj->iFan1); } - -// traversal IDs -static inline void Odc_ManIncrementTravId( Odc_Man_t * p ) { p->nTravIds++; } -static inline void Odc_ObjSetTravIdCurrent( Odc_Man_t * p, Odc_Obj_t * pObj ) { pObj->TravId = p->nTravIds; } -static inline int Odc_ObjIsTravIdCurrent( Odc_Man_t * p, Odc_Obj_t * pObj ) { return (int )((int)pObj->TravId == p->nTravIds); } - -// truth tables -static inline unsigned * Odc_ObjTruth( Odc_Man_t * p, Odc_Lit_t Lit ) { assert( !(Lit & 1) ); return Vec_PtrEntry(p->vTruths, Lit >> 1); } - -// iterators -#define Odc_ForEachPi( p, Lit, i ) \ - for ( i = 0; (i < Odc_PiNum(p)) && (((Lit) = Odc_Var(p, i)), 1); i++ ) -#define Odc_ForEachAnd( p, pObj, i ) \ - for ( i = 1 + Odc_CiNum(p); (i < Odc_ObjNum(p)) && ((pObj) = (p)->pObjs + i); i++ ) - - -// exported functions -extern Odc_Man_t * Abc_NtkDontCareAlloc( int nVarsMax, int nLevels, int fVerbose, int fVeryVerbose ); -extern void Abc_NtkDontCareClear( Odc_Man_t * p ); -extern void Abc_NtkDontCareFree( Odc_Man_t * p ); -extern int Abc_NtkDontCareCompute( Odc_Man_t * p, Abc_Obj_t * pNode, Vec_Ptr_t * vLeaves, unsigned * puTruth ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Allocates the don't-care manager.] - - Description [The parameters are the max number of cut variables, - the number of fanout levels used for the ODC computation, and verbosiness.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Odc_Man_t * Abc_NtkDontCareAlloc( int nVarsMax, int nLevels, int fVerbose, int fVeryVerbose ) -{ - Odc_Man_t * p; - unsigned * pData; - int i, k; - p = ALLOC( Odc_Man_t, 1 ); - memset( p, 0, sizeof(Odc_Man_t) ); - assert( nVarsMax > 4 && nVarsMax < 16 ); - assert( nLevels > 0 && nLevels < 10 ); - - srand( 0xABC ); - - // dont'-care parameters - p->nVarsMax = nVarsMax; - p->nLevels = nLevels; - p->fVerbose = fVerbose; - p->fVeryVerbose = fVeryVerbose; - p->nPercCutoff = 10; - - // windowing - p->vRoots = Vec_PtrAlloc( 128 ); - p->vBranches = Vec_PtrAlloc( 128 ); - - // internal AIG package - // allocate room for objects - p->nObjsAlloc = ABC_DC_MAX_NODES; - p->pObjs = ALLOC( Odc_Obj_t, p->nObjsAlloc * sizeof(Odc_Obj_t) ); - p->nPis = nVarsMax + 32; - p->nObjs = 1 + p->nPis; - memset( p->pObjs, 0, p->nObjs * sizeof(Odc_Obj_t) ); - // set the PI masks - for ( i = 0; i < 32; i++ ) - p->pObjs[1 + p->nVarsMax + i].uMask = (1 << i); - // allocate hash table - p->nTableSize = p->nObjsAlloc/3 + 1; - p->pTable = ALLOC( Odc_Lit_t, p->nTableSize * sizeof(Odc_Lit_t) ); - memset( p->pTable, 0, p->nTableSize * sizeof(Odc_Lit_t) ); - p->vUsedSpots = Vec_IntAlloc( 1000 ); - - // truth tables - p->nWords = Abc_TruthWordNum( p->nVarsMax ); - p->nBits = p->nWords * 8 * sizeof(unsigned); - p->vTruths = Vec_PtrAllocSimInfo( p->nObjsAlloc, p->nWords ); - p->vTruthsElem = Vec_PtrAllocSimInfo( p->nVarsMax, p->nWords ); - - // set elementary truth tables - Abc_InfoFill( Vec_PtrEntry(p->vTruths, 0), p->nWords ); - for ( k = 0; k < p->nVarsMax; k++ ) - { -// pData = Odc_ObjTruth( p, Odc_Var(p, k) ); - pData = Vec_PtrEntry( p->vTruthsElem, k ); - Abc_InfoClear( pData, p->nWords ); - for ( i = 0; i < p->nBits; i++ ) - if ( i & (1 << k) ) - pData[i>>5] |= (1 << (i&31)); - } - - // set random truth table for the additional inputs - for ( k = p->nVarsMax; k < p->nPis; k++ ) - { - pData = Odc_ObjTruth( p, Odc_Var(p, k) ); - Abc_InfoRandom( pData, p->nWords ); - } - - // set the miter to the unused value - p->iRoot = 0xffff; - return p; -} - -/**Function************************************************************* - - Synopsis [Clears the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDontCareClear( Odc_Man_t * p ) -{ - int clk = clock(); - // clean the structural hashing table - if ( Vec_IntSize(p->vUsedSpots) > p->nTableSize/3 ) // more than one third - memset( p->pTable, 0, sizeof(Odc_Lit_t) * p->nTableSize ); - else - { - int iSpot, i; - Vec_IntForEachEntry( p->vUsedSpots, iSpot, i ) - p->pTable[iSpot] = 0; - } - Vec_IntClear( p->vUsedSpots ); - // reset the number of nodes - p->nObjs = 1 + p->nPis; - // reset the root node - p->iRoot = 0xffff; - -p->timeClean += clock() - clk; -} - -/**Function************************************************************* - - Synopsis [Frees the don't-care manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDontCareFree( Odc_Man_t * p ) -{ - if ( p->fVerbose ) - { - printf( "Wins = %5d. Empty = %5d. SimsEmpty = %5d. QuantOver = %5d. WinsFinish = %5d.\n", - p->nWins, p->nWinsEmpty, p->nSimsEmpty, p->nQuantsOver, p->nWinsFinish ); - printf( "Ave DCs per window = %6.2f %%. Ave DCs per finished window = %6.2f %%.\n", - 1.0*p->nTotalDcs/p->nWins, 1.0*p->nTotalDcs/p->nWinsFinish ); - printf( "Runtime stats of the ODC manager:\n" ); - PRT( "Cleaning ", p->timeClean ); - PRT( "Windowing ", p->timeWin ); - PRT( "Miter ", p->timeMiter ); - PRT( "Simulation ", p->timeSim ); - PRT( "Quantifying ", p->timeQuant ); - PRT( "Truth table ", p->timeTruth ); - PRT( "TOTAL ", p->timeTotal ); - PRT( "Aborted ", p->timeAbort ); - } - Vec_PtrFree( p->vRoots ); - Vec_PtrFree( p->vBranches ); - Vec_PtrFree( p->vTruths ); - Vec_PtrFree( p->vTruthsElem ); - Vec_IntFree( p->vUsedSpots ); - free( p->pObjs ); - free( p->pTable ); - free( p ); -} - - - -/**Function************************************************************* - - Synopsis [Marks the TFO of the collected nodes up to the given level.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDontCareWinSweepLeafTfo_rec( Abc_Obj_t * pObj, int nLevelLimit, Abc_Obj_t * pNode ) -{ - Abc_Obj_t * pFanout; - int i; - if ( Abc_ObjIsCo(pObj) || (int)pObj->Level > nLevelLimit || pObj == pNode ) - return; - if ( Abc_NodeIsTravIdCurrent(pObj) ) - return; - Abc_NodeSetTravIdCurrent( pObj ); - //////////////////////////////////////// - // try to reduce the runtime - if ( Abc_ObjFanoutNum(pObj) > 100 ) - return; - //////////////////////////////////////// - Abc_ObjForEachFanout( pObj, pFanout, i ) - Abc_NtkDontCareWinSweepLeafTfo_rec( pFanout, nLevelLimit, pNode ); -} - -/**Function************************************************************* - - Synopsis [Marks the TFO of the collected nodes up to the given level.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDontCareWinSweepLeafTfo( Odc_Man_t * p ) -{ - Abc_Obj_t * pObj; - int i; - Abc_NtkIncrementTravId( p->pNode->pNtk ); - Vec_PtrForEachEntry( p->vLeaves, pObj, i ) - Abc_NtkDontCareWinSweepLeafTfo_rec( pObj, p->pNode->Level + p->nLevels, p->pNode ); -} - -/**Function************************************************************* - - Synopsis [Recursively collects the roots.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDontCareWinCollectRoots_rec( Abc_Obj_t * pObj, Vec_Ptr_t * vRoots ) -{ - Abc_Obj_t * pFanout; - int i; - assert( Abc_ObjIsNode(pObj) ); - assert( Abc_NodeIsTravIdCurrent(pObj) ); - // check if the node has all fanouts marked - Abc_ObjForEachFanout( pObj, pFanout, i ) - if ( !Abc_NodeIsTravIdCurrent(pFanout) ) - break; - // if some of the fanouts are unmarked, add the node to the root - if ( i < Abc_ObjFanoutNum(pObj) ) - { - Vec_PtrPushUnique( vRoots, pObj ); - return; - } - // otherwise, call recursively - Abc_ObjForEachFanout( pObj, pFanout, i ) - Abc_NtkDontCareWinCollectRoots_rec( pFanout, vRoots ); -} - -/**Function************************************************************* - - Synopsis [Collects the roots of the window.] - - Description [Roots of the window are the nodes that have at least - one fanout that it not in the TFO of the leaves.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDontCareWinCollectRoots( Odc_Man_t * p ) -{ - assert( !Abc_NodeIsTravIdCurrent(p->pNode) ); - // mark the node with the old traversal ID - Abc_NodeSetTravIdCurrent( p->pNode ); - // collect the roots - Vec_PtrClear( p->vRoots ); - Abc_NtkDontCareWinCollectRoots_rec( p->pNode, p->vRoots ); -} - -/**Function************************************************************* - - Synopsis [Recursively adds missing nodes and leaves.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDontCareWinAddMissing_rec( Odc_Man_t * p, Abc_Obj_t * pObj ) -{ - Abc_Obj_t * pFanin; - int i; - // skip the already collected leaves and branches - if ( Abc_NodeIsTravIdCurrent(pObj) ) - return 1; - // if this is not an internal node - make it a new branch - if ( !Abc_NodeIsTravIdPrevious(pObj) || Abc_ObjIsCi(pObj) ) //|| (int)pObj->Level <= p->nLevLeaves ) - { - Abc_NodeSetTravIdCurrent( pObj ); - Vec_PtrPush( p->vBranches, pObj ); - return Vec_PtrSize(p->vBranches) <= 32; - } - // visit the fanins of the node - Abc_ObjForEachFanin( pObj, pFanin, i ) - if ( !Abc_NtkDontCareWinAddMissing_rec( p, pFanin ) ) - return 0; - return 1; -} - -/**Function************************************************************* - - Synopsis [Adds to the window nodes and leaves in the TFI of the roots.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDontCareWinAddMissing( Odc_Man_t * p ) -{ - Abc_Obj_t * pObj; - int i; - // set the leaves - Abc_NtkIncrementTravId( p->pNode->pNtk ); - Vec_PtrForEachEntry( p->vLeaves, pObj, i ) - Abc_NodeSetTravIdCurrent( pObj ); - // explore from the roots - Vec_PtrClear( p->vBranches ); - Vec_PtrForEachEntry( p->vRoots, pObj, i ) - if ( !Abc_NtkDontCareWinAddMissing_rec( p, pObj ) ) - return 0; - return 1; -} - -/**Function************************************************************* - - Synopsis [Computes window for the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDontCareWindow( Odc_Man_t * p ) -{ - // mark the TFO of the collected nodes up to the given level (p->pNode->Level + p->nWinTfoMax) - Abc_NtkDontCareWinSweepLeafTfo( p ); - // find the roots of the window - Abc_NtkDontCareWinCollectRoots( p ); - if ( Vec_PtrSize(p->vRoots) == 1 && Vec_PtrEntry(p->vRoots, 0) == p->pNode ) - { -// printf( "Empty window\n" ); - return 0; - } - // add the nodes in the TFI of the roots that are not yet in the window - if ( !Abc_NtkDontCareWinAddMissing( p ) ) - { -// printf( "Too many branches (%d)\n", Vec_PtrSize(p->vBranches) ); - return 0; - } - return 1; -} - - - - - -/**Function************************************************************* - - Synopsis [Performing hashing of two AIG Literals.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline unsigned Odc_HashKey( Odc_Lit_t iFan0, Odc_Lit_t iFan1, int TableSize ) -{ - unsigned Key = 0; - Key ^= Odc_Regular(iFan0) * 7937; - Key ^= Odc_Regular(iFan1) * 2971; - Key ^= Odc_IsComplement(iFan0) * 911; - Key ^= Odc_IsComplement(iFan1) * 353; - return Key % TableSize; -} - -/**Function************************************************************* - - Synopsis [Checks if the given name node already exists in the table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Odc_Lit_t * Odc_HashLookup( Odc_Man_t * p, Odc_Lit_t iFan0, Odc_Lit_t iFan1 ) -{ - Odc_Obj_t * pObj; - Odc_Lit_t * pEntry; - unsigned uHashKey; - assert( iFan0 < iFan1 ); - // get the hash key for this node - uHashKey = Odc_HashKey( iFan0, iFan1, p->nTableSize ); - // remember the spot in the hash table that will be used - if ( p->pTable[uHashKey] == 0 ) - Vec_IntPush( p->vUsedSpots, uHashKey ); - // find the entry - for ( pEntry = p->pTable + uHashKey; *pEntry; pEntry = &pObj->iNext ) - { - pObj = Odc_Lit2Obj( p, *pEntry ); - if ( pObj->iFan0 == iFan0 && pObj->iFan1 == iFan1 ) - return pEntry; - } - return pEntry; -} - -/**Function************************************************************* - - Synopsis [Finds node by structural hashing or creates a new node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Odc_Lit_t Odc_And( Odc_Man_t * p, Odc_Lit_t iFan0, Odc_Lit_t iFan1 ) -{ - Odc_Obj_t * pObj; - Odc_Lit_t * pEntry; - unsigned uMask0, uMask1; - int Temp; - // consider trivial cases - if ( iFan0 == iFan1 ) - return iFan0; - if ( iFan0 == Odc_Not(iFan1) ) - return Odc_Const0(); - if ( Odc_Regular(iFan0) == Odc_Const1() ) - return iFan0 == Odc_Const1() ? iFan1 : Odc_Const0(); - if ( Odc_Regular(iFan1) == Odc_Const1() ) - return iFan1 == Odc_Const1() ? iFan0 : Odc_Const0(); - // canonicize the fanin order - if ( iFan0 > iFan1 ) - Temp = iFan0, iFan0 = iFan1, iFan1 = Temp; - // check if a node with these fanins exists - pEntry = Odc_HashLookup( p, iFan0, iFan1 ); - if ( *pEntry ) - return *pEntry; - // create a new node - pObj = Odc_ObjNew( p ); - pObj->iFan0 = iFan0; - pObj->iFan1 = iFan1; - pObj->iNext = 0; - pObj->TravId = 0; - // set the mask - uMask0 = Odc_Lit2Obj(p, Odc_Regular(iFan0))->uMask; - uMask1 = Odc_Lit2Obj(p, Odc_Regular(iFan1))->uMask; - pObj->uMask = uMask0 | uMask1; - // add to the table - *pEntry = Odc_Obj2Lit( p, pObj ); - return *pEntry; -} - -/**Function************************************************************* - - Synopsis [Boolean OR.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Odc_Lit_t Odc_Or( Odc_Man_t * p, Odc_Lit_t iFan0, Odc_Lit_t iFan1 ) -{ - return Odc_Not( Odc_And(p, Odc_Not(iFan0), Odc_Not(iFan1)) ); -} - -/**Function************************************************************* - - Synopsis [Boolean XOR.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Odc_Lit_t Odc_Xor( Odc_Man_t * p, Odc_Lit_t iFan0, Odc_Lit_t iFan1 ) -{ - return Odc_Or( p, Odc_And(p, iFan0, Odc_Not(iFan1)), Odc_And(p, Odc_Not(iFan0), iFan1) ); -} - - - - - -/**Function************************************************************* - - Synopsis [Transfers the window into the AIG package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void * Abc_NtkDontCareTransfer_rec( Odc_Man_t * p, Abc_Obj_t * pNode, Abc_Obj_t * pPivot ) -{ - unsigned uData0, uData1; - Odc_Lit_t uLit0, uLit1, uRes0, uRes1; - assert( !Abc_ObjIsComplement(pNode) ); - // skip visited objects - if ( Abc_NodeIsTravIdCurrent(pNode) ) - return pNode->pCopy; - Abc_NodeSetTravIdCurrent(pNode); - assert( Abc_ObjIsNode(pNode) ); - // consider the case when the node is the pivot - if ( pNode == pPivot ) - return pNode->pCopy = (void *)((Odc_Const1() << 16) | Odc_Const0()); - // compute the cofactors - uData0 = (unsigned)Abc_NtkDontCareTransfer_rec( p, Abc_ObjFanin0(pNode), pPivot ); - uData1 = (unsigned)Abc_NtkDontCareTransfer_rec( p, Abc_ObjFanin1(pNode), pPivot ); - // find the 0-cofactor - uLit0 = Odc_NotCond( (Odc_Lit_t)(uData0 & 0xffff), Abc_ObjFaninC0(pNode) ); - uLit1 = Odc_NotCond( (Odc_Lit_t)(uData1 & 0xffff), Abc_ObjFaninC1(pNode) ); - uRes0 = Odc_And( p, uLit0, uLit1 ); - // find the 1-cofactor - uLit0 = Odc_NotCond( (Odc_Lit_t)(uData0 >> 16), Abc_ObjFaninC0(pNode) ); - uLit1 = Odc_NotCond( (Odc_Lit_t)(uData1 >> 16), Abc_ObjFaninC1(pNode) ); - uRes1 = Odc_And( p, uLit0, uLit1 ); - // find the result - return pNode->pCopy = (void *)((uRes1 << 16) | uRes0); -} - -/**Function************************************************************* - - Synopsis [Transfers the window into the AIG package.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDontCareTransfer( Odc_Man_t * p ) -{ - Abc_Obj_t * pObj; - Odc_Lit_t uRes0, uRes1; - Odc_Lit_t uLit; - unsigned uData; - int i; - Abc_NtkIncrementTravId( p->pNode->pNtk ); - // set elementary variables at the leaves - Vec_PtrForEachEntry( p->vLeaves, pObj, i ) - { - uLit = Odc_Var( p, i ); - pObj->pCopy = (void *)((uLit << 16) | uLit); - Abc_NodeSetTravIdCurrent(pObj); - } - // set elementary variables at the branched - Vec_PtrForEachEntry( p->vBranches, pObj, i ) - { - uLit = Odc_Var( p, i+p->nVarsMax ); - pObj->pCopy = (void *)((uLit << 16) | uLit); - Abc_NodeSetTravIdCurrent(pObj); - } - // compute the AIG for the window - p->iRoot = Odc_Const0(); - Vec_PtrForEachEntry( p->vRoots, pObj, i ) - { - uData = (unsigned)Abc_NtkDontCareTransfer_rec( p, pObj, p->pNode ); - // get the cofactors - uRes0 = uData & 0xffff; - uRes1 = uData >> 16; - // compute the miter -// assert( uRes0 != uRes1 ); // may be false if the node is redundant w.r.t. this root - uLit = Odc_Xor( p, uRes0, uRes1 ); - p->iRoot = Odc_Or( p, p->iRoot, uLit ); - } - return 1; -} - - -/**Function************************************************************* - - Synopsis [Recursively computes the pair of cofactors.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned Abc_NtkDontCareCofactors_rec( Odc_Man_t * p, Odc_Lit_t Lit, unsigned uMask ) -{ - Odc_Obj_t * pObj; - unsigned uData0, uData1; - Odc_Lit_t uLit0, uLit1, uRes0, uRes1; - assert( !Odc_IsComplement(Lit) ); - // skip visited objects - pObj = Odc_Lit2Obj( p, Lit ); - if ( Odc_ObjIsTravIdCurrent(p, pObj) ) - return pObj->uData; - Odc_ObjSetTravIdCurrent(p, pObj); - // skip objects out of the cone - if ( (pObj->uMask & uMask) == 0 ) - return pObj->uData = ((Lit << 16) | Lit); - // consider the case when the node is the var - if ( pObj->uMask == uMask && Odc_IsTerm(p, Lit) ) - return pObj->uData = ((Odc_Const1() << 16) | Odc_Const0()); - // compute the cofactors - uData0 = Abc_NtkDontCareCofactors_rec( p, Odc_ObjFanin0(pObj), uMask ); - uData1 = Abc_NtkDontCareCofactors_rec( p, Odc_ObjFanin1(pObj), uMask ); - // find the 0-cofactor - uLit0 = Odc_NotCond( (Odc_Lit_t)(uData0 & 0xffff), Odc_ObjFaninC0(pObj) ); - uLit1 = Odc_NotCond( (Odc_Lit_t)(uData1 & 0xffff), Odc_ObjFaninC1(pObj) ); - uRes0 = Odc_And( p, uLit0, uLit1 ); - // find the 1-cofactor - uLit0 = Odc_NotCond( (Odc_Lit_t)(uData0 >> 16), Odc_ObjFaninC0(pObj) ); - uLit1 = Odc_NotCond( (Odc_Lit_t)(uData1 >> 16), Odc_ObjFaninC1(pObj) ); - uRes1 = Odc_And( p, uLit0, uLit1 ); - // find the result - return pObj->uData = ((uRes1 << 16) | uRes0); -} - -/**Function************************************************************* - - Synopsis [Quantifies the branch variables.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDontCareQuantify( Odc_Man_t * p ) -{ - Odc_Lit_t uRes0, uRes1; - unsigned uData; - int i; - assert( p->iRoot < 0xffff ); - assert( Vec_PtrSize(p->vBranches) <= 32 ); // the mask size - for ( i = 0; i < Vec_PtrSize(p->vBranches); i++ ) - { - // compute the cofactors w.r.t. this variable - Odc_ManIncrementTravId( p ); - uData = Abc_NtkDontCareCofactors_rec( p, Odc_Regular(p->iRoot), (1 << i) ); - uRes0 = Odc_NotCond( (Odc_Lit_t)(uData & 0xffff), Odc_IsComplement(p->iRoot) ); - uRes1 = Odc_NotCond( (Odc_Lit_t)(uData >> 16), Odc_IsComplement(p->iRoot) ); - // quantify this variable existentially - p->iRoot = Odc_Or( p, uRes0, uRes1 ); - // check the limit - if ( Odc_ObjNum(p) > ABC_DC_MAX_NODES/2 ) - return 0; - } - assert( p->nObjs <= p->nObjsAlloc ); - return 1; -} - - - -/**Function************************************************************* - - Synopsis [Set elementary truth tables for PIs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDontCareSimulateSetElem2( Odc_Man_t * p ) -{ - unsigned * pData; - int i, k; - for ( k = 0; k < p->nVarsMax; k++ ) - { - pData = Odc_ObjTruth( p, Odc_Var(p, k) ); - Abc_InfoClear( pData, p->nWords ); - for ( i = 0; i < p->nBits; i++ ) - if ( i & (1 << k) ) - pData[i>>5] |= (1 << (i&31)); - } -} - -/**Function************************************************************* - - Synopsis [Set elementary truth tables for PIs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDontCareSimulateSetElem( Odc_Man_t * p ) -{ - unsigned * pData, * pData2; - int k; - for ( k = 0; k < p->nVarsMax; k++ ) - { - pData = Odc_ObjTruth( p, Odc_Var(p, k) ); - pData2 = Vec_PtrEntry( p->vTruthsElem, k ); - Abc_InfoCopy( pData, pData2, p->nWords ); - } -} - -/**Function************************************************************* - - Synopsis [Set random simulation words for PIs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDontCareSimulateSetRand( Odc_Man_t * p ) -{ - unsigned * pData; - int w, k, Number; - for ( w = 0; w < p->nWords; w++ ) - { - Number = rand(); - for ( k = 0; k < p->nVarsMax; k++ ) - { - pData = Odc_ObjTruth( p, Odc_Var(p, k) ); - pData[w] = (Number & (1<<k)) ? ~0 : 0; - } - } -} - -/**Function************************************************************* - - Synopsis [Set random simulation words for PIs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDontCareCountMintsWord( Odc_Man_t * p, unsigned * puTruth ) -{ - int w, Counter = 0; - for ( w = 0; w < p->nWords; w++ ) - if ( puTruth[w] ) - Counter++; - return Counter; -} - -/**Function************************************************************* - - Synopsis [Simulates one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDontCareTruthOne( Odc_Man_t * p, Odc_Lit_t Lit ) -{ - Odc_Obj_t * pObj; - unsigned * pInfo, * pInfo1, * pInfo2; - int k, fComp1, fComp2; - assert( !Odc_IsComplement( Lit ) ); - assert( !Odc_IsTerm( p, Lit ) ); - // get the truth tables - pObj = Odc_Lit2Obj( p, Lit ); - pInfo = Odc_ObjTruth( p, Lit ); - pInfo1 = Odc_ObjTruth( p, Odc_ObjFanin0(pObj) ); - pInfo2 = Odc_ObjTruth( p, Odc_ObjFanin1(pObj) ); - fComp1 = Odc_ObjFaninC0( pObj ); - fComp2 = Odc_ObjFaninC1( pObj ); - // simulate - if ( fComp1 && fComp2 ) - for ( k = 0; k < p->nWords; k++ ) - pInfo[k] = ~pInfo1[k] & ~pInfo2[k]; - else if ( fComp1 && !fComp2 ) - for ( k = 0; k < p->nWords; k++ ) - pInfo[k] = ~pInfo1[k] & pInfo2[k]; - else if ( !fComp1 && fComp2 ) - for ( k = 0; k < p->nWords; k++ ) - pInfo[k] = pInfo1[k] & ~pInfo2[k]; - else // if ( fComp1 && fComp2 ) - for ( k = 0; k < p->nWords; k++ ) - pInfo[k] = pInfo1[k] & pInfo2[k]; -} - -/**Function************************************************************* - - Synopsis [Computes the truth table.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkDontCareSimulate_rec( Odc_Man_t * p, Odc_Lit_t Lit ) -{ - Odc_Obj_t * pObj; - assert( !Odc_IsComplement(Lit) ); - // skip terminals - if ( Odc_IsTerm(p, Lit) ) - return; - // skip visited objects - pObj = Odc_Lit2Obj( p, Lit ); - if ( Odc_ObjIsTravIdCurrent(p, pObj) ) - return; - Odc_ObjSetTravIdCurrent(p, pObj); - // call recursively - Abc_NtkDontCareSimulate_rec( p, Odc_ObjFanin0(pObj) ); - Abc_NtkDontCareSimulate_rec( p, Odc_ObjFanin1(pObj) ); - // construct the truth table - Abc_NtkDontCareTruthOne( p, Lit ); -} - -/**Function************************************************************* - - Synopsis [Computes the truth table of the care set.] - - Description [Returns the number of ones in the simulation info.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDontCareSimulate( Odc_Man_t * p, unsigned * puTruth ) -{ - Odc_ManIncrementTravId( p ); - Abc_NtkDontCareSimulate_rec( p, Odc_Regular(p->iRoot) ); - Abc_InfoCopy( puTruth, Odc_ObjTruth(p, Odc_Regular(p->iRoot)), p->nWords ); - if ( Odc_IsComplement(p->iRoot) ) - Abc_InfoNot( puTruth, p->nWords ); - return Extra_TruthCountOnes( puTruth, p->nVarsMax ); -} - -/**Function************************************************************* - - Synopsis [Computes the truth table of the care set.] - - Description [Returns the number of ones in the simulation info.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDontCareSimulateBefore( Odc_Man_t * p, unsigned * puTruth ) -{ - int nIters = 2; - int nRounds, Counter, r; - // decide how many rounds to simulate - nRounds = p->nBits / p->nWords; - Counter = 0; - for ( r = 0; r < nIters; r++ ) - { - Abc_NtkDontCareSimulateSetRand( p ); - Abc_NtkDontCareSimulate( p, puTruth ); - Counter += Abc_NtkDontCareCountMintsWord( p, puTruth ); - } - // normalize - Counter = Counter * nRounds / nIters; - return Counter; -} - -/**Function************************************************************* - - Synopsis [Computes ODCs for the node in terms of the cut variables.] - - Description [Returns the number of don't care minterms in the truth table. - In particular, this procedure returns 0 if there is no don't-cares.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkDontCareCompute( Odc_Man_t * p, Abc_Obj_t * pNode, Vec_Ptr_t * vLeaves, unsigned * puTruth ) -{ - int nMints, RetValue; - int clk, clkTotal = clock(); - - p->nWins++; - - // set the parameters - assert( !Abc_ObjIsComplement(pNode) ); - assert( Abc_ObjIsNode(pNode) ); - assert( Vec_PtrSize(vLeaves) <= p->nVarsMax ); - p->vLeaves = vLeaves; - p->pNode = pNode; - - // compute the window -clk = clock(); - RetValue = Abc_NtkDontCareWindow( p ); -p->timeWin += clock() - clk; - if ( !RetValue ) - { -p->timeAbort += clock() - clkTotal; - Abc_InfoFill( puTruth, p->nWords ); - p->nWinsEmpty++; - return 0; - } - - if ( p->fVeryVerbose ) - { - printf( " %5d : ", pNode->Id ); - printf( "Leaf = %2d ", Vec_PtrSize(p->vLeaves) ); - printf( "Root = %2d ", Vec_PtrSize(p->vRoots) ); - printf( "Bran = %2d ", Vec_PtrSize(p->vBranches) ); - printf( " | " ); - } - - // transfer the window into the AIG package -clk = clock(); - Abc_NtkDontCareTransfer( p ); -p->timeMiter += clock() - clk; - - // simulate to estimate the amount of don't-cares -clk = clock(); - nMints = Abc_NtkDontCareSimulateBefore( p, puTruth ); -p->timeSim += clock() - clk; - if ( p->fVeryVerbose ) - { - printf( "AIG = %5d ", Odc_NodeNum(p) ); - printf( "%6.2f %% ", 100.0 * (p->nBits - nMints) / p->nBits ); - } - - // if there is less then the given percentage of don't-cares, skip - if ( 100.0 * (p->nBits - nMints) / p->nBits < 1.0 * p->nPercCutoff ) - { -p->timeAbort += clock() - clkTotal; - if ( p->fVeryVerbose ) - printf( "Simulation cutoff.\n" ); - Abc_InfoFill( puTruth, p->nWords ); - p->nSimsEmpty++; - return 0; - } - - // quantify external variables -clk = clock(); - RetValue = Abc_NtkDontCareQuantify( p ); -p->timeQuant += clock() - clk; - if ( !RetValue ) - { -p->timeAbort += clock() - clkTotal; - if ( p->fVeryVerbose ) - printf( "=== Overflow! ===\n" ); - Abc_InfoFill( puTruth, p->nWords ); - p->nQuantsOver++; - return 0; - } - - // get the truth table -clk = clock(); - Abc_NtkDontCareSimulateSetElem( p ); - nMints = Abc_NtkDontCareSimulate( p, puTruth ); -p->timeTruth += clock() - clk; - if ( p->fVeryVerbose ) - { - printf( "AIG = %5d ", Odc_NodeNum(p) ); - printf( "%6.2f %% ", 100.0 * (p->nBits - nMints) / p->nBits ); - printf( "\n" ); - } -p->timeTotal += clock() - clkTotal; - p->nWinsFinish++; - p->nTotalDcs += (int)(100.0 * (p->nBits - nMints) / p->nBits); - return nMints; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcOrder.c b/src/base/abci/abcOrder.c deleted file mode 100644 index 04417f77..00000000 --- a/src/base/abci/abcOrder.c +++ /dev/null @@ -1,131 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcOrder.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Exploring static BDD variable orders.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcOrder.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Abc_NtkChangeCiOrder( Abc_Ntk_t * pNtk, Vec_Ptr_t * vSupp, int fReverse ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Changes the order of primary inputs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFindCiOrder( Abc_Ntk_t * pNtk, int fReverse, int fVerbose ) -{ - Vec_Ptr_t * vSupp; - vSupp = Abc_NtkSupport( pNtk ); - Abc_NtkChangeCiOrder( pNtk, vSupp, fReverse ); - Vec_PtrFree( vSupp ); -} - -/**Function************************************************************* - - Synopsis [Implements the given variable order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkImplementCiOrder( Abc_Ntk_t * pNtk, char * pFileName, int fReverse, int fVerbose ) -{ - char Buffer[1000]; - FILE * pFile; - Vec_Ptr_t * vSupp; - Abc_Obj_t * pObj; - pFile = fopen( pFileName, "r" ); - vSupp = Vec_PtrAlloc( Abc_NtkCiNum(pNtk) ); - while ( fscanf( pFile, "%s", Buffer ) == 1 ) - { - pObj = Abc_NtkFindCi( pNtk, Buffer ); - if ( pObj == NULL || !Abc_ObjIsCi(pObj) ) - { - printf( "Name \"%s\" is not a PI name. Cannot use this order.\n", Buffer ); - Vec_PtrFree( vSupp ); - fclose( pFile ); - return; - } - Vec_PtrPush( vSupp, pObj ); - } - fclose( pFile ); - if ( Vec_PtrSize(vSupp) != Abc_NtkCiNum(pNtk) ) - { - printf( "The number of names in the order (%d) is not the same as the number of PIs (%d).\n", Vec_PtrSize(vSupp), Abc_NtkCiNum(pNtk) ); - Vec_PtrFree( vSupp ); - return; - } - Abc_NtkChangeCiOrder( pNtk, vSupp, fReverse ); - Vec_PtrFree( vSupp ); -} - -/**Function************************************************************* - - Synopsis [Changes the order of primary inputs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkChangeCiOrder( Abc_Ntk_t * pNtk, Vec_Ptr_t * vSupp, int fReverse ) -{ - Abc_Obj_t * pObj; - int i; - assert( Vec_PtrSize(vSupp) == Abc_NtkCiNum(pNtk) ); - // order CIs using the array - if ( fReverse ) - Vec_PtrForEachEntry( vSupp, pObj, i ) - Vec_PtrWriteEntry( pNtk->vCis, Vec_PtrSize(vSupp)-1-i, pObj ); - else - Vec_PtrForEachEntry( vSupp, pObj, i ) - Vec_PtrWriteEntry( pNtk->vCis, i, pObj ); - // order PIs accordingly - Vec_PtrClear( pNtk->vPis ); - Abc_NtkForEachCi( pNtk, pObj, i ) - if ( Abc_ObjIsPi(pObj) ) - Vec_PtrPush( pNtk->vPis, pObj ); -// Abc_NtkForEachCi( pNtk, pObj, i ) -// printf( "%s ", Abc_ObjName(pObj) ); -// printf( "\n" ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcPart.c b/src/base/abci/abcPart.c deleted file mode 100644 index 85c4e918..00000000 --- a/src/base/abci/abcPart.c +++ /dev/null @@ -1,1205 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcPart.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Output partitioning package.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcPart.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Supp_Man_t_ Supp_Man_t; -struct Supp_Man_t_ -{ - int nChunkSize; // the size of one chunk of memory (~1 Mb) - int nStepSize; // the step size in saving memory (~64 bytes) - char * pFreeBuf; // the pointer to free memory - int nFreeSize; // the size of remaining free memory - Vec_Ptr_t * vMemory; // the memory allocated - Vec_Ptr_t * vFree; // the vector of free pieces of memory -}; - -typedef struct Supp_One_t_ Supp_One_t; -struct Supp_One_t_ -{ - int nRefs; // the number of references - int nOuts; // the number of outputs - int nOutsAlloc; // the array size - int pOuts[0]; // the array of outputs -}; - -static inline int Supp_SizeType( int nSize, int nStepSize ) { return nSize / nStepSize + ((nSize % nStepSize) > 0); } -static inline char * Supp_OneNext( char * pPart ) { return *((char **)pPart); } -static inline void Supp_OneSetNext( char * pPart, char * pNext ) { *((char **)pPart) = pNext; } - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Start the memory manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Supp_Man_t * Supp_ManStart( int nChunkSize, int nStepSize ) -{ - Supp_Man_t * p; - p = ALLOC( Supp_Man_t, 1 ); - memset( p, 0, sizeof(Supp_Man_t) ); - p->nChunkSize = nChunkSize; - p->nStepSize = nStepSize; - p->vMemory = Vec_PtrAlloc( 1000 ); - p->vFree = Vec_PtrAlloc( 1000 ); - return p; -} - -/**Function************************************************************* - - Synopsis [Stops the memory manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Supp_ManStop( Supp_Man_t * p ) -{ - void * pMemory; - int i; - Vec_PtrForEachEntry( p->vMemory, pMemory, i ) - free( pMemory ); - Vec_PtrFree( p->vMemory ); - Vec_PtrFree( p->vFree ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Fetches the memory entry of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -char * Supp_ManFetch( Supp_Man_t * p, int nSize ) -{ - int Type, nSizeReal; - char * pMemory; - assert( nSize > 0 ); - Type = Supp_SizeType( nSize, p->nStepSize ); - Vec_PtrFillExtra( p->vFree, Type + 1, NULL ); - if ( pMemory = Vec_PtrEntry( p->vFree, Type ) ) - { - Vec_PtrWriteEntry( p->vFree, Type, Supp_OneNext(pMemory) ); - return pMemory; - } - nSizeReal = p->nStepSize * Type; - if ( p->nFreeSize < nSizeReal ) - { - p->pFreeBuf = ALLOC( char, p->nChunkSize ); - p->nFreeSize = p->nChunkSize; - Vec_PtrPush( p->vMemory, p->pFreeBuf ); - } - assert( p->nFreeSize >= nSizeReal ); - pMemory = p->pFreeBuf; - p->pFreeBuf += nSizeReal; - p->nFreeSize -= nSizeReal; - return pMemory; -} - -/**Function************************************************************* - - Synopsis [Recycles the memory entry of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Supp_ManRecycle( Supp_Man_t * p, char * pMemory, int nSize ) -{ - int Type; - Type = Supp_SizeType( nSize, p->nStepSize ); - Vec_PtrFillExtra( p->vFree, Type + 1, NULL ); - Supp_OneSetNext( pMemory, Vec_PtrEntry(p->vFree, Type) ); - Vec_PtrWriteEntry( p->vFree, Type, pMemory ); -} - -/**Function************************************************************* - - Synopsis [Fetches the memory entry of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Supp_One_t * Supp_ManFetchEntry( Supp_Man_t * p, int nWords, int nRefs ) -{ - Supp_One_t * pPart; - pPart = (Supp_One_t *)Supp_ManFetch( p, sizeof(Supp_One_t) + sizeof(int) * nWords ); - pPart->nRefs = nRefs; - pPart->nOuts = 0; - pPart->nOutsAlloc = nWords; - return pPart; -} - -/**Function************************************************************* - - Synopsis [Recycles the memory entry of the given size.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Supp_ManRecycleEntry( Supp_Man_t * p, Supp_One_t * pEntry ) -{ - assert( pEntry->nOuts <= pEntry->nOutsAlloc ); - assert( pEntry->nOuts >= pEntry->nOutsAlloc/2 ); - Supp_ManRecycle( p, (char *)pEntry, sizeof(Supp_One_t) + sizeof(int) * pEntry->nOutsAlloc ); -} - -/**Function************************************************************* - - Synopsis [Merges two entries.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Supp_One_t * Supp_ManMergeEntry( Supp_Man_t * pMan, Supp_One_t * p1, Supp_One_t * p2, int nRefs ) -{ - Supp_One_t * p = Supp_ManFetchEntry( pMan, p1->nOuts + p2->nOuts, nRefs ); - int * pBeg1 = p1->pOuts; - int * pBeg2 = p2->pOuts; - int * pBeg = p->pOuts; - int * pEnd1 = p1->pOuts + p1->nOuts; - int * pEnd2 = p2->pOuts + p2->nOuts; - while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 ) - { - if ( *pBeg1 == *pBeg2 ) - *pBeg++ = *pBeg1++, pBeg2++; - else if ( *pBeg1 < *pBeg2 ) - *pBeg++ = *pBeg1++; - else - *pBeg++ = *pBeg2++; - } - while ( pBeg1 < pEnd1 ) - *pBeg++ = *pBeg1++; - while ( pBeg2 < pEnd2 ) - *pBeg++ = *pBeg2++; - p->nOuts = pBeg - p->pOuts; - assert( p->nOuts <= p->nOutsAlloc ); - assert( p->nOuts >= p1->nOuts ); - assert( p->nOuts >= p2->nOuts ); - return p; -} - -/**Function************************************************************* - - Synopsis [Tranfers the entry.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Int_t * Supp_ManTransferEntry( Supp_One_t * p ) -{ - Vec_Int_t * vSupp; - int i; - vSupp = Vec_IntAlloc( p->nOuts ); - for ( i = 0; i < p->nOuts; i++ ) - Vec_IntPush( vSupp, p->pOuts[i] ); - return vSupp; -} - -/**Function************************************************************* - - Synopsis [Computes supports of the POs in the multi-output AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NtkDfsNatural( Abc_Ntk_t * pNtk ) -{ - Vec_Ptr_t * vNodes; - Abc_Obj_t * pObj, * pNext; - int i, k; - assert( Abc_NtkIsStrash(pNtk) ); - vNodes = Vec_PtrAlloc( Abc_NtkObjNum(pNtk) ); - Abc_NtkIncrementTravId( pNtk ); - // add the constant-1 nodes - pObj = Abc_AigConst1(pNtk); - Abc_NodeSetTravIdCurrent( pObj ); - Vec_PtrPush( vNodes, pObj ); - // add the CIs/nodes/COs in the topological order - Abc_NtkForEachNode( pNtk, pObj, i ) - { - // check the fanins and add CIs - Abc_ObjForEachFanin( pObj, pNext, k ) - if ( Abc_ObjIsCi(pNext) && !Abc_NodeIsTravIdCurrent(pNext) ) - { - Abc_NodeSetTravIdCurrent( pNext ); - Vec_PtrPush( vNodes, pNext ); - } - // add the node - Vec_PtrPush( vNodes, pObj ); - // check the fanouts and add COs - Abc_ObjForEachFanout( pObj, pNext, k ) - if ( Abc_ObjIsCo(pNext) && !Abc_NodeIsTravIdCurrent(pNext) ) - { - Abc_NodeSetTravIdCurrent( pNext ); - Vec_PtrPush( vNodes, pNext ); - } - } - return vNodes; -} - -/**Function************************************************************* - - Synopsis [Computes supports of the POs.] - - Description [Returns the ptr-vector of int-vectors.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NtkComputeSupportsSmart( Abc_Ntk_t * pNtk ) -{ - Vec_Ptr_t * vSupports; - Vec_Ptr_t * vNodes; - Vec_Int_t * vSupp; - Supp_Man_t * p; - Supp_One_t * pPart0, * pPart1; - Abc_Obj_t * pObj; - int i; - // set the number of PIs/POs - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pNext = (Abc_Obj_t *)i; - Abc_NtkForEachCo( pNtk, pObj, i ) - pObj->pNext = (Abc_Obj_t *)i; - // start the support computation manager - p = Supp_ManStart( 1 << 20, 1 << 6 ); - // consider objects in the topological order - vSupports = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) ); - Abc_NtkCleanCopy(pNtk); - // order the nodes so that the PIs and POs follow naturally - vNodes = Abc_NtkDfsNatural( pNtk ); - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - if ( Abc_ObjIsNode(pObj) ) - { - pPart0 = (Supp_One_t *)Abc_ObjFanin0(pObj)->pCopy; - pPart1 = (Supp_One_t *)Abc_ObjFanin1(pObj)->pCopy; - pObj->pCopy = (Abc_Obj_t *)Supp_ManMergeEntry( p, pPart0, pPart1, Abc_ObjFanoutNum(pObj) ); - assert( pPart0->nRefs > 0 ); - if ( --pPart0->nRefs == 0 ) - Supp_ManRecycleEntry( p, pPart0 ); - assert( pPart1->nRefs > 0 ); - if ( --pPart1->nRefs == 0 ) - Supp_ManRecycleEntry( p, pPart1 ); - continue; - } - if ( Abc_ObjIsCo(pObj) ) - { - pPart0 = (Supp_One_t *)Abc_ObjFanin0(pObj)->pCopy; - // only save the CO if it is non-trivial - if ( Abc_ObjIsNode(Abc_ObjFanin0(pObj)) ) - { - vSupp = Supp_ManTransferEntry(pPart0); - Vec_IntPush( vSupp, (int)pObj->pNext ); - Vec_PtrPush( vSupports, vSupp ); - } - assert( pPart0->nRefs > 0 ); - if ( --pPart0->nRefs == 0 ) - Supp_ManRecycleEntry( p, pPart0 ); - continue; - } - if ( Abc_ObjIsCi(pObj) ) - { - if ( Abc_ObjFanoutNum(pObj) ) - { - pPart0 = (Supp_One_t *)Supp_ManFetchEntry( p, 1, Abc_ObjFanoutNum(pObj) ); - pPart0->pOuts[ pPart0->nOuts++ ] = (int)pObj->pNext; - pObj->pCopy = (Abc_Obj_t *)pPart0; - } - continue; - } - if ( pObj == Abc_AigConst1(pNtk) ) - { - if ( Abc_ObjFanoutNum(pObj) ) - pObj->pCopy = (Abc_Obj_t *)Supp_ManFetchEntry( p, 0, Abc_ObjFanoutNum(pObj) ); - continue; - } - assert( 0 ); - } - Vec_PtrFree( vNodes ); -//printf( "Memory usage = %d Mb.\n", Vec_PtrSize(p->vMemory) * p->nChunkSize / (1<<20) ); - Supp_ManStop( p ); - // sort supports by size - Vec_VecSort( (Vec_Vec_t *)vSupports, 1 ); - // clear the number of PIs/POs - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pNext = NULL; - Abc_NtkForEachCo( pNtk, pObj, i ) - pObj->pNext = NULL; -/* - Vec_PtrForEachEntry( vSupports, vSupp, i ) - printf( "%d ", Vec_IntSize(vSupp) ); - printf( "\n" ); -*/ - return vSupports; -} - - -/**Function************************************************************* - - Synopsis [Computes supports of the POs using naive method.] - - Description [Returns the ptr-vector of int-vectors.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NtkComputeSupportsNaive( Abc_Ntk_t * pNtk ) -{ - Vec_Ptr_t * vSupp, * vSupports; - Vec_Int_t * vSuppI; - Abc_Obj_t * pObj, * pTemp; - int i, k; - // set the PI numbers - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pNext = (void *)i; - // save the CI numbers - vSupports = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pObj, i ) - { - if ( !Abc_ObjIsNode(Abc_ObjFanin0(pObj)) ) - continue; - vSupp = Abc_NtkNodeSupport( pNtk, &pObj, 1 ); - vSuppI = (Vec_Int_t *)vSupp; - Vec_PtrForEachEntry( vSupp, pTemp, k ) - Vec_IntWriteEntry( vSuppI, k, (int)pTemp->pNext ); - Vec_IntSort( vSuppI, 0 ); - // append the number of this output - Vec_IntPush( vSuppI, i ); - // save the support in the vector - Vec_PtrPush( vSupports, vSuppI ); - } - // clean the CI numbers - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pNext = NULL; - // sort supports by size - Vec_VecSort( (Vec_Vec_t *)vSupports, 1 ); -/* - Vec_PtrForEachEntry( vSupports, vSuppI, i ) - printf( "%d ", Vec_IntSize(vSuppI) ); - printf( "\n" ); -*/ - return vSupports; -} - -/**Function************************************************************* - - Synopsis [Start bitwise support representation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned * Abc_NtkSuppCharStart( Vec_Int_t * vOne, int nPis ) -{ - unsigned * pBuffer; - int i, Entry; - int nWords = Abc_BitWordNum(nPis); - pBuffer = ALLOC( unsigned, nWords ); - memset( pBuffer, 0, sizeof(unsigned) * nWords ); - Vec_IntForEachEntry( vOne, Entry, i ) - { - assert( Entry < nPis ); - Abc_InfoSetBit( pBuffer, Entry ); - } - return pBuffer; -} - -/**Function************************************************************* - - Synopsis [Add to bitwise support representation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkSuppCharAdd( unsigned * pBuffer, Vec_Int_t * vOne, int nPis ) -{ - int i, Entry; - Vec_IntForEachEntry( vOne, Entry, i ) - { - assert( Entry < nPis ); - Abc_InfoSetBit( pBuffer, Entry ); - } -} - -/**Function************************************************************* - - Synopsis [Find the common variables using bitwise support representation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkSuppCharCommon( unsigned * pBuffer, Vec_Int_t * vOne ) -{ - int i, Entry, nCommon = 0; - Vec_IntForEachEntry( vOne, Entry, i ) - nCommon += Abc_InfoHasBit(pBuffer, Entry); - return nCommon; -} - -/**Function************************************************************* - - Synopsis [Find the best partition.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkPartitionSmartFindPart( Vec_Ptr_t * vPartSuppsAll, Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsChar, int nSuppSizeLimit, Vec_Int_t * vOne ) -{ -/* - Vec_Int_t * vPartSupp, * vPart; - double Attract, Repulse, Cost, CostBest; - int i, nCommon, iBest; - iBest = -1; - CostBest = 0.0; - Vec_PtrForEachEntry( vPartSuppsAll, vPartSupp, i ) - { - vPart = Vec_PtrEntry( vPartsAll, i ); - if ( nPartSizeLimit > 0 && Vec_IntSize(vPart) >= nPartSizeLimit ) - continue; - nCommon = Vec_IntTwoCountCommon( vPartSupp, vOne ); - if ( nCommon == 0 ) - continue; - if ( nCommon == Vec_IntSize(vOne) ) - return i; - Attract = 1.0 * nCommon / Vec_IntSize(vOne); - if ( Vec_IntSize(vPartSupp) < 100 ) - Repulse = 1.0; - else - Repulse = log10( Vec_IntSize(vPartSupp) / 10.0 ); - Cost = pow( Attract, pow(Repulse, 5.0) ); - if ( CostBest < Cost ) - { - CostBest = Cost; - iBest = i; - } - } - if ( CostBest < 0.6 ) - return -1; - return iBest; -*/ - - Vec_Int_t * vPartSupp;//, * vPart; - int Attract, Repulse, Value, ValueBest; - int i, nCommon, iBest; -// int nCommon2; - iBest = -1; - ValueBest = 0; - Vec_PtrForEachEntry( vPartSuppsAll, vPartSupp, i ) - { - // skip partitions with too many outputs -// vPart = Vec_PtrEntry( vPartsAll, i ); -// if ( nSuppSizeLimit > 0 && Vec_IntSize(vPart) >= nSuppSizeLimit ) -// continue; - // find the number of common variables between this output and the partitions -// nCommon2 = Vec_IntTwoCountCommon( vPartSupp, vOne ); - nCommon = Abc_NtkSuppCharCommon( Vec_PtrEntry(vPartSuppsChar, i), vOne ); -// assert( nCommon2 == nCommon ); - // if no common variables, continue searching - if ( nCommon == 0 ) - continue; - // if all variables are common, the best partition if found - if ( nCommon == Vec_IntSize(vOne) ) - return i; - // skip partitions whose size exceeds the limit - if ( nSuppSizeLimit > 0 && Vec_IntSize(vPartSupp) >= 2 * nSuppSizeLimit ) - continue; - // figure out might be the good partition for this one - Attract = 1000 * nCommon / Vec_IntSize(vOne); - if ( Vec_IntSize(vPartSupp) < 100 ) - Repulse = 1; - else - Repulse = 1+Extra_Base2Log(Vec_IntSize(vPartSupp)-100); - Value = Attract/Repulse; - if ( ValueBest < Value ) - { - ValueBest = Value; - iBest = i; - } - } - if ( ValueBest < 75 ) - return -1; - return iBest; -} - -/**Function************************************************************* - - Synopsis [Perform the smart partitioning.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPartitionPrint( Abc_Ntk_t * pNtk, Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsAll ) -{ - Vec_Int_t * vOne; - int i, nOutputs, Counter; - - Counter = 0; - Vec_PtrForEachEntry( vPartSuppsAll, vOne, i ) - { - nOutputs = Vec_IntSize(Vec_PtrEntry(vPartsAll, i)); - printf( "%d=(%d,%d) ", i, Vec_IntSize(vOne), nOutputs ); - Counter += nOutputs; - if ( i == Vec_PtrSize(vPartsAll) - 1 ) - break; - } -// assert( Counter == Abc_NtkCoNum(pNtk) ); - printf( "\nTotal = %d. Outputs = %d.\n", Counter, Abc_NtkCoNum(pNtk) ); -} - -/**Function************************************************************* - - Synopsis [Perform the smart partitioning.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPartitionCompact( Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsAll, int nSuppSizeLimit ) -{ - Vec_Int_t * vOne, * vPart, * vPartSupp, * vTemp; - int i, iPart; - - if ( nSuppSizeLimit == 0 ) - nSuppSizeLimit = 200; - - // pack smaller partitions into larger blocks - iPart = 0; - vPart = vPartSupp = NULL; - Vec_PtrForEachEntry( vPartSuppsAll, vOne, i ) - { - if ( Vec_IntSize(vOne) < nSuppSizeLimit ) - { - if ( vPartSupp == NULL ) - { - assert( vPart == NULL ); - vPartSupp = Vec_IntDup(vOne); - vPart = Vec_PtrEntry(vPartsAll, i); - } - else - { - vPartSupp = Vec_IntTwoMerge( vTemp = vPartSupp, vOne ); - Vec_IntFree( vTemp ); - vPart = Vec_IntTwoMerge( vTemp = vPart, Vec_PtrEntry(vPartsAll, i) ); - Vec_IntFree( vTemp ); - Vec_IntFree( Vec_PtrEntry(vPartsAll, i) ); - } - if ( Vec_IntSize(vPartSupp) < nSuppSizeLimit ) - continue; - } - else - vPart = Vec_PtrEntry(vPartsAll, i); - // add the partition - Vec_PtrWriteEntry( vPartsAll, iPart, vPart ); - vPart = NULL; - if ( vPartSupp ) - { - Vec_IntFree( Vec_PtrEntry(vPartSuppsAll, iPart) ); - Vec_PtrWriteEntry( vPartSuppsAll, iPart, vPartSupp ); - vPartSupp = NULL; - } - iPart++; - } - // add the last one - if ( vPart ) - { - Vec_PtrWriteEntry( vPartsAll, iPart, vPart ); - vPart = NULL; - - assert( vPartSupp != NULL ); - Vec_IntFree( Vec_PtrEntry(vPartSuppsAll, iPart) ); - Vec_PtrWriteEntry( vPartSuppsAll, iPart, vPartSupp ); - vPartSupp = NULL; - iPart++; - } - Vec_PtrShrink( vPartsAll, iPart ); - Vec_PtrShrink( vPartsAll, iPart ); -} - -/**Function************************************************************* - - Synopsis [Perform the smart partitioning.] - - Description [Returns the ptr-vector of int-vectors.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NtkPartitionSmart( Abc_Ntk_t * pNtk, int nSuppSizeLimit, int fVerbose ) -{ - ProgressBar * pProgress; - Vec_Ptr_t * vPartSuppsChar; - Vec_Ptr_t * vSupps, * vPartsAll, * vPartsAll2, * vPartSuppsAll; - Vec_Int_t * vOne, * vPart, * vPartSupp, * vTemp; - int i, iPart, iOut, clk, clk2, timeFind = 0; - - // compute the supports for all outputs -clk = clock(); -// vSupps = Abc_NtkComputeSupportsNaive( pNtk ); - vSupps = Abc_NtkComputeSupportsSmart( pNtk ); -if ( fVerbose ) -{ -PRT( "Supps", clock() - clk ); -} - // start char-based support representation - vPartSuppsChar = Vec_PtrAlloc( 1000 ); - - // create partitions -clk = clock(); - vPartsAll = Vec_PtrAlloc( 256 ); - vPartSuppsAll = Vec_PtrAlloc( 256 ); - pProgress = Extra_ProgressBarStart( stdout, Vec_PtrSize(vSupps) ); - Vec_PtrForEachEntry( vSupps, vOne, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); -// if ( i % 1000 == 0 ) -// printf( "CIs = %6d. COs = %6d. Processed = %6d (out of %6d). Parts = %6d.\r", -// Abc_NtkCiNum(pNtk), Abc_NtkCoNum(pNtk), i, Vec_PtrSize(vSupps), Vec_PtrSize(vPartsAll) ); - // get the output number - iOut = Vec_IntPop(vOne); - // find closely matching part -clk2 = clock(); - iPart = Abc_NtkPartitionSmartFindPart( vPartSuppsAll, vPartsAll, vPartSuppsChar, nSuppSizeLimit, vOne ); -timeFind += clock() - clk2; - if ( iPart == -1 ) - { - // create new partition - vPart = Vec_IntAlloc( 32 ); - Vec_IntPush( vPart, iOut ); - // create new partition support - vPartSupp = Vec_IntDup( vOne ); - // add this partition and its support - Vec_PtrPush( vPartsAll, vPart ); - Vec_PtrPush( vPartSuppsAll, vPartSupp ); - - Vec_PtrPush( vPartSuppsChar, Abc_NtkSuppCharStart(vOne, Abc_NtkCiNum(pNtk)) ); - } - else - { - // add output to this partition - vPart = Vec_PtrEntry( vPartsAll, iPart ); - Vec_IntPush( vPart, iOut ); - // merge supports - vPartSupp = Vec_PtrEntry( vPartSuppsAll, iPart ); - vPartSupp = Vec_IntTwoMerge( vTemp = vPartSupp, vOne ); - Vec_IntFree( vTemp ); - // reinsert new support - Vec_PtrWriteEntry( vPartSuppsAll, iPart, vPartSupp ); - - Abc_NtkSuppCharAdd( Vec_PtrEntry(vPartSuppsChar, iPart), vOne, Abc_NtkCiNum(pNtk) ); - } - } - Extra_ProgressBarStop( pProgress ); - - // stop char-based support representation - Vec_PtrForEachEntry( vPartSuppsChar, vTemp, i ) - free( vTemp ); - Vec_PtrFree( vPartSuppsChar ); - -//printf( "\n" ); -if ( fVerbose ) -{ -PRT( "Parts", clock() - clk ); -//PRT( "Find ", timeFind ); -} - -clk = clock(); - // remember number of supports - Vec_PtrForEachEntry( vPartSuppsAll, vOne, i ) - Vec_IntPush( vOne, i ); - // sort the supports in the decreasing order - Vec_VecSort( (Vec_Vec_t *)vPartSuppsAll, 1 ); - // reproduce partitions - vPartsAll2 = Vec_PtrAlloc( 256 ); - Vec_PtrForEachEntry( vPartSuppsAll, vOne, i ) - Vec_PtrPush( vPartsAll2, Vec_PtrEntry(vPartsAll, Vec_IntPop(vOne)) ); - Vec_PtrFree( vPartsAll ); - vPartsAll = vPartsAll2; - - // compact small partitions -// Abc_NtkPartitionPrint( pNtk, vPartsAll, vPartSuppsAll ); - Abc_NtkPartitionCompact( vPartsAll, vPartSuppsAll, nSuppSizeLimit ); - -if ( fVerbose ) -{ -PRT( "Comps", clock() - clk ); -} - if ( fVerbose ) - printf( "Created %d partitions.\n", Vec_PtrSize(vPartsAll) ); -// Abc_NtkPartitionPrint( pNtk, vPartsAll, vPartSuppsAll ); - - // cleanup - Vec_VecFree( (Vec_Vec_t *)vSupps ); - Vec_VecFree( (Vec_Vec_t *)vPartSuppsAll ); -/* - // converts from intergers to nodes - Vec_PtrForEachEntry( vPartsAll, vPart, iPart ) - { - vPartPtr = Vec_PtrAlloc( Vec_IntSize(vPart) ); - Vec_IntForEachEntry( vPart, iOut, i ) - Vec_PtrPush( vPartPtr, Abc_NtkCo(pNtk, iOut) ); - Vec_IntFree( vPart ); - Vec_PtrWriteEntry( vPartsAll, iPart, vPartPtr ); - } -*/ - return vPartsAll; -} - -/**Function************************************************************* - - Synopsis [Perform the naive partitioning.] - - Description [Returns the ptr-vector of int-vectors.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NtkPartitionNaive( Abc_Ntk_t * pNtk, int nPartSize ) -{ - Vec_Ptr_t * vParts; - Abc_Obj_t * pObj; - int nParts, i; - nParts = (Abc_NtkCoNum(pNtk) / nPartSize) + ((Abc_NtkCoNum(pNtk) % nPartSize) > 0); - vParts = (Vec_Ptr_t *)Vec_VecStart( nParts ); - Abc_NtkForEachCo( pNtk, pObj, i ) - Vec_IntPush( Vec_PtrEntry(vParts, i / nPartSize), i ); - return vParts; -} - -/**Function************************************************************* - - Synopsis [Converts from intergers to pointers for the given network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkConvertCos( Abc_Ntk_t * pNtk, Vec_Int_t * vOuts, Vec_Ptr_t * vOutsPtr ) -{ - int Out, i; - Vec_PtrClear( vOutsPtr ); - Vec_IntForEachEntry( vOuts, Out, i ) - Vec_PtrPush( vOutsPtr, Abc_NtkCo(pNtk, Out) ); -} - -/**Function************************************************************* - - Synopsis [Returns representative of the given node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NtkPartStitchFindRepr_rec( Vec_Ptr_t * vEquiv, Abc_Obj_t * pObj ) -{ - Abc_Obj_t * pRepr; - pRepr = Vec_PtrEntry( vEquiv, pObj->Id ); - if ( pRepr == NULL || pRepr == pObj ) - return pObj; - return Abc_NtkPartStitchFindRepr_rec( vEquiv, pRepr ); -} - -/**Function************************************************************* - - Synopsis [Returns the representative of the fanin.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Abc_Obj_t * Abc_NtkPartStitchCopy0( Vec_Ptr_t * vEquiv, Abc_Obj_t * pObj ) -{ - Abc_Obj_t * pFan = Abc_ObjFanin0( pObj ); - Abc_Obj_t * pRepr = Abc_NtkPartStitchFindRepr_rec( vEquiv, pFan ); - return Abc_ObjNotCond( pRepr->pCopy, pRepr->fPhase ^ pFan->fPhase ^ Abc_ObjFaninC1(pObj) ); -} -static inline Abc_Obj_t * Abc_NtkPartStitchCopy1( Vec_Ptr_t * vEquiv, Abc_Obj_t * pObj ) -{ - Abc_Obj_t * pFan = Abc_ObjFanin1( pObj ); - Abc_Obj_t * pRepr = Abc_NtkPartStitchFindRepr_rec( vEquiv, pFan ); - return Abc_ObjNotCond( pRepr->pCopy, pRepr->fPhase ^ pFan->fPhase ^ Abc_ObjFaninC1(pObj) ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Hop_Obj_t * Hop_ObjChild0Next( Abc_Obj_t * pObj ) { return Hop_NotCond( (Hop_Obj_t *)Abc_ObjFanin0(pObj)->pNext, Abc_ObjFaninC0(pObj) ); } -static inline Hop_Obj_t * Hop_ObjChild1Next( Abc_Obj_t * pObj ) { return Hop_NotCond( (Hop_Obj_t *)Abc_ObjFanin1(pObj)->pNext, Abc_ObjFaninC1(pObj) ); } - - -/**Function************************************************************* - - Synopsis [Stitches together several networks with choice nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Hop_Man_t * Abc_NtkPartStartHop( Abc_Ntk_t * pNtk ) -{ - Hop_Man_t * pMan; - Abc_Obj_t * pObj; - int i; - // start the HOP package - pMan = Hop_ManStart(); - pMan->vObjs = Vec_PtrAlloc( Abc_NtkObjNumMax(pNtk) + 1 ); - Vec_PtrPush( pMan->vObjs, Hop_ManConst1(pMan) ); - // map constant node and PIs - Abc_AigConst1(pNtk)->pNext = (Abc_Obj_t *)Hop_ManConst1(pMan); - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pNext = (Abc_Obj_t *)Hop_ObjCreatePi(pMan); - // map the internal nodes - Abc_AigForEachAnd( pNtk, pObj, i ) - { - pObj->pNext = (Abc_Obj_t *)Hop_And( pMan, Hop_ObjChild0Next(pObj), Hop_ObjChild1Next(pObj) ); - assert( !Abc_ObjIsComplement(pObj->pNext) ); - } - // set the choice nodes - Abc_AigForEachAnd( pNtk, pObj, i ) - { - if ( pObj->pCopy ) - ((Hop_Obj_t *)pObj->pNext)->pData = pObj->pCopy->pNext; - } - // transfer the POs - Abc_NtkForEachCo( pNtk, pObj, i ) - Hop_ObjCreatePo( pMan, Hop_ObjChild0Next(pObj) ); - // check the new manager - if ( !Hop_ManCheck(pMan) ) - printf( "Abc_NtkPartStartHop: HOP manager check has failed.\n" ); - return pMan; -} - -/**Function************************************************************* - - Synopsis [Stitches together several networks with choice nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkPartStitchChoices( Abc_Ntk_t * pNtk, Vec_Ptr_t * vParts ) -{ - extern Abc_Ntk_t * Abc_NtkHopRemoveLoops( Abc_Ntk_t * pNtk, Hop_Man_t * pMan ); - - Hop_Man_t * pMan; - Vec_Ptr_t * vNodes; - Abc_Ntk_t * pNtkNew, * pNtkTemp; - Abc_Obj_t * pObj, * pFanin; - int i, k, iNodeId; - - // start a new network similar to the original one - assert( Abc_NtkIsStrash(pNtk) ); - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_STRASH, ABC_FUNC_AIG ); - - // annotate parts to point to the new network - Vec_PtrForEachEntry( vParts, pNtkTemp, i ) - { - assert( Abc_NtkIsStrash(pNtkTemp) ); - Abc_NtkCleanCopy( pNtkTemp ); - - // map the CI nodes - Abc_AigConst1(pNtkTemp)->pCopy = Abc_AigConst1(pNtkNew); - Abc_NtkForEachCi( pNtkTemp, pObj, k ) - { - iNodeId = Nm_ManFindIdByNameTwoTypes( pNtkNew->pManName, Abc_ObjName(pObj), ABC_OBJ_PI, ABC_OBJ_BO ); - if ( iNodeId == -1 ) - { - printf( "Cannot find CI node %s in the original network.\n", Abc_ObjName(pObj) ); - return NULL; - } - pObj->pCopy = Abc_NtkObj( pNtkNew, iNodeId ); - } - - // add the internal nodes while saving representatives - vNodes = Abc_AigDfs( pNtkTemp, 1, 0 ); - Vec_PtrForEachEntry( vNodes, pObj, k ) - { - pObj->pCopy = Abc_AigAnd( pNtkNew->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) ); - assert( !Abc_ObjIsComplement(pObj->pCopy) ); - if ( Abc_AigNodeIsChoice(pObj) ) - for ( pFanin = pObj->pData; pFanin; pFanin = pFanin->pData ) - pFanin->pCopy->pCopy = pObj->pCopy; - } - Vec_PtrFree( vNodes ); - - // map the CO nodes - Abc_NtkForEachCo( pNtkTemp, pObj, k ) - { - iNodeId = Nm_ManFindIdByNameTwoTypes( pNtkNew->pManName, Abc_ObjName(pObj), ABC_OBJ_PO, ABC_OBJ_BI ); - if ( iNodeId == -1 ) - { - printf( "Cannot find CO node %s in the original network.\n", Abc_ObjName(pObj) ); - return NULL; - } - pObj->pCopy = Abc_NtkObj( pNtkNew, iNodeId ); - Abc_ObjAddFanin( pObj->pCopy, Abc_ObjChild0Copy(pObj) ); - } - } - - // connect the remaining POs -/* - Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkNew); - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pCopy = Abc_NtkCi( pNtkNew, i ); - Abc_NtkForEachCo( pNtk, pObj, i ) - pObj->pCopy = Abc_NtkCo( pNtkNew, i ); -*/ - Abc_NtkForEachCo( pNtk, pObj, i ) - { - if ( Abc_ObjFaninNum(pObj->pCopy) == 0 ) - Abc_ObjAddFanin( pObj->pCopy, Abc_ObjChild0Copy(pObj) ); - } - - // transform into the HOP manager - pMan = Abc_NtkPartStartHop( pNtkNew ); - pNtkNew = Abc_NtkHopRemoveLoops( pNtkTemp = pNtkNew, pMan ); - Abc_NtkDelete( pNtkTemp ); - - // check correctness of the new network - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkPartStitchChoices: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Stitches together several networks with choice nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkFraigPartitioned( Vec_Ptr_t * vStore, void * pParams ) -{ - extern int Cmd_CommandExecute( void * pAbc, char * sCommand ); - extern void * Abc_FrameGetGlobalFrame(); - - Vec_Ptr_t * vParts, * vFraigs, * vOnePtr; - Vec_Int_t * vOne; - Abc_Ntk_t * pNtk, * pNtk2, * pNtkAig, * pNtkFraig; - int i, k; - - // perform partitioning - pNtk = Vec_PtrEntry( vStore, 0 ); - assert( Abc_NtkIsStrash(pNtk) ); -// vParts = Abc_NtkPartitionNaive( pNtk, 20 ); - vParts = Abc_NtkPartitionSmart( pNtk, 300, 0 ); - - Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "unset progressbar" ); - - // fraig each partition - vOnePtr = Vec_PtrAlloc( 1000 ); - vFraigs = Vec_PtrAlloc( Vec_PtrSize(vParts) ); - Vec_PtrForEachEntry( vParts, vOne, i ) - { - // start the partition - Abc_NtkConvertCos( pNtk, vOne, vOnePtr ); - pNtkAig = Abc_NtkCreateConeArray( pNtk, vOnePtr, 0 ); - // add nodes to the partition - Vec_PtrForEachEntryStart( vStore, pNtk2, k, 1 ) - { - Abc_NtkConvertCos( pNtk2, vOne, vOnePtr ); - Abc_NtkAppendToCone( pNtkAig, pNtk2, vOnePtr ); - } - printf( "Fraiging part %4d (out of %4d) PI = %5d. PO = %5d. And = %6d. Lev = %4d.\r", - i+1, Vec_PtrSize(vParts), Abc_NtkPiNum(pNtkAig), Abc_NtkPoNum(pNtkAig), - Abc_NtkNodeNum(pNtkAig), Abc_AigLevel(pNtkAig) ); - // fraig the partition - pNtkFraig = Abc_NtkFraig( pNtkAig, pParams, 1, 0 ); - Vec_PtrPush( vFraigs, pNtkFraig ); - Abc_NtkDelete( pNtkAig ); - } - printf( " \r" ); - Vec_VecFree( (Vec_Vec_t *)vParts ); - - Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "set progressbar" ); - - // derive the final network - pNtkFraig = Abc_NtkPartStitchChoices( pNtk, vFraigs ); - Vec_PtrForEachEntry( vFraigs, pNtkAig, i ) - Abc_NtkDelete( pNtkAig ); - Vec_PtrFree( vFraigs ); - Vec_PtrFree( vOnePtr ); - return pNtkFraig; -} - -/**Function************************************************************* - - Synopsis [Stitches together several networks with choice nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFraigPartitionedTime( Abc_Ntk_t * pNtk, void * pParams ) -{ - extern int Cmd_CommandExecute( void * pAbc, char * sCommand ); - extern void * Abc_FrameGetGlobalFrame(); - - Vec_Ptr_t * vParts, * vFraigs, * vOnePtr; - Vec_Int_t * vOne; - Abc_Ntk_t * pNtkAig, * pNtkFraig; - int i; - int clk = clock(); - - // perform partitioning - assert( Abc_NtkIsStrash(pNtk) ); -// vParts = Abc_NtkPartitionNaive( pNtk, 20 ); - vParts = Abc_NtkPartitionSmart( pNtk, 300, 0 ); - - Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "unset progressbar" ); - - // fraig each partition - vOnePtr = Vec_PtrAlloc( 1000 ); - vFraigs = Vec_PtrAlloc( Vec_PtrSize(vParts) ); - Vec_PtrForEachEntry( vParts, vOne, i ) - { - Abc_NtkConvertCos( pNtk, vOne, vOnePtr ); - pNtkAig = Abc_NtkCreateConeArray( pNtk, vOnePtr, 0 ); - pNtkFraig = Abc_NtkFraig( pNtkAig, pParams, 0, 0 ); - Vec_PtrPush( vFraigs, pNtkFraig ); - Abc_NtkDelete( pNtkAig ); - - printf( "Finished part %5d (out of %5d)\r", i+1, Vec_PtrSize(vParts) ); - } - Vec_VecFree( (Vec_Vec_t *)vParts ); - - Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "set progressbar" ); - - // derive the final network - Vec_PtrForEachEntry( vFraigs, pNtkAig, i ) - Abc_NtkDelete( pNtkAig ); - Vec_PtrFree( vFraigs ); - Vec_PtrFree( vOnePtr ); - PRT( "Partitioned fraiging time", clock() - clk ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcPlace.c b/src/base/abci/abcPlace.c deleted file mode 100644 index 87c99e99..00000000 --- a/src/base/abci/abcPlace.c +++ /dev/null @@ -1,255 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcPlace.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Interface with a placer.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcPlace.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -// placement includes -#include "place_base.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -AbstractCell *abstractCells = NULL; -ConcreteCell *cells = NULL; -ConcreteNet *nets = NULL; -int nAllocSize = 0; - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Creates a new cell.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Abc_PlaceCreateCell( Abc_Obj_t * pObj, int fAnd ) -{ - assert( cells[pObj->Id].m_id == 0 ); - - cells[pObj->Id].m_id = pObj->Id; - cells[pObj->Id].m_label = ""; - cells[pObj->Id].m_parent = &(abstractCells[fAnd]); - cells[pObj->Id].m_fixed = 0; - addConcreteCell(&(cells[pObj->Id])); -} - -/**Function************************************************************* - - Synopsis [Updates the net.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Abc_PlaceUpdateNet( Abc_Obj_t * pObj ) -{ - Abc_Obj_t * pFanout; - int k; - // free the old array of net terminals - if ( nets[pObj->Id].m_terms ) - free( nets[pObj->Id].m_terms ); - // fill in the net with the new information - nets[pObj->Id].m_id = pObj->Id; - nets[pObj->Id].m_weight = 1.0; - nets[pObj->Id].m_numTerms = Abc_ObjFanoutNum(pObj); //fanout - nets[pObj->Id].m_terms = ALLOC(ConcreteCell*, Abc_ObjFanoutNum(pObj)); - Abc_ObjForEachFanout( pObj, pFanout, k ) - nets[pObj->Id].m_terms[k] = &(cells[pFanout->Id]); - addConcreteNet(&(nets[pObj->Id])); -} - -/**Function************************************************************* - - Synopsis [Returns the placement cost of the cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -float Abc_PlaceEvaluateCut( Abc_Obj_t * pRoot, Vec_Ptr_t * vFanins ) -{ - Abc_Obj_t * pObj; -// double x, y; - int i; - Vec_PtrForEachEntry( vFanins, pObj, i ) - { -// pObj->Id - } - return 0.0; -} - -/**Function************************************************************* - - Synopsis [Updates placement after one step of rewriting.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_PlaceUpdate( Vec_Ptr_t * vAddedCells, Vec_Ptr_t * vUpdatedNets ) -{ - Abc_Obj_t * pObj, * pFanin; - int i, k; - Vec_Ptr_t * vCells, * vNets; - - // start the arrays of new cells and nets - vCells = Vec_PtrAlloc( 16 ); - vNets = Vec_PtrAlloc( 32 ); - - // go through the new nodes - Vec_PtrForEachEntry( vAddedCells, pObj, i ) - { - assert( !Abc_ObjIsComplement(pObj) ); - Abc_PlaceCreateCell( pObj, 1 ); - Abc_PlaceUpdateNet( pObj ); - - // add the new cell and its fanin nets to temporary storage - Vec_PtrPush( vCells, &(cells[pObj->Id]) ); - Abc_ObjForEachFanin( pObj, pFanin, k ) - Vec_PtrPushUnique( vNets, &(nets[pFanin->Id]) ); - } - - // go through the modified nets - Vec_PtrForEachEntry( vUpdatedNets, pObj, i ) - { - assert( !Abc_ObjIsComplement(pObj) ); - if ( Abc_ObjType(pObj) == ABC_OBJ_NONE ) // dead node - continue; - Abc_PlaceUpdateNet( pObj ); - } - - // update the placement -// fastPlace( Vec_PtrSize(vCells), (ConcreteCell **)Vec_PtrArray(vCells), -// Vec_PtrSize(vNets), (ConcreteNet **)Vec_PtrArray(vNets) ); - - // clean up - Vec_PtrFree( vCells ); - Vec_PtrFree( vNets ); -} - -/**Function************************************************************* - - Synopsis [This procedure is called before the writing start.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_PlaceBegin( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pObj; - int i; - - // allocate and clean internal storage - nAllocSize = 5 * Abc_NtkObjNumMax(pNtk); - cells = REALLOC(ConcreteCell, cells, nAllocSize); - nets = REALLOC(ConcreteNet, nets, nAllocSize); - memset( cells, 0, sizeof(ConcreteCell) * nAllocSize ); - memset( nets, 0, sizeof(ConcreteNet) * nAllocSize ); - - // create AbstractCells - // 1: pad - // 2: and - if (!abstractCells) - abstractCells = ALLOC(AbstractCell,2); - - abstractCells[0].m_height = 1.0; - abstractCells[0].m_width = 1.0; - abstractCells[0].m_label = "pio"; - abstractCells[0].m_pad = 1; - - abstractCells[1].m_height = 1.0; - abstractCells[1].m_width = 1.0; - abstractCells[1].m_label = "and"; - abstractCells[1].m_pad = 0; - - // input pads - Abc_NtkForEachCi( pNtk, pObj, i ) - Abc_PlaceCreateCell( pObj, 0 ); - - // ouput pads - Abc_NtkForEachCo( pNtk, pObj, i ) - Abc_PlaceCreateCell( pObj, 0 ); - - // AND nodes - Abc_AigForEachAnd( pNtk, pObj, i ) - Abc_PlaceCreateCell( pObj, 1 ); - - // all nets - Abc_NtkForEachObj( pNtk, pObj, i ) - { - if ( !Abc_ObjIsCi(pObj) && !Abc_ObjIsNode(pObj) ) - continue; - Abc_PlaceUpdateNet( pObj ); - } - - globalPreplace((float)0.8); - globalPlace(); -} - -/**Function************************************************************* - - Synopsis [This procedure is called after the writing completes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_PlaceEnd( Abc_Ntk_t * pNtk ) -{ - int i; - - - // clean up - for ( i = 0; i < nAllocSize; i++ ) - FREE( nets[i].m_terms ); - FREE( abstractCells ); - FREE( cells ); - FREE( nets ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcPrint.c b/src/base/abci/abcPrint.c deleted file mode 100644 index 7c3fb33c..00000000 --- a/src/base/abci/abcPrint.c +++ /dev/null @@ -1,949 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcPrint.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Printing statistics.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcPrint.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "dec.h" -#include "main.h" -#include "mio.h" -//#include "seq.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//extern int s_TotalNodes = 0; -//extern int s_TotalChanges = 0; - -int s_MappingTime = 0; -int s_MappingMem = 0; -int s_ResubTime = 0; -int s_ResynTime = 0; - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Print the vital stats of the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintStats( FILE * pFile, Abc_Ntk_t * pNtk, int fFactored ) -{ - int Num; - -// if ( Abc_NtkIsStrash(pNtk) ) -// Abc_AigCountNext( pNtk->pManFunc ); - - fprintf( pFile, "%-13s:", pNtk->pName ); - if ( Abc_NtkAssertNum(pNtk) ) - fprintf( pFile, " i/o/a = %4d/%4d/%4d", Abc_NtkPiNum(pNtk), Abc_NtkPoNum(pNtk), Abc_NtkAssertNum(pNtk) ); - else - fprintf( pFile, " i/o = %4d/%4d", Abc_NtkPiNum(pNtk), Abc_NtkPoNum(pNtk) ); - fprintf( pFile, " lat = %4d", Abc_NtkLatchNum(pNtk) ); - if ( Abc_NtkIsNetlist(pNtk) ) - { - fprintf( pFile, " net = %5d", Abc_NtkNetNum(pNtk) ); - fprintf( pFile, " nd = %5d", Abc_NtkNodeNum(pNtk) ); - fprintf( pFile, " wbox = %3d", Abc_NtkWhiteboxNum(pNtk) ); - fprintf( pFile, " bbox = %3d", Abc_NtkBlackboxNum(pNtk) ); - } - else if ( Abc_NtkIsStrash(pNtk) ) - { - fprintf( pFile, " and = %5d", Abc_NtkNodeNum(pNtk) ); - if ( Num = Abc_NtkGetChoiceNum(pNtk) ) - fprintf( pFile, " (choice = %d)", Num ); - if ( Num = Abc_NtkGetExorNum(pNtk) ) - fprintf( pFile, " (exor = %d)", Num ); -// if ( Num2 = Abc_NtkGetMuxNum(pNtk) ) -// fprintf( pFile, " (mux = %d)", Num2-Num ); -// if ( Num2 ) -// fprintf( pFile, " (other = %d)", Abc_NtkNodeNum(pNtk)-3*Num2 ); - } - else - { - fprintf( pFile, " nd = %5d", Abc_NtkNodeNum(pNtk) ); - fprintf( pFile, " net = %5d", Abc_NtkGetTotalFanins(pNtk) ); - } - - if ( Abc_NtkIsStrash(pNtk) || Abc_NtkIsNetlist(pNtk) ) - { - } - else if ( Abc_NtkHasSop(pNtk) ) - { - - fprintf( pFile, " cube = %5d", Abc_NtkGetCubeNum(pNtk) ); -// fprintf( pFile, " lit(sop) = %5d", Abc_NtkGetLitNum(pNtk) ); - if ( fFactored ) - fprintf( pFile, " lit(fac) = %5d", Abc_NtkGetLitFactNum(pNtk) ); - } - else if ( Abc_NtkHasAig(pNtk) ) - fprintf( pFile, " aig = %5d", Abc_NtkGetAigNodeNum(pNtk) ); - else if ( Abc_NtkHasBdd(pNtk) ) - fprintf( pFile, " bdd = %5d", Abc_NtkGetBddNodeNum(pNtk) ); - else if ( Abc_NtkHasMapping(pNtk) ) - { - fprintf( pFile, " area = %5.2f", Abc_NtkGetMappedArea(pNtk) ); - fprintf( pFile, " delay = %5.2f", Abc_NtkDelayTrace(pNtk) ); - } - else if ( !Abc_NtkHasBlackbox(pNtk) ) - { - assert( 0 ); - } - - if ( Abc_NtkIsStrash(pNtk) ) - fprintf( pFile, " lev = %3d", Abc_AigLevel(pNtk) ); - else - fprintf( pFile, " lev = %3d", Abc_NtkLevel(pNtk) ); - - fprintf( pFile, "\n" ); - -// Abc_NtkCrossCut( pNtk ); - - // print the statistic into a file -/* - { - FILE * pTable; - pTable = fopen( "xs/reg_stats.txt", "a+" ); - fprintf( pTable, "%s ", pNtk->pName ); - fprintf( pTable, "%d ", Abc_NtkLatchNum(pNtk) ); - fprintf( pTable, "%d ", Abc_NtkNodeNum(pNtk) ); - fprintf( pTable, "\n" ); - fclose( pTable ); - } -*/ -/* - // print the statistic into a file - { - FILE * pTable; - pTable = fopen( "stats.txt", "a+" ); - fprintf( pTable, "%s ", pNtk->pSpec ); - fprintf( pTable, "%.0f ", Abc_NtkGetMappedArea(pNtk) ); - fprintf( pTable, "%.2f ", Abc_NtkDelayTrace(pNtk) ); - fprintf( pTable, "\n" ); - fclose( pTable ); - } -*/ - -/* - // print the statistic into a file - { - FILE * pTable; - pTable = fopen( "x/stats_new.txt", "a+" ); - fprintf( pTable, "%s ", pNtk->pName ); -// fprintf( pTable, "%d ", Abc_NtkPiNum(pNtk) ); -// fprintf( pTable, "%d ", Abc_NtkPoNum(pNtk) ); -// fprintf( pTable, "%d ", Abc_NtkLevel(pNtk) ); -// fprintf( pTable, "%d ", Abc_NtkNodeNum(pNtk) ); -// fprintf( pTable, "%d ", Abc_NtkGetTotalFanins(pNtk) ); -// fprintf( pTable, "%d ", Abc_NtkLatchNum(pNtk) ); -// fprintf( pTable, "%.2f ", (float)(s_MappingMem)/(float)(1<<20) ); - fprintf( pTable, "%.2f", (float)(s_MappingTime)/(float)(CLOCKS_PER_SEC) ); -// fprintf( pTable, "%.2f", (float)(s_ResynTime)/(float)(CLOCKS_PER_SEC) ); - fprintf( pTable, "\n" ); - fclose( pTable ); - - s_ResynTime = 0; - } -*/ - -/* - // print the statistic into a file - { - static int Counter = 0; - extern int timeRetime; - FILE * pTable; - Counter++; - pTable = fopen( "a/ret__stats.txt", "a+" ); - fprintf( pTable, "%s ", pNtk->pName ); - fprintf( pTable, "%d ", Abc_NtkNodeNum(pNtk) ); - fprintf( pTable, "%d ", Abc_NtkLatchNum(pNtk) ); - fprintf( pTable, "%d ", Abc_NtkLevel(pNtk) ); - fprintf( pTable, "%.2f ", (float)(timeRetime)/(float)(CLOCKS_PER_SEC) ); - if ( Counter % 4 == 0 ) - fprintf( pTable, "\n" ); - fclose( pTable ); - } -*/ - -/* - // print the statistic into a file - { - static int Counter = 0; - extern int timeRetime; - FILE * pTable; - Counter++; - pTable = fopen( "d/stats.txt", "a+" ); - fprintf( pTable, "%s ", pNtk->pName ); -// fprintf( pTable, "%d ", Abc_NtkPiNum(pNtk) ); -// fprintf( pTable, "%d ", Abc_NtkPoNum(pNtk) ); -// fprintf( pTable, "%d ", Abc_NtkLatchNum(pNtk) ); - fprintf( pTable, "%d ", Abc_NtkNodeNum(pNtk) ); - fprintf( pTable, "%.2f ", (float)(timeRetime)/(float)(CLOCKS_PER_SEC) ); - fprintf( pTable, "\n" ); - fclose( pTable ); - } -*/ - -/* - s_TotalNodes += Abc_NtkNodeNum(pNtk); - printf( "Total nodes = %6d %6.2f Mb Changes = %6d.\n", - s_TotalNodes, s_TotalNodes * 20.0 / (1<<20), s_TotalChanges ); -*/ - -// if ( Abc_NtkHasSop(pNtk) ) -// printf( "The total number of cube pairs = %d.\n", Abc_NtkGetCubePairNum(pNtk) ); -} - -/**Function************************************************************* - - Synopsis [Prints PIs/POs and LIs/LOs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintIo( FILE * pFile, Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pObj; - int i; - - fprintf( pFile, "Primary inputs (%d): ", Abc_NtkPiNum(pNtk) ); - Abc_NtkForEachPi( pNtk, pObj, i ) - fprintf( pFile, " %s", Abc_ObjName(pObj) ); -// fprintf( pFile, " %s(%d)", Abc_ObjName(pObj), Abc_ObjFanoutNum(pObj) ); - fprintf( pFile, "\n" ); - - fprintf( pFile, "Primary outputs (%d):", Abc_NtkPoNum(pNtk) ); - Abc_NtkForEachPo( pNtk, pObj, i ) - fprintf( pFile, " %s", Abc_ObjName(pObj) ); - fprintf( pFile, "\n" ); - - fprintf( pFile, "Latches (%d): ", Abc_NtkLatchNum(pNtk) ); - Abc_NtkForEachLatch( pNtk, pObj, i ) - fprintf( pFile, " %s(%s=%s)", Abc_ObjName(pObj), - Abc_ObjName(Abc_ObjFanout0(pObj)), Abc_ObjName(Abc_ObjFanin0(pObj)) ); - fprintf( pFile, "\n" ); -} - -/**Function************************************************************* - - Synopsis [Prints statistics about latches.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintLatch( FILE * pFile, Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pLatch, * pFanin; - int i, Counter0, Counter1, Counter2; - int InitNums[4], Init; - - assert( !Abc_NtkIsNetlist(pNtk) ); - if ( Abc_NtkLatchNum(pNtk) == 0 ) - { - fprintf( pFile, "The network is combinational.\n" ); - return; - } - - for ( i = 0; i < 4; i++ ) - InitNums[i] = 0; - Counter0 = Counter1 = Counter2 = 0; - Abc_NtkForEachLatch( pNtk, pLatch, i ) - { - Init = Abc_LatchInit( pLatch ); - assert( Init < 4 ); - InitNums[Init]++; - - pFanin = Abc_ObjFanin0(Abc_ObjFanin0(pLatch)); - if ( Abc_NtkIsLogic(pNtk) ) - { - if ( !Abc_NodeIsConst(pFanin) ) - continue; - } - else if ( Abc_NtkIsStrash(pNtk) ) - { - if ( !Abc_AigNodeIsConst(pFanin) ) - continue; - } - else - assert( 0 ); - - // the latch input is a constant node - Counter0++; - if ( Abc_LatchIsInitDc(pLatch) ) - { - Counter1++; - continue; - } - // count the number of cases when the constant is equal to the initial value - if ( Abc_NtkIsStrash(pNtk) ) - { - if ( Abc_LatchIsInit1(pLatch) == !Abc_ObjFaninC0(pLatch) ) - Counter2++; - } - else - { - if ( Abc_LatchIsInit1(pLatch) == Abc_NodeIsConst1(Abc_ObjFanin0(Abc_ObjFanin0(pLatch))) ) - Counter2++; - } - } - fprintf( pFile, "%-15s: ", pNtk->pName ); - fprintf( pFile, "Latch = %6d. No = %4d. Zero = %4d. One = %4d. DC = %4d.\n", - Abc_NtkLatchNum(pNtk), InitNums[0], InitNums[1], InitNums[2], InitNums[3] ); - fprintf( pFile, "Const fanin = %3d. DC init = %3d. Matching init = %3d. ", Counter0, Counter1, Counter2 ); - fprintf( pFile, "Self-feed latches = %2d.\n", -1 ); //Abc_NtkCountSelfFeedLatches(pNtk) ); -} - -/**Function************************************************************* - - Synopsis [Prints the distribution of fanins/fanouts in the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintFanio( FILE * pFile, Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode; - int i, k, nFanins, nFanouts; - Vec_Int_t * vFanins, * vFanouts; - int nOldSize, nNewSize; - - vFanins = Vec_IntAlloc( 0 ); - vFanouts = Vec_IntAlloc( 0 ); - Vec_IntFill( vFanins, 100, 0 ); - Vec_IntFill( vFanouts, 100, 0 ); - Abc_NtkForEachNode( pNtk, pNode, i ) - { - nFanins = Abc_ObjFaninNum(pNode); - if ( Abc_NtkIsNetlist(pNtk) ) - nFanouts = Abc_ObjFanoutNum( Abc_ObjFanout0(pNode) ); - else - nFanouts = Abc_ObjFanoutNum(pNode); -// nFanouts = Abc_NodeMffcSize(pNode); - if ( nFanins > vFanins->nSize || nFanouts > vFanouts->nSize ) - { - nOldSize = vFanins->nSize; - nNewSize = ABC_MAX(nFanins, nFanouts) + 10; - Vec_IntGrow( vFanins, nNewSize ); - Vec_IntGrow( vFanouts, nNewSize ); - for ( k = nOldSize; k < nNewSize; k++ ) - { - Vec_IntPush( vFanins, 0 ); - Vec_IntPush( vFanouts, 0 ); - } - } - vFanins->pArray[nFanins]++; - vFanouts->pArray[nFanouts]++; - } - fprintf( pFile, "The distribution of fanins and fanouts in the network:\n" ); - fprintf( pFile, " Number Nodes with fanin Nodes with fanout\n" ); - for ( k = 0; k < vFanins->nSize; k++ ) - { - if ( vFanins->pArray[k] == 0 && vFanouts->pArray[k] == 0 ) - continue; - fprintf( pFile, "%5d : ", k ); - if ( vFanins->pArray[k] == 0 ) - fprintf( pFile, " " ); - else - fprintf( pFile, "%12d ", vFanins->pArray[k] ); - fprintf( pFile, " " ); - if ( vFanouts->pArray[k] == 0 ) - fprintf( pFile, " " ); - else - fprintf( pFile, "%12d ", vFanouts->pArray[k] ); - fprintf( pFile, "\n" ); - } - Vec_IntFree( vFanins ); - Vec_IntFree( vFanouts ); -} - -/**Function************************************************************* - - Synopsis [Prints the fanins/fanouts of a node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodePrintFanio( FILE * pFile, Abc_Obj_t * pNode ) -{ - Abc_Obj_t * pNode2; - int i; - if ( Abc_ObjIsPo(pNode) ) - pNode = Abc_ObjFanin0(pNode); - - fprintf( pFile, "Node %s", Abc_ObjName(pNode) ); - fprintf( pFile, "\n" ); - - fprintf( pFile, "Fanins (%d): ", Abc_ObjFaninNum(pNode) ); - Abc_ObjForEachFanin( pNode, pNode2, i ) - fprintf( pFile, " %s", Abc_ObjName(pNode2) ); - fprintf( pFile, "\n" ); - - fprintf( pFile, "Fanouts (%d): ", Abc_ObjFaninNum(pNode) ); - Abc_ObjForEachFanout( pNode, pNode2, i ) - fprintf( pFile, " %s", Abc_ObjName(pNode2) ); - fprintf( pFile, "\n" ); -} - -/**Function************************************************************* - - Synopsis [Prints the MFFCs of the nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintMffc( FILE * pFile, Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode; - int i; - extern void Abc_NodeMffsConeSuppPrint( Abc_Obj_t * pNode ); - Abc_NtkForEachNode( pNtk, pNode, i ) - Abc_NodeMffsConeSuppPrint( pNode ); -} - -/**Function************************************************************* - - Synopsis [Prints the factored form of one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintFactor( FILE * pFile, Abc_Ntk_t * pNtk, int fUseRealNames ) -{ - Abc_Obj_t * pNode; - int i; - assert( Abc_NtkIsSopLogic(pNtk) ); - Abc_NtkForEachNode( pNtk, pNode, i ) - Abc_NodePrintFactor( pFile, pNode, fUseRealNames ); -} - -/**Function************************************************************* - - Synopsis [Prints the factored form of one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodePrintFactor( FILE * pFile, Abc_Obj_t * pNode, int fUseRealNames ) -{ - Dec_Graph_t * pGraph; - Vec_Ptr_t * vNamesIn; - if ( Abc_ObjIsCo(pNode) ) - pNode = Abc_ObjFanin0(pNode); - if ( Abc_ObjIsPi(pNode) ) - { - fprintf( pFile, "Skipping the PI node.\n" ); - return; - } - if ( Abc_ObjIsLatch(pNode) ) - { - fprintf( pFile, "Skipping the latch.\n" ); - return; - } - assert( Abc_ObjIsNode(pNode) ); - pGraph = Dec_Factor( pNode->pData ); - if ( fUseRealNames ) - { - vNamesIn = Abc_NodeGetFaninNames(pNode); - Dec_GraphPrint( stdout, pGraph, (char **)vNamesIn->pArray, Abc_ObjName(pNode) ); - Abc_NodeFreeNames( vNamesIn ); - } - else - Dec_GraphPrint( stdout, pGraph, (char **)NULL, Abc_ObjName(pNode) ); - Dec_GraphFree( pGraph ); -} - - -/**Function************************************************************* - - Synopsis [Prints the level stats of the PO node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintLevel( FILE * pFile, Abc_Ntk_t * pNtk, int fProfile, int fListNodes ) -{ - Abc_Obj_t * pNode; - int i, k, Length; - - if ( fListNodes ) - { - int nLevels; - nLevels = Abc_NtkLevel(pNtk); - printf( "Nodes by level:\n" ); - for ( i = 0; i <= nLevels; i++ ) - { - printf( "%2d : ", i ); - Abc_NtkForEachNode( pNtk, pNode, k ) - if ( (int)pNode->Level == i ) - printf( " %s", Abc_ObjName(pNode) ); - printf( "\n" ); - } - return; - } - - // print the delay profile - if ( fProfile && Abc_NtkHasMapping(pNtk) ) - { - int nIntervals = 12; - float DelayMax, DelayCur, DelayDelta; - int * pLevelCounts; - int DelayInt, nOutsSum, nOutsTotal; - - // get the max delay and delta - DelayMax = Abc_NtkDelayTrace( pNtk ); - DelayDelta = DelayMax/nIntervals; - // collect outputs by delay - pLevelCounts = ALLOC( int, nIntervals ); - memset( pLevelCounts, 0, sizeof(int) * nIntervals ); - Abc_NtkForEachCo( pNtk, pNode, i ) - { - DelayCur = Abc_NodeReadArrival( Abc_ObjFanin0(pNode) )->Worst; - DelayInt = (int)(DelayCur / DelayDelta); - if ( DelayInt >= nIntervals ) - DelayInt = nIntervals - 1; - pLevelCounts[DelayInt]++; - } - - nOutsSum = 0; - nOutsTotal = Abc_NtkCoNum(pNtk); - for ( i = 0; i < nIntervals; i++ ) - { - nOutsSum += pLevelCounts[i]; - printf( "[%8.2f - %8.2f] : COs = %4d. %5.1f %%\n", - DelayDelta * i, DelayDelta * (i+1), pLevelCounts[i], 100.0 * nOutsSum/nOutsTotal ); - } - free( pLevelCounts ); - return; - } - else if ( fProfile ) - { - int LevelMax, * pLevelCounts; - int nOutsSum, nOutsTotal; - - if ( !Abc_NtkIsStrash(pNtk) ) - Abc_NtkLevel(pNtk); - - LevelMax = 0; - Abc_NtkForEachCo( pNtk, pNode, i ) - if ( LevelMax < (int)Abc_ObjFanin0(pNode)->Level ) - LevelMax = Abc_ObjFanin0(pNode)->Level; - pLevelCounts = ALLOC( int, LevelMax + 1 ); - memset( pLevelCounts, 0, sizeof(int) * (LevelMax + 1) ); - Abc_NtkForEachCo( pNtk, pNode, i ) - pLevelCounts[Abc_ObjFanin0(pNode)->Level]++; - - nOutsSum = 0; - nOutsTotal = Abc_NtkCoNum(pNtk); - for ( i = 0; i <= LevelMax; i++ ) - if ( pLevelCounts[i] ) - { - nOutsSum += pLevelCounts[i]; - printf( "Level = %4d. COs = %4d. %5.1f %%\n", i, pLevelCounts[i], 100.0 * nOutsSum/nOutsTotal ); - } - free( pLevelCounts ); - return; - } - assert( Abc_NtkIsStrash(pNtk) ); - - // find the longest name - Length = 0; - Abc_NtkForEachCo( pNtk, pNode, i ) - if ( Length < (int)strlen(Abc_ObjName(pNode)) ) - Length = strlen(Abc_ObjName(pNode)); - if ( Length < 5 ) - Length = 5; - // print stats for each output - Abc_NtkForEachCo( pNtk, pNode, i ) - { - fprintf( pFile, "CO %4d : %*s ", i, Length, Abc_ObjName(pNode) ); - Abc_NodePrintLevel( pFile, pNode ); - } -} - -/**Function************************************************************* - - Synopsis [Prints the factored form of one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodePrintLevel( FILE * pFile, Abc_Obj_t * pNode ) -{ - Abc_Obj_t * pDriver; - Vec_Ptr_t * vNodes; - - pDriver = Abc_ObjIsCo(pNode)? Abc_ObjFanin0(pNode) : pNode; - if ( Abc_ObjIsPi(pDriver) ) - { - fprintf( pFile, "Primary input.\n" ); - return; - } - if ( Abc_ObjIsLatch(pDriver) ) - { - fprintf( pFile, "Latch.\n" ); - return; - } - if ( Abc_NodeIsConst(pDriver) ) - { - fprintf( pFile, "Constant %d.\n", !Abc_ObjFaninC0(pNode) ); - return; - } - // print the level - fprintf( pFile, "Level = %3d. ", pDriver->Level ); - // print the size of MFFC - fprintf( pFile, "Mffc = %5d. ", Abc_NodeMffcSize(pDriver) ); - // print the size of the shole cone - vNodes = Abc_NtkDfsNodes( pNode->pNtk, &pDriver, 1 ); - fprintf( pFile, "Cone = %5d. ", Vec_PtrSize(vNodes) ); - Vec_PtrFree( vNodes ); - fprintf( pFile, "\n" ); -} - -/**Function************************************************************* - - Synopsis [Prints the factored form of one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodePrintKMap( Abc_Obj_t * pNode, int fUseRealNames ) -{ - Vec_Ptr_t * vNamesIn; - if ( fUseRealNames ) - { - vNamesIn = Abc_NodeGetFaninNames(pNode); - Extra_PrintKMap( stdout, pNode->pNtk->pManFunc, pNode->pData, Cudd_Not(pNode->pData), - Abc_ObjFaninNum(pNode), NULL, 0, (char **)vNamesIn->pArray ); - Abc_NodeFreeNames( vNamesIn ); - } - else - Extra_PrintKMap( stdout, pNode->pNtk->pManFunc, pNode->pData, Cudd_Not(pNode->pData), - Abc_ObjFaninNum(pNode), NULL, 0, NULL ); - -} - -/**Function************************************************************* - - Synopsis [Prints statistics about gates used in the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintGates( Abc_Ntk_t * pNtk, int fUseLibrary ) -{ - Abc_Obj_t * pObj; - int fHasBdds, i; - int CountConst, CountBuf, CountInv, CountAnd, CountOr, CountOther, CounterTotal; - char * pSop; - - if ( fUseLibrary && Abc_NtkHasMapping(pNtk) ) - { - stmm_table * tTable; - stmm_generator * gen; - char * pName; - int * pCounter, Counter; - double Area, AreaTotal; - - // count the gates by name - CounterTotal = 0; - tTable = stmm_init_table(strcmp, stmm_strhash); - Abc_NtkForEachNode( pNtk, pObj, i ) - { - if ( i == 0 ) continue; - if ( !stmm_find_or_add( tTable, Mio_GateReadName(pObj->pData), (char ***)&pCounter ) ) - *pCounter = 0; - (*pCounter)++; - CounterTotal++; - } - // print the gates - AreaTotal = Abc_NtkGetMappedArea(pNtk); - stmm_foreach_item( tTable, gen, (char **)&pName, (char **)&Counter ) - { - Area = Counter * Mio_GateReadArea(Mio_LibraryReadGateByName(pNtk->pManFunc,pName)); - printf( "%-12s = %8d %10.2f %6.2f %%\n", pName, Counter, Area, 100.0 * Area / AreaTotal ); - } - printf( "%-12s = %8d %10.2f %6.2f %%\n", "TOTAL", CounterTotal, AreaTotal, 100.0 ); - stmm_free_table( tTable ); - return; - } - - if ( Abc_NtkIsAigLogic(pNtk) ) - return; - - // transform logic functions from BDD to SOP - if ( fHasBdds = Abc_NtkIsBddLogic(pNtk) ) - { - if ( !Abc_NtkBddToSop(pNtk, 0) ) - { - printf( "Abc_NtkPrintGates(): Converting to SOPs has failed.\n" ); - return; - } - } - - // get hold of the SOP of the node - CountConst = CountBuf = CountInv = CountAnd = CountOr = CountOther = CounterTotal = 0; - Abc_NtkForEachNode( pNtk, pObj, i ) - { - if ( i == 0 ) continue; - if ( Abc_NtkHasMapping(pNtk) ) - pSop = Mio_GateReadSop(pObj->pData); - else - pSop = pObj->pData; - // collect the stats - if ( Abc_SopIsConst0(pSop) || Abc_SopIsConst1(pSop) ) - CountConst++; - else if ( Abc_SopIsBuf(pSop) ) - CountBuf++; - else if ( Abc_SopIsInv(pSop) ) - CountInv++; - else if ( !Abc_SopIsComplement(pSop) && Abc_SopIsAndType(pSop) || Abc_SopIsComplement(pSop) && Abc_SopIsOrType(pSop) ) - CountAnd++; - else if ( Abc_SopIsComplement(pSop) && Abc_SopIsAndType(pSop) || !Abc_SopIsComplement(pSop) && Abc_SopIsOrType(pSop) ) - CountOr++; - else - CountOther++; - CounterTotal++; - } - printf( "Const = %8d %6.2f %%\n", CountConst , 100.0 * CountConst / CounterTotal ); - printf( "Buffer = %8d %6.2f %%\n", CountBuf , 100.0 * CountBuf / CounterTotal ); - printf( "Inverter = %8d %6.2f %%\n", CountInv , 100.0 * CountInv / CounterTotal ); - printf( "And = %8d %6.2f %%\n", CountAnd , 100.0 * CountAnd / CounterTotal ); - printf( "Or = %8d %6.2f %%\n", CountOr , 100.0 * CountOr / CounterTotal ); - printf( "Other = %8d %6.2f %%\n", CountOther , 100.0 * CountOther / CounterTotal ); - printf( "TOTAL = %8d %6.2f %%\n", CounterTotal, 100.0 * CounterTotal / CounterTotal ); - - // convert the network back into BDDs if this is how it was - if ( fHasBdds ) - Abc_NtkSopToBdd(pNtk); -} - -/**Function************************************************************* - - Synopsis [Prints statistics about gates used in the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintSharing( Abc_Ntk_t * pNtk ) -{ - Vec_Ptr_t * vNodes1, * vNodes2; - Abc_Obj_t * pObj1, * pObj2, * pNode1, * pNode2; - int i, k, m, n, Counter; - - // print the template - printf( "Statistics about sharing of logic nodes among the CO pairs.\n" ); - printf( "(CO1,CO2)=NumShared : " ); - // go though the CO pairs - Abc_NtkForEachCo( pNtk, pObj1, i ) - { - vNodes1 = Abc_NtkDfsNodes( pNtk, &pObj1, 1 ); - // mark the nodes - Vec_PtrForEachEntry( vNodes1, pNode1, m ) - pNode1->fMarkA = 1; - // go through the second COs - Abc_NtkForEachCo( pNtk, pObj2, k ) - { - if ( i >= k ) - continue; - vNodes2 = Abc_NtkDfsNodes( pNtk, &pObj2, 1 ); - // count the number of marked - Counter = 0; - Vec_PtrForEachEntry( vNodes2, pNode2, n ) - Counter += pNode2->fMarkA; - // print - printf( "(%d,%d)=%d ", i, k, Counter ); - Vec_PtrFree( vNodes2 ); - } - // unmark the nodes - Vec_PtrForEachEntry( vNodes1, pNode1, m ) - pNode1->fMarkA = 0; - Vec_PtrFree( vNodes1 ); - } - printf( "\n" ); -} - -/**Function************************************************************* - - Synopsis [Prints info for each output cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintStrSupports( Abc_Ntk_t * pNtk ) -{ - Vec_Ptr_t * vSupp, * vNodes; - Abc_Obj_t * pObj; - int i; - printf( "Structural support info:\n" ); - Abc_NtkForEachCo( pNtk, pObj, i ) - { - vSupp = Abc_NtkNodeSupport( pNtk, &pObj, 1 ); - vNodes = Abc_NtkDfsNodes( pNtk, &pObj, 1 ); - printf( "%20s : Cone = %5d. Supp = %5d.\n", - Abc_ObjName(pObj), vNodes->nSize, vSupp->nSize ); - Vec_PtrFree( vNodes ); - Vec_PtrFree( vSupp ); - } -} - -/**Function************************************************************* - - Synopsis [Prints information about the object.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ObjPrint( FILE * pFile, Abc_Obj_t * pObj ) -{ - Abc_Obj_t * pFanin; - int i; - fprintf( pFile, "Object %5d : ", pObj->Id ); - switch ( pObj->Type ) - { - case ABC_OBJ_NONE: - fprintf( pFile, "NONE " ); - break; - case ABC_OBJ_CONST1: - fprintf( pFile, "Const1 " ); - break; - case ABC_OBJ_PIO: - fprintf( pFile, "PIO " ); - break; - case ABC_OBJ_PI: - fprintf( pFile, "PI " ); - break; - case ABC_OBJ_PO: - fprintf( pFile, "PO " ); - break; - case ABC_OBJ_BI: - fprintf( pFile, "BI " ); - break; - case ABC_OBJ_BO: - fprintf( pFile, "BO " ); - break; - case ABC_OBJ_ASSERT: - fprintf( pFile, "Assert " ); - break; - case ABC_OBJ_NET: - fprintf( pFile, "Net " ); - break; - case ABC_OBJ_NODE: - fprintf( pFile, "Node " ); - break; - case ABC_OBJ_LATCH: - fprintf( pFile, "Latch " ); - break; - case ABC_OBJ_WHITEBOX: - fprintf( pFile, "Whitebox" ); - break; - case ABC_OBJ_BLACKBOX: - fprintf( pFile, "Blackbox" ); - break; - default: - assert(0); - break; - } - // print the fanins - fprintf( pFile, " Fanins ( " ); - Abc_ObjForEachFanin( pObj, pFanin, i ) - fprintf( pFile, "%d ", pFanin->Id ); - fprintf( pFile, ") " ); -/* - fprintf( pFile, " Fanouts ( " ); - Abc_ObjForEachFanout( pObj, pFanin, i ) - fprintf( pFile, "%d(%c) ", pFanin->Id, Abc_NodeIsTravIdCurrent(pFanin)? '+' : '-' ); - fprintf( pFile, ") " ); -*/ - // print the logic function - if ( Abc_ObjIsNode(pObj) && Abc_NtkIsSopLogic(pObj->pNtk) ) - fprintf( pFile, " %s", pObj->pData ); - else - fprintf( pFile, "\n" ); -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcProve.c b/src/base/abci/abcProve.c deleted file mode 100644 index a4220216..00000000 --- a/src/base/abci/abcProve.c +++ /dev/null @@ -1,343 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcProve.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Proves the miter using AIG rewriting, FRAIGing, and SAT solving.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcProve.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "fraig.h" -#include "math.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -extern int Abc_NtkRefactor( Abc_Ntk_t * pNtk, int nNodeSizeMax, int nConeSizeMax, bool fUpdateLevel, bool fUseZeros, bool fUseDcs, bool fVerbose ); -extern Abc_Ntk_t * Abc_NtkFromFraig( Fraig_Man_t * pMan, Abc_Ntk_t * pNtk ); - -static Abc_Ntk_t * Abc_NtkMiterFraig( Abc_Ntk_t * pNtk, int nBTLimit, sint64 nInspLimit, int * pRetValue, int * pNumFails, sint64 * pNumConfs, sint64 * pNumInspects ); -static void Abc_NtkMiterPrint( Abc_Ntk_t * pNtk, char * pString, int clk, int fVerbose ); - - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Attempts to solve the miter using a number of tricks.] - - Description [Returns -1 if timed out; 0 if SAT; 1 if UNSAT. Returns - a simplified version of the original network (or a constant 0 network). - In case the network is not a constant zero and a SAT assignment is found, - pNtk->pModel contains a satisfying assignment.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkMiterProve( Abc_Ntk_t ** ppNtk, void * pPars ) -{ - Prove_Params_t * pParams = pPars; - Abc_Ntk_t * pNtk, * pNtkTemp; - int RetValue, nIter, nSatFails, Counter, clk, timeStart = clock(); - sint64 nSatConfs, nSatInspects, nInspectLimit; - - // get the starting network - pNtk = *ppNtk; - assert( Abc_NtkIsStrash(pNtk) ); - assert( Abc_NtkPoNum(pNtk) == 1 ); - - if ( pParams->fVerbose ) - { - printf( "RESOURCE LIMITS: Iterations = %d. Rewriting = %s. Fraiging = %s.\n", - pParams->nItersMax, pParams->fUseRewriting? "yes":"no", pParams->fUseFraiging? "yes":"no" ); - printf( "Mitering = %d (%3.1f). Rewriting = %d (%3.1f). Fraiging = %d (%3.1f).\n", - pParams->nMiteringLimitStart, pParams->nMiteringLimitMulti, - pParams->nRewritingLimitStart, pParams->nRewritingLimitMulti, - pParams->nFraigingLimitStart, pParams->nFraigingLimitMulti ); - printf( "Mitering last = %d.\n", - pParams->nMiteringLimitLast ); - } - - // if SAT only, solve without iteration - if ( !pParams->fUseRewriting && !pParams->fUseFraiging ) - { - clk = clock(); - RetValue = Abc_NtkMiterSat( pNtk, (sint64)pParams->nMiteringLimitLast, (sint64)0, 0, NULL, NULL ); - Abc_NtkMiterPrint( pNtk, "SAT solving", clk, pParams->fVerbose ); - *ppNtk = pNtk; - return RetValue; - } - - // check the current resource limits - for ( nIter = 0; nIter < pParams->nItersMax; nIter++ ) - { - if ( pParams->fVerbose ) - { - printf( "ITERATION %2d : Confs = %6d. FraigBTL = %3d. \n", nIter+1, - (int)(pParams->nMiteringLimitStart * pow(pParams->nMiteringLimitMulti,nIter)), - (int)(pParams->nFraigingLimitStart * pow(pParams->nFraigingLimitMulti,nIter)) ); - fflush( stdout ); - } - - // try brute-force SAT - clk = clock(); - nInspectLimit = pParams->nTotalInspectLimit? pParams->nTotalInspectLimit - pParams->nTotalInspectsMade : 0; - RetValue = Abc_NtkMiterSat( pNtk, (sint64)(pParams->nMiteringLimitStart * pow(pParams->nMiteringLimitMulti,nIter)), (sint64)nInspectLimit, 0, &nSatConfs, &nSatInspects ); - Abc_NtkMiterPrint( pNtk, "SAT solving", clk, pParams->fVerbose ); - if ( RetValue >= 0 ) - break; - - // add to the number of backtracks and inspects - pParams->nTotalBacktracksMade += nSatConfs; - pParams->nTotalInspectsMade += nSatInspects; - // check if global resource limit is reached - if ( (pParams->nTotalBacktrackLimit && pParams->nTotalBacktracksMade >= pParams->nTotalBacktrackLimit) || - (pParams->nTotalInspectLimit && pParams->nTotalInspectsMade >= pParams->nTotalInspectLimit) ) - { - printf( "Reached global limit on conflicts/inspects. Quitting.\n" ); - *ppNtk = pNtk; - return -1; - } - - // try rewriting - if ( pParams->fUseRewriting ) - { - clk = clock(); - Counter = (int)(pParams->nRewritingLimitStart * pow(pParams->nRewritingLimitMulti,nIter)); -// Counter = 1; - while ( 1 ) - { -/* - extern Abc_Ntk_t * Abc_NtkIvyResyn( Abc_Ntk_t * pNtk, int fUpdateLevel, int fVerbose ); - pNtk = Abc_NtkIvyResyn( pNtkTemp = pNtk, 0, 0 ); Abc_NtkDelete( pNtkTemp ); - if ( (RetValue = Abc_NtkMiterIsConstant(pNtk)) >= 0 ) - break; - if ( --Counter == 0 ) - break; -*/ -/* - Abc_NtkRewrite( pNtk, 0, 0, 0, 0, 0 ); - if ( (RetValue = Abc_NtkMiterIsConstant(pNtk)) >= 0 ) - break; - if ( --Counter == 0 ) - break; -*/ - Abc_NtkRewrite( pNtk, 0, 0, 0, 0, 0 ); - if ( (RetValue = Abc_NtkMiterIsConstant(pNtk)) >= 0 ) - break; - if ( --Counter == 0 ) - break; - Abc_NtkRefactor( pNtk, 10, 16, 0, 0, 0, 0 ); - if ( (RetValue = Abc_NtkMiterIsConstant(pNtk)) >= 0 ) - break; - if ( --Counter == 0 ) - break; - pNtk = Abc_NtkBalance( pNtkTemp = pNtk, 0, 0, 0 ); Abc_NtkDelete( pNtkTemp ); - if ( (RetValue = Abc_NtkMiterIsConstant(pNtk)) >= 0 ) - break; - if ( --Counter == 0 ) - break; - } - Abc_NtkMiterPrint( pNtk, "Rewriting ", clk, pParams->fVerbose ); - } - - if ( pParams->fUseFraiging ) - { - // try FRAIGing - clk = clock(); - nInspectLimit = pParams->nTotalInspectLimit? pParams->nTotalInspectLimit - pParams->nTotalInspectsMade : 0; - pNtk = Abc_NtkMiterFraig( pNtkTemp = pNtk, (int)(pParams->nFraigingLimitStart * pow(pParams->nFraigingLimitMulti,nIter)), nInspectLimit, &RetValue, &nSatFails, &nSatConfs, &nSatInspects ); Abc_NtkDelete( pNtkTemp ); - Abc_NtkMiterPrint( pNtk, "FRAIGing ", clk, pParams->fVerbose ); -// printf( "NumFails = %d\n", nSatFails ); - if ( RetValue >= 0 ) - break; - - // add to the number of backtracks and inspects - pParams->nTotalBacktracksMade += nSatConfs; - pParams->nTotalInspectsMade += nSatInspects; - // check if global resource limit is reached - if ( (pParams->nTotalBacktrackLimit && pParams->nTotalBacktracksMade >= pParams->nTotalBacktrackLimit) || - (pParams->nTotalInspectLimit && pParams->nTotalInspectsMade >= pParams->nTotalInspectLimit) ) - { - printf( "Reached global limit on conflicts/inspects. Quitting.\n" ); - *ppNtk = pNtk; - return -1; - } - } - - } - - // try to prove it using brute force SAT - if ( RetValue < 0 && pParams->fUseBdds ) - { - if ( pParams->fVerbose ) - { - printf( "Attempting BDDs with node limit %d ...\n", pParams->nBddSizeLimit ); - fflush( stdout ); - } - clk = clock(); - pNtk = Abc_NtkCollapse( pNtkTemp = pNtk, pParams->nBddSizeLimit, 0, pParams->fBddReorder, 0 ); - if ( pNtk ) - { - Abc_NtkDelete( pNtkTemp ); - RetValue = ( (Abc_NtkNodeNum(pNtk) == 1) && (Abc_ObjFanin0(Abc_NtkPo(pNtk,0))->pData == Cudd_ReadLogicZero(pNtk->pManFunc)) ); - } - else - pNtk = pNtkTemp; - Abc_NtkMiterPrint( pNtk, "BDD building", clk, pParams->fVerbose ); - } - - if ( RetValue < 0 ) - { - if ( pParams->fVerbose ) - { - printf( "Attempting SAT with conflict limit %d ...\n", pParams->nMiteringLimitLast ); - fflush( stdout ); - } - clk = clock(); - nInspectLimit = pParams->nTotalInspectLimit? pParams->nTotalInspectLimit - pParams->nTotalInspectsMade : 0; - RetValue = Abc_NtkMiterSat( pNtk, (sint64)pParams->nMiteringLimitLast, (sint64)nInspectLimit, 0, NULL, NULL ); - Abc_NtkMiterPrint( pNtk, "SAT solving", clk, pParams->fVerbose ); - } - - // assign the model if it was proved by rewriting (const 1 miter) - if ( RetValue == 0 && pNtk->pModel == NULL ) - { - pNtk->pModel = ALLOC( int, Abc_NtkCiNum(pNtk) ); - memset( pNtk->pModel, 0, sizeof(int) * Abc_NtkCiNum(pNtk) ); - } - *ppNtk = pNtk; - return RetValue; -} - -/**Function************************************************************* - - Synopsis [Attempts to solve the miter using a number of tricks.] - - Description [Returns -1 if timed out; 0 if SAT; 1 if UNSAT.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkMiterFraig( Abc_Ntk_t * pNtk, int nBTLimit, sint64 nInspLimit, int * pRetValue, int * pNumFails, sint64 * pNumConfs, sint64 * pNumInspects ) -{ - Abc_Ntk_t * pNtkNew; - Fraig_Params_t Params, * pParams = &Params; - Fraig_Man_t * pMan; - int nWords1, nWords2, nWordsMin, RetValue; - int * pModel; - - // to determine the number of simulation patterns - // use the following strategy - // at least 64 words (32 words random and 32 words dynamic) - // no more than 256M for one circuit (128M + 128M) - nWords1 = 32; - nWords2 = (1<<27) / (Abc_NtkNodeNum(pNtk) + Abc_NtkCiNum(pNtk)); - nWordsMin = ABC_MIN( nWords1, nWords2 ); - - // set the FRAIGing parameters - Fraig_ParamsSetDefault( pParams ); - pParams->nPatsRand = nWordsMin * 32; // the number of words of random simulation info - pParams->nPatsDyna = nWordsMin * 32; // the number of words of dynamic simulation info - pParams->nBTLimit = nBTLimit; // the max number of backtracks - pParams->nSeconds = -1; // the runtime limit - pParams->fTryProve = 0; // do not try to prove the final miter - pParams->fDoSparse = 1; // try proving sparse functions - pParams->fVerbose = 0; - pParams->nInspLimit = nInspLimit; - - // transform the target into a fraig - pMan = Abc_NtkToFraig( pNtk, pParams, 0, 0 ); - Fraig_ManProveMiter( pMan ); - RetValue = Fraig_ManCheckMiter( pMan ); - - // create the network - pNtkNew = Abc_NtkFromFraig( pMan, pNtk ); - - // save model - if ( RetValue == 0 ) - { - pModel = Fraig_ManReadModel( pMan ); - FREE( pNtkNew->pModel ); - pNtkNew->pModel = ALLOC( int, Abc_NtkCiNum(pNtkNew) ); - memcpy( pNtkNew->pModel, pModel, sizeof(int) * Abc_NtkCiNum(pNtkNew) ); - } - - // save the return values - *pRetValue = RetValue; - *pNumFails = Fraig_ManReadSatFails( pMan ); - *pNumConfs = Fraig_ManReadConflicts( pMan ); - *pNumInspects = Fraig_ManReadInspects( pMan ); - - // delete the fraig manager - Fraig_ManFree( pMan ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Attempts to solve the miter using a number of tricks.] - - Description [Returns -1 if timed out; 0 if SAT; 1 if UNSAT.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkMiterPrint( Abc_Ntk_t * pNtk, char * pString, int clk, int fVerbose ) -{ - if ( !fVerbose ) - return; - printf( "Nodes = %7d. Levels = %4d. ", Abc_NtkNodeNum(pNtk), - Abc_NtkIsStrash(pNtk)? Abc_AigLevel(pNtk) : Abc_NtkLevel(pNtk) ); - PRT( pString, clock() - clk ); -} - - -/**Function************************************************************* - - Synopsis [Implements resynthesis for CEC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkMiterRwsat( Abc_Ntk_t * pNtk ) -{ - Abc_Ntk_t * pNtkTemp; - Abc_NtkRewrite( pNtk, 0, 0, 0, 0, 0 ); - pNtk = Abc_NtkBalance( pNtkTemp = pNtk, 0, 0, 0 ); Abc_NtkDelete( pNtkTemp ); - Abc_NtkRewrite( pNtk, 0, 0, 0, 0, 0 ); - Abc_NtkRefactor( pNtk, 10, 16, 0, 0, 0, 0 ); - return pNtk; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcQbf.c b/src/base/abci/abcQbf.c deleted file mode 100644 index b839f812..00000000 --- a/src/base/abci/abcQbf.c +++ /dev/null @@ -1,260 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcQbf.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Implementation of a simple QBF solver.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcQbf.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -/* - Implementation of a simple QBF solver along the lines of - A. Solar-Lezama, L. Tancau, R. Bodik, V. Saraswat, and S. Seshia, - "Combinatorial sketching for finite programs", 12th International - Conference on Architectural Support for Programming Languages and - Operating Systems (ASPLOS 2006), San Jose, CA, October 2006. -*/ - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Abc_NtkModelToVector( Abc_Ntk_t * pNtk, Vec_Int_t * vPiValues ); -static void Abc_NtkVectorClearPars( Vec_Int_t * vPiValues, int nPars ); -static void Abc_NtkVectorClearVars( Abc_Ntk_t * pNtk, Vec_Int_t * vPiValues, int nPars ); -static void Abc_NtkVectorPrintPars( Vec_Int_t * vPiValues, int nPars ); -static void Abc_NtkVectorPrintVars( Abc_Ntk_t * pNtk, Vec_Int_t * vPiValues, int nPars ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Solve the QBF problem EpAx[M(p,x)].] - - Description [Variables p go first, followed by variable x. - The number of parameters is nPars. The miter is in pNtk. - The miter expresses EQUALITY of the implementation and spec.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkQbf( Abc_Ntk_t * pNtk, int nPars, int fVerbose ) -{ - Abc_Ntk_t * pNtkVer, * pNtkSyn, * pNtkSyn2, * pNtkTemp; - Vec_Int_t * vPiValues; - int clkTotal = clock(), clkS, clkV; - int nIters, nIterMax = 500, nInputs, RetValue, fFound = 0; - - assert( Abc_NtkIsStrash(pNtk) ); - assert( Abc_NtkIsComb(pNtk) ); - assert( Abc_NtkPoNum(pNtk) == 1 ); - assert( nPars > 0 && nPars < Abc_NtkPiNum(pNtk) ); - assert( Abc_NtkPiNum(pNtk)-nPars < 32 ); - nInputs = Abc_NtkPiNum(pNtk) - nPars; - - // initialize the synthesized network with 0000-combination - vPiValues = Vec_IntStart( Abc_NtkPiNum(pNtk) ); - Abc_NtkVectorClearPars( vPiValues, nPars ); - pNtkSyn = Abc_NtkMiterCofactor( pNtk, vPiValues ); - if ( fVerbose ) - { - printf( "Iter %2d : ", 0 ); - printf( "AIG = %6d ", Abc_NtkNodeNum(pNtkSyn) ); - Abc_NtkVectorPrintVars( pNtk, vPiValues, nPars ); - printf( "\n" ); - } - - // iteratively solve - for ( nIters = 0; nIters < nIterMax; nIters++ ) - { - // solve the synthesis instance -clkS = clock(); - RetValue = Abc_NtkMiterSat( pNtkSyn, 0, 0, 0, NULL, NULL ); -clkS = clock() - clkS; - if ( RetValue == 0 ) - Abc_NtkModelToVector( pNtkSyn, vPiValues ); - if ( RetValue == 1 ) - { - break; - } - if ( RetValue == -1 ) - { - printf( "Synthesis timed out.\n" ); - break; - } - // there is a counter-example - - // construct the verification instance - Abc_NtkVectorClearVars( pNtk, vPiValues, nPars ); - pNtkVer = Abc_NtkMiterCofactor( pNtk, vPiValues ); - // complement the output - Abc_ObjXorFaninC( Abc_NtkPo(pNtkVer,0), 0 ); - - // solve the verification instance -clkV = clock(); - RetValue = Abc_NtkMiterSat( pNtkVer, 0, 0, 0, NULL, NULL ); -clkV = clock() - clkV; - if ( RetValue == 0 ) - Abc_NtkModelToVector( pNtkVer, vPiValues ); - Abc_NtkDelete( pNtkVer ); - if ( RetValue == 1 ) - { - fFound = 1; - break; - } - if ( RetValue == -1 ) - { - printf( "Verification timed out.\n" ); - break; - } - // there is a counter-example - - // create a new synthesis network - Abc_NtkVectorClearPars( vPiValues, nPars ); - pNtkSyn2 = Abc_NtkMiterCofactor( pNtk, vPiValues ); - // add to the synthesis instance - pNtkSyn = Abc_NtkMiterAnd( pNtkTemp = pNtkSyn, pNtkSyn2, 0, 0 ); - Abc_NtkDelete( pNtkSyn2 ); - Abc_NtkDelete( pNtkTemp ); - - if ( fVerbose ) - { - printf( "Iter %2d : ", nIters+1 ); - printf( "AIG = %6d ", Abc_NtkNodeNum(pNtkSyn) ); - Abc_NtkVectorPrintVars( pNtk, vPiValues, nPars ); - printf( " " ); -// PRTn( "Syn", clkS ); - PRT( "Ver", clkV ); - } - } - Abc_NtkDelete( pNtkSyn ); - // report the results - if ( fFound ) - { - printf( "Parameters: " ); - Abc_NtkVectorPrintPars( vPiValues, nPars ); - printf( "\n" ); - printf( "Solved after %d interations. ", nIters ); - } - else if ( nIters == nIterMax ) - printf( "Unsolved after %d interations. ", nIters ); - else - printf( "Implementation does not exist. " ); - PRT( "Total runtime", clock() - clkTotal ); - Vec_IntFree( vPiValues ); -} - - -/**Function************************************************************* - - Synopsis [Translates model into the vector of values.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkModelToVector( Abc_Ntk_t * pNtk, Vec_Int_t * vPiValues ) -{ - int * pModel, i; - pModel = pNtk->pModel; - for ( i = 0; i < Abc_NtkPiNum(pNtk); i++ ) - Vec_IntWriteEntry( vPiValues, i, pModel[i] ); -} - -/**Function************************************************************* - - Synopsis [Clears parameters.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkVectorClearPars( Vec_Int_t * vPiValues, int nPars ) -{ - int i; - for ( i = 0; i < nPars; i++ ) - Vec_IntWriteEntry( vPiValues, i, -1 ); -} - -/**Function************************************************************* - - Synopsis [Clears variables.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkVectorClearVars( Abc_Ntk_t * pNtk, Vec_Int_t * vPiValues, int nPars ) -{ - int i; - for ( i = nPars; i < Abc_NtkPiNum(pNtk); i++ ) - Vec_IntWriteEntry( vPiValues, i, -1 ); -} - -/**Function************************************************************* - - Synopsis [Clears variables.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkVectorPrintPars( Vec_Int_t * vPiValues, int nPars ) -{ - int i; - for ( i = 0; i < nPars; i++ ) - printf( "%d", Vec_IntEntry(vPiValues,i) ); -} - -/**Function************************************************************* - - Synopsis [Clears variables.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkVectorPrintVars( Abc_Ntk_t * pNtk, Vec_Int_t * vPiValues, int nPars ) -{ - int i; - for ( i = nPars; i < Abc_NtkPiNum(pNtk); i++ ) - printf( "%d", Vec_IntEntry(vPiValues,i) ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcQuant.c b/src/base/abci/abcQuant.c deleted file mode 100644 index 0f2bd72f..00000000 --- a/src/base/abci/abcQuant.c +++ /dev/null @@ -1,419 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcQuant.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [AIG-based variable quantification.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcQuant.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Performs fast synthesis.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkSynthesize( Abc_Ntk_t ** ppNtk, int fMoreEffort ) -{ - Abc_Ntk_t * pNtk, * pNtkTemp; - - pNtk = *ppNtk; - - Abc_NtkRewrite( pNtk, 0, 0, 0, 0, 0 ); - Abc_NtkRefactor( pNtk, 10, 16, 0, 0, 0, 0 ); - pNtk = Abc_NtkBalance( pNtkTemp = pNtk, 0, 0, 0 ); - Abc_NtkDelete( pNtkTemp ); - - if ( fMoreEffort ) - { - Abc_NtkRewrite( pNtk, 0, 0, 0, 0, 0 ); - Abc_NtkRefactor( pNtk, 10, 16, 0, 0, 0, 0 ); - pNtk = Abc_NtkBalance( pNtkTemp = pNtk, 0, 0, 0 ); - Abc_NtkDelete( pNtkTemp ); - } - - *ppNtk = pNtk; -} - -/**Function************************************************************* - - Synopsis [Existentially quantifies one variable.] - - Description [] - - SideEffects [This procedure creates dangling nodes in the AIG.] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkQuantify( Abc_Ntk_t * pNtk, int fUniv, int iVar, int fVerbose ) -{ - Vec_Ptr_t * vNodes; - Abc_Obj_t * pObj, * pNext, * pFanin; - int i; - assert( Abc_NtkIsStrash(pNtk) ); - assert( iVar < Abc_NtkCiNum(pNtk) ); - - // collect the internal nodes - pObj = Abc_NtkCi( pNtk, iVar ); - vNodes = Abc_NtkDfsReverseNodes( pNtk, &pObj, 1 ); - - // assign the cofactors of the CI node to be constants - pObj->pCopy = Abc_ObjNot( Abc_AigConst1(pNtk) ); - pObj->pData = Abc_AigConst1(pNtk); - - // quantify the nodes - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - for ( pNext = pObj? pObj->pCopy : pObj; pObj; pObj = pNext, pNext = pObj? pObj->pCopy : pObj ) - { - pFanin = Abc_ObjFanin0(pObj); - if ( !Abc_NodeIsTravIdCurrent(pFanin) ) - pFanin->pCopy = pFanin->pData = pFanin; - pFanin = Abc_ObjFanin1(pObj); - if ( !Abc_NodeIsTravIdCurrent(pFanin) ) - pFanin->pCopy = pFanin->pData = pFanin; - pObj->pCopy = Abc_AigAnd( pNtk->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) ); - pObj->pData = Abc_AigAnd( pNtk->pManFunc, Abc_ObjChild0Data(pObj), Abc_ObjChild1Data(pObj) ); - } - } - Vec_PtrFree( vNodes ); - - // update the affected COs - Abc_NtkForEachCo( pNtk, pObj, i ) - { - if ( !Abc_NodeIsTravIdCurrent(pObj) ) - continue; - pFanin = Abc_ObjFanin0(pObj); - // get the result of quantification - if ( fUniv ) - pNext = Abc_AigAnd( pNtk->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild0Data(pObj) ); - else - pNext = Abc_AigOr( pNtk->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild0Data(pObj) ); - pNext = Abc_ObjNotCond( pNext, Abc_ObjFaninC0(pObj) ); - if ( Abc_ObjRegular(pNext) == pFanin ) - continue; - // update the fanins of the CO - Abc_ObjPatchFanin( pObj, pFanin, pNext ); -// if ( Abc_ObjFanoutNum(pFanin) == 0 ) -// Abc_AigDeleteNode( pNtk->pManFunc, pFanin ); - } - - // make sure the node has no fanouts -// pObj = Abc_NtkCi( pNtk, iVar ); -// assert( Abc_ObjFanoutNum(pObj) == 0 ); - return 1; -} - -/**Function************************************************************* - - Synopsis [Constructs the transition relation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkTransRel( Abc_Ntk_t * pNtk, int fInputs, int fVerbose ) -{ - char Buffer[1000]; - Vec_Ptr_t * vPairs; - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pObj, * pMiter; - int i, nLatches; - int fSynthesis = 1; - - assert( Abc_NtkIsStrash(pNtk) ); - assert( Abc_NtkLatchNum(pNtk) ); - nLatches = Abc_NtkLatchNum(pNtk); - // start the network - pNtkNew = Abc_NtkAlloc( ABC_NTK_STRASH, ABC_FUNC_AIG, 1 ); - // duplicate the name and the spec - sprintf( Buffer, "%s_TR", pNtk->pName ); - pNtkNew->pName = Extra_UtilStrsav(pNtk->pName); -// pNtkNew->pSpec = Extra_UtilStrsav(pNtk->pSpec); - Abc_NtkCleanCopy( pNtk ); - // create current state variables - Abc_NtkForEachLatchOutput( pNtk, pObj, i ) - { - pObj->pCopy = Abc_NtkCreatePi(pNtkNew); - Abc_ObjAssignName( pObj->pCopy, Abc_ObjName(pObj), NULL ); - } - // create next state variables - Abc_NtkForEachLatchInput( pNtk, pObj, i ) - Abc_ObjAssignName( Abc_NtkCreatePi(pNtkNew), Abc_ObjName(pObj), NULL ); - // create PI variables - Abc_NtkForEachPi( pNtk, pObj, i ) - Abc_NtkDupObj( pNtkNew, pObj, 1 ); - // create the PO - Abc_NtkCreatePo( pNtkNew ); - // restrash the nodes (assuming a topological order of the old network) - Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkNew); - Abc_NtkForEachNode( pNtk, pObj, i ) - pObj->pCopy = Abc_AigAnd( pNtkNew->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) ); - // create the function of the primary output - assert( Abc_NtkBoxNum(pNtk) == Abc_NtkLatchNum(pNtk) ); - vPairs = Vec_PtrAlloc( 2*nLatches ); - Abc_NtkForEachLatchInput( pNtk, pObj, i ) - { - Vec_PtrPush( vPairs, Abc_ObjChild0Copy(pObj) ); - Vec_PtrPush( vPairs, Abc_NtkPi(pNtkNew, i+nLatches) ); - } - pMiter = Abc_AigMiter( pNtkNew->pManFunc, vPairs ); - Vec_PtrFree( vPairs ); - // add the primary output - Abc_ObjAddFanin( Abc_NtkPo(pNtkNew,0), Abc_ObjNot(pMiter) ); - Abc_ObjAssignName( Abc_NtkPo(pNtkNew,0), "rel", NULL ); - - // quantify inputs - if ( fInputs ) - { - assert( Abc_NtkPiNum(pNtkNew) == Abc_NtkPiNum(pNtk) + 2*nLatches ); - for ( i = Abc_NtkPiNum(pNtkNew) - 1; i >= 2*nLatches; i-- ) -// for ( i = 2*nLatches; i < Abc_NtkPiNum(pNtkNew); i++ ) - { - Abc_NtkQuantify( pNtkNew, 0, i, fVerbose ); -// if ( fSynthesis && (i % 3 == 2) ) - if ( fSynthesis ) - { - Abc_NtkCleanData( pNtkNew ); - Abc_AigCleanup( pNtkNew->pManFunc ); - Abc_NtkSynthesize( &pNtkNew, 1 ); - } -// printf( "Var = %3d. Nodes = %6d. ", Abc_NtkPiNum(pNtkNew) - 1 - i, Abc_NtkNodeNum(pNtkNew) ); -// printf( "Var = %3d. Nodes = %6d. ", i - 2*nLatches, Abc_NtkNodeNum(pNtkNew) ); - } -// printf( "\n" ); - Abc_NtkCleanData( pNtkNew ); - Abc_AigCleanup( pNtkNew->pManFunc ); - for ( i = Abc_NtkPiNum(pNtkNew) - 1; i >= 2*nLatches; i-- ) - { - pObj = Abc_NtkPi( pNtkNew, i ); - assert( Abc_ObjFanoutNum(pObj) == 0 ); - Abc_NtkDeleteObj( pObj ); - } - } - - // check consistency of the network - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkTransRel: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - - -/**Function************************************************************* - - Synopsis [Performs one image computation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkInitialState( Abc_Ntk_t * pNtk ) -{ - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pMiter; - int i, nVars = Abc_NtkPiNum(pNtk)/2; - assert( Abc_NtkIsStrash(pNtk) ); - // start the new network - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_STRASH, ABC_FUNC_AIG ); - // compute the all-zero state in terms of the CS variables - pMiter = Abc_AigConst1(pNtkNew); - for ( i = 0; i < nVars; i++ ) - pMiter = Abc_AigAnd( pNtkNew->pManFunc, pMiter, Abc_ObjNot( Abc_NtkPi(pNtkNew, i) ) ); - // add the PO - Abc_ObjAddFanin( Abc_NtkPo(pNtkNew,0), pMiter ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Swaps current state and next state variables.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkSwapVariables( Abc_Ntk_t * pNtk ) -{ - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pMiter, * pObj, * pObj0, * pObj1; - int i, nVars = Abc_NtkPiNum(pNtk)/2; - assert( Abc_NtkIsStrash(pNtk) ); - // start the new network - pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_STRASH, ABC_FUNC_AIG ); - // update the PIs - for ( i = 0; i < nVars; i++ ) - { - pObj0 = Abc_NtkPi( pNtk, i ); - pObj1 = Abc_NtkPi( pNtk, i+nVars ); - pMiter = pObj0->pCopy; - pObj0->pCopy = pObj1->pCopy; - pObj1->pCopy = pMiter; - } - // restrash - Abc_NtkForEachNode( pNtk, pObj, i ) - pObj->pCopy = Abc_AigAnd( pNtkNew->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) ); - // add the PO - pMiter = Abc_ObjChild0Copy( Abc_NtkPo(pNtk,0) ); - Abc_ObjAddFanin( Abc_NtkPo(pNtkNew,0), pMiter ); - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Performs reachability analisys.] - - Description [Assumes that the input is the transition relation.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkReachability( Abc_Ntk_t * pNtkRel, int nIters, int fVerbose ) -{ - Abc_Obj_t * pObj; - Abc_Ntk_t * pNtkFront, * pNtkReached, * pNtkNext, * pNtkTemp; - int clk, i, v, nVars, nNodesOld, nNodesNew, nNodesPrev; - int fFixedPoint = 0; - int fSynthesis = 1; - int fMoreEffort = 1; - - assert( Abc_NtkIsStrash(pNtkRel) ); - assert( Abc_NtkLatchNum(pNtkRel) == 0 ); - assert( Abc_NtkPiNum(pNtkRel) % 2 == 0 ); - - // compute the network composed of the initial states - pNtkFront = Abc_NtkInitialState( pNtkRel ); - pNtkReached = Abc_NtkDup( pNtkFront ); -//Abc_NtkShow( pNtkReached, 0, 0, 0 ); - -// if ( fVerbose ) -// printf( "Transition relation = %6d.\n", Abc_NtkNodeNum(pNtkRel) ); - - // perform iterations of reachability analysis - nNodesPrev = Abc_NtkNodeNum(pNtkFront); - nVars = Abc_NtkPiNum(pNtkRel)/2; - for ( i = 0; i < nIters; i++ ) - { - clk = clock(); - // get the set of next states - pNtkNext = Abc_NtkMiterAnd( pNtkRel, pNtkFront, 0, 0 ); - Abc_NtkDelete( pNtkFront ); - // quantify the current state variables - for ( v = 0; v < nVars; v++ ) - { - Abc_NtkQuantify( pNtkNext, 0, v, fVerbose ); - if ( fSynthesis && (v % 3 == 2) ) - { - Abc_NtkCleanData( pNtkNext ); - Abc_AigCleanup( pNtkNext->pManFunc ); - Abc_NtkSynthesize( &pNtkNext, fMoreEffort ); - } - } - Abc_NtkCleanData( pNtkNext ); - Abc_AigCleanup( pNtkNext->pManFunc ); - if ( fSynthesis ) - Abc_NtkSynthesize( &pNtkNext, 1 ); - // map the next states into the current states - pNtkNext = Abc_NtkSwapVariables( pNtkTemp = pNtkNext ); - Abc_NtkDelete( pNtkTemp ); - // check the termination condition - if ( Abc_ObjFanin0(Abc_NtkPo(pNtkNext,0)) == Abc_AigConst1(pNtkNext) ) - { - fFixedPoint = 1; - printf( "Fixed point is reached!\n" ); - Abc_NtkDelete( pNtkNext ); - break; - } - // compute new front - pNtkFront = Abc_NtkMiterAnd( pNtkNext, pNtkReached, 0, 1 ); - Abc_NtkDelete( pNtkNext ); - // add the reached states - pNtkReached = Abc_NtkMiterAnd( pNtkTemp = pNtkReached, pNtkFront, 1, 0 ); - Abc_NtkDelete( pNtkTemp ); - // compress the size of Front - nNodesOld = Abc_NtkNodeNum(pNtkFront); - if ( fSynthesis ) - { - Abc_NtkSynthesize( &pNtkFront, fMoreEffort ); - Abc_NtkSynthesize( &pNtkReached, fMoreEffort ); - } - nNodesNew = Abc_NtkNodeNum(pNtkFront); - // print statistics - if ( fVerbose ) - { - printf( "I = %3d : Reach = %6d Fr = %6d FrM = %6d %7.2f %% ", - i + 1, Abc_NtkNodeNum(pNtkReached), nNodesOld, nNodesNew, 100.0*(nNodesNew-nNodesPrev)/nNodesPrev ); - PRT( "T", clock() - clk ); - } - nNodesPrev = Abc_NtkNodeNum(pNtkFront); - } - if ( !fFixedPoint ) - fprintf( stdout, "Reachability analysis stopped after %d iterations.\n", nIters ); - - // complement the output to represent the set of unreachable states - Abc_ObjXorFaninC( Abc_NtkPo(pNtkReached,0), 0 ); - - // remove next state variables - for ( i = 2*nVars - 1; i >= nVars; i-- ) - { - pObj = Abc_NtkPi( pNtkReached, i ); - assert( Abc_ObjFanoutNum(pObj) == 0 ); - Abc_NtkDeleteObj( pObj ); - } - - // check consistency of the network - if ( !Abc_NtkCheck( pNtkReached ) ) - { - printf( "Abc_NtkReachability: The network check has failed.\n" ); - Abc_NtkDelete( pNtkReached ); - return NULL; - } - return pNtkReached; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcRec.c b/src/base/abci/abcRec.c deleted file mode 100644 index a6ec6981..00000000 --- a/src/base/abci/abcRec.c +++ /dev/null @@ -1,1173 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcRec.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Record of semi-canonical AIG subgraphs.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcRec.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "if.h" -#include "kit.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Abc_ManRec_t_ Abc_ManRec_t; -struct Abc_ManRec_t_ -{ - Abc_Ntk_t * pNtk; // the record - Vec_Ptr_t * vTtElems; // the elementary truth tables - Vec_Ptr_t * vTtNodes; // the node truth tables - Abc_Obj_t ** pBins; // hash table mapping truth tables into nodes - int nBins; // the number of allocated bins - int nVars; // the number of variables - int nVarsInit; // the number of variables requested initially - int nWords; // the number of TT words - int nCuts; // the max number of cuts to use - // temporaries - int * pBytes; // temporary storage for minterms - int * pMints; // temporary storage for minterm counters - unsigned * pTemp1; // temporary truth table - unsigned * pTemp2; // temporary truth table - Vec_Ptr_t * vNodes; // the temporary nodes - Vec_Ptr_t * vTtTemps; // the truth tables for the internal nodes of the cut - Vec_Ptr_t * vLabels; // temporary storage for AIG node labels - Vec_Str_t * vCosts; // temporary storage for costs - Vec_Int_t * vMemory; // temporary memory for truth tables - // statistics - int nTried; // the number of cuts tried - int nFilterSize; // the number of same structures - int nFilterRedund; // the number of same structures - int nFilterVolume; // the number of same structures - int nFilterTruth; // the number of same structures - int nFilterError; // the number of same structures - int nFilterSame; // the number of same structures - int nAdded; // the number of subgraphs added - int nAddedFuncs; // the number of functions added - // rewriting - int nFunsFound; // the found functions - int nFunsNotFound; // the missing functions - // runtime - int timeCollect; // the runtime to canonicize - int timeTruth; // the runtime to canonicize - int timeCanon; // the runtime to canonicize - int timeOther; // the runtime to canonicize - int timeTotal; // the runtime to canonicize -}; - -// the truth table is canonicized in such a way that for (00000) its value is 0 - -static Abc_Obj_t ** Abc_NtkRecTableLookup( Abc_ManRec_t * p, unsigned * pTruth, int nVars ); -static int Abc_NtkRecComputeTruth( Abc_Obj_t * pObj, Vec_Ptr_t * vTtNodes, int nVars ); -static int Abc_NtkRecAddCutCheckCycle_rec( Abc_Obj_t * pRoot, Abc_Obj_t * pObj ); - -static Abc_ManRec_t * s_pMan = NULL; - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Starts the record for the given network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRecIsRunning() -{ - return s_pMan != NULL; -} - -/**Function************************************************************* - - Synopsis [Starts the record for the given network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRecVarNum() -{ - return (s_pMan != NULL)? s_pMan->nVars : -1; -} - -/**Function************************************************************* - - Synopsis [Starts the record for the given network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Int_t * Abc_NtkRecMemory() -{ - return s_pMan->vMemory; -} - -/**Function************************************************************* - - Synopsis [Starts the record for the given network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkRecStart( Abc_Ntk_t * pNtk, int nVars, int nCuts ) -{ - Abc_ManRec_t * p; - Abc_Obj_t * pObj, ** ppSpot; - char Buffer[10]; - unsigned * pTruth; - int i, RetValue; - int clkTotal = clock(), clk; - - assert( s_pMan == NULL ); - if ( pNtk == NULL ) - { - assert( nVars > 2 && nVars <= 16 ); - pNtk = Abc_NtkAlloc( ABC_NTK_STRASH, ABC_FUNC_AIG, 1 ); - pNtk->pName = Extra_UtilStrsav( "record" ); - } - else - { - if ( Abc_NtkGetChoiceNum(pNtk) > 0 ) - { - printf( "The starting record should be a network without choice nodes.\n" ); - return; - } - if ( Abc_NtkPiNum(pNtk) > 16 ) - { - printf( "The starting record should be a network with no more than %d primary inputs.\n", 16 ); - return; - } - if ( Abc_NtkPiNum(pNtk) > nVars ) - printf( "The starting record has %d inputs (warning only).\n", Abc_NtkPiNum(pNtk) ); - pNtk = Abc_NtkDup( pNtk ); - } - // create the primary inputs - for ( i = Abc_NtkPiNum(pNtk); i < nVars; i++ ) - { - pObj = Abc_NtkCreatePi( pNtk ); - Buffer[0] = 'a' + i; - Buffer[1] = 0; - Abc_ObjAssignName( pObj, Buffer, NULL ); - } - Abc_NtkCleanCopy( pNtk ); - Abc_NtkCleanEquiv( pNtk ); - - // start the manager - p = ALLOC( Abc_ManRec_t, 1 ); - memset( p, 0, sizeof(Abc_ManRec_t) ); - p->pNtk = pNtk; - p->nVars = Abc_NtkPiNum(pNtk); - p->nWords = Kit_TruthWordNum( p->nVars ); - p->nCuts = nCuts; - p->nVarsInit = nVars; - - // create elementary truth tables - p->vTtElems = Vec_PtrAlloc( 0 ); assert( p->vTtElems->pArray == NULL ); - p->vTtElems->nSize = p->nVars; - p->vTtElems->nCap = p->nVars; - p->vTtElems->pArray = (void *)Extra_TruthElementary( p->nVars ); - - // allocate room for node truth tables - if ( Abc_NtkObjNum(pNtk) > (1<<14) ) - p->vTtNodes = Vec_PtrAllocSimInfo( 2 * Abc_NtkObjNum(pNtk), p->nWords ); - else - p->vTtNodes = Vec_PtrAllocSimInfo( 1<<14, p->nWords ); - - // create hash table - p->nBins = 50011; - p->pBins = ALLOC( Abc_Obj_t *, p->nBins ); - memset( p->pBins, 0, sizeof(Abc_Obj_t *) * p->nBins ); - - // set elementary tables - Kit_TruthFill( Vec_PtrEntry(p->vTtNodes, 0), p->nVars ); - Abc_NtkForEachPi( pNtk, pObj, i ) - Kit_TruthCopy( Vec_PtrEntry(p->vTtNodes, pObj->Id), Vec_PtrEntry(p->vTtElems, i), p->nVars ); - - // compute the tables -clk = clock(); - Abc_AigForEachAnd( pNtk, pObj, i ) - { - RetValue = Abc_NtkRecComputeTruth( pObj, p->vTtNodes, p->nVars ); - assert( RetValue ); - } -p->timeTruth += clock() - clk; - - // insert the PO nodes into the table - Abc_NtkForEachPo( pNtk, pObj, i ) - { - p->nTried++; - p->nAdded++; - - pObj = Abc_ObjFanin0(pObj); - pTruth = Vec_PtrEntry( p->vTtNodes, pObj->Id ); - - if ( pTruth[0] == 1128481603 ) - { - int x = 0; - } - - // add the resulting truth table to the hash table - ppSpot = Abc_NtkRecTableLookup( p, pTruth, p->nVars ); - assert( pObj->pEquiv == NULL ); - assert( pObj->pCopy == NULL ); - if ( *ppSpot == NULL ) - { - p->nAddedFuncs++; - *ppSpot = pObj; - } - else - { - pObj->pEquiv = (*ppSpot)->pEquiv; - (*ppSpot)->pEquiv = (Hop_Obj_t *)pObj; - if ( !Abc_NtkRecAddCutCheckCycle_rec(*ppSpot, pObj) ) - printf( "Loop!\n" ); - } - } - - // temporaries - p->pBytes = ALLOC( int, 4*p->nWords ); - p->pMints = ALLOC( int, 2*p->nVars ); - p->pTemp1 = ALLOC( unsigned, p->nWords ); - p->pTemp2 = ALLOC( unsigned, p->nWords ); - p->vNodes = Vec_PtrAlloc( 100 ); - p->vTtTemps = Vec_PtrAllocSimInfo( 64, p->nWords ); - p->vMemory = Vec_IntAlloc( Abc_TruthWordNum(p->nVars) * 1000 ); - - // set the manager - s_pMan = p; -p->timeTotal += clock() - clkTotal; -} - -/**Function************************************************************* - - Synopsis [Returns the given record.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkRecStop() -{ - assert( s_pMan != NULL ); - if ( s_pMan->pNtk ) - Abc_NtkDelete( s_pMan->pNtk ); - Vec_PtrFree( s_pMan->vTtNodes ); - Vec_PtrFree( s_pMan->vTtElems ); - free( s_pMan->pBins ); - - // temporaries - free( s_pMan->pBytes ); - free( s_pMan->pMints ); - free( s_pMan->pTemp1 ); - free( s_pMan->pTemp2 ); - Vec_PtrFree( s_pMan->vNodes ); - Vec_PtrFree( s_pMan->vTtTemps ); - if ( s_pMan->vLabels ) - Vec_PtrFree( s_pMan->vLabels ); - if ( s_pMan->vCosts ) - Vec_StrFree( s_pMan->vCosts ); - Vec_IntFree( s_pMan->vMemory ); - - free( s_pMan ); - s_pMan = NULL; -} - -/**Function************************************************************* - - Synopsis [Returns the given record.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkRecUse() -{ - Abc_ManRec_t * p = s_pMan; - Abc_Ntk_t * pNtk = p->pNtk; - assert( p != NULL ); - Abc_NtkRecPs(); - p->pNtk = NULL; - Abc_NtkRecStop(); - return pNtk; -} - -static inline void Abc_ObjSetMax( Abc_Obj_t * pObj, int Value ) { assert( pObj->Level < 0xff ); pObj->Level = (Value << 8) | (pObj->Level & 0xff); } -static inline void Abc_ObjClearMax( Abc_Obj_t * pObj ) { pObj->Level = (pObj->Level & 0xff); } -static inline int Abc_ObjGetMax( Abc_Obj_t * pObj ) { return (pObj->Level >> 8) & 0xff; } - -/**Function************************************************************* - - Synopsis [Print statistics about the current record.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkRecPs() -{ - int Counter, Counters[17] = {0}; - int CounterS, CountersS[17] = {0}; - Abc_ManRec_t * p = s_pMan; - Abc_Ntk_t * pNtk = p->pNtk; - Abc_Obj_t * pObj, * pEntry, * pTemp; - int i; - - // set the max PI number - Abc_NtkForEachPi( pNtk, pObj, i ) - Abc_ObjSetMax( pObj, i+1 ); - Abc_AigForEachAnd( pNtk, pObj, i ) - Abc_ObjSetMax( pObj, ABC_MAX( Abc_ObjGetMax(Abc_ObjFanin0(pObj)), Abc_ObjGetMax(Abc_ObjFanin1(pObj)) ) ); - // go through the table - Counter = CounterS = 0; - for ( i = 0; i < p->nBins; i++ ) - for ( pEntry = p->pBins[i]; pEntry; pEntry = pEntry->pCopy ) - { - Counters[ Abc_ObjGetMax(pEntry) ]++; - Counter++; - for ( pTemp = pEntry; pTemp; pTemp = (Abc_Obj_t *)pTemp->pEquiv ) - { - assert( Abc_ObjGetMax(pTemp) == Abc_ObjGetMax(pEntry) ); - CountersS[ Abc_ObjGetMax(pTemp) ]++; - CounterS++; - } - } -// printf( "Functions = %d. Expected = %d.\n", Counter, p->nAddedFuncs ); -// printf( "Subgraphs = %d. Expected = %d.\n", CounterS, p->nAdded ); - assert( Counter == p->nAddedFuncs ); - assert( CounterS == p->nAdded ); - - // clean - Abc_NtkForEachObj( pNtk, pObj, i ) - { - Abc_ObjClearMax( pObj ); - } - - printf( "The record with %d AND nodes in %d subgraphs for %d functions with %d inputs:\n", - Abc_NtkNodeNum(pNtk), Abc_NtkPoNum(pNtk), p->nAddedFuncs, Abc_NtkPiNum(pNtk) ); - for ( i = 0; i <= 16; i++ ) - { - if ( Counters[i] ) - printf( "Inputs = %2d. Funcs = %8d. Subgrs = %8d. Ratio = %6.2f.\n", i, Counters[i], CountersS[i], 1.0*CountersS[i]/Counters[i] ); - } - - printf( "Subgraphs tried = %8d. (%6.2f %%)\n", p->nTried, !p->nTried? 0 : 100.0*p->nTried/p->nTried ); - printf( "Subgraphs filtered by support size = %8d. (%6.2f %%)\n", p->nFilterSize, !p->nTried? 0 : 100.0*p->nFilterSize/p->nTried ); - printf( "Subgraphs filtered by structural redundancy = %8d. (%6.2f %%)\n", p->nFilterRedund, !p->nTried? 0 : 100.0*p->nFilterRedund/p->nTried ); - printf( "Subgraphs filtered by volume = %8d. (%6.2f %%)\n", p->nFilterVolume, !p->nTried? 0 : 100.0*p->nFilterVolume/p->nTried ); - printf( "Subgraphs filtered by TT redundancy = %8d. (%6.2f %%)\n", p->nFilterTruth, !p->nTried? 0 : 100.0*p->nFilterTruth/p->nTried ); - printf( "Subgraphs filtered by error = %8d. (%6.2f %%)\n", p->nFilterError, !p->nTried? 0 : 100.0*p->nFilterError/p->nTried ); - printf( "Subgraphs filtered by isomorphism = %8d. (%6.2f %%)\n", p->nFilterSame, !p->nTried? 0 : 100.0*p->nFilterSame/p->nTried ); - printf( "Subgraphs added = %8d. (%6.2f %%)\n", p->nAdded, !p->nTried? 0 : 100.0*p->nAdded/p->nTried ); - printf( "Functions added = %8d. (%6.2f %%)\n", p->nAddedFuncs, !p->nTried? 0 : 100.0*p->nAddedFuncs/p->nTried ); - - p->timeOther = p->timeTotal - p->timeCollect - p->timeTruth - p->timeCanon; - PRTP( "Collecting nodes ", p->timeCollect, p->timeTotal ); - PRTP( "Computing truth ", p->timeTruth, p->timeTotal ); - PRTP( "Canonicizing ", p->timeCanon, p->timeTotal ); - PRTP( "Other ", p->timeOther, p->timeTotal ); - PRTP( "TOTAL ", p->timeTotal, p->timeTotal ); - if ( p->nFunsFound ) - printf( "During rewriting found = %d and not found = %d functions.\n", p->nFunsFound, p->nFunsNotFound ); -} - -/**Function************************************************************* - - Synopsis [Filters the current record.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkRecFilter( int iVar, int iPlus ) -{ -} - -/**Function************************************************************* - - Synopsis [Returns the hash key.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline unsigned Abc_NtkRecTableHash( unsigned * pTruth, int nVars, int nBins, int * pPrimes ) -{ - int i, nWords = Kit_TruthWordNum( nVars ); - unsigned uHash = 0; - for ( i = 0; i < nWords; i++ ) - uHash ^= pTruth[i] * pPrimes[i & 0x7]; - return uHash % nBins; -} - -/**Function************************************************************* - - Synopsis [Returns the given record.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t ** Abc_NtkRecTableLookup( Abc_ManRec_t * p, unsigned * pTruth, int nVars ) -{ - static int s_Primes[10] = { 1291, 1699, 2357, 4177, 5147, 5647, 6343, 7103, 7873, 8147 }; - Abc_Obj_t ** ppSpot, * pEntry; - ppSpot = p->pBins + Abc_NtkRecTableHash( pTruth, nVars, p->nBins, s_Primes ); - for ( pEntry = *ppSpot; pEntry; ppSpot = &pEntry->pCopy, pEntry = pEntry->pCopy ) - if ( Kit_TruthIsEqualWithPhase(Vec_PtrEntry(p->vTtNodes, pEntry->Id), pTruth, nVars) ) - return ppSpot; - return ppSpot; -} - -/**Function************************************************************* - - Synopsis [Computes the truth table of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRecComputeTruth( Abc_Obj_t * pObj, Vec_Ptr_t * vTtNodes, int nVars ) -{ - unsigned * pTruth, * pTruth0, * pTruth1; - int RetValue; - assert( Abc_ObjIsNode(pObj) ); - pTruth = Vec_PtrEntry( vTtNodes, pObj->Id ); - pTruth0 = Vec_PtrEntry( vTtNodes, Abc_ObjFaninId0(pObj) ); - pTruth1 = Vec_PtrEntry( vTtNodes, Abc_ObjFaninId1(pObj) ); - Kit_TruthAndPhase( pTruth, pTruth0, pTruth1, nVars, Abc_ObjFaninC0(pObj), Abc_ObjFaninC1(pObj) ); - assert( (pTruth[0] & 1) == pObj->fPhase ); - RetValue = ((pTruth[0] & 1) == pObj->fPhase); - return RetValue; -} - -/**Function************************************************************* - - Synopsis [Performs renoding as technology mapping.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkRecAdd( Abc_Ntk_t * pNtk ) -{ - extern Abc_Ntk_t * Abc_NtkIf( Abc_Ntk_t * pNtk, If_Par_t * pPars ); - extern int Abc_NtkRecAddCut( If_Man_t * pIfMan, If_Obj_t * pRoot, If_Cut_t * pCut ); - - If_Par_t Pars, * pPars = &Pars; - Abc_Ntk_t * pNtkNew; - int clk = clock(); - - if ( Abc_NtkGetChoiceNum( pNtk ) ) - printf( "Performing renoding with choices.\n" ); - - // set defaults - memset( pPars, 0, sizeof(If_Par_t) ); - // user-controlable paramters - pPars->nLutSize = s_pMan->nVarsInit; - pPars->nCutsMax = s_pMan->nCuts; - pPars->nFlowIters = 0; - pPars->nAreaIters = 0; - pPars->DelayTarget = -1; - pPars->fPreprocess = 0; - pPars->fArea = 1; - pPars->fFancy = 0; - pPars->fExpRed = 0; - pPars->fLatchPaths = 0; - pPars->fSeqMap = 0; - pPars->fVerbose = 0; - // internal parameters - pPars->fTruth = 0; - pPars->fUsePerm = 0; - pPars->nLatches = 0; - pPars->pLutLib = NULL; // Abc_FrameReadLibLut(); - pPars->pTimesArr = NULL; - pPars->pTimesArr = NULL; - pPars->fUseBdds = 0; - pPars->fUseSops = 0; - pPars->fUseCnfs = 0; - pPars->fUseMv = 0; - pPars->pFuncCost = NULL; - pPars->pFuncUser = Abc_NtkRecAddCut; - - // perform recording - pNtkNew = Abc_NtkIf( pNtk, pPars ); - Abc_NtkDelete( pNtkNew ); -s_pMan->timeTotal += clock() - clk; - -// if ( !Abc_NtkCheck( s_pMan->pNtk ) ) -// printf( "Abc_NtkRecAdd: The network check has failed.\n" ); -} - -/**Function************************************************************* - - Synopsis [Adds the cut function to the internal storage.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkRecCollectNodes_rec( If_Obj_t * pNode, Vec_Ptr_t * vNodes ) -{ - if ( pNode->fMark ) - return; - pNode->fMark = 1; - assert( If_ObjIsAnd(pNode) ); - Abc_NtkRecCollectNodes_rec( If_ObjFanin0(pNode), vNodes ); - Abc_NtkRecCollectNodes_rec( If_ObjFanin1(pNode), vNodes ); - Vec_PtrPush( vNodes, pNode ); -} - -/**Function************************************************************* - - Synopsis [Adds the cut function to the internal storage.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRecCollectNodes( If_Man_t * pIfMan, If_Obj_t * pRoot, If_Cut_t * pCut, Vec_Ptr_t * vNodes ) -{ - If_Obj_t * pLeaf; - int i, RetValue = 1; - - // collect the internal nodes of the cut - Vec_PtrClear( vNodes ); - If_CutForEachLeaf( pIfMan, pCut, pLeaf, i ) - { - Vec_PtrPush( vNodes, pLeaf ); - assert( pLeaf->fMark == 0 ); - pLeaf->fMark = 1; - } - - // collect other nodes - Abc_NtkRecCollectNodes_rec( pRoot, vNodes ); - - // check if there are leaves, such that both of their fanins are marked - // this indicates a redundant cut - If_CutForEachLeaf( pIfMan, pCut, pLeaf, i ) - { - if ( !If_ObjIsAnd(pLeaf) ) - continue; - if ( If_ObjFanin0(pLeaf)->fMark && If_ObjFanin1(pLeaf)->fMark ) - { - RetValue = 0; - break; - } - } - - // clean the mark - Vec_PtrForEachEntry( vNodes, pLeaf, i ) - pLeaf->fMark = 0; -/* - if ( pRoot->Id == 2639 ) - { - // print the cut - Vec_PtrForEachEntry( vNodes, pLeaf, i ) - { - if ( If_ObjIsAnd(pLeaf) ) - printf( "%4d = %c%4d & %c%4d\n", pLeaf->Id, - (If_ObjFaninC0(pLeaf)? '-':'+'), If_ObjFanin0(pLeaf)->Id, - (If_ObjFaninC1(pLeaf)? '-':'+'), If_ObjFanin1(pLeaf)->Id ); - else - printf( "%4d = pi\n", pLeaf->Id ); - } - printf( "\n" ); - } -*/ - return RetValue; -} - -/**Function************************************************************* - - Synopsis [Computes truth tables of nodes in the cut.] - - Description [Returns 0 if the TT does not depend on some cut variables. - Or if the TT can be expressed simpler using other nodes.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRecCutTruth( Vec_Ptr_t * vNodes, int nLeaves, Vec_Ptr_t * vTtTemps, Vec_Ptr_t * vTtElems ) -{ - unsigned * pSims, * pSims0, * pSims1; - unsigned * pTemp = s_pMan->pTemp2; - unsigned uWord; - If_Obj_t * pObj, * pObj2, * pRoot; - int i, k, nLimit, nInputs = s_pMan->nVars; - - assert( Vec_PtrSize(vNodes) > nLeaves ); - - // set the elementary truth tables and compute the truth tables of the nodes - Vec_PtrForEachEntry( vNodes, pObj, i ) - { - pObj->pCopy = Vec_PtrEntry(vTtTemps, i); - pSims = (unsigned *)pObj->pCopy; - if ( i < nLeaves ) - { - Kit_TruthCopy( pSims, Vec_PtrEntry(vTtElems, i), nInputs ); - continue; - } - assert( If_ObjIsAnd(pObj) ); - // get hold of the simulation information - pSims0 = (unsigned *)If_ObjFanin0(pObj)->pCopy; - pSims1 = (unsigned *)If_ObjFanin1(pObj)->pCopy; - // simulate the node - Kit_TruthAndPhase( pSims, pSims0, pSims1, nInputs, If_ObjFaninC0(pObj), If_ObjFaninC1(pObj) ); - } - - // check the support size - pRoot = Vec_PtrEntryLast( vNodes ); - pSims = (unsigned *)pRoot->pCopy; - if ( Kit_TruthSupport(pSims, nInputs) != Kit_BitMask(nLeaves) ) - return 0; - - // make sure none of the nodes has the same simulation info as the output - // check pairwise comparisons - nLimit = Vec_PtrSize(vNodes) - 1; - Vec_PtrForEachEntryStop( vNodes, pObj, i, nLimit ) - { - pSims0 = (unsigned *)pObj->pCopy; - if ( Kit_TruthIsEqualWithPhase(pSims, pSims0, nInputs) ) - return 0; - Vec_PtrForEachEntryStop( vNodes, pObj2, k, i ) - { - if ( (If_ObjFanin0(pRoot) == pObj && If_ObjFanin1(pRoot) == pObj2) || - (If_ObjFanin1(pRoot) == pObj && If_ObjFanin0(pRoot) == pObj2) ) - continue; - pSims1 = (unsigned *)pObj2->pCopy; - - uWord = pSims0[0] & pSims1[0]; - if ( pSims[0] == uWord || pSims[0] == ~uWord ) - { - Kit_TruthAndPhase( pTemp, pSims0, pSims1, nInputs, 0, 0 ); - if ( Kit_TruthIsEqualWithPhase(pSims, pTemp, nInputs) ) - return 0; - } - - uWord = pSims0[0] & ~pSims1[0]; - if ( pSims[0] == uWord || pSims[0] == ~uWord ) - { - Kit_TruthAndPhase( pTemp, pSims0, pSims1, nInputs, 0, 1 ); - if ( Kit_TruthIsEqualWithPhase(pSims, pTemp, nInputs) ) - return 0; - } - - uWord = ~pSims0[0] & pSims1[0]; - if ( pSims[0] == uWord || pSims[0] == ~uWord ) - { - Kit_TruthAndPhase( pTemp, pSims0, pSims1, nInputs, 1, 0 ); - if ( Kit_TruthIsEqualWithPhase(pSims, pTemp, nInputs) ) - return 0; - } - - uWord = ~pSims0[0] & ~pSims1[0]; - if ( pSims[0] == uWord || pSims[0] == ~uWord ) - { - Kit_TruthAndPhase( pTemp, pSims0, pSims1, nInputs, 1, 1 ); - if ( Kit_TruthIsEqualWithPhase(pSims, pTemp, nInputs) ) - return 0; - } - } - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Adds the cut function to the internal storage.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRecAddCutCheckCycle_rec( Abc_Obj_t * pRoot, Abc_Obj_t * pObj ) -{ - assert( pRoot->Level > 0 ); - if ( pObj->Level < pRoot->Level ) - return 1; - if ( pObj == pRoot ) - return 0; - if ( !Abc_NtkRecAddCutCheckCycle_rec(pRoot, Abc_ObjFanin0(pObj)) ) - return 0; - if ( !Abc_NtkRecAddCutCheckCycle_rec(pRoot, Abc_ObjFanin1(pObj)) ) - return 0; - return 1; -} - -/**Function************************************************************* - - Synopsis [Adds the cut function to the internal storage.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRecAddCut( If_Man_t * pIfMan, If_Obj_t * pRoot, If_Cut_t * pCut ) -{ - static int s_MaxSize[16] = { 0 }; - char Buffer[40], Name[20], Truth[20]; - char pCanonPerm[16]; - Abc_Obj_t * pObj, * pFanin0, * pFanin1, ** ppSpot, * pObjPo; - Abc_Ntk_t * pAig = s_pMan->pNtk; - If_Obj_t * pIfObj; - Vec_Ptr_t * vNodes = s_pMan->vNodes; - unsigned * pInOut = s_pMan->pTemp1; - unsigned * pTemp = s_pMan->pTemp2; - unsigned * pTruth; - int i, RetValue, nNodes, nNodesBeg, nInputs = s_pMan->nVars, nLeaves = If_CutLeaveNum(pCut); - unsigned uCanonPhase; - int clk; - - if ( pRoot->Id == 2639 ) - { - int y = 0; - } - - assert( nInputs <= 16 ); - assert( nInputs == (int)pCut->nLimit ); - s_pMan->nTried++; - - // skip small cuts - if ( nLeaves < 3 ) - { - s_pMan->nFilterSize++; - return 1; - } - - // collect internal nodes and skip redundant cuts -clk = clock(); - RetValue = Abc_NtkRecCollectNodes( pIfMan, pRoot, pCut, vNodes ); -s_pMan->timeCollect += clock() - clk; - if ( !RetValue ) - { - s_pMan->nFilterRedund++; - return 1; - } - - // skip cuts with very large volume - if ( Vec_PtrSize(vNodes) > nLeaves + 3*(nLeaves-1) + s_MaxSize[nLeaves] ) - { - s_pMan->nFilterVolume++; - return 1; - } - - // compute truth table and skip the redundant structures -clk = clock(); - RetValue = Abc_NtkRecCutTruth( vNodes, nLeaves, s_pMan->vTtTemps, s_pMan->vTtElems ); -s_pMan->timeTruth += clock() - clk; - if ( !RetValue ) - { - s_pMan->nFilterTruth++; - return 1; - } - - // copy the truth table - Kit_TruthCopy( pInOut, (unsigned *)pRoot->pCopy, nInputs ); - - // set permutation - for ( i = 0; i < nInputs; i++ ) - pCanonPerm[i] = i; - - // semi-canonicize the truth table -clk = clock(); - uCanonPhase = Kit_TruthSemiCanonicize( pInOut, pTemp, nInputs, pCanonPerm, (short *)s_pMan->pMints ); -s_pMan->timeCanon += clock() - clk; - // pCanonPerm and uCanonPhase show what was the variable corresponding to each var in the current truth - - // go through the variables in the new truth table - for ( i = 0; i < nLeaves; i++ ) - { - // get hold of the corresponding leaf - pIfObj = If_ManObj( pIfMan, pCut->pLeaves[pCanonPerm[i]] ); - // get hold of the corresponding new node - pObj = Abc_NtkPi( pAig, i ); - pObj = Abc_ObjNotCond( pObj, (uCanonPhase & (1 << i)) ); - // map them - pIfObj->pCopy = pObj; -/* - if ( pRoot->Id == 2639 ) - { - unsigned uSupp; - printf( "Node %6d : ", pIfObj->Id ); - printf( "Support " ); - uSupp = Kit_TruthSupport(Vec_PtrEntry( s_pMan->vTtNodes, Abc_ObjRegular(pObj)->Id ), nInputs); - Extra_PrintBinary( stdout, &uSupp, nInputs ); - printf( " " ); - Extra_PrintBinary( stdout, Vec_PtrEntry( s_pMan->vTtNodes, Abc_ObjRegular(pObj)->Id ), 1<<6 ); - printf( "\n" ); - } -*/ - } - - // build the node and compute its truth table - nNodesBeg = Abc_NtkObjNumMax( pAig ); - Vec_PtrForEachEntryStart( vNodes, pIfObj, i, nLeaves ) - { - pFanin0 = Abc_ObjNotCond( If_ObjFanin0(pIfObj)->pCopy, If_ObjFaninC0(pIfObj) ); - pFanin1 = Abc_ObjNotCond( If_ObjFanin1(pIfObj)->pCopy, If_ObjFaninC1(pIfObj) ); - - nNodes = Abc_NtkObjNumMax( pAig ); - pObj = Abc_AigAnd( pAig->pManFunc, pFanin0, pFanin1 ); - assert( !Abc_ObjIsComplement(pObj) ); - pIfObj->pCopy = pObj; - - if ( pObj->Id == nNodes ) - { - // increase storage for truth tables - if ( Vec_PtrSize(s_pMan->vTtNodes) <= pObj->Id ) - Vec_PtrDoubleSimInfo(s_pMan->vTtNodes); - // compute the truth table - RetValue = Abc_NtkRecComputeTruth( pObj, s_pMan->vTtNodes, nInputs ); - if ( RetValue == 0 ) - { - s_pMan->nFilterError++; - printf( "T" ); - return 1; - } - } - } - - pTruth = Vec_PtrEntry( s_pMan->vTtNodes, pObj->Id ); - if ( Kit_TruthSupport(pTruth, nInputs) != Kit_BitMask(nLeaves) ) - { - s_pMan->nFilterError++; - printf( "S" ); - return 1; - } - - // compare the truth tables - if ( !Kit_TruthIsEqualWithPhase( pTruth, pInOut, nInputs ) ) - { - s_pMan->nFilterError++; - printf( "F" ); - return 1; - } -// Extra_PrintBinary( stdout, pInOut, 8 ); printf( "\n" ); - - // if not new nodes were added and the node has a CO fanout - if ( nNodesBeg == Abc_NtkObjNumMax(pAig) && Abc_NodeFindCoFanout(pObj) != NULL ) - { - s_pMan->nFilterSame++; - return 1; - } - s_pMan->nAdded++; - - // create PO for this node - pObjPo = Abc_NtkCreatePo(pAig); - Abc_ObjAddFanin( pObjPo, pObj ); - - // assign the name to this PO - sprintf( Name, "%d_%06d", nLeaves, Abc_NtkPoNum(pAig) ); - if ( (nInputs <= 6) && 0 ) - { - Extra_PrintHexadecimalString( Truth, pInOut, nInputs ); - sprintf( Buffer, "%s_%s", Name, Truth ); - } - else - { - sprintf( Buffer, "%s", Name ); - } - Abc_ObjAssignName( pObjPo, Buffer, NULL ); - - // add the resulting truth table to the hash table - ppSpot = Abc_NtkRecTableLookup( s_pMan, pTruth, nInputs ); - assert( pObj->pEquiv == NULL ); - assert( pObj->pCopy == NULL ); - if ( *ppSpot == NULL ) - { - s_pMan->nAddedFuncs++; - *ppSpot = pObj; - } - else - { - pObj->pEquiv = (*ppSpot)->pEquiv; - (*ppSpot)->pEquiv = (Hop_Obj_t *)pObj; - if ( !Abc_NtkRecAddCutCheckCycle_rec(*ppSpot, pObj) ) - printf( "Loop!\n" ); - } - return 1; -} - - -/**Function************************************************************* - - Synopsis [Labels the record AIG with the corresponding new AIG nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NtkRecStrashNodeLabel_rec( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pObj, int fBuild, Vec_Ptr_t * vLabels ) -{ - Abc_Obj_t * pFanin0New, * pFanin1New, * pLabel; - assert( !Abc_ObjIsComplement(pObj) ); - // if this node is already visited, skip - if ( Abc_NodeIsTravIdCurrent( pObj ) ) - return Vec_PtrEntry( vLabels, pObj->Id ); - assert( Abc_ObjIsNode(pObj) ); - // mark the node as visited - Abc_NodeSetTravIdCurrent( pObj ); - // label the fanins - pFanin0New = Abc_NtkRecStrashNodeLabel_rec( pNtkNew, Abc_ObjFanin0(pObj), fBuild, vLabels ); - pFanin1New = Abc_NtkRecStrashNodeLabel_rec( pNtkNew, Abc_ObjFanin1(pObj), fBuild, vLabels ); - // label the node if possible - pLabel = NULL; - if ( pFanin0New && pFanin1New ) - { - pFanin0New = Abc_ObjNotCond( pFanin0New, Abc_ObjFaninC0(pObj) ); - pFanin1New = Abc_ObjNotCond( pFanin1New, Abc_ObjFaninC1(pObj) ); - if ( fBuild ) - pLabel = Abc_AigAnd( pNtkNew->pManFunc, pFanin0New, pFanin1New ); - else - pLabel = Abc_AigAndLookup( pNtkNew->pManFunc, pFanin0New, pFanin1New ); - } - Vec_PtrWriteEntry( vLabels, pObj->Id, pLabel ); - return pLabel; -} - -/**Function************************************************************* - - Synopsis [Counts the area of the given node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRecStrashNodeCount_rec( Abc_Obj_t * pObj, Vec_Str_t * vCosts, Vec_Ptr_t * vLabels ) -{ - int Cost0, Cost1; - if ( Vec_PtrEntry( vLabels, pObj->Id ) ) - return 0; - assert( Abc_ObjIsNode(pObj) ); - // if this node is already visited, skip - if ( Abc_NodeIsTravIdCurrent( pObj ) ) - return Vec_StrEntry( vCosts, pObj->Id ); - // mark the node as visited - Abc_NodeSetTravIdCurrent( pObj ); - // count for the fanins - Cost0 = Abc_NtkRecStrashNodeCount_rec( Abc_ObjFanin0(pObj), vCosts, vLabels ); - Cost1 = Abc_NtkRecStrashNodeCount_rec( Abc_ObjFanin1(pObj), vCosts, vLabels ); - Vec_StrWriteEntry( vCosts, pObj->Id, (char)(Cost0 + Cost1 + 1) ); - return Cost0 + Cost1 + 1; -} - -/**Function************************************************************* - - Synopsis [Strashes the given node using its local function.] - - Description [Assumes that the fanins are already strashed. - Returns 0 if the function is not found in the table.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRecStrashNode( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pObj, unsigned * pTruth, int nVars ) -{ - char pCanonPerm[16]; - Abc_Ntk_t * pAig = s_pMan->pNtk; - unsigned * pInOut = s_pMan->pTemp1; - unsigned * pTemp = s_pMan->pTemp2; - unsigned * pTruthRec; - Abc_Obj_t * pCand, * pCandMin, * pLeaf, * pFanin, ** ppSpot; - unsigned uCanonPhase; - int i, nLeaves, CostMin, Cost, nOnes, fCompl; - - // check if the record works - nLeaves = Abc_ObjFaninNum(pObj); - assert( nLeaves >= 3 && nLeaves <= s_pMan->nVars ); - pFanin = Abc_ObjFanin0(pObj); - assert( Abc_ObjRegular(pFanin->pCopy)->pNtk == pNtkNew ); - assert( s_pMan != NULL ); - assert( nVars == s_pMan->nVars ); - - // copy the truth table - Kit_TruthCopy( pInOut, pTruth, nVars ); - - // set permutation - for ( i = 0; i < nVars; i++ ) - pCanonPerm[i] = i; - - // canonicize the truth table - uCanonPhase = Kit_TruthSemiCanonicize( pInOut, pTemp, nVars, pCanonPerm, (short *)s_pMan->pMints ); - - // get hold of the curresponding class - ppSpot = Abc_NtkRecTableLookup( s_pMan, pInOut, nVars ); - if ( *ppSpot == NULL ) - { - s_pMan->nFunsNotFound++; -// printf( "The class of a function with %d inputs is not found.\n", nLeaves ); - return 0; - } - s_pMan->nFunsFound++; - - // make sure the truth table is the same - pTruthRec = Vec_PtrEntry( s_pMan->vTtNodes, (*ppSpot)->Id ); - if ( !Kit_TruthIsEqualWithPhase( pTruthRec, pInOut, nVars ) ) - { - assert( 0 ); - return 0; - } - - - // allocate storage for costs - if ( s_pMan->vLabels && Vec_PtrSize(s_pMan->vLabels) < Abc_NtkObjNumMax(pAig) ) - { - Vec_PtrFree( s_pMan->vLabels ); - s_pMan->vLabels = NULL; - } - if ( s_pMan->vLabels == NULL ) - s_pMan->vLabels = Vec_PtrStart( Abc_NtkObjNumMax(pAig) ); - - // go through the variables in the new truth table - Abc_NtkIncrementTravId( pAig ); - for ( i = 0; i < nLeaves; i++ ) - { - // get hold of the corresponding fanin - pFanin = Abc_ObjFanin( pObj, pCanonPerm[i] )->pCopy; - pFanin = Abc_ObjNotCond( pFanin, (uCanonPhase & (1 << i)) ); - // label the PI of the AIG subgraphs with this fanin - pLeaf = Abc_NtkPi( pAig, i ); - Vec_PtrWriteEntry( s_pMan->vLabels, pLeaf->Id, pFanin ); - Abc_NodeSetTravIdCurrent( pLeaf ); - } - - // go through the candidates - and recursively label them - for ( pCand = *ppSpot; pCand; pCand = (Abc_Obj_t *)pCand->pEquiv ) - Abc_NtkRecStrashNodeLabel_rec( pNtkNew, pCand, 0, s_pMan->vLabels ); - - - // allocate storage for costs - if ( s_pMan->vCosts && Vec_StrSize(s_pMan->vCosts) < Abc_NtkObjNumMax(pAig) ) - { - Vec_StrFree( s_pMan->vCosts ); - s_pMan->vCosts = NULL; - } - if ( s_pMan->vCosts == NULL ) - s_pMan->vCosts = Vec_StrStart( Abc_NtkObjNumMax(pAig) ); - - // find the best subgraph - CostMin = ABC_INFINITY; - pCandMin = NULL; - for ( pCand = *ppSpot; pCand; pCand = (Abc_Obj_t *)pCand->pEquiv ) - { - // label the leaves - Abc_NtkIncrementTravId( pAig ); - // count the number of non-labeled nodes - Cost = Abc_NtkRecStrashNodeCount_rec( pCand, s_pMan->vCosts, s_pMan->vLabels ); - if ( CostMin > Cost ) - { -// printf( "%d ", Cost ); - CostMin = Cost; - pCandMin = pCand; - } - } -// printf( "\n" ); - assert( pCandMin != NULL ); - if ( pCandMin == NULL ) - return 0; - - - // label the leaves - Abc_NtkIncrementTravId( pAig ); - for ( i = 0; i < nLeaves; i++ ) - Abc_NodeSetTravIdCurrent( Abc_NtkPi(pAig, i) ); - - // implement the subgraph - pObj->pCopy = Abc_NtkRecStrashNodeLabel_rec( pNtkNew, pCandMin, 1, s_pMan->vLabels ); - assert( Abc_ObjRegular(pObj->pCopy)->pNtk == pNtkNew ); - - // determine phase difference - nOnes = Kit_TruthCountOnes(pTruth, nVars); - fCompl = (nOnes > (1<< nVars)/2); -// assert( fCompl == ((uCanonPhase & (1 << nVars)) > 0) ); - - nOnes = Kit_TruthCountOnes(pTruthRec, nVars); - fCompl ^= (nOnes > (1<< nVars)/2); - // complement - pObj->pCopy = Abc_ObjNotCond( pObj->pCopy, fCompl ); - return 1; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcReconv.c b/src/base/abci/abcReconv.c deleted file mode 100644 index e77f055a..00000000 --- a/src/base/abci/abcReconv.c +++ /dev/null @@ -1,762 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcReconv.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Computation of reconvergence-driven cuts.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcReconv.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -struct Abc_ManCut_t_ -{ - // user specified parameters - int nNodeSizeMax; // the limit on the size of the supernode - int nConeSizeMax; // the limit on the size of the containing cone - int nNodeFanStop; // the limit on the size of the supernode - int nConeFanStop; // the limit on the size of the containing cone - // internal parameters - Vec_Ptr_t * vNodeLeaves; // fanins of the collapsed node (the cut) - Vec_Ptr_t * vConeLeaves; // fanins of the containing cone - Vec_Ptr_t * vVisited; // the visited nodes - Vec_Vec_t * vLevels; // the data structure to compute TFO nodes - Vec_Ptr_t * vNodesTfo; // the nodes in the TFO of the cut -}; - -static int Abc_NodeBuildCutLevelOne_int( Vec_Ptr_t * vVisited, Vec_Ptr_t * vLeaves, int nSizeLimit, int nFaninLimit ); -static int Abc_NodeBuildCutLevelTwo_int( Vec_Ptr_t * vVisited, Vec_Ptr_t * vLeaves, int nFaninLimit ); -static void Abc_NodeConeMarkCollect_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vVisited ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Unmarks the TFI cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Abc_NodesMark( Vec_Ptr_t * vVisited ) -{ - Abc_Obj_t * pNode; - int i; - Vec_PtrForEachEntry( vVisited, pNode, i ) - pNode->fMarkA = 1; -} - -/**Function************************************************************* - - Synopsis [Unmarks the TFI cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Abc_NodesUnmark( Vec_Ptr_t * vVisited ) -{ - Abc_Obj_t * pNode; - int i; - Vec_PtrForEachEntry( vVisited, pNode, i ) - pNode->fMarkA = 0; -} - -/**Function************************************************************* - - Synopsis [Unmarks the TFI cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Abc_NodesUnmarkB( Vec_Ptr_t * vVisited ) -{ - Abc_Obj_t * pNode; - int i; - Vec_PtrForEachEntry( vVisited, pNode, i ) - pNode->fMarkB = 0; -} - -/**Function************************************************************* - - Synopsis [Evaluate the cost of removing the node from the set of leaves.] - - Description [Returns the number of new leaves that will be brought in. - Returns large number if the node cannot be removed from the set of leaves.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Abc_NodeGetLeafCostOne( Abc_Obj_t * pNode, int nFaninLimit ) -{ - int Cost; - // make sure the node is in the construction zone - assert( pNode->fMarkB == 1 ); - // cannot expand over the PI node - if ( Abc_ObjIsCi(pNode) ) - return 999; - // get the cost of the cone - Cost = (!Abc_ObjFanin0(pNode)->fMarkB) + (!Abc_ObjFanin1(pNode)->fMarkB); - // always accept if the number of leaves does not increase - if ( Cost < 2 ) - return Cost; - // skip nodes with many fanouts - if ( Abc_ObjFanoutNum(pNode) > nFaninLimit ) - return 999; - // return the number of nodes that will be on the leaves if this node is removed - return Cost; -} - -/**Function************************************************************* - - Synopsis [Evaluate the cost of removing the node from the set of leaves.] - - Description [Returns the number of new leaves that will be brought in. - Returns large number if the node cannot be removed from the set of leaves.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Abc_NodeGetLeafCostTwo( Abc_Obj_t * pNode, int nFaninLimit, - Abc_Obj_t ** ppLeafToAdd, Abc_Obj_t ** pNodeToMark1, Abc_Obj_t ** pNodeToMark2 ) -{ - Abc_Obj_t * pFanin0, * pFanin1, * pTemp; - Abc_Obj_t * pGrand, * pGrandToAdd; - // make sure the node is in the construction zone - assert( pNode->fMarkB == 1 ); - // cannot expand over the PI node - if ( Abc_ObjIsCi(pNode) ) - return 999; - // skip nodes with many fanouts -// if ( Abc_ObjFanoutNum(pNode) > nFaninLimit ) -// return 999; - // get the children - pFanin0 = Abc_ObjFanin0(pNode); - pFanin1 = Abc_ObjFanin1(pNode); - assert( !pFanin0->fMarkB && !pFanin1->fMarkB ); - // count the number of unique grandchildren that will be included - // return infinite cost if this number if more than 1 - if ( Abc_ObjIsCi(pFanin0) && Abc_ObjIsCi(pFanin1) ) - return 999; - // consider the special case when a non-CI fanin can be dropped - if ( !Abc_ObjIsCi(pFanin0) && Abc_ObjFanin0(pFanin0)->fMarkB && Abc_ObjFanin1(pFanin0)->fMarkB ) - { - *ppLeafToAdd = pFanin1; - *pNodeToMark1 = pFanin0; - *pNodeToMark2 = NULL; - return 1; - } - if ( !Abc_ObjIsCi(pFanin1) && Abc_ObjFanin0(pFanin1)->fMarkB && Abc_ObjFanin1(pFanin1)->fMarkB ) - { - *ppLeafToAdd = pFanin0; - *pNodeToMark1 = pFanin1; - *pNodeToMark2 = NULL; - return 1; - } - - // make the first node CI if any - if ( Abc_ObjIsCi(pFanin1) ) - pTemp = pFanin0, pFanin0 = pFanin1, pFanin1 = pTemp; - // consider the first node - pGrandToAdd = NULL; - if ( Abc_ObjIsCi(pFanin0) ) - { - *pNodeToMark1 = NULL; - pGrandToAdd = pFanin0; - } - else - { - *pNodeToMark1 = pFanin0; - pGrand = Abc_ObjFanin0(pFanin0); - if ( !pGrand->fMarkB ) - { - if ( pGrandToAdd && pGrandToAdd != pGrand ) - return 999; - pGrandToAdd = pGrand; - } - pGrand = Abc_ObjFanin1(pFanin0); - if ( !pGrand->fMarkB ) - { - if ( pGrandToAdd && pGrandToAdd != pGrand ) - return 999; - pGrandToAdd = pGrand; - } - } - // consider the second node - *pNodeToMark2 = pFanin1; - pGrand = Abc_ObjFanin0(pFanin1); - if ( !pGrand->fMarkB ) - { - if ( pGrandToAdd && pGrandToAdd != pGrand ) - return 999; - pGrandToAdd = pGrand; - } - pGrand = Abc_ObjFanin1(pFanin1); - if ( !pGrand->fMarkB ) - { - if ( pGrandToAdd && pGrandToAdd != pGrand ) - return 999; - pGrandToAdd = pGrand; - } - assert( pGrandToAdd != NULL ); - *ppLeafToAdd = pGrandToAdd; - return 1; -} - - -/**Function************************************************************* - - Synopsis [Finds a fanin-limited, reconvergence-driven cut for the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NodeFindCut( Abc_ManCut_t * p, Abc_Obj_t * pRoot, bool fContain ) -{ - Abc_Obj_t * pNode; - int i; - - assert( !Abc_ObjIsComplement(pRoot) ); - assert( Abc_ObjIsNode(pRoot) ); - - // start the visited nodes and mark them - Vec_PtrClear( p->vVisited ); - Vec_PtrPush( p->vVisited, pRoot ); - Vec_PtrPush( p->vVisited, Abc_ObjFanin0(pRoot) ); - Vec_PtrPush( p->vVisited, Abc_ObjFanin1(pRoot) ); - pRoot->fMarkB = 1; - Abc_ObjFanin0(pRoot)->fMarkB = 1; - Abc_ObjFanin1(pRoot)->fMarkB = 1; - - // start the cut - Vec_PtrClear( p->vNodeLeaves ); - Vec_PtrPush( p->vNodeLeaves, Abc_ObjFanin0(pRoot) ); - Vec_PtrPush( p->vNodeLeaves, Abc_ObjFanin1(pRoot) ); - - // compute the cut - while ( Abc_NodeBuildCutLevelOne_int( p->vVisited, p->vNodeLeaves, p->nNodeSizeMax, p->nNodeFanStop ) ); - assert( Vec_PtrSize(p->vNodeLeaves) <= p->nNodeSizeMax ); - - // return if containing cut is not requested - if ( !fContain ) - { - // unmark both fMarkA and fMarkB in tbe TFI - Abc_NodesUnmarkB( p->vVisited ); - return p->vNodeLeaves; - } - -//printf( "\n\n\n" ); - // compute the containing cut - assert( p->nNodeSizeMax < p->nConeSizeMax ); - // copy the current boundary - Vec_PtrClear( p->vConeLeaves ); - Vec_PtrForEachEntry( p->vNodeLeaves, pNode, i ) - Vec_PtrPush( p->vConeLeaves, pNode ); - // compute the containing cut - while ( Abc_NodeBuildCutLevelOne_int( p->vVisited, p->vConeLeaves, p->nConeSizeMax, p->nConeFanStop ) ); - assert( Vec_PtrSize(p->vConeLeaves) <= p->nConeSizeMax ); - // unmark TFI using fMarkA and fMarkB - Abc_NodesUnmarkB( p->vVisited ); - return p->vNodeLeaves; -} - -/**Function************************************************************* - - Synopsis [Builds reconvergence-driven cut by changing one leaf at a time.] - - Description [This procedure looks at the current leaves and tries to change - one leaf at a time in such a way that the cut grows as little as possible. - In evaluating the fanins, this procedure looks only at their immediate - predecessors (this is why it is called a one-level construction procedure).] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeBuildCutLevelOne_int( Vec_Ptr_t * vVisited, Vec_Ptr_t * vLeaves, int nSizeLimit, int nFaninLimit ) -{ - Abc_Obj_t * pNode, * pFaninBest, * pNext; - int CostBest, CostCur, i; - // find the best fanin - CostBest = 100; - pFaninBest = NULL; -//printf( "Evaluating fanins of the cut:\n" ); - Vec_PtrForEachEntry( vLeaves, pNode, i ) - { - CostCur = Abc_NodeGetLeafCostOne( pNode, nFaninLimit ); -//printf( " Fanin %s has cost %d.\n", Abc_ObjName(pNode), CostCur ); -// if ( CostBest > CostCur ) // performance improvement: expand the variable with the smallest level - if ( CostBest > CostCur || - (CostBest == CostCur && pNode->Level > pFaninBest->Level) ) - { - CostBest = CostCur; - pFaninBest = pNode; - } - if ( CostBest == 0 ) - break; - } - if ( pFaninBest == NULL ) - return 0; -// return Abc_NodeBuildCutLevelTwo_int( vVisited, vLeaves, nFaninLimit ); - - assert( CostBest < 3 ); - if ( vLeaves->nSize - 1 + CostBest > nSizeLimit ) - return 0; -// return Abc_NodeBuildCutLevelTwo_int( vVisited, vLeaves, nFaninLimit ); - - assert( Abc_ObjIsNode(pFaninBest) ); - // remove the node from the array - Vec_PtrRemove( vLeaves, pFaninBest ); -//printf( "Removing fanin %s.\n", Abc_ObjName(pFaninBest) ); - - // add the left child to the fanins - pNext = Abc_ObjFanin0(pFaninBest); - if ( !pNext->fMarkB ) - { -//printf( "Adding fanin %s.\n", Abc_ObjName(pNext) ); - pNext->fMarkB = 1; - Vec_PtrPush( vLeaves, pNext ); - Vec_PtrPush( vVisited, pNext ); - } - // add the right child to the fanins - pNext = Abc_ObjFanin1(pFaninBest); - if ( !pNext->fMarkB ) - { -//printf( "Adding fanin %s.\n", Abc_ObjName(pNext) ); - pNext->fMarkB = 1; - Vec_PtrPush( vLeaves, pNext ); - Vec_PtrPush( vVisited, pNext ); - } - assert( vLeaves->nSize <= nSizeLimit ); - // keep doing this - return 1; -} - -/**Function************************************************************* - - Synopsis [Builds reconvergence-driven cut by changing one leaf at a time.] - - Description [This procedure looks at the current leaves and tries to change - one leaf at a time in such a way that the cut grows as little as possible. - In evaluating the fanins, this procedure looks across two levels of fanins - (this is why it is called a two-level construction procedure).] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeBuildCutLevelTwo_int( Vec_Ptr_t * vVisited, Vec_Ptr_t * vLeaves, int nFaninLimit ) -{ - Abc_Obj_t * pNode, * pLeafToAdd, * pNodeToMark1, * pNodeToMark2; - int CostCur, i; - // find the best fanin - Vec_PtrForEachEntry( vLeaves, pNode, i ) - { - CostCur = Abc_NodeGetLeafCostTwo( pNode, nFaninLimit, &pLeafToAdd, &pNodeToMark1, &pNodeToMark2 ); - if ( CostCur < 2 ) - break; - } - if ( CostCur > 2 ) - return 0; - // remove the node from the array - Vec_PtrRemove( vLeaves, pNode ); - // add the node to the leaves - if ( pLeafToAdd ) - { - assert( !pLeafToAdd->fMarkB ); - pLeafToAdd->fMarkB = 1; - Vec_PtrPush( vLeaves, pLeafToAdd ); - Vec_PtrPush( vVisited, pLeafToAdd ); - } - // mark the other nodes - if ( pNodeToMark1 ) - { - assert( !pNodeToMark1->fMarkB ); - pNodeToMark1->fMarkB = 1; - Vec_PtrPush( vVisited, pNodeToMark1 ); - } - if ( pNodeToMark2 ) - { - assert( !pNodeToMark2->fMarkB ); - pNodeToMark2->fMarkB = 1; - Vec_PtrPush( vVisited, pNodeToMark2 ); - } - // keep doing this - return 1; -} - - -/**Function************************************************************* - - Synopsis [Get the nodes contained in the cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeConeCollect( Abc_Obj_t ** ppRoots, int nRoots, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vVisited, int fIncludeFanins ) -{ - Abc_Obj_t * pTemp; - int i; - // mark the fanins of the cone - Abc_NodesMark( vLeaves ); - // collect the nodes in the DFS order - Vec_PtrClear( vVisited ); - // add the fanins - if ( fIncludeFanins ) - Vec_PtrForEachEntry( vLeaves, pTemp, i ) - Vec_PtrPush( vVisited, pTemp ); - // add other nodes - for ( i = 0; i < nRoots; i++ ) - Abc_NodeConeMarkCollect_rec( ppRoots[i], vVisited ); - // unmark both sets - Abc_NodesUnmark( vLeaves ); - Abc_NodesUnmark( vVisited ); -} - -/**Function************************************************************* - - Synopsis [Marks the TFI cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeConeMarkCollect_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vVisited ) -{ - if ( pNode->fMarkA == 1 ) - return; - // visit transitive fanin - if ( Abc_ObjIsNode(pNode) ) - { - Abc_NodeConeMarkCollect_rec( Abc_ObjFanin0(pNode), vVisited ); - Abc_NodeConeMarkCollect_rec( Abc_ObjFanin1(pNode), vVisited ); - } - assert( pNode->fMarkA == 0 ); - pNode->fMarkA = 1; - Vec_PtrPush( vVisited, pNode ); -} - -/**Function************************************************************* - - Synopsis [Returns BDD representing the logic function of the cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -DdNode * Abc_NodeConeBdd( DdManager * dd, DdNode ** pbVars, Abc_Obj_t * pRoot, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vVisited ) -{ - Abc_Obj_t * pNode; - DdNode * bFunc0, * bFunc1, * bFunc; - int i; - // get the nodes in the cut without fanins in the DFS order - Abc_NodeConeCollect( &pRoot, 1, vLeaves, vVisited, 0 ); - // set the elementary BDDs - Vec_PtrForEachEntry( vLeaves, pNode, i ) - pNode->pCopy = (Abc_Obj_t *)pbVars[i]; - // compute the BDDs for the collected nodes - Vec_PtrForEachEntry( vVisited, pNode, i ) - { - assert( !Abc_ObjIsPi(pNode) ); - bFunc0 = Cudd_NotCond( Abc_ObjFanin0(pNode)->pCopy, Abc_ObjFaninC0(pNode) ); - bFunc1 = Cudd_NotCond( Abc_ObjFanin1(pNode)->pCopy, Abc_ObjFaninC1(pNode) ); - bFunc = Cudd_bddAnd( dd, bFunc0, bFunc1 ); Cudd_Ref( bFunc ); - pNode->pCopy = (Abc_Obj_t *)bFunc; - } - Cudd_Ref( bFunc ); - // dereference the intermediate ones - Vec_PtrForEachEntry( vVisited, pNode, i ) - Cudd_RecursiveDeref( dd, (DdNode *)pNode->pCopy ); - Cudd_Deref( bFunc ); - return bFunc; -} - -/**Function************************************************************* - - Synopsis [Returns BDD representing the transition relation of the cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -DdNode * Abc_NodeConeDcs( DdManager * dd, DdNode ** pbVarsX, DdNode ** pbVarsY, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vRoots, Vec_Ptr_t * vVisited ) -{ - DdNode * bFunc0, * bFunc1, * bFunc, * bTrans, * bTemp, * bCube, * bResult; - Abc_Obj_t * pNode; - int i; - // get the nodes in the cut without fanins in the DFS order - Abc_NodeConeCollect( (Abc_Obj_t **)vRoots->pArray, vRoots->nSize, vLeaves, vVisited, 0 ); - // set the elementary BDDs - Vec_PtrForEachEntry( vLeaves, pNode, i ) - pNode->pCopy = (Abc_Obj_t *)pbVarsX[i]; - // compute the BDDs for the collected nodes - Vec_PtrForEachEntry( vVisited, pNode, i ) - { - bFunc0 = Cudd_NotCond( Abc_ObjFanin0(pNode)->pCopy, Abc_ObjFaninC0(pNode) ); - bFunc1 = Cudd_NotCond( Abc_ObjFanin1(pNode)->pCopy, Abc_ObjFaninC1(pNode) ); - bFunc = Cudd_bddAnd( dd, bFunc0, bFunc1 ); Cudd_Ref( bFunc ); - pNode->pCopy = (Abc_Obj_t *)bFunc; - } - // compute the transition relation of the cone - bTrans = b1; Cudd_Ref( bTrans ); - Vec_PtrForEachEntry( vRoots, pNode, i ) - { - bFunc = Cudd_bddXnor( dd, (DdNode *)pNode->pCopy, pbVarsY[i] ); Cudd_Ref( bFunc ); - bTrans = Cudd_bddAnd( dd, bTemp = bTrans, bFunc ); Cudd_Ref( bTrans ); - Cudd_RecursiveDeref( dd, bTemp ); - Cudd_RecursiveDeref( dd, bFunc ); - } - // dereference the intermediate ones - Vec_PtrForEachEntry( vVisited, pNode, i ) - Cudd_RecursiveDeref( dd, (DdNode *)pNode->pCopy ); - // compute don't-cares - bCube = Extra_bddComputeRangeCube( dd, vRoots->nSize, vRoots->nSize + vLeaves->nSize ); Cudd_Ref( bCube ); - bResult = Cudd_bddExistAbstract( dd, bTrans, bCube ); Cudd_Ref( bResult ); - bResult = Cudd_Not( bResult ); - Cudd_RecursiveDeref( dd, bCube ); - Cudd_RecursiveDeref( dd, bTrans ); - Cudd_Deref( bResult ); - return bResult; -} - -/**Function************************************************************* - - Synopsis [Starts the resynthesis manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_ManCut_t * Abc_NtkManCutStart( int nNodeSizeMax, int nConeSizeMax, int nNodeFanStop, int nConeFanStop ) -{ - Abc_ManCut_t * p; - p = ALLOC( Abc_ManCut_t, 1 ); - memset( p, 0, sizeof(Abc_ManCut_t) ); - p->vNodeLeaves = Vec_PtrAlloc( 100 ); - p->vConeLeaves = Vec_PtrAlloc( 100 ); - p->vVisited = Vec_PtrAlloc( 100 ); - p->vLevels = Vec_VecAlloc( 100 ); - p->vNodesTfo = Vec_PtrAlloc( 100 ); - p->nNodeSizeMax = nNodeSizeMax; - p->nConeSizeMax = nConeSizeMax; - p->nNodeFanStop = nNodeFanStop; - p->nConeFanStop = nConeFanStop; - return p; -} - -/**Function************************************************************* - - Synopsis [Stops the resynthesis manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkManCutStop( Abc_ManCut_t * p ) -{ - Vec_PtrFree( p->vNodeLeaves ); - Vec_PtrFree( p->vConeLeaves ); - Vec_PtrFree( p->vVisited ); - Vec_VecFree( p->vLevels ); - Vec_PtrFree( p->vNodesTfo ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Returns the leaves of the cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NtkManCutReadCutLarge( Abc_ManCut_t * p ) -{ - return p->vConeLeaves; -} - -/**Function************************************************************* - - Synopsis [Returns the leaves of the cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NtkManCutReadCutSmall( Abc_ManCut_t * p ) -{ - return p->vNodeLeaves; -} - -/**Function************************************************************* - - Synopsis [Returns the leaves of the cone.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NtkManCutReadVisited( Abc_ManCut_t * p ) -{ - return p->vVisited; -} - - - -/**Function************************************************************* - - Synopsis [Collects the TFO of the cut in the topological order.] - - Description [TFO of the cut is defined as a set of nodes, for which the cut - is a cut, that is, every path from the collected nodes to the CIs goes through - a node in the cut. The nodes are collected if their level does not exceed - the given number (LevelMax). The nodes are returned in the topological order. - If the root node is given, its MFFC is marked, so that the collected nodes - do not contain any nodes in the MFFC.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_NodeCollectTfoCands( Abc_ManCut_t * p, Abc_Obj_t * pRoot, Vec_Ptr_t * vLeaves, int LevelMax ) -{ - Abc_Ntk_t * pNtk = pRoot->pNtk; - Vec_Ptr_t * vVec; - Abc_Obj_t * pNode, * pFanout; - int i, k, v, LevelMin; - assert( Abc_NtkIsStrash(pNtk) ); - - // assuming that the structure is clean - Vec_VecForEachLevel( p->vLevels, vVec, i ) - assert( vVec->nSize == 0 ); - - // put fanins into the structure while labeling them - Abc_NtkIncrementTravId( pNtk ); - LevelMin = -1; - Vec_PtrForEachEntry( vLeaves, pNode, i ) - { - if ( pNode->Level > (unsigned)LevelMax ) - continue; - Abc_NodeSetTravIdCurrent( pNode ); - Vec_VecPush( p->vLevels, pNode->Level, pNode ); - if ( LevelMin < (int)pNode->Level ) - LevelMin = pNode->Level; - } - assert( LevelMin >= 0 ); - - // mark MFFC - if ( pRoot ) - Abc_NodeMffcLabelAig( pRoot ); - - // go through the levels up - Vec_PtrClear( p->vNodesTfo ); - Vec_VecForEachEntryStart( p->vLevels, pNode, i, k, LevelMin ) - { - if ( i > LevelMax ) - break; - // if the node is not marked, it is not a fanin - if ( !Abc_NodeIsTravIdCurrent(pNode) ) - { - // check if it belongs to the TFO - if ( !Abc_NodeIsTravIdCurrent(Abc_ObjFanin0(pNode)) || - !Abc_NodeIsTravIdCurrent(Abc_ObjFanin1(pNode)) ) - continue; - // save the node in the TFO and label it - Vec_PtrPush( p->vNodesTfo, pNode ); - Abc_NodeSetTravIdCurrent( pNode ); - } - // go through the fanouts and add them to the structure if they meet the conditions - Abc_ObjForEachFanout( pNode, pFanout, v ) - { - // skip if fanout is a CO or its level exceeds - if ( Abc_ObjIsCo(pFanout) || pFanout->Level > (unsigned)LevelMax ) - continue; - // skip if it is already added or if it is in MFFC - if ( Abc_NodeIsTravIdCurrent(pFanout) ) - continue; - // add it to the structure but do not mark it (until tested later) - Vec_VecPushUnique( p->vLevels, pFanout->Level, pFanout ); - } - } - - // clear the levelized structure - Vec_VecForEachLevelStart( p->vLevels, vVec, i, LevelMin ) - { - if ( i > LevelMax ) - break; - Vec_PtrClear( vVec ); - } - return p->vNodesTfo; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcRefactor.c b/src/base/abci/abcRefactor.c deleted file mode 100644 index d2b77ed2..00000000 --- a/src/base/abci/abcRefactor.c +++ /dev/null @@ -1,379 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcRefactor.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Resynthesis based on collapsing and refactoring.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcRefactor.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "dec.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Abc_ManRef_t_ Abc_ManRef_t; -struct Abc_ManRef_t_ -{ - // user specified parameters - int nNodeSizeMax; // the limit on the size of the supernode - int nConeSizeMax; // the limit on the size of the containing cone - int fVerbose; // the verbosity flag - // internal data structures - DdManager * dd; // the BDD manager - Vec_Str_t * vCube; // temporary - Vec_Int_t * vForm; // temporary - Vec_Ptr_t * vVisited; // temporary - Vec_Ptr_t * vLeaves; // temporary - // node statistics - int nLastGain; - int nNodesConsidered; - int nNodesRefactored; - int nNodesGained; - int nNodesBeg; - int nNodesEnd; - // runtime statistics - int timeCut; - int timeBdd; - int timeDcs; - int timeSop; - int timeFact; - int timeEval; - int timeRes; - int timeNtk; - int timeTotal; -}; - -static void Abc_NtkManRefPrintStats( Abc_ManRef_t * p ); -static Abc_ManRef_t * Abc_NtkManRefStart( int nNodeSizeMax, int nConeSizeMax, bool fUseDcs, bool fVerbose ); -static void Abc_NtkManRefStop( Abc_ManRef_t * p ); -static Dec_Graph_t * Abc_NodeRefactor( Abc_ManRef_t * p, Abc_Obj_t * pNode, Vec_Ptr_t * vFanins, bool fUpdateLevel, bool fUseZeros, bool fUseDcs, bool fVerbose ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Performs incremental resynthesis of the AIG.] - - Description [Starting from each node, computes a reconvergence-driven cut, - derives BDD of the cut function, constructs ISOP, factors the ISOP, - and replaces the current implementation of the MFFC of the node by the - new factored form, if the number of AIG nodes is reduced and the total - number of levels of the AIG network is not increated. Returns the - number of AIG nodes saved.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRefactor( Abc_Ntk_t * pNtk, int nNodeSizeMax, int nConeSizeMax, bool fUpdateLevel, bool fUseZeros, bool fUseDcs, bool fVerbose ) -{ - ProgressBar * pProgress; - Abc_ManRef_t * pManRef; - Abc_ManCut_t * pManCut; - Dec_Graph_t * pFForm; - Vec_Ptr_t * vFanins; - Abc_Obj_t * pNode; - int clk, clkStart = clock(); - int i, nNodes; - - assert( Abc_NtkIsStrash(pNtk) ); - // cleanup the AIG - Abc_AigCleanup(pNtk->pManFunc); - // start the managers - pManCut = Abc_NtkManCutStart( nNodeSizeMax, nConeSizeMax, 2, 1000 ); - pManRef = Abc_NtkManRefStart( nNodeSizeMax, nConeSizeMax, fUseDcs, fVerbose ); - pManRef->vLeaves = Abc_NtkManCutReadCutLarge( pManCut ); - // compute the reverse levels if level update is requested - if ( fUpdateLevel ) - Abc_NtkStartReverseLevels( pNtk, 0 ); - - // resynthesize each node once - pManRef->nNodesBeg = Abc_NtkNodeNum(pNtk); - nNodes = Abc_NtkObjNumMax(pNtk); - pProgress = Extra_ProgressBarStart( stdout, nNodes ); - Abc_NtkForEachNode( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - // skip the constant node -// if ( Abc_NodeIsConst(pNode) ) -// continue; - // skip persistant nodes - if ( Abc_NodeIsPersistant(pNode) ) - continue; - // skip the nodes with many fanouts - if ( Abc_ObjFanoutNum(pNode) > 1000 ) - continue; - // stop if all nodes have been tried once - if ( i >= nNodes ) - break; - // compute a reconvergence-driven cut -clk = clock(); - vFanins = Abc_NodeFindCut( pManCut, pNode, fUseDcs ); -pManRef->timeCut += clock() - clk; - // evaluate this cut -clk = clock(); - pFForm = Abc_NodeRefactor( pManRef, pNode, vFanins, fUpdateLevel, fUseZeros, fUseDcs, fVerbose ); -pManRef->timeRes += clock() - clk; - if ( pFForm == NULL ) - continue; - // acceptable replacement found, update the graph -clk = clock(); - Dec_GraphUpdateNetwork( pNode, pFForm, fUpdateLevel, pManRef->nLastGain ); -pManRef->timeNtk += clock() - clk; - Dec_GraphFree( pFForm ); -// { -// extern int s_TotalChanges; -// s_TotalChanges++; -// } - } - Extra_ProgressBarStop( pProgress ); -pManRef->timeTotal = clock() - clkStart; - pManRef->nNodesEnd = Abc_NtkNodeNum(pNtk); - - // print statistics of the manager - if ( fVerbose ) - Abc_NtkManRefPrintStats( pManRef ); - // delete the managers - Abc_NtkManCutStop( pManCut ); - Abc_NtkManRefStop( pManRef ); - // put the nodes into the DFS order and reassign their IDs - Abc_NtkReassignIds( pNtk ); -// Abc_AigCheckFaninOrder( pNtk->pManFunc ); - // fix the levels - if ( fUpdateLevel ) - Abc_NtkStopReverseLevels( pNtk ); - else - Abc_NtkLevel( pNtk ); - // check - if ( !Abc_NtkCheck( pNtk ) ) - { - printf( "Abc_NtkRefactor: The network check has failed.\n" ); - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Resynthesizes the node using refactoring.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_NodeRefactor( Abc_ManRef_t * p, Abc_Obj_t * pNode, Vec_Ptr_t * vFanins, bool fUpdateLevel, bool fUseZeros, bool fUseDcs, bool fVerbose ) -{ - int fVeryVerbose = 0; - Abc_Obj_t * pFanin; - Dec_Graph_t * pFForm; - DdNode * bNodeFunc; - int nNodesSaved, nNodesAdded, i, clk; - char * pSop; - int Required; - - Required = fUpdateLevel? Abc_ObjRequiredLevel(pNode) : ABC_INFINITY; - - p->nNodesConsidered++; - - // get the function of the cut -clk = clock(); - bNodeFunc = Abc_NodeConeBdd( p->dd, p->dd->vars, pNode, vFanins, p->vVisited ); Cudd_Ref( bNodeFunc ); -p->timeBdd += clock() - clk; - - // if don't-care are used, transform the function into ISOP - if ( fUseDcs ) - { - DdNode * bNodeDc, * bNodeOn, * bNodeOnDc; - int nMints, nMintsDc; -clk = clock(); - // get the don't-cares - bNodeDc = Abc_NodeConeDcs( p->dd, p->dd->vars + vFanins->nSize, p->dd->vars, p->vLeaves, vFanins, p->vVisited ); Cudd_Ref( bNodeDc ); - nMints = (1 << vFanins->nSize); - nMintsDc = (int)Cudd_CountMinterm( p->dd, bNodeDc, vFanins->nSize ); -// printf( "Percentage of minterms = %5.2f.\n", 100.0 * nMintsDc / nMints ); - // get the ISF - bNodeOn = Cudd_bddAnd( p->dd, bNodeFunc, Cudd_Not(bNodeDc) ); Cudd_Ref( bNodeOn ); - bNodeOnDc = Cudd_bddOr ( p->dd, bNodeFunc, bNodeDc ); Cudd_Ref( bNodeOnDc ); - Cudd_RecursiveDeref( p->dd, bNodeFunc ); - Cudd_RecursiveDeref( p->dd, bNodeDc ); - // get the ISOP - bNodeFunc = Cudd_bddIsop( p->dd, bNodeOn, bNodeOnDc ); Cudd_Ref( bNodeFunc ); - Cudd_RecursiveDeref( p->dd, bNodeOn ); - Cudd_RecursiveDeref( p->dd, bNodeOnDc ); -p->timeDcs += clock() - clk; - } - - // always accept the case of constant node - if ( Cudd_IsConstant(bNodeFunc) ) - { - p->nLastGain = Abc_NodeMffcSize( pNode ); - p->nNodesGained += p->nLastGain; - p->nNodesRefactored++; - Cudd_RecursiveDeref( p->dd, bNodeFunc ); - if ( Cudd_IsComplement(bNodeFunc) ) - return Dec_GraphCreateConst0(); - return Dec_GraphCreateConst1(); - } - - // get the SOP of the cut -clk = clock(); - pSop = Abc_ConvertBddToSop( NULL, p->dd, bNodeFunc, bNodeFunc, vFanins->nSize, 0, p->vCube, -1 ); -p->timeSop += clock() - clk; - - // get the factored form -clk = clock(); - pFForm = Dec_Factor( pSop ); - free( pSop ); -p->timeFact += clock() - clk; - - // mark the fanin boundary - // (can mark only essential fanins, belonging to bNodeFunc!) - Vec_PtrForEachEntry( vFanins, pFanin, i ) - pFanin->vFanouts.nSize++; - // label MFFC with current traversal ID - Abc_NtkIncrementTravId( pNode->pNtk ); - nNodesSaved = Abc_NodeMffcLabelAig( pNode ); - // unmark the fanin boundary and set the fanins as leaves in the form - Vec_PtrForEachEntry( vFanins, pFanin, i ) - { - pFanin->vFanouts.nSize--; - Dec_GraphNode(pFForm, i)->pFunc = pFanin; - } - - // detect how many new nodes will be added (while taking into account reused nodes) -clk = clock(); - nNodesAdded = Dec_GraphToNetworkCount( pNode, pFForm, nNodesSaved, Required ); -p->timeEval += clock() - clk; - // quit if there is no improvement - if ( nNodesAdded == -1 || nNodesAdded == nNodesSaved && !fUseZeros ) - { - Cudd_RecursiveDeref( p->dd, bNodeFunc ); - Dec_GraphFree( pFForm ); - return NULL; - } - - // compute the total gain in the number of nodes - p->nLastGain = nNodesSaved - nNodesAdded; - p->nNodesGained += p->nLastGain; - p->nNodesRefactored++; - - // report the progress - if ( fVeryVerbose ) - { - printf( "Node %6s : ", Abc_ObjName(pNode) ); - printf( "Cone = %2d. ", vFanins->nSize ); - printf( "BDD = %2d. ", Cudd_DagSize(bNodeFunc) ); - printf( "FF = %2d. ", 1 + Dec_GraphNodeNum(pFForm) ); - printf( "MFFC = %2d. ", nNodesSaved ); - printf( "Add = %2d. ", nNodesAdded ); - printf( "GAIN = %2d. ", p->nLastGain ); - printf( "\n" ); - } - Cudd_RecursiveDeref( p->dd, bNodeFunc ); - return pFForm; -} - - -/**Function************************************************************* - - Synopsis [Starts the resynthesis manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_ManRef_t * Abc_NtkManRefStart( int nNodeSizeMax, int nConeSizeMax, bool fUseDcs, bool fVerbose ) -{ - Abc_ManRef_t * p; - p = ALLOC( Abc_ManRef_t, 1 ); - memset( p, 0, sizeof(Abc_ManRef_t) ); - p->vCube = Vec_StrAlloc( 100 ); - p->vVisited = Vec_PtrAlloc( 100 ); - p->nNodeSizeMax = nNodeSizeMax; - p->nConeSizeMax = nConeSizeMax; - p->fVerbose = fVerbose; - // start the BDD manager - if ( fUseDcs ) - p->dd = Cudd_Init( p->nNodeSizeMax + p->nConeSizeMax, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 ); - else - p->dd = Cudd_Init( p->nNodeSizeMax, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 ); - Cudd_zddVarsFromBddVars( p->dd, 2 ); - return p; -} - -/**Function************************************************************* - - Synopsis [Stops the resynthesis manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkManRefStop( Abc_ManRef_t * p ) -{ - Extra_StopManager( p->dd ); - Vec_PtrFree( p->vVisited ); - Vec_StrFree( p->vCube ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Stops the resynthesis manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkManRefPrintStats( Abc_ManRef_t * p ) -{ - printf( "Refactoring statistics:\n" ); - printf( "Nodes considered = %8d.\n", p->nNodesConsidered ); - printf( "Nodes refactored = %8d.\n", p->nNodesRefactored ); - printf( "Gain = %8d. (%6.2f %%).\n", p->nNodesBeg-p->nNodesEnd, 100.0*(p->nNodesBeg-p->nNodesEnd)/p->nNodesBeg ); - PRT( "Cuts ", p->timeCut ); - PRT( "Resynthesis", p->timeRes ); - PRT( " BDD ", p->timeBdd ); - PRT( " DCs ", p->timeDcs ); - PRT( " SOP ", p->timeSop ); - PRT( " FF ", p->timeFact ); - PRT( " Eval ", p->timeEval ); - PRT( "AIG update ", p->timeNtk ); - PRT( "TOTAL ", p->timeTotal ); -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcRenode.c b/src/base/abci/abcRenode.c deleted file mode 100644 index 8e8e8719..00000000 --- a/src/base/abci/abcRenode.c +++ /dev/null @@ -1,311 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcRenode.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcRenode.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "reo.h" -#include "if.h" -#include "kit.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static int Abc_NtkRenodeEvalAig( If_Cut_t * pCut ); -static int Abc_NtkRenodeEvalBdd( If_Cut_t * pCut ); -static int Abc_NtkRenodeEvalSop( If_Cut_t * pCut ); -static int Abc_NtkRenodeEvalCnf( If_Cut_t * pCut ); -static int Abc_NtkRenodeEvalMv( If_Cut_t * pCut ); - -static reo_man * s_pReo = NULL; -static DdManager * s_pDd = NULL; -static Vec_Int_t * s_vMemory = NULL; -static Vec_Int_t * s_vMemory2 = NULL; - -static int nDsdCounter = 0; - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Performs renoding as technology mapping.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkRenode( Abc_Ntk_t * pNtk, int nFaninMax, int nCubeMax, int nFlowIters, int nAreaIters, int fArea, int fUseBdds, int fUseSops, int fUseCnfs, int fUseMv, int fVerbose ) -{ - extern Abc_Ntk_t * Abc_NtkIf( Abc_Ntk_t * pNtk, If_Par_t * pPars ); - If_Par_t Pars, * pPars = &Pars; - Abc_Ntk_t * pNtkNew; - - if ( Abc_NtkGetChoiceNum( pNtk ) ) - printf( "Performing renoding with choices.\n" ); - - nDsdCounter = 0; - - // set defaults - memset( pPars, 0, sizeof(If_Par_t) ); - // user-controlable paramters - pPars->nLutSize = nFaninMax; - pPars->nCutsMax = nCubeMax; - pPars->nFlowIters = nFlowIters; - pPars->nAreaIters = nAreaIters; - pPars->DelayTarget = -1; - pPars->fPreprocess = 1; - pPars->fArea = fArea; - pPars->fFancy = 0; - pPars->fExpRed = 0; // - pPars->fLatchPaths = 0; - pPars->fSeqMap = 0; - pPars->fVerbose = fVerbose; - // internal parameters - pPars->fTruth = 1; - pPars->fUsePerm = 1; - pPars->nLatches = 0; - pPars->pLutLib = NULL; // Abc_FrameReadLibLut(); - pPars->pTimesArr = NULL; - pPars->pTimesArr = NULL; - pPars->fUseBdds = fUseBdds; - pPars->fUseSops = fUseSops; - pPars->fUseCnfs = fUseCnfs; - pPars->fUseMv = fUseMv; - if ( fUseBdds ) - pPars->pFuncCost = Abc_NtkRenodeEvalBdd; - else if ( fUseSops ) - pPars->pFuncCost = Abc_NtkRenodeEvalSop; - else if ( fUseCnfs ) - { - pPars->fArea = 1; - pPars->pFuncCost = Abc_NtkRenodeEvalCnf; - } - else if ( fUseMv ) - pPars->pFuncCost = Abc_NtkRenodeEvalMv; - else - pPars->pFuncCost = Abc_NtkRenodeEvalAig; - - // start the manager - if ( fUseBdds ) - { - assert( s_pReo == NULL ); - s_pDd = Cudd_Init( nFaninMax, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 ); - s_pReo = Extra_ReorderInit( nFaninMax, 100 ); - pPars->pReoMan = s_pReo; - } - else - { - assert( s_vMemory == NULL ); - s_vMemory = Vec_IntAlloc( 1 << 16 ); - s_vMemory2 = Vec_IntAlloc( 1 << 16 ); - } - - // perform mapping/renoding - pNtkNew = Abc_NtkIf( pNtk, pPars ); - - // start the manager - if ( fUseBdds ) - { - Extra_StopManager( s_pDd ); - Extra_ReorderQuit( s_pReo ); - s_pReo = NULL; - s_pDd = NULL; - } - else - { - Vec_IntFree( s_vMemory ); - Vec_IntFree( s_vMemory2 ); - s_vMemory = NULL; - s_vMemory2 = NULL; - } - -// printf( "Decomposed %d functions.\n", nDsdCounter ); - - return pNtkNew; -} - -/**Function************************************************************* - - Synopsis [Computes the cost based on the factored form.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRenodeEvalAig( If_Cut_t * pCut ) -{ - Kit_Graph_t * pGraph; - int i, nNodes; -/* -extern void Kit_DsdTest( unsigned * pTruth, int nVars ); -if ( If_CutLeaveNum(pCut) == 8 ) -{ - nDsdCounter++; - Kit_DsdTest( If_CutTruth(pCut), If_CutLeaveNum(pCut) ); -} -*/ - pGraph = Kit_TruthToGraph( If_CutTruth(pCut), If_CutLeaveNum(pCut), s_vMemory ); - if ( pGraph == NULL ) - { - for ( i = 0; i < If_CutLeaveNum(pCut); i++ ) - pCut->pPerm[i] = 100; - return IF_COST_MAX; - } - nNodes = Kit_GraphNodeNum( pGraph ); - for ( i = 0; i < If_CutLeaveNum(pCut); i++ ) - pCut->pPerm[i] = Kit_GraphLeafDepth_rec( pGraph, Kit_GraphNodeLast(pGraph), Kit_GraphNode(pGraph, i) ); - Kit_GraphFree( pGraph ); - return nNodes; -} - -/**Function************************************************************* - - Synopsis [Computes the cost based on the BDD size after reordering.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRenodeEvalBdd( If_Cut_t * pCut ) -{ - int pOrder[IF_MAX_LUTSIZE]; - DdNode * bFunc, * bFuncNew; - int i, k, nNodes; - for ( i = 0; i < If_CutLeaveNum(pCut); i++ ) - pCut->pPerm[i] = pOrder[i] = -100; - bFunc = Kit_TruthToBdd( s_pDd, If_CutTruth(pCut), If_CutLeaveNum(pCut), 0 ); Cudd_Ref( bFunc ); - bFuncNew = Extra_Reorder( s_pReo, s_pDd, bFunc, pOrder ); Cudd_Ref( bFuncNew ); - for ( i = k = 0; i < If_CutLeaveNum(pCut); i++ ) - if ( pOrder[i] >= 0 ) - pCut->pPerm[pOrder[i]] = ++k; // double-check this! - nNodes = -1 + Cudd_DagSize( bFuncNew ); - Cudd_RecursiveDeref( s_pDd, bFuncNew ); - Cudd_RecursiveDeref( s_pDd, bFunc ); - return nNodes; -} - -/**Function************************************************************* - - Synopsis [Computes the cost based on ISOP.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRenodeEvalSop( If_Cut_t * pCut ) -{ - int i, RetValue; - for ( i = 0; i < If_CutLeaveNum(pCut); i++ ) - pCut->pPerm[i] = 1; - RetValue = Kit_TruthIsop( If_CutTruth(pCut), If_CutLeaveNum(pCut), s_vMemory, 1 ); - if ( RetValue == -1 ) - return IF_COST_MAX; - assert( RetValue == 0 || RetValue == 1 ); - return Vec_IntSize( s_vMemory ); -} - -/**Function************************************************************* - - Synopsis [Computes the cost based on two ISOPs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRenodeEvalCnf( If_Cut_t * pCut ) -{ - int i, RetValue, nClauses; - // set internal mapper parameters - for ( i = 0; i < If_CutLeaveNum(pCut); i++ ) - pCut->pPerm[i] = 1; - // compute ISOP for the positive phase - RetValue = Kit_TruthIsop( If_CutTruth(pCut), If_CutLeaveNum(pCut), s_vMemory, 0 ); - if ( RetValue == -1 ) - return IF_COST_MAX; - assert( RetValue == 0 || RetValue == 1 ); - nClauses = Vec_IntSize( s_vMemory ); - // compute ISOP for the negative phase - Kit_TruthNot( If_CutTruth(pCut), If_CutTruth(pCut), If_CutLeaveNum(pCut) ); - RetValue = Kit_TruthIsop( If_CutTruth(pCut), If_CutLeaveNum(pCut), s_vMemory, 0 ); - Kit_TruthNot( If_CutTruth(pCut), If_CutTruth(pCut), If_CutLeaveNum(pCut) ); - if ( RetValue == -1 ) - return IF_COST_MAX; - assert( RetValue == 0 || RetValue == 1 ); - nClauses += Vec_IntSize( s_vMemory ); - return nClauses; -} - -/**Function************************************************************* - - Synopsis [Computes the cost of MV-SOP of the cut function.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRenodeEvalMv( If_Cut_t * pCut ) -{ - int i, RetValue; - // set internal mapper parameters - for ( i = 0; i < If_CutLeaveNum(pCut); i++ ) - pCut->pPerm[i] = 1; - // compute ISOP for the positive phase - RetValue = Kit_TruthIsop( If_CutTruth(pCut), If_CutLeaveNum(pCut), s_vMemory, 0 ); - if ( RetValue == -1 ) - return IF_COST_MAX; - assert( RetValue == 0 || RetValue == 1 ); - // compute ISOP for the negative phase - Kit_TruthNot( If_CutTruth(pCut), If_CutTruth(pCut), If_CutLeaveNum(pCut) ); - RetValue = Kit_TruthIsop( If_CutTruth(pCut), If_CutLeaveNum(pCut), s_vMemory2, 0 ); - Kit_TruthNot( If_CutTruth(pCut), If_CutTruth(pCut), If_CutLeaveNum(pCut) ); - if ( RetValue == -1 ) - return IF_COST_MAX; - assert( RetValue == 0 || RetValue == 1 ); - // return the cost of the cut - RetValue = Abc_NodeEvalMvCost( If_CutLeaveNum(pCut), s_vMemory, s_vMemory2 ); - if ( RetValue >= IF_COST_MAX ) - return IF_COST_MAX; - return RetValue; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcReorder.c b/src/base/abci/abcReorder.c deleted file mode 100644 index d6dee49b..00000000 --- a/src/base/abci/abcReorder.c +++ /dev/null @@ -1,100 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcReorder.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Reordering local BDDs of the nodes.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcReorder.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "reo.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Reorders BDD of the local function of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeBddReorder( reo_man * p, Abc_Obj_t * pNode ) -{ - Abc_Obj_t * pFanin; - DdNode * bFunc; - int * pOrder, i; - // create the temporary array for the variable order - pOrder = ALLOC( int, Abc_ObjFaninNum(pNode) ); - for ( i = 0; i < Abc_ObjFaninNum(pNode); i++ ) - pOrder[i] = -1; - // reorder the BDD - bFunc = Extra_Reorder( p, pNode->pNtk->pManFunc, pNode->pData, pOrder ); Cudd_Ref( bFunc ); - Cudd_RecursiveDeref( pNode->pNtk->pManFunc, pNode->pData ); - pNode->pData = bFunc; - // update the fanin order - Abc_ObjForEachFanin( pNode, pFanin, i ) - pOrder[i] = pNode->vFanins.pArray[ pOrder[i] ]; - Abc_ObjForEachFanin( pNode, pFanin, i ) - pNode->vFanins.pArray[i] = pOrder[i]; - free( pOrder ); -} - -/**Function************************************************************* - - Synopsis [Reorders BDDs of the local functions.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkBddReorder( Abc_Ntk_t * pNtk, int fVerbose ) -{ - reo_man * p; - Abc_Obj_t * pNode; - int i; - p = Extra_ReorderInit( Abc_NtkGetFaninMax(pNtk), 100 ); - Abc_NtkForEachNode( pNtk, pNode, i ) - { - if ( Abc_ObjFaninNum(pNode) < 3 ) - continue; - if ( fVerbose ) - fprintf( stdout, "%10s: ", Abc_ObjName(pNode) ); - if ( fVerbose ) - fprintf( stdout, "Before = %5d BDD nodes. ", Cudd_DagSize(pNode->pData) ); - Abc_NodeBddReorder( p, pNode ); - if ( fVerbose ) - fprintf( stdout, "After = %5d BDD nodes.\n", Cudd_DagSize(pNode->pData) ); - } - Extra_ReorderQuit( p ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcRestruct.c b/src/base/abci/abcRestruct.c deleted file mode 100644 index 326d1543..00000000 --- a/src/base/abci/abcRestruct.c +++ /dev/null @@ -1,1496 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcRestruct.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcRestruct.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "dec.h" -#include "dsd.h" -#include "cut.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -#define RST_RANDOM_UNSIGNED ((((unsigned)rand()) << 24) ^ (((unsigned)rand()) << 12) ^ ((unsigned)rand())) - -typedef struct Abc_ManRst_t_ Abc_ManRst_t; -struct Abc_ManRst_t_ -{ - // the network - Abc_Ntk_t * pNtk; // the network for restructuring - // user specified parameters - int nCutMax; // the limit on the size of the supernode - int fUpdateLevel; // turns on watching the number of levels - int fUseZeros; // turns on zero-cost replacements - int fVerbose; // the verbosity flag - // internal data structures - DdManager * dd; // the BDD manager - Dsd_Manager_t * pManDsd; // the DSD manager - Vec_Ptr_t * vVisited; // temporary - Vec_Ptr_t * vLeaves; // temporary - Vec_Ptr_t * vDecs; // temporary - Vec_Ptr_t * vTemp; // temporary - Vec_Int_t * vSims; // temporary - Vec_Int_t * vRands; // temporary - Vec_Int_t * vOnes; // temporary - Vec_Int_t * vBinate; // temporary - Vec_Int_t * vTwos; // temporary - // node statistics - int nLastGain; - int nCutsConsidered; - int nCutsExplored; - int nNodesConsidered; - int nNodesRestructured; - int nNodesGained; - // runtime statistics - int timeCut; - int timeBdd; - int timeDsd; - int timeEval; - int timeRes; - int timeNtk; - int timeTotal; -}; - -static Dec_Graph_t * Abc_NodeResubstitute( Abc_ManRst_t * p, Abc_Obj_t * pNode, Cut_Cut_t * pCutList ); - -static Dec_Graph_t * Abc_NodeRestructure( Abc_ManRst_t * p, Abc_Obj_t * pNode, Cut_Cut_t * pCutList ); -static Dec_Graph_t * Abc_NodeRestructureCut( Abc_ManRst_t * p, Abc_Obj_t * pNode, Cut_Cut_t * pCut ); -static Dec_Graph_t * Abc_NodeEvaluateDsd( Abc_ManRst_t * pManRst, Dsd_Node_t * pNodeDsd, Abc_Obj_t * pRoot, int Required, int nNodesSaved, int * pnNodesAdded ); - -static Cut_Man_t * Abc_NtkStartCutManForRestruct( Abc_Ntk_t * pNtk, int nCutMax, int fDag ); -static Abc_ManRst_t * Abc_NtkManRstStart( int nCutMax, bool fUpdateLevel, bool fUseZeros, bool fVerbose ); -static void Abc_NtkManRstStop( Abc_ManRst_t * p ); -static void Abc_NtkManRstPrintStats( Abc_ManRst_t * p ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Implements AIG restructuring.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRestructure( Abc_Ntk_t * pNtk, int nCutMax, bool fUpdateLevel, bool fUseZeros, bool fVerbose ) -{ - ProgressBar * pProgress; - Abc_ManRst_t * pManRst; - Cut_Man_t * pManCut; - Cut_Cut_t * pCutList; - Dec_Graph_t * pGraph; - Abc_Obj_t * pNode; - int clk, clkStart = clock(); - int fMulti = 1; - int fResub = 0; - int i, nNodes; - - assert( Abc_NtkIsStrash(pNtk) ); - // cleanup the AIG - Abc_AigCleanup(pNtk->pManFunc); - Abc_NtkCleanCopy(pNtk); - - // compute the reverse levels if level update is requested - if ( fUpdateLevel ) - Abc_NtkStartReverseLevels( pNtk, 0 ); - - // start the restructuring manager - pManRst = Abc_NtkManRstStart( nCutMax, fUpdateLevel, fUseZeros, fVerbose ); - pManRst->pNtk = pNtk; - // start the cut manager -clk = clock(); - pManCut = Abc_NtkStartCutManForRestruct( pNtk, nCutMax, fMulti ); -pManRst->timeCut += clock() - clk; -// pNtk->pManCut = pManCut; - - // resynthesize each node once - nNodes = Abc_NtkObjNumMax(pNtk); - pProgress = Extra_ProgressBarStart( stdout, nNodes ); - Abc_NtkForEachNode( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - // skip the constant node -// if ( Abc_NodeIsConst(pNode) ) -// continue; - // skip persistant nodes - if ( Abc_NodeIsPersistant(pNode) ) - continue; - // skip the node if it is inside the tree -// if ( Abc_ObjFanoutNum(pNode) < 2 ) -// continue; - // skip the nodes with too many fanouts - if ( Abc_ObjFanoutNum(pNode) > 1000 ) - continue; - // stop if all nodes have been tried once - if ( i >= nNodes ) - break; - // get the cuts for the given node -clk = clock(); - pCutList = Abc_NodeGetCutsRecursive( pManCut, pNode, fMulti, 0 ); -pManRst->timeCut += clock() - clk; - - // perform restructuring -clk = clock(); - if ( fResub ) - pGraph = Abc_NodeResubstitute( pManRst, pNode, pCutList ); - else - pGraph = Abc_NodeRestructure( pManRst, pNode, pCutList ); -pManRst->timeRes += clock() - clk; - if ( pGraph == NULL ) - continue; - - // acceptable replacement found, update the graph -clk = clock(); - Dec_GraphUpdateNetwork( pNode, pGraph, fUpdateLevel, pManRst->nLastGain ); -pManRst->timeNtk += clock() - clk; - Dec_GraphFree( pGraph ); - } - Extra_ProgressBarStop( pProgress ); -pManRst->timeTotal = clock() - clkStart; - - // print statistics of the manager -// if ( fVerbose ) - Abc_NtkManRstPrintStats( pManRst ); - // delete the managers - Cut_ManStop( pManCut ); - Abc_NtkManRstStop( pManRst ); - // put the nodes into the DFS order and reassign their IDs - Abc_NtkReassignIds( pNtk ); -// Abc_AigCheckFaninOrder( pNtk->pManFunc ); - // fix the levels - if ( fUpdateLevel ) - Abc_NtkStopReverseLevels( pNtk ); - else - Abc_NtkLevel( pNtk ); - // check - if ( !Abc_NtkCheck( pNtk ) ) - { - printf( "Abc_NtkRefactor: The network check has failed.\n" ); - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_RestructNodeDivisors( Abc_ManRst_t * p, Abc_Obj_t * pRoot, int nNodesSaved ) -{ - Abc_Obj_t * pNode, * pFanout;//, * pFanin; - int i, k; - // start with the leaves - Vec_PtrClear( p->vDecs ); - Vec_PtrForEachEntry( p->vLeaves, pNode, i ) - { - Vec_PtrPush( p->vDecs, pNode ); - assert( pNode->fMarkC == 0 ); - pNode->fMarkC = 1; - } - // explore the fanouts - Vec_PtrForEachEntry( p->vDecs, pNode, i ) - { - // if the fanout has both fanins in the set, add it - Abc_ObjForEachFanout( pNode, pFanout, k ) - { - if ( pFanout->fMarkC || Abc_ObjIsPo(pFanout) ) - continue; - if ( Abc_ObjFanin0(pFanout)->fMarkC && Abc_ObjFanin1(pFanout)->fMarkC ) - { - Vec_PtrPush( p->vDecs, pFanout ); - pFanout->fMarkC = 1; - } - } - } - // unmark the nodes - Vec_PtrForEachEntry( p->vDecs, pNode, i ) - pNode->fMarkC = 0; -/* - // print the nodes - Vec_PtrForEachEntryStart( p->vDecs, pNode, i, Vec_PtrSize(p->vLeaves) ) - { - printf( "%2d %s = ", i, Abc_NodeIsTravIdCurrent(pNode)? "*" : " " ); - // find the first fanin - Vec_PtrForEachEntry( p->vDecs, pFanin, k ) - if ( Abc_ObjFanin0(pNode) == pFanin ) - break; - if ( k < Vec_PtrSize(p->vLeaves) ) - printf( "%c", 'a' + k ); - else - printf( "%d", k ); - printf( "%s ", Abc_ObjFaninC0(pNode)? "\'" : "" ); - // find the second fanin - Vec_PtrForEachEntry( p->vDecs, pFanin, k ) - if ( Abc_ObjFanin1(pNode) == pFanin ) - break; - if ( k < Vec_PtrSize(p->vLeaves) ) - printf( "%c", 'a' + k ); - else - printf( "%d", k ); - printf( "%s ", Abc_ObjFaninC1(pNode)? "\'" : "" ); - printf( "\n" ); - } -*/ - printf( "%d\n", Vec_PtrSize(p->vDecs)-nNodesSaved-Vec_PtrSize(p->vLeaves) ); -} - - -/**Function************************************************************* - - Synopsis [Starts the cut manager for rewriting.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_NodeRestructure( Abc_ManRst_t * p, Abc_Obj_t * pNode, Cut_Cut_t * pCutList ) -{ - Dec_Graph_t * pGraph; - Cut_Cut_t * pCut; -// int nCuts; - p->nNodesConsidered++; -/* - // count the number of cuts with four inputs or more - nCuts = 0; - for ( pCut = pCutList; pCut; pCut = pCut->pNext ) - nCuts += (int)(pCut->nLeaves > 3); - printf( "-----------------------------------\n" ); - printf( "Node %6d : Factor-cuts = %5d.\n", pNode->Id, nCuts ); -*/ - // go through the interesting cuts - for ( pCut = pCutList; pCut; pCut = pCut->pNext ) - { - if ( pCut->nLeaves < 4 ) - continue; - if ( pGraph = Abc_NodeRestructureCut( p, pNode, pCut ) ) - return pGraph; - } - return NULL; -} - -/**Function************************************************************* - - Synopsis [Starts the cut manager for rewriting.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_NodeRestructureCut( Abc_ManRst_t * p, Abc_Obj_t * pRoot, Cut_Cut_t * pCut ) -{ - Dec_Graph_t * pGraph; - Dsd_Node_t * pNodeDsd; - Abc_Obj_t * pLeaf; - DdNode * bFunc; - int nNodesSaved, nNodesAdded; - int Required, nMaxSize, clk, i; - int fVeryVerbose = 0; - - p->nCutsConsidered++; - - // get the required time for the node - Required = p->fUpdateLevel? Abc_ObjRequiredLevel(pRoot) : ABC_INFINITY; - - // collect the leaves of the cut - Vec_PtrClear( p->vLeaves ); - for ( i = 0; i < (int)pCut->nLeaves; i++ ) - { - pLeaf = Abc_NtkObj(pRoot->pNtk, pCut->pLeaves[i]); - if ( pLeaf == NULL ) // the so-called "bad cut phenomenon" is due to removed nodes - return NULL; - Vec_PtrPush( p->vLeaves, pLeaf ); - } - - if ( pRoot->Id == 29 ) - { - int x = 0; - } - -clk = clock(); - // collect the internal nodes of the cut -// Abc_NodeConeCollect( &pRoot, 1, p->vLeaves, p->vVisited, 0 ); - // derive the BDD of the cut - bFunc = Abc_NodeConeBdd( p->dd, p->dd->vars, pRoot, p->vLeaves, p->vVisited ); Cudd_Ref( bFunc ); -p->timeBdd += clock() - clk; - - // consider the special case, when the function is a constant - if ( Cudd_IsConstant(bFunc) ) - { - p->nLastGain = Abc_NodeMffcSize( pRoot ); - p->nNodesGained += p->nLastGain; - p->nNodesRestructured++; - Cudd_RecursiveDeref( p->dd, bFunc ); - if ( Cudd_IsComplement(bFunc) ) - return Dec_GraphCreateConst0(); - return Dec_GraphCreateConst1(); - } - -clk = clock(); - // try disjoint support decomposition - pNodeDsd = Dsd_DecomposeOne( p->pManDsd, bFunc ); -p->timeDsd += clock() - clk; - - // skip nodes with non-decomposable blocks - Dsd_TreeNodeGetInfoOne( pNodeDsd, NULL, &nMaxSize ); - if ( nMaxSize > 3 ) - { - Cudd_RecursiveDeref( p->dd, bFunc ); - return NULL; - } - - -/* - // skip nodes that cannot be improved - if ( Vec_PtrSize(p->vVisited) <= Dsd_TreeGetAigCost(pNodeDsd) ) - { - Cudd_RecursiveDeref( p->dd, bFunc ); - return NULL; - } -*/ - - p->nCutsExplored++; - - // mark the fanin boundary - // (can mark only essential fanins, belonging to bNodeFunc!) - Vec_PtrForEachEntry( p->vLeaves, pLeaf, i ) - pLeaf->vFanouts.nSize++; - // label MFFC with current traversal ID - Abc_NtkIncrementTravId( pRoot->pNtk ); - nNodesSaved = Abc_NodeMffcLabelAig( pRoot ); - // unmark the fanin boundary and set the fanins as leaves in the form - Vec_PtrForEachEntry( p->vLeaves, pLeaf, i ) - pLeaf->vFanouts.nSize--; -/* - if ( nNodesSaved < 3 ) - { - Cudd_RecursiveDeref( p->dd, bFunc ); - return NULL; - } -*/ - -/* - printf( "%5d : Cut-size = %d. Old AIG = %2d. New AIG = %2d. Old MFFC = %2d.\n", - pRoot->Id, pCut->nLeaves, Vec_PtrSize(p->vVisited), Dsd_TreeGetAigCost(pNodeDsd), - nNodesSaved ); - Dsd_NodePrint( stdout, pNodeDsd ); - - Abc_RestructNodeDivisors( p, pRoot ); - - if ( pRoot->Id == 433 ) - { - int x = 0; - } -*/ -// Abc_RestructNodeDivisors( p, pRoot, nNodesSaved ); - - - // detect how many new nodes will be added (while taking into account reused nodes) -clk = clock(); - if ( nMaxSize > 3 ) - pGraph = NULL; - else - pGraph = Abc_NodeEvaluateDsd( p, pNodeDsd, pRoot, Required, nNodesSaved, &nNodesAdded ); -// pGraph = NULL; -p->timeEval += clock() - clk; - - // quit if there is no improvement - if ( pGraph == NULL || nNodesAdded == -1 || nNodesAdded == nNodesSaved && !p->fUseZeros ) - { - Cudd_RecursiveDeref( p->dd, bFunc ); - if ( pGraph ) Dec_GraphFree( pGraph ); - return NULL; - } - -/* - // print stats - printf( "%5d : Cut-size = %d. Old AIG = %2d. New AIG = %2d. Old MFFC = %2d. New MFFC = %2d. Gain = %d.\n", - pRoot->Id, pCut->nLeaves, Vec_PtrSize(p->vVisited), Dsd_TreeGetAigCost(pNodeDsd), - nNodesSaved, nNodesAdded, (nNodesAdded == -1)? 0 : nNodesSaved-nNodesAdded ); -// Dsd_NodePrint( stdout, pNodeDsd ); -// Dec_GraphPrint( stdout, pGraph, NULL, NULL ); -*/ - - // compute the total gain in the number of nodes - p->nLastGain = nNodesSaved - nNodesAdded; - p->nNodesGained += p->nLastGain; - p->nNodesRestructured++; - - // report the progress - if ( fVeryVerbose ) - { - printf( "Node %6s : ", Abc_ObjName(pRoot) ); - printf( "Cone = %2d. ", p->vLeaves->nSize ); - printf( "BDD = %2d. ", Cudd_DagSize(bFunc) ); - printf( "FF = %2d. ", 1 + Dec_GraphNodeNum(pGraph) ); - printf( "MFFC = %2d. ", nNodesSaved ); - printf( "Add = %2d. ", nNodesAdded ); - printf( "GAIN = %2d. ", p->nLastGain ); - printf( "\n" ); - } - Cudd_RecursiveDeref( p->dd, bFunc ); - return pGraph; -} - - -/**Function************************************************************* - - Synopsis [Moves closer to the end the node that is best for sharing.] - - Description [If the flag is set, tries to find an EXOR, otherwise, tries - to find an OR.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeEdgeDsdPermute( Dec_Graph_t * pGraph, Abc_ManRst_t * pManRst, Vec_Int_t * vEdges, int fExor ) -{ - Dec_Edge_t eNode1, eNode2, eNode3; - Abc_Obj_t * pNode1, * pNode2, * pNode3, * pTemp; - int LeftBound = 0, RightBound, i; - // get the right bound - RightBound = Vec_IntSize(vEdges) - 2; - assert( LeftBound <= RightBound ); - if ( LeftBound == RightBound ) - return; - // get the two last nodes - eNode1 = Dec_IntToEdge( Vec_IntEntry(vEdges, RightBound + 1) ); - eNode2 = Dec_IntToEdge( Vec_IntEntry(vEdges, RightBound ) ); - pNode1 = Dec_GraphNode( pGraph, eNode1.Node )->pFunc; - pNode2 = Dec_GraphNode( pGraph, eNode2.Node )->pFunc; - pNode1 = !pNode1? NULL : Abc_ObjNotCond( pNode1, eNode1.fCompl ); - pNode2 = !pNode2? NULL : Abc_ObjNotCond( pNode2, eNode2.fCompl ); - // quit if the last node does not exist - if ( pNode1 == NULL ) - return; - // find the first node that can be shared - for ( i = RightBound; i >= LeftBound; i-- ) - { - // get the third node - eNode3 = Dec_IntToEdge( Vec_IntEntry(vEdges, i) ); - pNode3 = Dec_GraphNode( pGraph, eNode3.Node )->pFunc; - pNode3 = !pNode3? NULL : Abc_ObjNotCond( pNode3, eNode3.fCompl ); - if ( pNode3 == NULL ) - continue; - // check if the node exists - if ( fExor ) - { - if ( pNode1 && pNode3 ) - { - pTemp = Abc_AigXorLookup( pManRst->pNtk->pManFunc, pNode1, pNode3, NULL ); - if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) ) - continue; - - if ( pNode3 == pNode2 ) - return; - Vec_IntWriteEntry( vEdges, i, Dec_EdgeToInt(eNode2) ); - Vec_IntWriteEntry( vEdges, RightBound, Dec_EdgeToInt(eNode3) ); - return; - } - } - else - { - if ( pNode1 && pNode3 ) - { - pTemp = Abc_AigAndLookup( pManRst->pNtk->pManFunc, Abc_ObjNot(pNode1), Abc_ObjNot(pNode3) ); - if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) ) - continue; - - if ( eNode3.Node == eNode2.Node ) - return; - Vec_IntWriteEntry( vEdges, i, Dec_EdgeToInt(eNode2) ); - Vec_IntWriteEntry( vEdges, RightBound, Dec_EdgeToInt(eNode3) ); - return; - } - } - } -} - -/**Function************************************************************* - - Synopsis [Adds the new edge in the given order.] - - Description [Similar to Vec_IntPushOrder, except in decreasing order.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeEdgeDsdPushOrdered( Dec_Graph_t * pGraph, Vec_Int_t * vEdges, int Edge ) -{ - int i, NodeOld, NodeNew; - vEdges->nSize++; - for ( i = vEdges->nSize-2; i >= 0; i-- ) - { - NodeOld = Dec_IntToEdge(vEdges->pArray[i]).Node; - NodeNew = Dec_IntToEdge(Edge).Node; - // use <= because we are trying to push the new (non-existent) nodes as far as possible - if ( Dec_GraphNode(pGraph, NodeOld)->Level <= Dec_GraphNode(pGraph, NodeNew)->Level ) - vEdges->pArray[i+1] = vEdges->pArray[i]; - else - break; - } - vEdges->pArray[i+1] = Edge; -} - -/**Function************************************************************* - - Synopsis [Evaluation one DSD.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Edge_t Abc_NodeEvaluateDsd_rec( Dec_Graph_t * pGraph, Abc_ManRst_t * pManRst, Dsd_Node_t * pNodeDsd, int Required, int nNodesSaved, int * pnNodesAdded ) -{ - Dec_Edge_t eNode1, eNode2, eNode3, eResult, eQuit = { 0, 2006 }; - Abc_Obj_t * pNode1, * pNode2, * pNode3, * pNode4, * pTemp; - Dsd_Node_t * pChildDsd; - Dsd_Type_t DecType; - Vec_Int_t * vEdges; - int Level1, Level2, Level3, Level4; - int i, Index, fCompl, Type; - - // remove the complemented attribute - fCompl = Dsd_IsComplement( pNodeDsd ); - pNodeDsd = Dsd_Regular( pNodeDsd ); - - // consider the trivial case - DecType = Dsd_NodeReadType( pNodeDsd ); - if ( DecType == DSD_NODE_BUF ) - { - Index = Dsd_NodeReadFunc(pNodeDsd)->index; - assert( Index < Dec_GraphLeaveNum(pGraph) ); - eResult = Dec_EdgeCreate( Index, fCompl ); - return eResult; - } - assert( DecType == DSD_NODE_OR || DecType == DSD_NODE_EXOR || DecType == DSD_NODE_PRIME ); - - // solve the problem for the children - vEdges = Vec_IntAlloc( Dsd_NodeReadDecsNum(pNodeDsd) ); - Dsd_NodeForEachChild( pNodeDsd, i, pChildDsd ) - { - eResult = Abc_NodeEvaluateDsd_rec( pGraph, pManRst, pChildDsd, Required, nNodesSaved, pnNodesAdded ); - if ( eResult.Node == eQuit.Node ) // infeasible - { - Vec_IntFree( vEdges ); - return eQuit; - } - // order the inputs only if this is OR or EXOR - if ( DecType == DSD_NODE_PRIME ) - Vec_IntPush( vEdges, Dec_EdgeToInt(eResult) ); - else - Abc_NodeEdgeDsdPushOrdered( pGraph, vEdges, Dec_EdgeToInt(eResult) ); - } - // the edges are sorted by the level of their nodes in decreasing order - - - // consider special cases - if ( DecType == DSD_NODE_OR ) - { - // try to balance the nodes by delay - assert( Vec_IntSize(vEdges) > 1 ); - while ( Vec_IntSize(vEdges) > 1 ) - { - // permute the last two entries - if ( Vec_IntSize(vEdges) > 2 ) - Abc_NodeEdgeDsdPermute( pGraph, pManRst, vEdges, 0 ); - // get the two last nodes - eNode1 = Dec_IntToEdge( Vec_IntPop(vEdges) ); - eNode2 = Dec_IntToEdge( Vec_IntPop(vEdges) ); - pNode1 = Dec_GraphNode( pGraph, eNode1.Node )->pFunc; - pNode2 = Dec_GraphNode( pGraph, eNode2.Node )->pFunc; - pNode1 = !pNode1? NULL : Abc_ObjNotCond( pNode1, eNode1.fCompl ); - pNode2 = !pNode2? NULL : Abc_ObjNotCond( pNode2, eNode2.fCompl ); - // check if the new node exists - pNode3 = NULL; - if ( pNode1 && pNode2 ) - { - pNode3 = Abc_AigAndLookup( pManRst->pNtk->pManFunc, Abc_ObjNot(pNode1), Abc_ObjNot(pNode2) ); - pNode3 = !pNode3? NULL : Abc_ObjNot(pNode3); - } - // create the new node - eNode3 = Dec_GraphAddNodeOr( pGraph, eNode1, eNode2 ); - // set level - Level1 = Dec_GraphNode( pGraph, eNode1.Node )->Level; - Level2 = Dec_GraphNode( pGraph, eNode2.Node )->Level; - Dec_GraphNode( pGraph, eNode3.Node )->Level = 1 + ABC_MAX(Level1, Level2); - // get the new node if possible - if ( pNode3 ) - { - Dec_GraphNode( pGraph, eNode3.Node )->pFunc = Abc_ObjNotCond(pNode3, eNode3.fCompl); - Level3 = Dec_GraphNode( pGraph, eNode3.Node )->Level; - assert( Required == ABC_INFINITY || Level3 == (int)Abc_ObjRegular(pNode3)->Level ); - } - if ( !pNode3 || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pNode3)) ) - { - (*pnNodesAdded)++; - if ( *pnNodesAdded > nNodesSaved ) - { - Vec_IntFree( vEdges ); - return eQuit; - } - } - // add the resulting node to the form - Abc_NodeEdgeDsdPushOrdered( pGraph, vEdges, Dec_EdgeToInt(eNode3) ); - } - // get the last node - eResult = Dec_IntToEdge( Vec_IntPop(vEdges) ); - Vec_IntFree( vEdges ); - // complement the graph if the node was complemented - eResult.fCompl ^= fCompl; - return eResult; - } - if ( DecType == DSD_NODE_EXOR ) - { - // try to balance the nodes by delay - assert( Vec_IntSize(vEdges) > 1 ); - while ( Vec_IntSize(vEdges) > 1 ) - { - // permute the last two entries - if ( Vec_IntSize(vEdges) > 2 ) - Abc_NodeEdgeDsdPermute( pGraph, pManRst, vEdges, 1 ); - // get the two last nodes - eNode1 = Dec_IntToEdge( Vec_IntPop(vEdges) ); - eNode2 = Dec_IntToEdge( Vec_IntPop(vEdges) ); - pNode1 = Dec_GraphNode( pGraph, eNode1.Node )->pFunc; - pNode2 = Dec_GraphNode( pGraph, eNode2.Node )->pFunc; - pNode1 = !pNode1? NULL : Abc_ObjNotCond( pNode1, eNode1.fCompl ); - pNode2 = !pNode2? NULL : Abc_ObjNotCond( pNode2, eNode2.fCompl ); - // check if the new node exists - Type = 0; - pNode3 = NULL; - if ( pNode1 && pNode2 ) - pNode3 = Abc_AigXorLookup( pManRst->pNtk->pManFunc, pNode1, pNode2, &Type ); - // create the new node - eNode3 = Dec_GraphAddNodeXor( pGraph, eNode1, eNode2, Type ); // should have the same structure as in AIG - // set level - Level1 = Dec_GraphNode( pGraph, eNode1.Node )->Level; - Level2 = Dec_GraphNode( pGraph, eNode2.Node )->Level; - Dec_GraphNode( pGraph, eNode3.Node )->Level = 2 + ABC_MAX(Level1, Level2); - // get the new node if possible - if ( pNode3 ) - { - Dec_GraphNode( pGraph, eNode3.Node )->pFunc = Abc_ObjNotCond(pNode3, eNode3.fCompl); - Level3 = Dec_GraphNode( pGraph, eNode3.Node )->Level; - assert( Required == ABC_INFINITY || Level3 == (int)Abc_ObjRegular(pNode3)->Level ); - } - if ( !pNode3 || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pNode3)) ) - { - (*pnNodesAdded)++; - if ( !pNode1 || !pNode2 ) - (*pnNodesAdded) += 2; - else if ( Type == 0 ) - { - pTemp = Abc_AigAndLookup( pManRst->pNtk->pManFunc, pNode1, Abc_ObjNot(pNode2) ); - if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) ) - (*pnNodesAdded)++; - pTemp = Abc_AigAndLookup( pManRst->pNtk->pManFunc, Abc_ObjNot(pNode1), pNode2 ); - if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) ) - (*pnNodesAdded)++; - } - else - { - pTemp = Abc_AigAndLookup( pManRst->pNtk->pManFunc, Abc_ObjNot(pNode1), Abc_ObjNot(pNode2) ); - if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) ) - (*pnNodesAdded)++; - pTemp = Abc_AigAndLookup( pManRst->pNtk->pManFunc, pNode1, pNode2 ); - if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) ) - (*pnNodesAdded)++; - } - if ( *pnNodesAdded > nNodesSaved ) - { - Vec_IntFree( vEdges ); - return eQuit; - } - } - // add the resulting node to the form - Abc_NodeEdgeDsdPushOrdered( pGraph, vEdges, Dec_EdgeToInt(eNode3) ); - } - // get the last node - eResult = Dec_IntToEdge( Vec_IntPop(vEdges) ); - Vec_IntFree( vEdges ); - // complement the graph if the node is complemented - eResult.fCompl ^= fCompl; - return eResult; - } - if ( DecType == DSD_NODE_PRIME ) - { - DdNode * bLocal, * bVar, * bCofT, * bCofE; - bLocal = Dsd_TreeGetPrimeFunction( pManRst->dd, pNodeDsd ); Cudd_Ref( bLocal ); -//Extra_bddPrint( pManRst->dd, bLocal ); - - bVar = pManRst->dd->vars[0]; - bCofE = Cudd_Cofactor( pManRst->dd, bLocal, Cudd_Not(bVar) ); Cudd_Ref( bCofE ); - bCofT = Cudd_Cofactor( pManRst->dd, bLocal, bVar ); Cudd_Ref( bCofT ); - if ( !Extra_bddIsVar(bCofE) || !Extra_bddIsVar(bCofT) ) - { - Cudd_RecursiveDeref( pManRst->dd, bCofE ); - Cudd_RecursiveDeref( pManRst->dd, bCofT ); - bVar = pManRst->dd->vars[1]; - bCofE = Cudd_Cofactor( pManRst->dd, bLocal, Cudd_Not(bVar) ); Cudd_Ref( bCofE ); - bCofT = Cudd_Cofactor( pManRst->dd, bLocal, bVar ); Cudd_Ref( bCofT ); - if ( !Extra_bddIsVar(bCofE) || !Extra_bddIsVar(bCofT) ) - { - Cudd_RecursiveDeref( pManRst->dd, bCofE ); - Cudd_RecursiveDeref( pManRst->dd, bCofT ); - bVar = pManRst->dd->vars[2]; - bCofE = Cudd_Cofactor( pManRst->dd, bLocal, Cudd_Not(bVar) ); Cudd_Ref( bCofE ); - bCofT = Cudd_Cofactor( pManRst->dd, bLocal, bVar ); Cudd_Ref( bCofT ); - if ( !Extra_bddIsVar(bCofE) || !Extra_bddIsVar(bCofT) ) - { - Cudd_RecursiveDeref( pManRst->dd, bCofE ); - Cudd_RecursiveDeref( pManRst->dd, bCofT ); - Cudd_RecursiveDeref( pManRst->dd, bLocal ); - Vec_IntFree( vEdges ); - return eQuit; - } - } - } - Cudd_RecursiveDeref( pManRst->dd, bLocal ); - // we found the control variable (bVar) and the var-cofactors (bCofT, bCofE) - - // find the graph nodes - eNode1 = Dec_IntToEdge( Vec_IntEntry(vEdges, bVar->index) ); - eNode2 = Dec_IntToEdge( Vec_IntEntry(vEdges, Cudd_Regular(bCofT)->index) ); - eNode3 = Dec_IntToEdge( Vec_IntEntry(vEdges, Cudd_Regular(bCofE)->index) ); - // add the complements to the graph nodes - eNode2.fCompl ^= Cudd_IsComplement(bCofT); - eNode3.fCompl ^= Cudd_IsComplement(bCofE); - - // because the cofactors are vars, we can just as well deref them here - Cudd_RecursiveDeref( pManRst->dd, bCofE ); - Cudd_RecursiveDeref( pManRst->dd, bCofT ); - - // find the ABC nodes - pNode1 = Dec_GraphNode( pGraph, eNode1.Node )->pFunc; - pNode2 = Dec_GraphNode( pGraph, eNode2.Node )->pFunc; - pNode3 = Dec_GraphNode( pGraph, eNode3.Node )->pFunc; - pNode1 = !pNode1? NULL : Abc_ObjNotCond( pNode1, eNode1.fCompl ); - pNode2 = !pNode2? NULL : Abc_ObjNotCond( pNode2, eNode2.fCompl ); - pNode3 = !pNode3? NULL : Abc_ObjNotCond( pNode3, eNode3.fCompl ); - - // check if the new node exists - Type = 0; - pNode4 = NULL; - if ( pNode1 && pNode2 && pNode3 ) - pNode4 = Abc_AigMuxLookup( pManRst->pNtk->pManFunc, pNode1, pNode2, pNode3, &Type ); - - // create the new node - eResult = Dec_GraphAddNodeMux( pGraph, eNode1, eNode2, eNode3, Type ); // should have the same structure as AIG - - // set level - Level1 = Dec_GraphNode( pGraph, eNode1.Node )->Level; - Level2 = Dec_GraphNode( pGraph, eNode2.Node )->Level; - Level3 = Dec_GraphNode( pGraph, eNode3.Node )->Level; - Dec_GraphNode( pGraph, eResult.Node )->Level = 2 + ABC_MAX( ABC_MAX(Level1, Level2), Level3 ); - // get the new node if possible - if ( pNode4 ) - { - Dec_GraphNode( pGraph, eResult.Node )->pFunc = Abc_ObjNotCond(pNode4, eResult.fCompl); - Level4 = Dec_GraphNode( pGraph, eResult.Node )->Level; - assert( Required == ABC_INFINITY || Level4 == (int)Abc_ObjRegular(pNode4)->Level ); - } - if ( !pNode4 || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pNode4)) ) - { - (*pnNodesAdded)++; - if ( Type == 0 ) - { - if ( !pNode1 || !pNode2 ) - (*pnNodesAdded)++; - else - { - pTemp = Abc_AigAndLookup( pManRst->pNtk->pManFunc, pNode1, pNode2 ); - if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) ) - (*pnNodesAdded)++; - } - if ( !pNode1 || !pNode3 ) - (*pnNodesAdded)++; - else - { - pTemp = Abc_AigAndLookup( pManRst->pNtk->pManFunc, Abc_ObjNot(pNode1), pNode3 ); - if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) ) - (*pnNodesAdded)++; - } - } - else - { - if ( !pNode1 || !pNode2 ) - (*pnNodesAdded)++; - else - { - pTemp = Abc_AigAndLookup( pManRst->pNtk->pManFunc, pNode1, Abc_ObjNot(pNode2) ); - if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) ) - (*pnNodesAdded)++; - } - if ( !pNode1 || !pNode3 ) - (*pnNodesAdded)++; - else - { - pTemp = Abc_AigAndLookup( pManRst->pNtk->pManFunc, Abc_ObjNot(pNode1), Abc_ObjNot(pNode3) ); - if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) ) - (*pnNodesAdded)++; - } - } - if ( *pnNodesAdded > nNodesSaved ) - { - Vec_IntFree( vEdges ); - return eQuit; - } - } - - Vec_IntFree( vEdges ); - // complement the graph if the node was complemented - eResult.fCompl ^= fCompl; - return eResult; - } - Vec_IntFree( vEdges ); - return eQuit; -} - -/**Function************************************************************* - - Synopsis [Evaluation one DSD.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_NodeEvaluateDsd( Abc_ManRst_t * pManRst, Dsd_Node_t * pNodeDsd, Abc_Obj_t * pRoot, int Required, int nNodesSaved, int * pnNodesAdded ) -{ - Dec_Graph_t * pGraph; - Dec_Edge_t gEdge; - Abc_Obj_t * pLeaf; - Dec_Node_t * pNode; - int i; - - // create the graph and set the leaves - pGraph = Dec_GraphCreate( Vec_PtrSize(pManRst->vLeaves) ); - Dec_GraphForEachLeaf( pGraph, pNode, i ) - { - pLeaf = Vec_PtrEntry( pManRst->vLeaves, i ); - pNode->pFunc = pLeaf; - pNode->Level = pLeaf->Level; - } - - // create the decomposition structure from the DSD - *pnNodesAdded = 0; - gEdge = Abc_NodeEvaluateDsd_rec( pGraph, pManRst, pNodeDsd, Required, nNodesSaved, pnNodesAdded ); - if ( gEdge.Node > 1000 ) // infeasible - { - *pnNodesAdded = -1; - Dec_GraphFree( pGraph ); - return NULL; - } - - // quit if the root node is the same - pLeaf = Dec_GraphNode( pGraph, gEdge.Node )->pFunc; - if ( Abc_ObjRegular(pLeaf) == pRoot ) - { - *pnNodesAdded = -1; - Dec_GraphFree( pGraph ); - return NULL; - } - - Dec_GraphSetRoot( pGraph, gEdge ); - return pGraph; -} - - - -/**Function************************************************************* - - Synopsis [Starts the cut manager for rewriting.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cut_Man_t * Abc_NtkStartCutManForRestruct( Abc_Ntk_t * pNtk, int nCutMax, int fDag ) -{ - static Cut_Params_t Params, * pParams = &Params; - Cut_Man_t * pManCut; - Abc_Obj_t * pObj; - int i; - // start the cut manager - memset( pParams, 0, sizeof(Cut_Params_t) ); - pParams->nVarsMax = nCutMax; // the max cut size ("k" of the k-feasible cuts) - pParams->nKeepMax = 250; // the max number of cuts kept at a node - pParams->fTruth = 0; // compute truth tables - pParams->fFilter = 1; // filter dominated cuts - pParams->fSeq = 0; // compute sequential cuts - pParams->fDrop = 0; // drop cuts on the fly - pParams->fDag = fDag; // compute DAG cuts - pParams->fTree = 0; // compute tree cuts - pParams->fVerbose = 0; // the verbosiness flag - pParams->nIdsMax = Abc_NtkObjNumMax( pNtk ); - pManCut = Cut_ManStart( pParams ); - if ( pParams->fDrop ) - Cut_ManSetFanoutCounts( pManCut, Abc_NtkFanoutCounts(pNtk) ); - // set cuts for PIs - Abc_NtkForEachCi( pNtk, pObj, i ) - if ( Abc_ObjFanoutNum(pObj) > 0 ) - Cut_NodeSetTriv( pManCut, pObj->Id ); - return pManCut; -} - -/**Function************************************************************* - - Synopsis [Starts the resynthesis manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_ManRst_t * Abc_NtkManRstStart( int nCutMax, bool fUpdateLevel, bool fUseZeros, bool fVerbose ) -{ - Abc_ManRst_t * p; - p = ALLOC( Abc_ManRst_t, 1 ); - memset( p, 0, sizeof(Abc_ManRst_t) ); - // set the parameters - p->nCutMax = nCutMax; - p->fUpdateLevel = fUpdateLevel; - p->fUseZeros = fUseZeros; - p->fVerbose = fVerbose; - // start the BDD manager - p->dd = Cudd_Init( p->nCutMax, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 ); - Cudd_zddVarsFromBddVars( p->dd, 2 ); - // start the DSD manager - p->pManDsd = Dsd_ManagerStart( p->dd, p->dd->size, 0 ); - // other temp datastructures - p->vVisited = Vec_PtrAlloc( 100 ); - p->vLeaves = Vec_PtrAlloc( 100 ); - p->vDecs = Vec_PtrAlloc( 100 ); - p->vTemp = Vec_PtrAlloc( 100 ); - p->vSims = Vec_IntAlloc( 100 ); - p->vOnes = Vec_IntAlloc( 100 ); - p->vBinate = Vec_IntAlloc( 100 ); - p->vTwos = Vec_IntAlloc( 100 ); - p->vRands = Vec_IntAlloc( 20 ); - - { - int i; - for ( i = 0; i < 20; i++ ) - Vec_IntPush( p->vRands, (int)RST_RANDOM_UNSIGNED ); - } - return p; -} - -/**Function************************************************************* - - Synopsis [Stops the resynthesis manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkManRstStop( Abc_ManRst_t * p ) -{ - Dsd_ManagerStop( p->pManDsd ); - Extra_StopManager( p->dd ); - Vec_PtrFree( p->vDecs ); - Vec_PtrFree( p->vLeaves ); - Vec_PtrFree( p->vVisited ); - Vec_PtrFree( p->vTemp ); - Vec_IntFree( p->vSims ); - Vec_IntFree( p->vOnes ); - Vec_IntFree( p->vBinate ); - Vec_IntFree( p->vTwos ); - Vec_IntFree( p->vRands ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Stops the resynthesis manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkManRstPrintStats( Abc_ManRst_t * p ) -{ - printf( "Refactoring statistics:\n" ); - printf( "Nodes considered = %8d.\n", p->nNodesConsidered ); - printf( "Cuts considered = %8d.\n", p->nCutsConsidered ); - printf( "Cuts explored = %8d.\n", p->nCutsExplored ); - printf( "Nodes restructured = %8d.\n", p->nNodesRestructured ); - printf( "Calculated gain = %8d.\n", p->nNodesGained ); - PRT( "Cuts ", p->timeCut ); - PRT( "Resynthesis", p->timeRes ); - PRT( " BDD ", p->timeBdd ); - PRT( " DSD ", p->timeDsd ); - PRT( " Eval ", p->timeEval ); - PRT( "AIG update ", p->timeNtk ); - PRT( "TOTAL ", p->timeTotal ); -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_Abc_NodeResubCollectDivs( Abc_ManRst_t * p, Abc_Obj_t * pRoot, Cut_Cut_t * pCut ) -{ - Abc_Obj_t * pNode, * pFanout; - int i, k; - // collect the leaves of the cut - Vec_PtrClear( p->vDecs ); - Abc_NtkIncrementTravId( pRoot->pNtk ); - for ( i = 0; i < (int)pCut->nLeaves; i++ ) - { - pNode = Abc_NtkObj(pRoot->pNtk, pCut->pLeaves[i]); - if ( pNode == NULL ) // the so-called "bad cut phenomenon" is due to removed nodes - return 0; - Vec_PtrPush( p->vDecs, pNode ); - Abc_NodeSetTravIdCurrent( pNode ); - } - // explore the fanouts - Vec_PtrForEachEntry( p->vDecs, pNode, i ) - { - // if the fanout has both fanins in the set, add it - Abc_ObjForEachFanout( pNode, pFanout, k ) - { - if ( Abc_NodeIsTravIdCurrent(pFanout) || Abc_ObjIsPo(pFanout) ) - continue; - if ( Abc_NodeIsTravIdCurrent(Abc_ObjFanin0(pFanout)) && Abc_NodeIsTravIdCurrent(Abc_ObjFanin1(pFanout)) ) - { - Vec_PtrPush( p->vDecs, pFanout ); - Abc_NodeSetTravIdCurrent( pFanout ); - } - } - } - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeResubMffc_rec( Abc_Obj_t * pNode ) -{ - if ( Abc_NodeIsTravIdCurrent(pNode) ) - return 0; - Abc_NodeSetTravIdCurrent( pNode ); - return 1 + Abc_NodeResubMffc_rec( Abc_ObjFanin0(pNode) ) + - Abc_NodeResubMffc_rec( Abc_ObjFanin1(pNode) ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeResubMffc( Abc_ManRst_t * p, Vec_Ptr_t * vDecs, int nLeaves, Abc_Obj_t * pRoot ) -{ - Abc_Obj_t * pObj; - int Counter, i, k; - // increment the traversal ID for the leaves - Abc_NtkIncrementTravId( pRoot->pNtk ); - // label the leaves - Vec_PtrForEachEntryStop( vDecs, pObj, i, nLeaves ) - Abc_NodeSetTravIdCurrent( pObj ); - // make sure the node is in the cone and is no one of the leaves - assert( Abc_NodeIsTravIdPrevious(pRoot) ); - Counter = Abc_NodeResubMffc_rec( pRoot ); - // move the labeled nodes to the end - Vec_PtrClear( p->vTemp ); - k = 0; - Vec_PtrForEachEntryStart( vDecs, pObj, i, nLeaves ) - if ( Abc_NodeIsTravIdCurrent(pObj) ) - Vec_PtrPush( p->vTemp, pObj ); - else - Vec_PtrWriteEntry( vDecs, k++, pObj ); - // add the labeled nodes - Vec_PtrForEachEntry( p->vTemp, pObj, i ) - Vec_PtrWriteEntry( vDecs, k++, pObj ); - assert( k == Vec_PtrSize(p->vDecs) ); - assert( pRoot == Vec_PtrEntryLast(p->vDecs) ); - return Counter; -} - -/**Function************************************************************* - - Synopsis [Performs simulation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeMffcSimulate( Vec_Ptr_t * vDecs, int nLeaves, Vec_Int_t * vRands, Vec_Int_t * vSims ) -{ - Abc_Obj_t * pObj; - unsigned uData0, uData1, uData; - int i; - // initialize random simulation data - Vec_IntClear( vSims ); - Vec_PtrForEachEntryStop( vDecs, pObj, i, nLeaves ) - { - uData = (unsigned)Vec_IntEntry( vRands, i ); - pObj->pData = (void *)uData; - Vec_IntPush( vSims, uData ); - } - // simulate - Vec_PtrForEachEntryStart( vDecs, pObj, i, nLeaves ) - { - uData0 = (unsigned)Abc_ObjFanin0(pObj)->pData; - uData1 = (unsigned)Abc_ObjFanin1(pObj)->pData; - uData = (Abc_ObjFaninC0(pObj)? ~uData0 : uData0) & (Abc_ObjFaninC1(pObj)? ~uData1 : uData1); - pObj->pData = (void *)uData; - Vec_IntPush( vSims, uData ); - } -} - -/**Function************************************************************* - - Synopsis [Full equality check.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeCheckFull( Abc_ManRst_t * p, Dec_Graph_t * pGraph ) -{ - return 1; -} -/**Function************************************************************* - - Synopsis [Detect contants.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_NodeMffcConstants( Abc_ManRst_t * p, Vec_Int_t * vSims ) -{ - Dec_Graph_t * pGraph; - unsigned uRoot; - // get the root node - uRoot = (unsigned)Vec_IntEntryLast( vSims ); - // get the graph if the node looks constant - if ( uRoot == 0 ) - pGraph = Dec_GraphCreateConst0(); - else if ( uRoot == ~(unsigned)0 ) - pGraph = Dec_GraphCreateConst1(); - // check the graph - if ( Abc_NodeCheckFull( p, pGraph ) ) - return pGraph; - Dec_GraphFree( pGraph ); - return NULL; -} - -/**Function************************************************************* - - Synopsis [Detect single non-overlaps.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_NodeMffcSingleVar( Abc_ManRst_t * p, Vec_Int_t * vSims, int nNodes, Vec_Int_t * vOnes ) -{ - Dec_Graph_t * pGraph; - unsigned uRoot, uNode; - int i; - - Vec_IntClear( vOnes ); - Vec_IntClear( p->vBinate ); - uRoot = (unsigned)Vec_IntEntryLast( vSims ); - for ( i = 0; i < nNodes; i++ ) - { - uNode = (unsigned)Vec_IntEntry( vSims, i ); - if ( uRoot == uNode || uRoot == ~uNode ) - { - pGraph = Dec_GraphCreate( 1 ); - Dec_GraphNode( pGraph, 0 )->pFunc = Vec_PtrEntry( p->vDecs, i ); - Dec_GraphSetRoot( pGraph, Dec_IntToEdge( (int)(uRoot == ~uNode) ) ); - // check the graph - if ( Abc_NodeCheckFull( p, pGraph ) ) - return pGraph; - Dec_GraphFree( pGraph ); - } - if ( (uRoot & uNode) == 0 ) - Vec_IntPush( vOnes, i << 1 ); - else if ( (uRoot & ~uNode) == 0 ) - Vec_IntPush( vOnes, (i << 1) + 1 ); - else - Vec_IntPush( p->vBinate, i ); - } - return NULL; -} - -/**Function************************************************************* - - Synopsis [Detect single non-overlaps.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_NodeMffcSingleNode( Abc_ManRst_t * p, Vec_Int_t * vSims, int nNodes, Vec_Int_t * vOnes ) -{ - Dec_Graph_t * pGraph; - Dec_Edge_t eNode0, eNode1, eRoot; - unsigned uRoot; - int i, k; - uRoot = (unsigned)Vec_IntEntryLast( vSims ); - for ( i = 0; i < vOnes->nSize; i++ ) - for ( k = i+1; k < vOnes->nSize; k++ ) - if ( ~uRoot == ((unsigned)vOnes->pArray[i] | (unsigned)vOnes->pArray[k]) ) - { - eNode0 = Dec_IntToEdge( vOnes->pArray[i] ^ 1 ); - eNode1 = Dec_IntToEdge( vOnes->pArray[k] ^ 1 ); - pGraph = Dec_GraphCreate( 2 ); - Dec_GraphNode( pGraph, 0 )->pFunc = Vec_PtrEntry( p->vDecs, eNode0.Node ); - Dec_GraphNode( pGraph, 1 )->pFunc = Vec_PtrEntry( p->vDecs, eNode1.Node ); - eRoot = Dec_GraphAddNodeAnd( pGraph, eNode0, eNode1 ); - Dec_GraphSetRoot( pGraph, eRoot ); - if ( Abc_NodeCheckFull( p, pGraph ) ) - return pGraph; - Dec_GraphFree( pGraph ); - } - return NULL; -} - -/**Function************************************************************* - - Synopsis [Detect single non-overlaps.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_NodeMffcDoubleNode( Abc_ManRst_t * p, Vec_Int_t * vSims, int nNodes, Vec_Int_t * vOnes ) -{ -// Dec_Graph_t * pGraph; -// unsigned uRoot, uNode; -// int i; - - - return NULL; -} - -/**Function************************************************************* - - Synopsis [Evaluates resubstution of one cut.] - - Description [Returns the graph to add if any.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_NodeResubEval( Abc_ManRst_t * p, Abc_Obj_t * pRoot, Cut_Cut_t * pCut ) -{ - Dec_Graph_t * pGraph; - int nNodesSaved; - - // collect the nodes in the cut - if ( !Abc_Abc_NodeResubCollectDivs( p, pRoot, pCut ) ) - return NULL; - - // label MFFC and count its size - nNodesSaved = Abc_NodeResubMffc( p, p->vDecs, pCut->nLeaves, pRoot ); - assert( nNodesSaved > 0 ); - - // simulate MFFC - Abc_NodeMffcSimulate( p->vDecs, pCut->nLeaves, p->vRands, p->vSims ); - - // check for constant output - pGraph = Abc_NodeMffcConstants( p, p->vSims ); - if ( pGraph ) - { - p->nNodesGained += nNodesSaved; - p->nNodesRestructured++; - return pGraph; - } - - // check for one literal (fill up the ones array) - pGraph = Abc_NodeMffcSingleVar( p, p->vSims, Vec_IntSize(p->vSims) - nNodesSaved, p->vOnes ); - if ( pGraph ) - { - p->nNodesGained += nNodesSaved; - p->nNodesRestructured++; - return pGraph; - } - if ( nNodesSaved == 1 ) - return NULL; - - // look for one node - pGraph = Abc_NodeMffcSingleNode( p, p->vSims, Vec_IntSize(p->vSims) - nNodesSaved, p->vOnes ); - if ( pGraph ) - { - p->nNodesGained += nNodesSaved - 1; - p->nNodesRestructured++; - return pGraph; - } - if ( nNodesSaved == 2 ) - return NULL; - - // look for two nodes - pGraph = Abc_NodeMffcDoubleNode( p, p->vSims, Vec_IntSize(p->vSims) - nNodesSaved, p->vOnes ); - if ( pGraph ) - { - p->nNodesGained += nNodesSaved - 2; - p->nNodesRestructured++; - return pGraph; - } - if ( nNodesSaved == 3 ) - return NULL; -/* - // look for MUX/EXOR - pGraph = Abc_NodeMffcMuxNode( p, p->vSims, Vec_IntSize(p->vSims) - nNodesSaved ); - if ( pGraph ) - { - p->nNodesGained += nNodesSaved - 1; - p->nNodesRestructured++; - return pGraph; - } -*/ - return NULL; -} - -/**Function************************************************************* - - Synopsis [Performs resubstution.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_NodeResubstitute( Abc_ManRst_t * p, Abc_Obj_t * pNode, Cut_Cut_t * pCutList ) -{ - Dec_Graph_t * pGraph, * pGraphBest = NULL; - Cut_Cut_t * pCut; - int nCuts; - p->nNodesConsidered++; - - // count the number of cuts with four inputs or more - nCuts = 0; - for ( pCut = pCutList; pCut; pCut = pCut->pNext ) - nCuts += (int)(pCut->nLeaves > 3); - printf( "-----------------------------------\n" ); - printf( "Node %6d : Factor-cuts = %5d.\n", pNode->Id, nCuts ); - - // go through the interesting cuts - for ( pCut = pCutList; pCut; pCut = pCut->pNext ) - { - if ( pCut->nLeaves < 4 ) - continue; - pGraph = Abc_NodeResubEval( p, pNode, pCut ); - if ( pGraph == NULL ) - continue; - if ( !pGraphBest || Dec_GraphNodeNum(pGraph) < Dec_GraphNodeNum(pGraphBest) ) - { - if ( pGraphBest ) - Dec_GraphFree(pGraphBest); - pGraphBest = pGraph; - } - else - Dec_GraphFree(pGraph); - } - return pGraphBest; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcResub.c b/src/base/abci/abcResub.c deleted file mode 100644 index 309c328d..00000000 --- a/src/base/abci/abcResub.c +++ /dev/null @@ -1,1951 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcResub.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Resubstitution manager.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcResub.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "dec.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -#define ABC_RS_DIV1_MAX 150 // the max number of divisors to consider -#define ABC_RS_DIV2_MAX 500 // the max number of pair-wise divisors to consider - -typedef struct Abc_ManRes_t_ Abc_ManRes_t; -struct Abc_ManRes_t_ -{ - // paramers - int nLeavesMax; // the max number of leaves in the cone - int nDivsMax; // the max number of divisors in the cone - // representation of the cone - Abc_Obj_t * pRoot; // the root of the cone - int nLeaves; // the number of leaves - int nDivs; // the number of all divisor (including leaves) - int nMffc; // the size of MFFC - int nLastGain; // the gain the number of nodes - Vec_Ptr_t * vDivs; // the divisors - // representation of the simulation info - int nBits; // the number of simulation bits - int nWords; // the number of unsigneds for siminfo - Vec_Ptr_t * vSims; // simulation info - unsigned * pInfo; // pointer to simulation info - // observability don't-cares - unsigned * pCareSet; - // internal divisor storage - Vec_Ptr_t * vDivs1UP; // the single-node unate divisors - Vec_Ptr_t * vDivs1UN; // the single-node unate divisors - Vec_Ptr_t * vDivs1B; // the single-node binate divisors - Vec_Ptr_t * vDivs2UP0; // the double-node unate divisors - Vec_Ptr_t * vDivs2UP1; // the double-node unate divisors - Vec_Ptr_t * vDivs2UN0; // the double-node unate divisors - Vec_Ptr_t * vDivs2UN1; // the double-node unate divisors - // other data - Vec_Ptr_t * vTemp; // temporary array of nodes - // runtime statistics - int timeCut; - int timeTruth; - int timeRes; - int timeDiv; - int timeMffc; - int timeSim; - int timeRes1; - int timeResD; - int timeRes2; - int timeRes3; - int timeNtk; - int timeTotal; - // improvement statistics - int nUsedNodeC; - int nUsedNode0; - int nUsedNode1Or; - int nUsedNode1And; - int nUsedNode2Or; - int nUsedNode2And; - int nUsedNode2OrAnd; - int nUsedNode2AndOr; - int nUsedNode3OrAnd; - int nUsedNode3AndOr; - int nUsedNodeTotal; - int nTotalDivs; - int nTotalLeaves; - int nTotalGain; - int nNodesBeg; - int nNodesEnd; -}; - -// external procedures -static Abc_ManRes_t* Abc_ManResubStart( int nLeavesMax, int nDivsMax ); -static void Abc_ManResubStop( Abc_ManRes_t * p ); -static Dec_Graph_t * Abc_ManResubEval( Abc_ManRes_t * p, Abc_Obj_t * pRoot, Vec_Ptr_t * vLeaves, int nSteps, bool fUpdateLevel, int fVerbose ); -static void Abc_ManResubCleanup( Abc_ManRes_t * p ); -static void Abc_ManResubPrint( Abc_ManRes_t * p ); - -// other procedures -static int Abc_ManResubCollectDivs( Abc_ManRes_t * p, Abc_Obj_t * pRoot, Vec_Ptr_t * vLeaves, int Required ); -static void Abc_ManResubSimulate( Vec_Ptr_t * vDivs, int nLeaves, Vec_Ptr_t * vSims, int nLeavesMax, int nWords ); -static void Abc_ManResubPrintDivs( Abc_ManRes_t * p, Abc_Obj_t * pRoot, Vec_Ptr_t * vLeaves ); - -static void Abc_ManResubDivsS( Abc_ManRes_t * p, int Required ); -static void Abc_ManResubDivsD( Abc_ManRes_t * p, int Required ); -static Dec_Graph_t * Abc_ManResubQuit( Abc_ManRes_t * p ); -static Dec_Graph_t * Abc_ManResubDivs0( Abc_ManRes_t * p ); -static Dec_Graph_t * Abc_ManResubDivs1( Abc_ManRes_t * p, int Required ); -static Dec_Graph_t * Abc_ManResubDivs12( Abc_ManRes_t * p, int Required ); -static Dec_Graph_t * Abc_ManResubDivs2( Abc_ManRes_t * p, int Required ); -static Dec_Graph_t * Abc_ManResubDivs3( Abc_ManRes_t * p, int Required ); - -static Vec_Ptr_t * Abc_CutFactorLarge( Abc_Obj_t * pNode, int nLeavesMax ); -static int Abc_CutVolumeCheck( Abc_Obj_t * pNode, Vec_Ptr_t * vLeaves ); - -// don't-care manager -extern void * Abc_NtkDontCareAlloc( int nVarsMax, int nLevels, int fVerbose, int fVeryVerbose ); -extern void Abc_NtkDontCareClear( void * p ); -extern void Abc_NtkDontCareFree( void * p ); -extern int Abc_NtkDontCareCompute( void * p, Abc_Obj_t * pNode, Vec_Ptr_t * vLeaves, unsigned * puTruth ); - -extern int s_ResubTime; - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Performs incremental resynthesis of the AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkResubstitute( Abc_Ntk_t * pNtk, int nCutMax, int nStepsMax, int nLevelsOdc, bool fUpdateLevel, bool fVerbose, bool fVeryVerbose ) -{ - ProgressBar * pProgress; - Abc_ManRes_t * pManRes; - Abc_ManCut_t * pManCut; - void * pManOdc = NULL; - Dec_Graph_t * pFForm; - Vec_Ptr_t * vLeaves; - Abc_Obj_t * pNode; - int clk, clkStart = clock(); - int i, nNodes; - - assert( Abc_NtkIsStrash(pNtk) ); - - // cleanup the AIG - Abc_AigCleanup(pNtk->pManFunc); - // start the managers - pManCut = Abc_NtkManCutStart( nCutMax, 100000, 100000, 100000 ); - pManRes = Abc_ManResubStart( nCutMax, ABC_RS_DIV1_MAX ); - if ( nLevelsOdc > 0 ) - pManOdc = Abc_NtkDontCareAlloc( nCutMax, nLevelsOdc, fVerbose, fVeryVerbose ); - - // compute the reverse levels if level update is requested - if ( fUpdateLevel ) - Abc_NtkStartReverseLevels( pNtk, 0 ); - - if ( Abc_NtkLatchNum(pNtk) ) - Abc_NtkForEachLatch(pNtk, pNode, i) - pNode->pNext = pNode->pData; - - // resynthesize each node once - pManRes->nNodesBeg = Abc_NtkNodeNum(pNtk); - nNodes = Abc_NtkObjNumMax(pNtk); - pProgress = Extra_ProgressBarStart( stdout, nNodes ); - Abc_NtkForEachNode( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - // skip the constant node -// if ( Abc_NodeIsConst(pNode) ) -// continue; - // skip persistant nodes - if ( Abc_NodeIsPersistant(pNode) ) - continue; - // skip the nodes with many fanouts - if ( Abc_ObjFanoutNum(pNode) > 1000 ) - continue; - // stop if all nodes have been tried once - if ( i >= nNodes ) - break; - - // compute a reconvergence-driven cut -clk = clock(); - vLeaves = Abc_NodeFindCut( pManCut, pNode, 0 ); -// vLeaves = Abc_CutFactorLarge( pNode, nCutMax ); -pManRes->timeCut += clock() - clk; -/* - if ( fVerbose && vLeaves ) - printf( "Node %6d : Leaves = %3d. Volume = %3d.\n", pNode->Id, Vec_PtrSize(vLeaves), Abc_CutVolumeCheck(pNode, vLeaves) ); - if ( vLeaves == NULL ) - continue; -*/ - // get the don't-cares - if ( pManOdc ) - { -clk = clock(); - Abc_NtkDontCareClear( pManOdc ); - Abc_NtkDontCareCompute( pManOdc, pNode, vLeaves, pManRes->pCareSet ); -pManRes->timeTruth += clock() - clk; - } - - // evaluate this cut -clk = clock(); - pFForm = Abc_ManResubEval( pManRes, pNode, vLeaves, nStepsMax, fUpdateLevel, fVerbose ); -// Vec_PtrFree( vLeaves ); -// Abc_ManResubCleanup( pManRes ); -pManRes->timeRes += clock() - clk; - if ( pFForm == NULL ) - continue; - pManRes->nTotalGain += pManRes->nLastGain; -/* - if ( pManRes->nLeaves == 4 && pManRes->nMffc == 2 && pManRes->nLastGain == 1 ) - { - printf( "%6d : L = %2d. V = %2d. Mffc = %2d. Divs = %3d. Up = %3d. Un = %3d. B = %3d.\n", - pNode->Id, pManRes->nLeaves, Abc_CutVolumeCheck(pNode, vLeaves), pManRes->nMffc, pManRes->nDivs, - pManRes->vDivs1UP->nSize, pManRes->vDivs1UN->nSize, pManRes->vDivs1B->nSize ); - Abc_ManResubPrintDivs( pManRes, pNode, vLeaves ); - } -*/ - // acceptable replacement found, update the graph -clk = clock(); - Dec_GraphUpdateNetwork( pNode, pFForm, fUpdateLevel, pManRes->nLastGain ); -pManRes->timeNtk += clock() - clk; - Dec_GraphFree( pFForm ); - } - Extra_ProgressBarStop( pProgress ); -pManRes->timeTotal = clock() - clkStart; - pManRes->nNodesEnd = Abc_NtkNodeNum(pNtk); - - // print statistics - if ( fVerbose ) - Abc_ManResubPrint( pManRes ); - - // delete the managers - Abc_ManResubStop( pManRes ); - Abc_NtkManCutStop( pManCut ); - if ( pManOdc ) Abc_NtkDontCareFree( pManOdc ); - - // clean the data field - Abc_NtkForEachObj( pNtk, pNode, i ) - pNode->pData = NULL; - - if ( Abc_NtkLatchNum(pNtk) ) - Abc_NtkForEachLatch(pNtk, pNode, i) - pNode->pData = pNode->pNext, pNode->pNext = NULL; - - // put the nodes into the DFS order and reassign their IDs - Abc_NtkReassignIds( pNtk ); -// Abc_AigCheckFaninOrder( pNtk->pManFunc ); - // fix the levels - if ( fUpdateLevel ) - Abc_NtkStopReverseLevels( pNtk ); - else - Abc_NtkLevel( pNtk ); - // check - if ( !Abc_NtkCheck( pNtk ) ) - { - printf( "Abc_NtkRefactor: The network check has failed.\n" ); - return 0; - } -s_ResubTime = clock() - clkStart; - return 1; -} - - - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_ManRes_t * Abc_ManResubStart( int nLeavesMax, int nDivsMax ) -{ - Abc_ManRes_t * p; - unsigned * pData; - int i, k; - assert( sizeof(unsigned) == 4 ); - p = ALLOC( Abc_ManRes_t, 1 ); - memset( p, 0, sizeof(Abc_ManRes_t) ); - p->nLeavesMax = nLeavesMax; - p->nDivsMax = nDivsMax; - p->vDivs = Vec_PtrAlloc( p->nDivsMax ); - // allocate simulation info - p->nBits = (1 << p->nLeavesMax); - p->nWords = (p->nBits <= 32)? 1 : (p->nBits / 32); - p->pInfo = ALLOC( unsigned, p->nWords * (p->nDivsMax + 1) ); - memset( p->pInfo, 0, sizeof(unsigned) * p->nWords * p->nLeavesMax ); - p->vSims = Vec_PtrAlloc( p->nDivsMax ); - for ( i = 0; i < p->nDivsMax; i++ ) - Vec_PtrPush( p->vSims, p->pInfo + i * p->nWords ); - // assign the care set - p->pCareSet = p->pInfo + p->nDivsMax * p->nWords; - Abc_InfoFill( p->pCareSet, p->nWords ); - // set elementary truth tables - for ( k = 0; k < p->nLeavesMax; k++ ) - { - pData = p->vSims->pArray[k]; - for ( i = 0; i < p->nBits; i++ ) - if ( i & (1 << k) ) - pData[i>>5] |= (1 << (i&31)); - } - // create the remaining divisors - p->vDivs1UP = Vec_PtrAlloc( p->nDivsMax ); - p->vDivs1UN = Vec_PtrAlloc( p->nDivsMax ); - p->vDivs1B = Vec_PtrAlloc( p->nDivsMax ); - p->vDivs2UP0 = Vec_PtrAlloc( p->nDivsMax ); - p->vDivs2UP1 = Vec_PtrAlloc( p->nDivsMax ); - p->vDivs2UN0 = Vec_PtrAlloc( p->nDivsMax ); - p->vDivs2UN1 = Vec_PtrAlloc( p->nDivsMax ); - p->vTemp = Vec_PtrAlloc( p->nDivsMax ); - return p; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManResubStop( Abc_ManRes_t * p ) -{ - Vec_PtrFree( p->vDivs ); - Vec_PtrFree( p->vSims ); - Vec_PtrFree( p->vDivs1UP ); - Vec_PtrFree( p->vDivs1UN ); - Vec_PtrFree( p->vDivs1B ); - Vec_PtrFree( p->vDivs2UP0 ); - Vec_PtrFree( p->vDivs2UP1 ); - Vec_PtrFree( p->vDivs2UN0 ); - Vec_PtrFree( p->vDivs2UN1 ); - Vec_PtrFree( p->vTemp ); - free( p->pInfo ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManResubPrint( Abc_ManRes_t * p ) -{ - printf( "Used constants = %6d. ", p->nUsedNodeC ); PRT( "Cuts ", p->timeCut ); - printf( "Used replacements = %6d. ", p->nUsedNode0 ); PRT( "Resub ", p->timeRes ); - printf( "Used single ORs = %6d. ", p->nUsedNode1Or ); PRT( " Div ", p->timeDiv ); - printf( "Used single ANDs = %6d. ", p->nUsedNode1And ); PRT( " Mffc ", p->timeMffc ); - printf( "Used double ORs = %6d. ", p->nUsedNode2Or ); PRT( " Sim ", p->timeSim ); - printf( "Used double ANDs = %6d. ", p->nUsedNode2And ); PRT( " 1 ", p->timeRes1 ); - printf( "Used OR-AND = %6d. ", p->nUsedNode2OrAnd ); PRT( " D ", p->timeResD ); - printf( "Used AND-OR = %6d. ", p->nUsedNode2AndOr ); PRT( " 2 ", p->timeRes2 ); - printf( "Used OR-2ANDs = %6d. ", p->nUsedNode3OrAnd ); PRT( "Truth ", p->timeTruth ); //PRT( " 3 ", p->timeRes3 ); - printf( "Used AND-2ORs = %6d. ", p->nUsedNode3AndOr ); PRT( "AIG ", p->timeNtk ); - printf( "TOTAL = %6d. ", p->nUsedNodeC + - p->nUsedNode0 + - p->nUsedNode1Or + - p->nUsedNode1And + - p->nUsedNode2Or + - p->nUsedNode2And + - p->nUsedNode2OrAnd + - p->nUsedNode2AndOr + - p->nUsedNode3OrAnd + - p->nUsedNode3AndOr - ); PRT( "TOTAL ", p->timeTotal ); - printf( "Total leaves = %8d.\n", p->nTotalLeaves ); - printf( "Total divisors = %8d.\n", p->nTotalDivs ); -// printf( "Total gain = %8d.\n", p->nTotalGain ); - printf( "Gain = %8d. (%6.2f %%).\n", p->nNodesBeg-p->nNodesEnd, 100.0*(p->nNodesBeg-p->nNodesEnd)/p->nNodesBeg ); -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManResubCollectDivs_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vInternal ) -{ - // skip visited nodes - if ( Abc_NodeIsTravIdCurrent(pNode) ) - return; - Abc_NodeSetTravIdCurrent(pNode); - // collect the fanins - Abc_ManResubCollectDivs_rec( Abc_ObjFanin0(pNode), vInternal ); - Abc_ManResubCollectDivs_rec( Abc_ObjFanin1(pNode), vInternal ); - // collect the internal node - if ( pNode->fMarkA == 0 ) - Vec_PtrPush( vInternal, pNode ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_ManResubCollectDivs( Abc_ManRes_t * p, Abc_Obj_t * pRoot, Vec_Ptr_t * vLeaves, int Required ) -{ - Abc_Obj_t * pNode, * pFanout; - int i, k, Limit, Counter; - - Vec_PtrClear( p->vDivs1UP ); - Vec_PtrClear( p->vDivs1UN ); - Vec_PtrClear( p->vDivs1B ); - - // add the leaves of the cuts to the divisors - Vec_PtrClear( p->vDivs ); - Abc_NtkIncrementTravId( pRoot->pNtk ); - Vec_PtrForEachEntry( vLeaves, pNode, i ) - { - Vec_PtrPush( p->vDivs, pNode ); - Abc_NodeSetTravIdCurrent( pNode ); - } - - // mark nodes in the MFFC - Vec_PtrForEachEntry( p->vTemp, pNode, i ) - pNode->fMarkA = 1; - // collect the cone (without MFFC) - Abc_ManResubCollectDivs_rec( pRoot, p->vDivs ); - // unmark the current MFFC - Vec_PtrForEachEntry( p->vTemp, pNode, i ) - pNode->fMarkA = 0; - - // check if the number of divisors is not exceeded - if ( Vec_PtrSize(p->vDivs) - Vec_PtrSize(vLeaves) + Vec_PtrSize(p->vTemp) >= Vec_PtrSize(p->vSims) - p->nLeavesMax ) - return 0; - - // get the number of divisors to collect - Limit = Vec_PtrSize(p->vSims) - p->nLeavesMax - (Vec_PtrSize(p->vDivs) - Vec_PtrSize(vLeaves) + Vec_PtrSize(p->vTemp)); - - // explore the fanouts, which are not in the MFFC - Counter = 0; - Vec_PtrForEachEntry( p->vDivs, pNode, i ) - { - if ( Abc_ObjFanoutNum(pNode) > 100 ) - { -// printf( "%d ", Abc_ObjFanoutNum(pNode) ); - continue; - } - // if the fanout has both fanins in the set, add it - Abc_ObjForEachFanout( pNode, pFanout, k ) - { - if ( Abc_NodeIsTravIdCurrent(pFanout) || Abc_ObjIsCo(pFanout) || (int)pFanout->Level > Required ) - continue; - if ( Abc_NodeIsTravIdCurrent(Abc_ObjFanin0(pFanout)) && Abc_NodeIsTravIdCurrent(Abc_ObjFanin1(pFanout)) ) - { - if ( Abc_ObjFanin0(pFanout) == pRoot || Abc_ObjFanin1(pFanout) == pRoot ) - continue; - Vec_PtrPush( p->vDivs, pFanout ); - Abc_NodeSetTravIdCurrent( pFanout ); - // quit computing divisors if there is too many of them - if ( ++Counter == Limit ) - goto Quits; - } - } - } - -Quits : - // get the number of divisors - p->nDivs = Vec_PtrSize(p->vDivs); - - // add the nodes in the MFFC - Vec_PtrForEachEntry( p->vTemp, pNode, i ) - Vec_PtrPush( p->vDivs, pNode ); - assert( pRoot == Vec_PtrEntryLast(p->vDivs) ); - - assert( Vec_PtrSize(p->vDivs) - Vec_PtrSize(vLeaves) <= Vec_PtrSize(p->vSims) - p->nLeavesMax ); - return 1; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManResubPrintDivs( Abc_ManRes_t * p, Abc_Obj_t * pRoot, Vec_Ptr_t * vLeaves ) -{ - Abc_Obj_t * pFanin, * pNode; - int i, k; - // print the nodes - Vec_PtrForEachEntry( p->vDivs, pNode, i ) - { - if ( i < Vec_PtrSize(vLeaves) ) - { - printf( "%6d : %c\n", pNode->Id, 'a'+i ); - continue; - } - printf( "%6d : %2d = ", pNode->Id, i ); - // find the first fanin - Vec_PtrForEachEntry( p->vDivs, pFanin, k ) - if ( Abc_ObjFanin0(pNode) == pFanin ) - break; - if ( k < Vec_PtrSize(vLeaves) ) - printf( "%c", 'a' + k ); - else - printf( "%d", k ); - printf( "%s ", Abc_ObjFaninC0(pNode)? "\'" : "" ); - // find the second fanin - Vec_PtrForEachEntry( p->vDivs, pFanin, k ) - if ( Abc_ObjFanin1(pNode) == pFanin ) - break; - if ( k < Vec_PtrSize(vLeaves) ) - printf( "%c", 'a' + k ); - else - printf( "%d", k ); - printf( "%s ", Abc_ObjFaninC1(pNode)? "\'" : "" ); - if ( pNode == pRoot ) - printf( " root" ); - printf( "\n" ); - } - printf( "\n" ); -} - - -/**Function************************************************************* - - Synopsis [Performs simulation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManResubSimulate( Vec_Ptr_t * vDivs, int nLeaves, Vec_Ptr_t * vSims, int nLeavesMax, int nWords ) -{ - Abc_Obj_t * pObj; - unsigned * puData0, * puData1, * puData; - int i, k; - assert( Vec_PtrSize(vDivs) - nLeaves <= Vec_PtrSize(vSims) - nLeavesMax ); - // simulate - Vec_PtrForEachEntry( vDivs, pObj, i ) - { - if ( i < nLeaves ) - { // initialize the leaf - pObj->pData = Vec_PtrEntry( vSims, i ); - continue; - } - // set storage for the node's simulation info - pObj->pData = Vec_PtrEntry( vSims, i - nLeaves + nLeavesMax ); - // get pointer to the simulation info - puData = pObj->pData; - puData0 = Abc_ObjFanin0(pObj)->pData; - puData1 = Abc_ObjFanin1(pObj)->pData; - // simulate - if ( Abc_ObjFaninC0(pObj) && Abc_ObjFaninC1(pObj) ) - for ( k = 0; k < nWords; k++ ) - puData[k] = ~puData0[k] & ~puData1[k]; - else if ( Abc_ObjFaninC0(pObj) ) - for ( k = 0; k < nWords; k++ ) - puData[k] = ~puData0[k] & puData1[k]; - else if ( Abc_ObjFaninC1(pObj) ) - for ( k = 0; k < nWords; k++ ) - puData[k] = puData0[k] & ~puData1[k]; - else - for ( k = 0; k < nWords; k++ ) - puData[k] = puData0[k] & puData1[k]; - } - // normalize - Vec_PtrForEachEntry( vDivs, pObj, i ) - { - puData = pObj->pData; - pObj->fPhase = (puData[0] & 1); - if ( pObj->fPhase ) - for ( k = 0; k < nWords; k++ ) - puData[k] = ~puData[k]; - } -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_ManResubQuit0( Abc_Obj_t * pRoot, Abc_Obj_t * pObj ) -{ - Dec_Graph_t * pGraph; - Dec_Edge_t eRoot; - pGraph = Dec_GraphCreate( 1 ); - Dec_GraphNode( pGraph, 0 )->pFunc = pObj; - eRoot = Dec_EdgeCreate( 0, pObj->fPhase ); - Dec_GraphSetRoot( pGraph, eRoot ); - if ( pRoot->fPhase ) - Dec_GraphComplement( pGraph ); - return pGraph; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_ManResubQuit1( Abc_Obj_t * pRoot, Abc_Obj_t * pObj0, Abc_Obj_t * pObj1, int fOrGate ) -{ - Dec_Graph_t * pGraph; - Dec_Edge_t eRoot, eNode0, eNode1; - assert( pObj0 != pObj1 ); - assert( !Abc_ObjIsComplement(pObj0) ); - assert( !Abc_ObjIsComplement(pObj1) ); - pGraph = Dec_GraphCreate( 2 ); - Dec_GraphNode( pGraph, 0 )->pFunc = pObj0; - Dec_GraphNode( pGraph, 1 )->pFunc = pObj1; - eNode0 = Dec_EdgeCreate( 0, pObj0->fPhase ); - eNode1 = Dec_EdgeCreate( 1, pObj1->fPhase ); - if ( fOrGate ) - eRoot = Dec_GraphAddNodeOr( pGraph, eNode0, eNode1 ); - else - eRoot = Dec_GraphAddNodeAnd( pGraph, eNode0, eNode1 ); - Dec_GraphSetRoot( pGraph, eRoot ); - if ( pRoot->fPhase ) - Dec_GraphComplement( pGraph ); - return pGraph; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_ManResubQuit21( Abc_Obj_t * pRoot, Abc_Obj_t * pObj0, Abc_Obj_t * pObj1, Abc_Obj_t * pObj2, int fOrGate ) -{ - Dec_Graph_t * pGraph; - Dec_Edge_t eRoot, eNode0, eNode1, eNode2; - assert( pObj0 != pObj1 ); - assert( !Abc_ObjIsComplement(pObj0) ); - assert( !Abc_ObjIsComplement(pObj1) ); - assert( !Abc_ObjIsComplement(pObj2) ); - pGraph = Dec_GraphCreate( 3 ); - Dec_GraphNode( pGraph, 0 )->pFunc = pObj0; - Dec_GraphNode( pGraph, 1 )->pFunc = pObj1; - Dec_GraphNode( pGraph, 2 )->pFunc = pObj2; - eNode0 = Dec_EdgeCreate( 0, pObj0->fPhase ); - eNode1 = Dec_EdgeCreate( 1, pObj1->fPhase ); - eNode2 = Dec_EdgeCreate( 2, pObj2->fPhase ); - if ( fOrGate ) - { - eRoot = Dec_GraphAddNodeOr( pGraph, eNode0, eNode1 ); - eRoot = Dec_GraphAddNodeOr( pGraph, eNode2, eRoot ); - } - else - { - eRoot = Dec_GraphAddNodeAnd( pGraph, eNode0, eNode1 ); - eRoot = Dec_GraphAddNodeAnd( pGraph, eNode2, eRoot ); - } - Dec_GraphSetRoot( pGraph, eRoot ); - if ( pRoot->fPhase ) - Dec_GraphComplement( pGraph ); - return pGraph; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_ManResubQuit2( Abc_Obj_t * pRoot, Abc_Obj_t * pObj0, Abc_Obj_t * pObj1, Abc_Obj_t * pObj2, int fOrGate ) -{ - Dec_Graph_t * pGraph; - Dec_Edge_t eRoot, ePrev, eNode0, eNode1, eNode2; - assert( pObj0 != pObj1 ); - assert( pObj0 != pObj2 ); - assert( pObj1 != pObj2 ); - assert( !Abc_ObjIsComplement(pObj0) ); - pGraph = Dec_GraphCreate( 3 ); - Dec_GraphNode( pGraph, 0 )->pFunc = Abc_ObjRegular(pObj0); - Dec_GraphNode( pGraph, 1 )->pFunc = Abc_ObjRegular(pObj1); - Dec_GraphNode( pGraph, 2 )->pFunc = Abc_ObjRegular(pObj2); - eNode0 = Dec_EdgeCreate( 0, Abc_ObjRegular(pObj0)->fPhase ); - if ( Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) ) - { - eNode1 = Dec_EdgeCreate( 1, Abc_ObjRegular(pObj1)->fPhase ); - eNode2 = Dec_EdgeCreate( 2, Abc_ObjRegular(pObj2)->fPhase ); - ePrev = Dec_GraphAddNodeOr( pGraph, eNode1, eNode2 ); - } - else - { - eNode1 = Dec_EdgeCreate( 1, Abc_ObjRegular(pObj1)->fPhase ^ Abc_ObjIsComplement(pObj1) ); - eNode2 = Dec_EdgeCreate( 2, Abc_ObjRegular(pObj2)->fPhase ^ Abc_ObjIsComplement(pObj2) ); - ePrev = Dec_GraphAddNodeAnd( pGraph, eNode1, eNode2 ); - } - if ( fOrGate ) - eRoot = Dec_GraphAddNodeOr( pGraph, eNode0, ePrev ); - else - eRoot = Dec_GraphAddNodeAnd( pGraph, eNode0, ePrev ); - Dec_GraphSetRoot( pGraph, eRoot ); - if ( pRoot->fPhase ) - Dec_GraphComplement( pGraph ); - return pGraph; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_ManResubQuit3( Abc_Obj_t * pRoot, Abc_Obj_t * pObj0, Abc_Obj_t * pObj1, Abc_Obj_t * pObj2, Abc_Obj_t * pObj3, int fOrGate ) -{ - Dec_Graph_t * pGraph; - Dec_Edge_t eRoot, ePrev0, ePrev1, eNode0, eNode1, eNode2, eNode3; - assert( pObj0 != pObj1 ); - assert( pObj2 != pObj3 ); - pGraph = Dec_GraphCreate( 4 ); - Dec_GraphNode( pGraph, 0 )->pFunc = Abc_ObjRegular(pObj0); - Dec_GraphNode( pGraph, 1 )->pFunc = Abc_ObjRegular(pObj1); - Dec_GraphNode( pGraph, 2 )->pFunc = Abc_ObjRegular(pObj2); - Dec_GraphNode( pGraph, 3 )->pFunc = Abc_ObjRegular(pObj3); - if ( Abc_ObjIsComplement(pObj0) && Abc_ObjIsComplement(pObj1) ) - { - eNode0 = Dec_EdgeCreate( 0, Abc_ObjRegular(pObj0)->fPhase ); - eNode1 = Dec_EdgeCreate( 1, Abc_ObjRegular(pObj1)->fPhase ); - ePrev0 = Dec_GraphAddNodeOr( pGraph, eNode0, eNode1 ); - if ( Abc_ObjIsComplement(pObj2) && Abc_ObjIsComplement(pObj3) ) - { - eNode2 = Dec_EdgeCreate( 2, Abc_ObjRegular(pObj2)->fPhase ); - eNode3 = Dec_EdgeCreate( 3, Abc_ObjRegular(pObj3)->fPhase ); - ePrev1 = Dec_GraphAddNodeOr( pGraph, eNode2, eNode3 ); - } - else - { - eNode2 = Dec_EdgeCreate( 2, Abc_ObjRegular(pObj2)->fPhase ^ Abc_ObjIsComplement(pObj2) ); - eNode3 = Dec_EdgeCreate( 3, Abc_ObjRegular(pObj3)->fPhase ^ Abc_ObjIsComplement(pObj3) ); - ePrev1 = Dec_GraphAddNodeAnd( pGraph, eNode2, eNode3 ); - } - } - else - { - eNode0 = Dec_EdgeCreate( 0, Abc_ObjRegular(pObj0)->fPhase ^ Abc_ObjIsComplement(pObj0) ); - eNode1 = Dec_EdgeCreate( 1, Abc_ObjRegular(pObj1)->fPhase ^ Abc_ObjIsComplement(pObj1) ); - ePrev0 = Dec_GraphAddNodeAnd( pGraph, eNode0, eNode1 ); - if ( Abc_ObjIsComplement(pObj2) && Abc_ObjIsComplement(pObj3) ) - { - eNode2 = Dec_EdgeCreate( 2, Abc_ObjRegular(pObj2)->fPhase ); - eNode3 = Dec_EdgeCreate( 3, Abc_ObjRegular(pObj3)->fPhase ); - ePrev1 = Dec_GraphAddNodeOr( pGraph, eNode2, eNode3 ); - } - else - { - eNode2 = Dec_EdgeCreate( 2, Abc_ObjRegular(pObj2)->fPhase ^ Abc_ObjIsComplement(pObj2) ); - eNode3 = Dec_EdgeCreate( 3, Abc_ObjRegular(pObj3)->fPhase ^ Abc_ObjIsComplement(pObj3) ); - ePrev1 = Dec_GraphAddNodeAnd( pGraph, eNode2, eNode3 ); - } - } - if ( fOrGate ) - eRoot = Dec_GraphAddNodeOr( pGraph, ePrev0, ePrev1 ); - else - eRoot = Dec_GraphAddNodeAnd( pGraph, ePrev0, ePrev1 ); - Dec_GraphSetRoot( pGraph, eRoot ); - if ( pRoot->fPhase ) - Dec_GraphComplement( pGraph ); - return pGraph; -} - - - - -/**Function************************************************************* - - Synopsis [Derives single-node unate/binate divisors.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManResubDivsS( Abc_ManRes_t * p, int Required ) -{ - Abc_Obj_t * pObj; - unsigned * puData, * puDataR; - int i, w; - Vec_PtrClear( p->vDivs1UP ); - Vec_PtrClear( p->vDivs1UN ); - Vec_PtrClear( p->vDivs1B ); - puDataR = p->pRoot->pData; - Vec_PtrForEachEntryStop( p->vDivs, pObj, i, p->nDivs ) - { - if ( (int)pObj->Level > Required - 1 ) - continue; - - puData = pObj->pData; - // check positive containment - for ( w = 0; w < p->nWords; w++ ) -// if ( puData[w] & ~puDataR[w] ) - if ( puData[w] & ~puDataR[w] & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - Vec_PtrPush( p->vDivs1UP, pObj ); - continue; - } - // check negative containment - for ( w = 0; w < p->nWords; w++ ) -// if ( ~puData[w] & puDataR[w] ) - if ( ~puData[w] & puDataR[w] & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - Vec_PtrPush( p->vDivs1UN, pObj ); - continue; - } - // add the node to binates - Vec_PtrPush( p->vDivs1B, pObj ); - } -} - -/**Function************************************************************* - - Synopsis [Derives double-node unate/binate divisors.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManResubDivsD( Abc_ManRes_t * p, int Required ) -{ - Abc_Obj_t * pObj0, * pObj1; - unsigned * puData0, * puData1, * puDataR; - int i, k, w; - Vec_PtrClear( p->vDivs2UP0 ); - Vec_PtrClear( p->vDivs2UP1 ); - Vec_PtrClear( p->vDivs2UN0 ); - Vec_PtrClear( p->vDivs2UN1 ); - puDataR = p->pRoot->pData; - Vec_PtrForEachEntry( p->vDivs1B, pObj0, i ) - { - if ( (int)pObj0->Level > Required - 2 ) - continue; - - puData0 = pObj0->pData; - Vec_PtrForEachEntryStart( p->vDivs1B, pObj1, k, i + 1 ) - { - if ( (int)pObj1->Level > Required - 2 ) - continue; - - puData1 = pObj1->pData; - - if ( Vec_PtrSize(p->vDivs2UP0) < ABC_RS_DIV2_MAX ) - { - // get positive unate divisors - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] & puData1[w]) & ~puDataR[w] ) - if ( (puData0[w] & puData1[w]) & ~puDataR[w] & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - Vec_PtrPush( p->vDivs2UP0, pObj0 ); - Vec_PtrPush( p->vDivs2UP1, pObj1 ); - } - for ( w = 0; w < p->nWords; w++ ) -// if ( (~puData0[w] & puData1[w]) & ~puDataR[w] ) - if ( (~puData0[w] & puData1[w]) & ~puDataR[w] & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - Vec_PtrPush( p->vDivs2UP0, Abc_ObjNot(pObj0) ); - Vec_PtrPush( p->vDivs2UP1, pObj1 ); - } - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] & ~puData1[w]) & ~puDataR[w] ) - if ( (puData0[w] & ~puData1[w]) & ~puDataR[w] & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - Vec_PtrPush( p->vDivs2UP0, pObj0 ); - Vec_PtrPush( p->vDivs2UP1, Abc_ObjNot(pObj1) ); - } - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] | puData1[w]) & ~puDataR[w] ) - if ( (puData0[w] | puData1[w]) & ~puDataR[w] & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - Vec_PtrPush( p->vDivs2UP0, Abc_ObjNot(pObj0) ); - Vec_PtrPush( p->vDivs2UP1, Abc_ObjNot(pObj1) ); - } - } - - if ( Vec_PtrSize(p->vDivs2UN0) < ABC_RS_DIV2_MAX ) - { - // get negative unate divisors - for ( w = 0; w < p->nWords; w++ ) -// if ( ~(puData0[w] & puData1[w]) & puDataR[w] ) - if ( ~(puData0[w] & puData1[w]) & puDataR[w] & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - Vec_PtrPush( p->vDivs2UN0, pObj0 ); - Vec_PtrPush( p->vDivs2UN1, pObj1 ); - } - for ( w = 0; w < p->nWords; w++ ) -// if ( ~(~puData0[w] & puData1[w]) & puDataR[w] ) - if ( ~(~puData0[w] & puData1[w]) & puDataR[w] & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - Vec_PtrPush( p->vDivs2UN0, Abc_ObjNot(pObj0) ); - Vec_PtrPush( p->vDivs2UN1, pObj1 ); - } - for ( w = 0; w < p->nWords; w++ ) -// if ( ~(puData0[w] & ~puData1[w]) & puDataR[w] ) - if ( ~(puData0[w] & ~puData1[w]) & puDataR[w] & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - Vec_PtrPush( p->vDivs2UN0, pObj0 ); - Vec_PtrPush( p->vDivs2UN1, Abc_ObjNot(pObj1) ); - } - for ( w = 0; w < p->nWords; w++ ) -// if ( ~(puData0[w] | puData1[w]) & puDataR[w] ) - if ( ~(puData0[w] | puData1[w]) & puDataR[w] & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - Vec_PtrPush( p->vDivs2UN0, Abc_ObjNot(pObj0) ); - Vec_PtrPush( p->vDivs2UN1, Abc_ObjNot(pObj1) ); - } - } - } - } -// printf( "%d %d ", Vec_PtrSize(p->vDivs2UP0), Vec_PtrSize(p->vDivs2UN0) ); -} - - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_ManResubQuit( Abc_ManRes_t * p ) -{ - Dec_Graph_t * pGraph; - unsigned * upData; - int w; - upData = p->pRoot->pData; - for ( w = 0; w < p->nWords; w++ ) -// if ( upData[w] ) - if ( upData[w] & p->pCareSet[w] ) // care set - break; - if ( w != p->nWords ) - return NULL; - // get constant node graph - if ( p->pRoot->fPhase ) - pGraph = Dec_GraphCreateConst1(); - else - pGraph = Dec_GraphCreateConst0(); - return pGraph; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_ManResubDivs0( Abc_ManRes_t * p ) -{ - Abc_Obj_t * pObj; - unsigned * puData, * puDataR; - int i, w; - puDataR = p->pRoot->pData; - Vec_PtrForEachEntryStop( p->vDivs, pObj, i, p->nDivs ) - { - puData = pObj->pData; - for ( w = 0; w < p->nWords; w++ ) -// if ( puData[w] != puDataR[w] ) - if ( (puData[w] ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - return Abc_ManResubQuit0( p->pRoot, pObj ); - } - return NULL; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_ManResubDivs1( Abc_ManRes_t * p, int Required ) -{ - Abc_Obj_t * pObj0, * pObj1; - unsigned * puData0, * puData1, * puDataR; - int i, k, w; - puDataR = p->pRoot->pData; - // check positive unate divisors - Vec_PtrForEachEntry( p->vDivs1UP, pObj0, i ) - { - puData0 = pObj0->pData; - Vec_PtrForEachEntryStart( p->vDivs1UP, pObj1, k, i + 1 ) - { - puData1 = pObj1->pData; - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] | puData1[w]) != puDataR[w] ) - if ( ((puData0[w] | puData1[w]) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - p->nUsedNode1Or++; - return Abc_ManResubQuit1( p->pRoot, pObj0, pObj1, 1 ); - } - } - } - // check negative unate divisors - Vec_PtrForEachEntry( p->vDivs1UN, pObj0, i ) - { - puData0 = pObj0->pData; - Vec_PtrForEachEntryStart( p->vDivs1UN, pObj1, k, i + 1 ) - { - puData1 = pObj1->pData; - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] & puData1[w]) != puDataR[w] ) - if ( ((puData0[w] & puData1[w]) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - p->nUsedNode1And++; - return Abc_ManResubQuit1( p->pRoot, pObj0, pObj1, 0 ); - } - } - } - return NULL; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_ManResubDivs12( Abc_ManRes_t * p, int Required ) -{ - Abc_Obj_t * pObj0, * pObj1, * pObj2, * pObjMax, * pObjMin0, * pObjMin1; - unsigned * puData0, * puData1, * puData2, * puDataR; - int i, k, j, w, LevelMax; - puDataR = p->pRoot->pData; - // check positive unate divisors - Vec_PtrForEachEntry( p->vDivs1UP, pObj0, i ) - { - puData0 = pObj0->pData; - Vec_PtrForEachEntryStart( p->vDivs1UP, pObj1, k, i + 1 ) - { - puData1 = pObj1->pData; - Vec_PtrForEachEntryStart( p->vDivs1UP, pObj2, j, k + 1 ) - { - puData2 = pObj2->pData; - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] | puData1[w] | puData2[w]) != puDataR[w] ) - if ( ((puData0[w] | puData1[w] | puData2[w]) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - LevelMax = ABC_MAX( pObj0->Level, ABC_MAX(pObj1->Level, pObj2->Level) ); - assert( LevelMax <= Required - 1 ); - - pObjMax = NULL; - if ( (int)pObj0->Level == LevelMax ) - pObjMax = pObj0, pObjMin0 = pObj1, pObjMin1 = pObj2; - if ( (int)pObj1->Level == LevelMax ) - { - if ( pObjMax ) continue; - pObjMax = pObj1, pObjMin0 = pObj0, pObjMin1 = pObj2; - } - if ( (int)pObj2->Level == LevelMax ) - { - if ( pObjMax ) continue; - pObjMax = pObj2, pObjMin0 = pObj0, pObjMin1 = pObj1; - } - - p->nUsedNode2Or++; - return Abc_ManResubQuit21( p->pRoot, pObjMin0, pObjMin1, pObjMax, 1 ); - } - } - } - } - // check negative unate divisors - Vec_PtrForEachEntry( p->vDivs1UN, pObj0, i ) - { - puData0 = pObj0->pData; - Vec_PtrForEachEntryStart( p->vDivs1UN, pObj1, k, i + 1 ) - { - puData1 = pObj1->pData; - Vec_PtrForEachEntryStart( p->vDivs1UN, pObj2, j, k + 1 ) - { - puData2 = pObj2->pData; - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] & puData1[w] & puData2[w]) != puDataR[w] ) - if ( ((puData0[w] & puData1[w] & puData2[w]) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - if ( w == p->nWords ) - { - LevelMax = ABC_MAX( pObj0->Level, ABC_MAX(pObj1->Level, pObj2->Level) ); - assert( LevelMax <= Required - 1 ); - - pObjMax = NULL; - if ( (int)pObj0->Level == LevelMax ) - pObjMax = pObj0, pObjMin0 = pObj1, pObjMin1 = pObj2; - if ( (int)pObj1->Level == LevelMax ) - { - if ( pObjMax ) continue; - pObjMax = pObj1, pObjMin0 = pObj0, pObjMin1 = pObj2; - } - if ( (int)pObj2->Level == LevelMax ) - { - if ( pObjMax ) continue; - pObjMax = pObj2, pObjMin0 = pObj0, pObjMin1 = pObj1; - } - - p->nUsedNode2And++; - return Abc_ManResubQuit21( p->pRoot, pObjMin0, pObjMin1, pObjMax, 0 ); - } - } - } - } - return NULL; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_ManResubDivs2( Abc_ManRes_t * p, int Required ) -{ - Abc_Obj_t * pObj0, * pObj1, * pObj2; - unsigned * puData0, * puData1, * puData2, * puDataR; - int i, k, w; - puDataR = p->pRoot->pData; - // check positive unate divisors - Vec_PtrForEachEntry( p->vDivs1UP, pObj0, i ) - { - puData0 = pObj0->pData; - Vec_PtrForEachEntry( p->vDivs2UP0, pObj1, k ) - { - pObj2 = Vec_PtrEntry( p->vDivs2UP1, k ); - - puData1 = Abc_ObjRegular(pObj1)->pData; - puData2 = Abc_ObjRegular(pObj2)->pData; - if ( Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) ) - { - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] | (puData1[w] | puData2[w])) != puDataR[w] ) - if ( ((puData0[w] | (puData1[w] | puData2[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - } - else if ( Abc_ObjIsComplement(pObj1) ) - { - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] | (~puData1[w] & puData2[w])) != puDataR[w] ) - if ( ((puData0[w] | (~puData1[w] & puData2[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - } - else if ( Abc_ObjIsComplement(pObj2) ) - { - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] | (puData1[w] & ~puData2[w])) != puDataR[w] ) - if ( ((puData0[w] | (puData1[w] & ~puData2[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - } - else - { - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] | (puData1[w] & puData2[w])) != puDataR[w] ) - if ( ((puData0[w] | (puData1[w] & puData2[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - } - if ( w == p->nWords ) - { - p->nUsedNode2OrAnd++; - return Abc_ManResubQuit2( p->pRoot, pObj0, pObj1, pObj2, 1 ); - } - } - } - // check negative unate divisors - Vec_PtrForEachEntry( p->vDivs1UN, pObj0, i ) - { - puData0 = pObj0->pData; - Vec_PtrForEachEntry( p->vDivs2UN0, pObj1, k ) - { - pObj2 = Vec_PtrEntry( p->vDivs2UN1, k ); - - puData1 = Abc_ObjRegular(pObj1)->pData; - puData2 = Abc_ObjRegular(pObj2)->pData; - if ( Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) ) - { - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] & (puData1[w] | puData2[w])) != puDataR[w] ) - if ( ((puData0[w] & (puData1[w] | puData2[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - } - else if ( Abc_ObjIsComplement(pObj1) ) - { - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] & (~puData1[w] & puData2[w])) != puDataR[w] ) - if ( ((puData0[w] & (~puData1[w] & puData2[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - } - else if ( Abc_ObjIsComplement(pObj2) ) - { - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] & (puData1[w] & ~puData2[w])) != puDataR[w] ) - if ( ((puData0[w] & (puData1[w] & ~puData2[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - } - else - { - for ( w = 0; w < p->nWords; w++ ) -// if ( (puData0[w] & (puData1[w] & puData2[w])) != puDataR[w] ) - if ( ((puData0[w] & (puData1[w] & puData2[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - } - if ( w == p->nWords ) - { - p->nUsedNode2AndOr++; - return Abc_ManResubQuit2( p->pRoot, pObj0, pObj1, pObj2, 0 ); - } - } - } - return NULL; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_ManResubDivs3( Abc_ManRes_t * p, int Required ) -{ - Abc_Obj_t * pObj0, * pObj1, * pObj2, * pObj3; - unsigned * puData0, * puData1, * puData2, * puData3, * puDataR; - int i, k, w, Flag; - puDataR = p->pRoot->pData; - // check positive unate divisors - Vec_PtrForEachEntry( p->vDivs2UP0, pObj0, i ) - { - pObj1 = Vec_PtrEntry( p->vDivs2UP1, i ); - puData0 = Abc_ObjRegular(pObj0)->pData; - puData1 = Abc_ObjRegular(pObj1)->pData; - Flag = (Abc_ObjIsComplement(pObj0) << 3) | (Abc_ObjIsComplement(pObj1) << 2); - - Vec_PtrForEachEntryStart( p->vDivs2UP0, pObj2, k, i + 1 ) - { - pObj3 = Vec_PtrEntry( p->vDivs2UP1, k ); - puData2 = Abc_ObjRegular(pObj2)->pData; - puData3 = Abc_ObjRegular(pObj3)->pData; - - Flag = (Flag & 12) | (Abc_ObjIsComplement(pObj2) << 1) | Abc_ObjIsComplement(pObj3); - assert( Flag < 16 ); - switch( Flag ) - { - case 0: // 0000 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((puData0[w] & puData1[w]) | (puData2[w] & puData3[w])) != puDataR[w] ) - if ( (((puData0[w] & puData1[w]) | (puData2[w] & puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - break; - case 1: // 0001 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((puData0[w] & puData1[w]) | (puData2[w] & ~puData3[w])) != puDataR[w] ) - if ( (((puData0[w] & puData1[w]) | (puData2[w] & ~puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - break; - case 2: // 0010 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((puData0[w] & puData1[w]) | (~puData2[w] & puData3[w])) != puDataR[w] ) - if ( (((puData0[w] & puData1[w]) | (~puData2[w] & puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - break; - case 3: // 0011 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((puData0[w] & puData1[w]) | (puData2[w] | puData3[w])) != puDataR[w] ) - if ( (((puData0[w] & puData1[w]) | (puData2[w] | puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - break; - - case 4: // 0100 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((puData0[w] & ~puData1[w]) | (puData2[w] & puData3[w])) != puDataR[w] ) - if ( (((puData0[w] & ~puData1[w]) | (puData2[w] & puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - break; - case 5: // 0101 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((puData0[w] & ~puData1[w]) | (puData2[w] & ~puData3[w])) != puDataR[w] ) - if ( (((puData0[w] & ~puData1[w]) | (puData2[w] & ~puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - break; - case 6: // 0110 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((puData0[w] & ~puData1[w]) | (~puData2[w] & puData3[w])) != puDataR[w] ) - if ( (((puData0[w] & ~puData1[w]) | (~puData2[w] & puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - break; - case 7: // 0111 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((puData0[w] & ~puData1[w]) | (puData2[w] | puData3[w])) != puDataR[w] ) - if ( (((puData0[w] & ~puData1[w]) | (puData2[w] | puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - break; - - case 8: // 1000 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((~puData0[w] & puData1[w]) | (puData2[w] & puData3[w])) != puDataR[w] ) - if ( (((~puData0[w] & puData1[w]) | (puData2[w] & puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - break; - case 9: // 1001 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((~puData0[w] & puData1[w]) | (puData2[w] & ~puData3[w])) != puDataR[w] ) - if ( (((~puData0[w] & puData1[w]) | (puData2[w] & ~puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - break; - case 10: // 1010 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((~puData0[w] & puData1[w]) | (~puData2[w] & puData3[w])) != puDataR[w] ) - if ( (((~puData0[w] & puData1[w]) | (~puData2[w] & puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - break; - case 11: // 1011 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((~puData0[w] & puData1[w]) | (puData2[w] | puData3[w])) != puDataR[w] ) - if ( (((~puData0[w] & puData1[w]) | (puData2[w] | puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - break; - - case 12: // 1100 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((puData0[w] | puData1[w]) | (puData2[w] & puData3[w])) != puDataR[w] ) - if ( (((puData0[w] | puData1[w]) | (puData2[w] & puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) // care set - break; - break; - case 13: // 1101 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((puData0[w] | puData1[w]) | (puData2[w] & ~puData3[w])) != puDataR[w] ) - if ( (((puData0[w] | puData1[w]) | (puData2[w] & ~puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) - break; - break; - case 14: // 1110 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((puData0[w] | puData1[w]) | (~puData2[w] & puData3[w])) != puDataR[w] ) - if ( (((puData0[w] | puData1[w]) | (~puData2[w] & puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) - break; - break; - case 15: // 1111 - for ( w = 0; w < p->nWords; w++ ) -// if ( ((puData0[w] | puData1[w]) | (puData2[w] | puData3[w])) != puDataR[w] ) - if ( (((puData0[w] | puData1[w]) | (puData2[w] | puData3[w])) ^ puDataR[w]) & p->pCareSet[w] ) - break; - break; - - } - if ( w == p->nWords ) - { - p->nUsedNode3OrAnd++; - return Abc_ManResubQuit3( p->pRoot, pObj0, pObj1, pObj2, pObj3, 1 ); - } - } - } -/* - // check negative unate divisors - Vec_PtrForEachEntry( p->vDivs2UN0, pObj0, i ) - { - pObj1 = Vec_PtrEntry( p->vDivs2UN1, i ); - puData0 = Abc_ObjRegular(pObj0)->pData; - puData1 = Abc_ObjRegular(pObj1)->pData; - Flag = (Abc_ObjIsComplement(pObj0) << 3) | (Abc_ObjIsComplement(pObj1) << 2); - - Vec_PtrForEachEntryStart( p->vDivs2UN0, pObj2, k, i + 1 ) - { - pObj3 = Vec_PtrEntry( p->vDivs2UN1, k ); - puData2 = Abc_ObjRegular(pObj2)->pData; - puData3 = Abc_ObjRegular(pObj3)->pData; - - Flag = (Flag & 12) | (Abc_ObjIsComplement(pObj2) << 1) | Abc_ObjIsComplement(pObj3); - assert( Flag < 16 ); - switch( Flag ) - { - case 0: // 0000 - for ( w = 0; w < p->nWords; w++ ) - if ( ((puData0[w] & puData1[w]) & (puData2[w] & puData3[w])) != puDataR[w] ) - break; - break; - case 1: // 0001 - for ( w = 0; w < p->nWords; w++ ) - if ( ((puData0[w] & puData1[w]) & (puData2[w] & ~puData3[w])) != puDataR[w] ) - break; - break; - case 2: // 0010 - for ( w = 0; w < p->nWords; w++ ) - if ( ((puData0[w] & puData1[w]) & (~puData2[w] & puData3[w])) != puDataR[w] ) - break; - break; - case 3: // 0011 - for ( w = 0; w < p->nWords; w++ ) - if ( ((puData0[w] & puData1[w]) & (puData2[w] | puData3[w])) != puDataR[w] ) - break; - break; - - case 4: // 0100 - for ( w = 0; w < p->nWords; w++ ) - if ( ((puData0[w] & ~puData1[w]) & (puData2[w] & puData3[w])) != puDataR[w] ) - break; - break; - case 5: // 0101 - for ( w = 0; w < p->nWords; w++ ) - if ( ((puData0[w] & ~puData1[w]) & (puData2[w] & ~puData3[w])) != puDataR[w] ) - break; - break; - case 6: // 0110 - for ( w = 0; w < p->nWords; w++ ) - if ( ((puData0[w] & ~puData1[w]) & (~puData2[w] & puData3[w])) != puDataR[w] ) - break; - break; - case 7: // 0111 - for ( w = 0; w < p->nWords; w++ ) - if ( ((puData0[w] & ~puData1[w]) & (puData2[w] | puData3[w])) != puDataR[w] ) - break; - break; - - case 8: // 1000 - for ( w = 0; w < p->nWords; w++ ) - if ( ((~puData0[w] & puData1[w]) & (puData2[w] & puData3[w])) != puDataR[w] ) - break; - break; - case 9: // 1001 - for ( w = 0; w < p->nWords; w++ ) - if ( ((~puData0[w] & puData1[w]) & (puData2[w] & ~puData3[w])) != puDataR[w] ) - break; - break; - case 10: // 1010 - for ( w = 0; w < p->nWords; w++ ) - if ( ((~puData0[w] & puData1[w]) & (~puData2[w] & puData3[w])) != puDataR[w] ) - break; - break; - case 11: // 1011 - for ( w = 0; w < p->nWords; w++ ) - if ( ((~puData0[w] & puData1[w]) & (puData2[w] | puData3[w])) != puDataR[w] ) - break; - break; - - case 12: // 1100 - for ( w = 0; w < p->nWords; w++ ) - if ( ((puData0[w] | puData1[w]) & (puData2[w] & puData3[w])) != puDataR[w] ) - break; - break; - case 13: // 1101 - for ( w = 0; w < p->nWords; w++ ) - if ( ((puData0[w] | puData1[w]) & (puData2[w] & ~puData3[w])) != puDataR[w] ) - break; - break; - case 14: // 1110 - for ( w = 0; w < p->nWords; w++ ) - if ( ((puData0[w] | puData1[w]) & (~puData2[w] & puData3[w])) != puDataR[w] ) - break; - break; - case 15: // 1111 - for ( w = 0; w < p->nWords; w++ ) - if ( ((puData0[w] | puData1[w]) & (puData2[w] | puData3[w])) != puDataR[w] ) - break; - break; - - } - if ( w == p->nWords ) - { - p->nUsedNode3AndOr++; - return Abc_ManResubQuit3( p->pRoot, pObj0, pObj1, pObj2, pObj3, 0 ); - } - } - } -*/ - return NULL; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManResubCleanup( Abc_ManRes_t * p ) -{ - Abc_Obj_t * pObj; - int i; - Vec_PtrForEachEntry( p->vDivs, pObj, i ) - pObj->pData = NULL; - Vec_PtrClear( p->vDivs ); - p->pRoot = NULL; -} - -/**Function************************************************************* - - Synopsis [Evaluates resubstution of one cut.] - - Description [Returns the graph to add if any.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Dec_Graph_t * Abc_ManResubEval( Abc_ManRes_t * p, Abc_Obj_t * pRoot, Vec_Ptr_t * vLeaves, int nSteps, bool fUpdateLevel, bool fVerbose ) -{ - extern int Abc_NodeMffsInside( Abc_Obj_t * pNode, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vInside ); - Dec_Graph_t * pGraph; - int Required; - int clk; - - Required = fUpdateLevel? Abc_ObjRequiredLevel(pRoot) : ABC_INFINITY; - - assert( nSteps >= 0 ); - assert( nSteps <= 3 ); - p->pRoot = pRoot; - p->nLeaves = Vec_PtrSize(vLeaves); - p->nLastGain = -1; - - // collect the MFFC -clk = clock(); - p->nMffc = Abc_NodeMffsInside( pRoot, vLeaves, p->vTemp ); -p->timeMffc += clock() - clk; - assert( p->nMffc > 0 ); - - // collect the divisor nodes -clk = clock(); - if ( !Abc_ManResubCollectDivs( p, pRoot, vLeaves, Required ) ) - return NULL; - p->timeDiv += clock() - clk; - - p->nTotalDivs += p->nDivs; - p->nTotalLeaves += p->nLeaves; - - // simulate the nodes -clk = clock(); - Abc_ManResubSimulate( p->vDivs, p->nLeaves, p->vSims, p->nLeavesMax, p->nWords ); -p->timeSim += clock() - clk; - -clk = clock(); - // consider constants - if ( pGraph = Abc_ManResubQuit( p ) ) - { - p->nUsedNodeC++; - p->nLastGain = p->nMffc; - return pGraph; - } - - // consider equal nodes - if ( pGraph = Abc_ManResubDivs0( p ) ) - { -p->timeRes1 += clock() - clk; - p->nUsedNode0++; - p->nLastGain = p->nMffc; - return pGraph; - } - if ( nSteps == 0 || p->nMffc == 1 ) - { -p->timeRes1 += clock() - clk; - return NULL; - } - - // get the one level divisors - Abc_ManResubDivsS( p, Required ); - - // consider one node - if ( pGraph = Abc_ManResubDivs1( p, Required ) ) - { -p->timeRes1 += clock() - clk; - p->nLastGain = p->nMffc - 1; - return pGraph; - } -p->timeRes1 += clock() - clk; - if ( nSteps == 1 || p->nMffc == 2 ) - return NULL; - -clk = clock(); - // consider triples - if ( pGraph = Abc_ManResubDivs12( p, Required ) ) - { -p->timeRes2 += clock() - clk; - p->nLastGain = p->nMffc - 2; - return pGraph; - } -p->timeRes2 += clock() - clk; - - // get the two level divisors -clk = clock(); - Abc_ManResubDivsD( p, Required ); -p->timeResD += clock() - clk; - - // consider two nodes -clk = clock(); - if ( pGraph = Abc_ManResubDivs2( p, Required ) ) - { -p->timeRes2 += clock() - clk; - p->nLastGain = p->nMffc - 2; - return pGraph; - } -p->timeRes2 += clock() - clk; - if ( nSteps == 2 || p->nMffc == 3 ) - return NULL; - - // consider two nodes -clk = clock(); - if ( pGraph = Abc_ManResubDivs3( p, Required ) ) - { -p->timeRes3 += clock() - clk; - p->nLastGain = p->nMffc - 3; - return pGraph; - } -p->timeRes3 += clock() - clk; - if ( nSteps == 3 || p->nLeavesMax == 4 ) - return NULL; - return NULL; -} - - - - -/**Function************************************************************* - - Synopsis [Computes the volume and checks if the cut is feasible.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CutVolumeCheck_rec( Abc_Obj_t * pObj ) -{ - // quit if the node is visited (or if it is a leaf) - if ( Abc_NodeIsTravIdCurrent(pObj) ) - return 0; - Abc_NodeSetTravIdCurrent(pObj); - // report the error - if ( Abc_ObjIsCi(pObj) ) - printf( "Abc_CutVolumeCheck() ERROR: The set of nodes is not a cut!\n" ); - // count the number of nodes in the leaves - return 1 + Abc_CutVolumeCheck_rec( Abc_ObjFanin0(pObj) ) + - Abc_CutVolumeCheck_rec( Abc_ObjFanin1(pObj) ); -} - -/**Function************************************************************* - - Synopsis [Computes the volume and checks if the cut is feasible.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_CutVolumeCheck( Abc_Obj_t * pNode, Vec_Ptr_t * vLeaves ) -{ - Abc_Obj_t * pObj; - int i; - // mark the leaves - Abc_NtkIncrementTravId( pNode->pNtk ); - Vec_PtrForEachEntry( vLeaves, pObj, i ) - Abc_NodeSetTravIdCurrent( pObj ); - // traverse the nodes starting from the given one and count them - return Abc_CutVolumeCheck_rec( pNode ); -} - -/**Function************************************************************* - - Synopsis [Computes the factor cut of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_CutFactor_rec( Abc_Obj_t * pObj, Vec_Ptr_t * vLeaves ) -{ - if ( pObj->fMarkA ) - return; - if ( Abc_ObjIsCi(pObj) || (Abc_ObjFanoutNum(pObj) > 1 && !Abc_NodeIsMuxControlType(pObj)) ) - { - Vec_PtrPush( vLeaves, pObj ); - pObj->fMarkA = 1; - return; - } - Abc_CutFactor_rec( Abc_ObjFanin0(pObj), vLeaves ); - Abc_CutFactor_rec( Abc_ObjFanin1(pObj), vLeaves ); -} - -/**Function************************************************************* - - Synopsis [Computes the factor cut of the node.] - - Description [Factor-cut is the cut at a node in terms of factor-nodes. - Factor-nodes are roots of the node trees (MUXes/EXORs are counted as single nodes). - Factor-cut is unique for the given node.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_CutFactor( Abc_Obj_t * pNode ) -{ - Vec_Ptr_t * vLeaves; - Abc_Obj_t * pObj; - int i; - assert( !Abc_ObjIsCi(pNode) ); - vLeaves = Vec_PtrAlloc( 10 ); - Abc_CutFactor_rec( Abc_ObjFanin0(pNode), vLeaves ); - Abc_CutFactor_rec( Abc_ObjFanin1(pNode), vLeaves ); - Vec_PtrForEachEntry( vLeaves, pObj, i ) - pObj->fMarkA = 0; - return vLeaves; -} - -/**Function************************************************************* - - Synopsis [Cut computation.] - - Description [This cut computation works as follows: - It starts with the factor cut at the node. If the factor-cut is large, quit. - It supports the set of leaves of the cut under construction and labels all nodes - in the cut under construction, including the leaves. - It computes the factor-cuts of the leaves and checks if it is easible to add any of them. - If it is, it randomly chooses one feasible and continues.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Abc_CutFactorLarge( Abc_Obj_t * pNode, int nLeavesMax ) -{ - Vec_Ptr_t * vLeaves, * vFactors, * vFact, * vNext; - Vec_Int_t * vFeasible; - Abc_Obj_t * pLeaf, * pTemp; - int i, k, Counter, RandLeaf; - int BestCut, BestShare; - assert( Abc_ObjIsNode(pNode) ); - // get one factor-cut - vLeaves = Abc_CutFactor( pNode ); - if ( Vec_PtrSize(vLeaves) > nLeavesMax ) - { - Vec_PtrFree(vLeaves); - return NULL; - } - if ( Vec_PtrSize(vLeaves) == nLeavesMax ) - return vLeaves; - // initialize the factor cuts for the leaves - vFactors = Vec_PtrAlloc( nLeavesMax ); - Abc_NtkIncrementTravId( pNode->pNtk ); - Vec_PtrForEachEntry( vLeaves, pLeaf, i ) - { - Abc_NodeSetTravIdCurrent( pLeaf ); - if ( Abc_ObjIsCi(pLeaf) ) - Vec_PtrPush( vFactors, NULL ); - else - Vec_PtrPush( vFactors, Abc_CutFactor(pLeaf) ); - } - // construct larger factor cuts - vFeasible = Vec_IntAlloc( nLeavesMax ); - while ( 1 ) - { - BestCut = -1; - // find the next feasible cut to add - Vec_IntClear( vFeasible ); - Vec_PtrForEachEntry( vFactors, vFact, i ) - { - if ( vFact == NULL ) - continue; - // count the number of unmarked leaves of this factor cut - Counter = 0; - Vec_PtrForEachEntry( vFact, pTemp, k ) - Counter += !Abc_NodeIsTravIdCurrent(pTemp); - // if the number of new leaves is smaller than the diff, it is feasible - if ( Counter <= nLeavesMax - Vec_PtrSize(vLeaves) + 1 ) - { - Vec_IntPush( vFeasible, i ); - if ( BestCut == -1 || BestShare < Vec_PtrSize(vFact) - Counter ) - BestCut = i, BestShare = Vec_PtrSize(vFact) - Counter; - } - } - // quit if there is no feasible factor cuts - if ( Vec_IntSize(vFeasible) == 0 ) - break; - // randomly choose one leaf and get its factor cut -// RandLeaf = Vec_IntEntry( vFeasible, rand() % Vec_IntSize(vFeasible) ); - // choose the cut that has most sharing with the other cuts - RandLeaf = BestCut; - - pLeaf = Vec_PtrEntry( vLeaves, RandLeaf ); - vNext = Vec_PtrEntry( vFactors, RandLeaf ); - // unmark this leaf - Abc_NodeSetTravIdPrevious( pLeaf ); - // remove this cut from the leaves and factor cuts - for ( i = RandLeaf; i < Vec_PtrSize(vLeaves)-1; i++ ) - { - Vec_PtrWriteEntry( vLeaves, i, Vec_PtrEntry(vLeaves, i+1) ); - Vec_PtrWriteEntry( vFactors, i, Vec_PtrEntry(vFactors,i+1) ); - } - Vec_PtrShrink( vLeaves, Vec_PtrSize(vLeaves) -1 ); - Vec_PtrShrink( vFactors, Vec_PtrSize(vFactors)-1 ); - // add new leaves, compute their factor cuts - Vec_PtrForEachEntry( vNext, pLeaf, i ) - { - if ( Abc_NodeIsTravIdCurrent(pLeaf) ) - continue; - Abc_NodeSetTravIdCurrent( pLeaf ); - Vec_PtrPush( vLeaves, pLeaf ); - if ( Abc_ObjIsCi(pLeaf) ) - Vec_PtrPush( vFactors, NULL ); - else - Vec_PtrPush( vFactors, Abc_CutFactor(pLeaf) ); - } - Vec_PtrFree( vNext ); - assert( Vec_PtrSize(vLeaves) <= nLeavesMax ); - if ( Vec_PtrSize(vLeaves) == nLeavesMax ) - break; - } - - // remove temporary storage - Vec_PtrForEachEntry( vFactors, vFact, i ) - if ( vFact ) Vec_PtrFree( vFact ); - Vec_PtrFree( vFactors ); - Vec_IntFree( vFeasible ); - return vLeaves; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcRewrite.c b/src/base/abci/abcRewrite.c deleted file mode 100644 index 89b79e5a..00000000 --- a/src/base/abci/abcRewrite.c +++ /dev/null @@ -1,414 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcRewrite.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Technology-independent resynthesis of the AIG based on DAG aware rewriting.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcRewrite.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "rwr.h" -#include "dec.h" - -/* - The ideas realized in this package are inspired by the paper: - Per Bjesse, Arne Boralv, "DAG-aware circuit compression for - formal verification", Proc. ICCAD 2004, pp. 42-49. -*/ - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static Cut_Man_t * Abc_NtkStartCutManForRewrite( Abc_Ntk_t * pNtk ); -static void Abc_NodePrintCuts( Abc_Obj_t * pNode ); -static void Abc_ManShowCutCone( Abc_Obj_t * pNode, Vec_Ptr_t * vLeaves ); - -extern void Abc_PlaceBegin( Abc_Ntk_t * pNtk ); -extern void Abc_PlaceEnd( Abc_Ntk_t * pNtk ); -extern void Abc_PlaceUpdate( Vec_Ptr_t * vAddedCells, Vec_Ptr_t * vUpdatedNets ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Performs incremental rewriting of the AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRewrite( Abc_Ntk_t * pNtk, int fUpdateLevel, int fUseZeros, int fVerbose, int fVeryVerbose, int fPlaceEnable ) -{ - ProgressBar * pProgress; - Cut_Man_t * pManCut; - Rwr_Man_t * pManRwr; - Abc_Obj_t * pNode; - Vec_Ptr_t * vAddedCells = NULL, * vUpdatedNets = NULL; - Dec_Graph_t * pGraph; - int i, nNodes, nGain, fCompl; - int clk, clkStart = clock(); - - assert( Abc_NtkIsStrash(pNtk) ); - // cleanup the AIG - Abc_AigCleanup(pNtk->pManFunc); -/* - { - Vec_Vec_t * vParts; - vParts = Abc_NtkPartitionSmart( pNtk, 50, 1 ); - Vec_VecFree( vParts ); - } -*/ - - // start placement package - if ( fPlaceEnable ) - { - Abc_PlaceBegin( pNtk ); - vAddedCells = Abc_AigUpdateStart( pNtk->pManFunc, &vUpdatedNets ); - } - - // start the rewriting manager - pManRwr = Rwr_ManStart( 0 ); - if ( pManRwr == NULL ) - return 0; - // compute the reverse levels if level update is requested - if ( fUpdateLevel ) - Abc_NtkStartReverseLevels( pNtk, 0 ); - // start the cut manager -clk = clock(); - pManCut = Abc_NtkStartCutManForRewrite( pNtk ); -Rwr_ManAddTimeCuts( pManRwr, clock() - clk ); - pNtk->pManCut = pManCut; - - if ( fVeryVerbose ) - Rwr_ScoresClean( pManRwr ); - - // resynthesize each node once - pManRwr->nNodesBeg = Abc_NtkNodeNum(pNtk); - nNodes = Abc_NtkObjNumMax(pNtk); - pProgress = Extra_ProgressBarStart( stdout, nNodes ); - Abc_NtkForEachNode( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - // stop if all nodes have been tried once - if ( i >= nNodes ) - break; - // skip persistant nodes - if ( Abc_NodeIsPersistant(pNode) ) - continue; - // skip the nodes with many fanouts - if ( Abc_ObjFanoutNum(pNode) > 1000 ) - continue; - - // for each cut, try to resynthesize it - nGain = Rwr_NodeRewrite( pManRwr, pManCut, pNode, fUpdateLevel, fUseZeros, fPlaceEnable ); - if ( !(nGain > 0 || nGain == 0 && fUseZeros) ) - continue; - // if we end up here, a rewriting step is accepted - - // get hold of the new subgraph to be added to the AIG - pGraph = Rwr_ManReadDecs(pManRwr); - fCompl = Rwr_ManReadCompl(pManRwr); - - // reset the array of the changed nodes - if ( fPlaceEnable ) - Abc_AigUpdateReset( pNtk->pManFunc ); - - // complement the FF if needed - if ( fCompl ) Dec_GraphComplement( pGraph ); -clk = clock(); - Dec_GraphUpdateNetwork( pNode, pGraph, fUpdateLevel, nGain ); -Rwr_ManAddTimeUpdate( pManRwr, clock() - clk ); - if ( fCompl ) Dec_GraphComplement( pGraph ); - - // use the array of changed nodes to update placement - if ( fPlaceEnable ) - Abc_PlaceUpdate( vAddedCells, vUpdatedNets ); - } - Extra_ProgressBarStop( pProgress ); -Rwr_ManAddTimeTotal( pManRwr, clock() - clkStart ); - // print stats - pManRwr->nNodesEnd = Abc_NtkNodeNum(pNtk); - if ( fVerbose ) - Rwr_ManPrintStats( pManRwr ); -// Rwr_ManPrintStatsFile( pManRwr ); - if ( fVeryVerbose ) - Rwr_ScoresReport( pManRwr ); - // delete the managers - Rwr_ManStop( pManRwr ); - Cut_ManStop( pManCut ); - pNtk->pManCut = NULL; - - // start placement package - if ( fPlaceEnable ) - { - Abc_PlaceEnd( pNtk ); - Abc_AigUpdateStop( pNtk->pManFunc ); - } - - // put the nodes into the DFS order and reassign their IDs - { -// int clk = clock(); - Abc_NtkReassignIds( pNtk ); -// PRT( "time", clock() - clk ); - } -// Abc_AigCheckFaninOrder( pNtk->pManFunc ); - // fix the levels - if ( fUpdateLevel ) - Abc_NtkStopReverseLevels( pNtk ); - else - Abc_NtkLevel( pNtk ); - // check - if ( !Abc_NtkCheck( pNtk ) ) - { - printf( "Abc_NtkRewrite: The network check has failed.\n" ); - return 0; - } - return 1; -} - - -/**Function************************************************************* - - Synopsis [Starts the cut manager for rewriting.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Cut_Man_t * Abc_NtkStartCutManForRewrite( Abc_Ntk_t * pNtk ) -{ - static Cut_Params_t Params, * pParams = &Params; - Cut_Man_t * pManCut; - Abc_Obj_t * pObj; - int i; - // start the cut manager - memset( pParams, 0, sizeof(Cut_Params_t) ); - pParams->nVarsMax = 4; // the max cut size ("k" of the k-feasible cuts) - pParams->nKeepMax = 250; // the max number of cuts kept at a node - pParams->fTruth = 1; // compute truth tables - pParams->fFilter = 1; // filter dominated cuts - pParams->fSeq = 0; // compute sequential cuts - pParams->fDrop = 0; // drop cuts on the fly - pParams->fVerbose = 0; // the verbosiness flag - pParams->nIdsMax = Abc_NtkObjNumMax( pNtk ); - pManCut = Cut_ManStart( pParams ); - if ( pParams->fDrop ) - Cut_ManSetFanoutCounts( pManCut, Abc_NtkFanoutCounts(pNtk) ); - // set cuts for PIs - Abc_NtkForEachCi( pNtk, pObj, i ) - if ( Abc_ObjFanoutNum(pObj) > 0 ) - Cut_NodeSetTriv( pManCut, pObj->Id ); - return pManCut; -} - -/**Function************************************************************* - - Synopsis [Prints the cuts at the nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodePrintCuts( Abc_Obj_t * pNode ) -{ - Vec_Ptr_t * vCuts; - Cut_Cut_t * pCut; - int k; - - printf( "\nNode %s\n", Abc_ObjName(pNode) ); - vCuts = (Vec_Ptr_t *)pNode->pCopy; - Vec_PtrForEachEntry( vCuts, pCut, k ) - { - Extra_PrintBinary( stdout, (unsigned *)&pCut->uSign, 16 ); - printf( " " ); - Cut_CutPrint( pCut, 0 ); - printf( "\n" ); - } -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManRewritePrintDivs( Vec_Ptr_t * vDivs, int nLeaves ) -{ - Abc_Obj_t * pFanin, * pNode, * pRoot; - int i, k; - pRoot = Vec_PtrEntryLast(vDivs); - // print the nodes - Vec_PtrForEachEntry( vDivs, pNode, i ) - { - if ( i < nLeaves ) - { - printf( "%6d : %c\n", pNode->Id, 'a'+i ); - continue; - } - printf( "%6d : %2d = ", pNode->Id, i ); - // find the first fanin - Vec_PtrForEachEntry( vDivs, pFanin, k ) - if ( Abc_ObjFanin0(pNode) == pFanin ) - break; - if ( k < nLeaves ) - printf( "%c", 'a' + k ); - else - printf( "%d", k ); - printf( "%s ", Abc_ObjFaninC0(pNode)? "\'" : "" ); - // find the second fanin - Vec_PtrForEachEntry( vDivs, pFanin, k ) - if ( Abc_ObjFanin1(pNode) == pFanin ) - break; - if ( k < nLeaves ) - printf( "%c", 'a' + k ); - else - printf( "%d", k ); - printf( "%s ", Abc_ObjFaninC1(pNode)? "\'" : "" ); - if ( pNode == pRoot ) - printf( " root" ); - printf( "\n" ); - } - printf( "\n" ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManShowCutCone_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vDivs ) -{ - if ( Abc_NodeIsTravIdCurrent(pNode) ) - return; - Abc_NodeSetTravIdCurrent(pNode); - Abc_ManShowCutCone_rec( Abc_ObjFanin0(pNode), vDivs ); - Abc_ManShowCutCone_rec( Abc_ObjFanin1(pNode), vDivs ); - Vec_PtrPush( vDivs, pNode ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManShowCutCone( Abc_Obj_t * pNode, Vec_Ptr_t * vLeaves ) -{ - Abc_Ntk_t * pNtk = pNode->pNtk; - Abc_Obj_t * pObj; - Vec_Ptr_t * vDivs; - int i; - vDivs = Vec_PtrAlloc( 100 ); - Abc_NtkIncrementTravId( pNtk ); - Vec_PtrForEachEntry( vLeaves, pObj, i ) - { - Abc_NodeSetTravIdCurrent( Abc_ObjRegular(pObj) ); - Vec_PtrPush( vDivs, Abc_ObjRegular(pObj) ); - } - Abc_ManShowCutCone_rec( pNode, vDivs ); - Abc_ManRewritePrintDivs( vDivs, Vec_PtrSize(vLeaves) ); - Vec_PtrFree( vDivs ); -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_RwrExpWithCut_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vLeaves, int fUseA ) -{ - if ( Vec_PtrFind(vLeaves, pNode) >= 0 || Vec_PtrFind(vLeaves, Abc_ObjNot(pNode)) >= 0 ) - { - if ( fUseA ) - Abc_ObjRegular(pNode)->fMarkA = 1; - else - Abc_ObjRegular(pNode)->fMarkB = 1; - return; - } - assert( Abc_ObjIsNode(pNode) ); - Abc_RwrExpWithCut_rec( Abc_ObjFanin0(pNode), vLeaves, fUseA ); - Abc_RwrExpWithCut_rec( Abc_ObjFanin1(pNode), vLeaves, fUseA ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_RwrExpWithCut( Abc_Obj_t * pNode, Vec_Ptr_t * vLeaves ) -{ - Abc_Obj_t * pObj; - int i, CountA, CountB; - Abc_RwrExpWithCut_rec( Abc_ObjFanin0(pNode), vLeaves, 1 ); - Abc_RwrExpWithCut_rec( Abc_ObjFanin1(pNode), vLeaves, 0 ); - CountA = CountB = 0; - Vec_PtrForEachEntry( vLeaves, pObj, i ) - { - CountA += Abc_ObjRegular(pObj)->fMarkA; - CountB += Abc_ObjRegular(pObj)->fMarkB; - Abc_ObjRegular(pObj)->fMarkA = 0; - Abc_ObjRegular(pObj)->fMarkB = 0; - } - printf( "(%d,%d:%d) ", CountA, CountB, CountA+CountB-Vec_PtrSize(vLeaves) ); -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcRr.c b/src/base/abci/abcRr.c deleted file mode 100644 index 92adc718..00000000 --- a/src/base/abci/abcRr.c +++ /dev/null @@ -1,999 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcRr.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Redundancy removal.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcRr.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "fraig.h" -#include "sim.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Abc_RRMan_t_ Abc_RRMan_t; -struct Abc_RRMan_t_ -{ - // the parameters - Abc_Ntk_t * pNtk; // the network - int nFaninLevels; // the number of fanin levels - int nFanoutLevels; // the number of fanout levels - // the node/fanin/fanout - Abc_Obj_t * pNode; // the node - Abc_Obj_t * pFanin; // the fanin - Abc_Obj_t * pFanout; // the fanout - // the intermediate cones - Vec_Ptr_t * vFaninLeaves; // the leaves of the fanin cone - Vec_Ptr_t * vFanoutRoots; // the roots of the fanout cone - // the window - Vec_Ptr_t * vLeaves; // the leaves of the window - Vec_Ptr_t * vCone; // the internal nodes of the window - Vec_Ptr_t * vRoots; // the roots of the window - Abc_Ntk_t * pWnd; // the window derived for the edge - // the miter - Abc_Ntk_t * pMiter; // the miter derived from the window - Prove_Params_t * pParams; // the miter proving parameters - // statistical variables - int nNodesOld; // the old number of nodes - int nLevelsOld; // the old number of levels - int nEdgesTried; // the number of nodes tried - int nEdgesRemoved; // the number of nodes proved - int timeWindow; // the time to construct the window - int timeMiter; // the time to construct the miter - int timeProve; // the time to prove the miter - int timeUpdate; // the network update time - int timeTotal; // the total runtime -}; - -static Abc_RRMan_t * Abc_RRManStart(); -static void Abc_RRManStop( Abc_RRMan_t * p ); -static void Abc_RRManPrintStats( Abc_RRMan_t * p ); -static void Abc_RRManClean( Abc_RRMan_t * p ); -static int Abc_NtkRRProve( Abc_RRMan_t * p ); -static int Abc_NtkRRUpdate( Abc_Ntk_t * pNtk, Abc_Obj_t * pNode, Abc_Obj_t * pFanin, Abc_Obj_t * pFanout ); -static int Abc_NtkRRWindow( Abc_RRMan_t * p ); - -static int Abc_NtkRRTfi_int( Vec_Ptr_t * vLeaves, int LevelLimit ); -static int Abc_NtkRRTfo_int( Vec_Ptr_t * vLeaves, Vec_Ptr_t * vRoots, int LevelLimit, Abc_Obj_t * pEdgeFanin, Abc_Obj_t * pEdgeFanout ); -static int Abc_NtkRRTfo_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vRoots, int LevelLimit ); -static void Abc_NtkRRTfi_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vCone, int LevelLimit ); -static Abc_Ntk_t * Abc_NtkWindow( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vCone, Vec_Ptr_t * vRoots ); - -static void Abc_NtkRRSimulateStart( Abc_Ntk_t * pNtk ); -static void Abc_NtkRRSimulateStop( Abc_Ntk_t * pNtk ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Removes stuck-at redundancies.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRR( Abc_Ntk_t * pNtk, int nFaninLevels, int nFanoutLevels, int fUseFanouts, int fVerbose ) -{ - ProgressBar * pProgress; - Abc_RRMan_t * p; - Abc_Obj_t * pNode, * pFanin, * pFanout; - int i, k, m, nNodes, RetValue, clk, clkTotal = clock(); - // start the manager - p = Abc_RRManStart( nFaninLevels, nFanoutLevels ); - p->pNtk = pNtk; - p->nFaninLevels = nFaninLevels; - p->nFanoutLevels = nFanoutLevels; - p->nNodesOld = Abc_NtkNodeNum(pNtk); - p->nLevelsOld = Abc_AigLevel(pNtk); - // remember latch values -// Abc_NtkForEachLatch( pNtk, pNode, i ) -// pNode->pNext = pNode->pData; - // go through the nodes - Abc_NtkCleanCopy(pNtk); - nNodes = Abc_NtkObjNumMax(pNtk); - Abc_NtkRRSimulateStart(pNtk); - pProgress = Extra_ProgressBarStart( stdout, nNodes ); - Abc_NtkForEachNode( pNtk, pNode, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - // stop if all nodes have been tried once - if ( i >= nNodes ) - break; - // skip the constant node -// if ( Abc_NodeIsConst(pNode) ) -// continue; - // skip persistant nodes - if ( Abc_NodeIsPersistant(pNode) ) - continue; - // skip the nodes with many fanouts - if ( Abc_ObjFanoutNum(pNode) > 1000 ) - continue; - // construct the window - if ( !fUseFanouts ) - { - Abc_ObjForEachFanin( pNode, pFanin, k ) - { - // skip the nodes with only one fanout (tree nodes) - if ( Abc_ObjFanoutNum(pFanin) == 1 ) - continue; -/* - if ( pFanin->Id == 228 && pNode->Id == 2649 ) - { - int k = 0; - } -*/ - p->nEdgesTried++; - Abc_RRManClean( p ); - p->pNode = pNode; - p->pFanin = pFanin; - p->pFanout = NULL; - - clk = clock(); - RetValue = Abc_NtkRRWindow( p ); - p->timeWindow += clock() - clk; - if ( !RetValue ) - continue; -/* - if ( pFanin->Id == 228 && pNode->Id == 2649 ) - { - Abc_NtkShowAig( p->pWnd, 0 ); - } -*/ - clk = clock(); - RetValue = Abc_NtkRRProve( p ); - p->timeMiter += clock() - clk; - if ( !RetValue ) - continue; -//printf( "%d -> %d (%d)\n", pFanin->Id, pNode->Id, k ); - - clk = clock(); - Abc_NtkRRUpdate( pNtk, p->pNode, p->pFanin, p->pFanout ); - p->timeUpdate += clock() - clk; - - p->nEdgesRemoved++; - break; - } - continue; - } - // use the fanouts - Abc_ObjForEachFanin( pNode, pFanin, k ) - Abc_ObjForEachFanout( pNode, pFanout, m ) - { - // skip the nodes with only one fanout (tree nodes) -// if ( Abc_ObjFanoutNum(pFanin) == 1 && Abc_ObjFanoutNum(pNode) == 1 ) -// continue; - - p->nEdgesTried++; - Abc_RRManClean( p ); - p->pNode = pNode; - p->pFanin = pFanin; - p->pFanout = pFanout; - - clk = clock(); - RetValue = Abc_NtkRRWindow( p ); - p->timeWindow += clock() - clk; - if ( !RetValue ) - continue; - - clk = clock(); - RetValue = Abc_NtkRRProve( p ); - p->timeMiter += clock() - clk; - if ( !RetValue ) - continue; - - clk = clock(); - Abc_NtkRRUpdate( pNtk, p->pNode, p->pFanin, p->pFanout ); - p->timeUpdate += clock() - clk; - - p->nEdgesRemoved++; - break; - } - } - Abc_NtkRRSimulateStop(pNtk); - Extra_ProgressBarStop( pProgress ); - p->timeTotal = clock() - clkTotal; - if ( fVerbose ) - Abc_RRManPrintStats( p ); - Abc_RRManStop( p ); - // restore latch values -// Abc_NtkForEachLatch( pNtk, pNode, i ) -// pNode->pData = pNode->pNext, pNode->pNext = NULL; - // put the nodes into the DFS order and reassign their IDs - Abc_NtkReassignIds( pNtk ); - Abc_NtkLevel( pNtk ); - // check - if ( !Abc_NtkCheck( pNtk ) ) - { - printf( "Abc_NtkRR: The network check has failed.\n" ); - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Start the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_RRMan_t * Abc_RRManStart() -{ - Abc_RRMan_t * p; - p = ALLOC( Abc_RRMan_t, 1 ); - memset( p, 0, sizeof(Abc_RRMan_t) ); - p->vFaninLeaves = Vec_PtrAlloc( 100 ); // the leaves of the fanin cone - p->vFanoutRoots = Vec_PtrAlloc( 100 ); // the roots of the fanout cone - p->vLeaves = Vec_PtrAlloc( 100 ); // the leaves of the window - p->vCone = Vec_PtrAlloc( 100 ); // the internal nodes of the window - p->vRoots = Vec_PtrAlloc( 100 ); // the roots of the window - p->pParams = ALLOC( Prove_Params_t, 1 ); - memset( p->pParams, 0, sizeof(Prove_Params_t) ); - Prove_ParamsSetDefault( p->pParams ); - return p; -} - -/**Function************************************************************* - - Synopsis [Stop the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_RRManStop( Abc_RRMan_t * p ) -{ - Abc_RRManClean( p ); - Vec_PtrFree( p->vFaninLeaves ); - Vec_PtrFree( p->vFanoutRoots ); - Vec_PtrFree( p->vLeaves ); - Vec_PtrFree( p->vCone ); - Vec_PtrFree( p->vRoots ); - free( p->pParams ); - free( p ); -} - -/**Function************************************************************* - - Synopsis [Stop the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_RRManPrintStats( Abc_RRMan_t * p ) -{ - double Ratio = 100.0*(p->nNodesOld - Abc_NtkNodeNum(p->pNtk))/p->nNodesOld; - printf( "Redundancy removal statistics:\n" ); - printf( "Edges tried = %6d.\n", p->nEdgesTried ); - printf( "Edges removed = %6d. (%5.2f %%)\n", p->nEdgesRemoved, 100.0*p->nEdgesRemoved/p->nEdgesTried ); - printf( "Node gain = %6d. (%5.2f %%)\n", p->nNodesOld - Abc_NtkNodeNum(p->pNtk), Ratio ); - printf( "Level gain = %6d.\n", p->nLevelsOld - Abc_AigLevel(p->pNtk) ); - PRT( "Windowing ", p->timeWindow ); - PRT( "Miter ", p->timeMiter ); - PRT( " Construct ", p->timeMiter - p->timeProve ); - PRT( " Prove ", p->timeProve ); - PRT( "Update ", p->timeUpdate ); - PRT( "TOTAL ", p->timeTotal ); -} - -/**Function************************************************************* - - Synopsis [Clean the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_RRManClean( Abc_RRMan_t * p ) -{ - p->pNode = NULL; - p->pFanin = NULL; - p->pFanout = NULL; - Vec_PtrClear( p->vFaninLeaves ); - Vec_PtrClear( p->vFanoutRoots ); - Vec_PtrClear( p->vLeaves ); - Vec_PtrClear( p->vCone ); - Vec_PtrClear( p->vRoots ); - if ( p->pWnd ) Abc_NtkDelete( p->pWnd ); - if ( p->pMiter ) Abc_NtkDelete( p->pMiter ); - p->pWnd = NULL; - p->pMiter = NULL; -} - -/**Function************************************************************* - - Synopsis [Returns 1 if the miter is constant 0.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRRProve( Abc_RRMan_t * p ) -{ - Abc_Ntk_t * pWndCopy; - int RetValue, clk; -// Abc_NtkShowAig( p->pWnd, 0 ); - pWndCopy = Abc_NtkDup( p->pWnd ); - Abc_NtkRRUpdate( pWndCopy, p->pNode->pCopy->pCopy, p->pFanin->pCopy->pCopy, p->pFanout? p->pFanout->pCopy->pCopy : NULL ); - if ( !Abc_NtkIsDfsOrdered(pWndCopy) ) - Abc_NtkReassignIds(pWndCopy); - p->pMiter = Abc_NtkMiter( p->pWnd, pWndCopy, 1, 0 ); - Abc_NtkDelete( pWndCopy ); -clk = clock(); - RetValue = Abc_NtkMiterProve( &p->pMiter, p->pParams ); -p->timeProve += clock() - clk; - if ( RetValue == 1 ) - return 1; - return 0; -} - -/**Function************************************************************* - - Synopsis [Updates the network after redundancy removal.] - - Description [This procedure assumes that non-control value of the fanin - was proved redundant. It is okay to concentrate on non-control values - because the control values can be seen as redundancy of the fanout edge.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRRUpdate( Abc_Ntk_t * pNtk, Abc_Obj_t * pNode, Abc_Obj_t * pFanin, Abc_Obj_t * pFanout ) -{ - Abc_Obj_t * pNodeNew, * pFanoutNew; - assert( pFanout == NULL ); - assert( !Abc_ObjIsComplement(pNode) ); - assert( !Abc_ObjIsComplement(pFanin) ); - assert( !Abc_ObjIsComplement(pFanout) ); - // find the node after redundancy removal - if ( pFanin == Abc_ObjFanin0(pNode) ) - pNodeNew = Abc_ObjChild1(pNode); - else if ( pFanin == Abc_ObjFanin1(pNode) ) - pNodeNew = Abc_ObjChild0(pNode); - else assert( 0 ); - // replace - if ( pFanout == NULL ) - { - Abc_AigReplace( pNtk->pManFunc, pNode, pNodeNew, 1 ); - return 1; - } - // find the fanout after redundancy removal - if ( pNode == Abc_ObjFanin0(pFanout) ) - pFanoutNew = Abc_AigAnd( pNtk->pManFunc, Abc_ObjNotCond(pNodeNew,Abc_ObjFaninC0(pFanout)), Abc_ObjChild1(pFanout) ); - else if ( pNode == Abc_ObjFanin1(pFanout) ) - pFanoutNew = Abc_AigAnd( pNtk->pManFunc, Abc_ObjNotCond(pNodeNew,Abc_ObjFaninC1(pFanout)), Abc_ObjChild0(pFanout) ); - else assert( 0 ); - // replace - Abc_AigReplace( pNtk->pManFunc, pFanout, pFanoutNew, 1 ); - return 1; -} - -/**Function************************************************************* - - Synopsis [Constructs window for checking RR.] - - Description [If the window (p->pWnd) with the given scope (p->nFaninLevels, - p->nFanoutLevels) cannot be constructed, returns 0. Otherwise, returns 1. - The levels are measured from the fanin node (pFanin) and the fanout node - (pEdgeFanout), respectively.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRRWindow( Abc_RRMan_t * p ) -{ - Abc_Obj_t * pObj, * pEdgeFanin, * pEdgeFanout; - int i, LevelMin, LevelMax, RetValue; - - // get the edge - pEdgeFanout = p->pFanout? p->pFanout : p->pNode; - pEdgeFanin = p->pFanout? p->pNode : p->pFanin; - // get the minimum and maximum levels of the window - LevelMin = ABC_MAX( 0, ((int)p->pFanin->Level) - p->nFaninLevels ); - LevelMax = (int)pEdgeFanout->Level + p->nFanoutLevels; - - // start the TFI leaves with the fanin - Abc_NtkIncrementTravId( p->pNtk ); - Abc_NodeSetTravIdCurrent( p->pFanin ); - Vec_PtrPush( p->vFaninLeaves, p->pFanin ); - // mark the TFI cone and collect the leaves down to the given level - while ( Abc_NtkRRTfi_int(p->vFaninLeaves, LevelMin) ); - - // mark the leaves with the new TravId - Abc_NtkIncrementTravId( p->pNtk ); - Vec_PtrForEachEntry( p->vFaninLeaves, pObj, i ) - Abc_NodeSetTravIdCurrent( pObj ); - // traverse the TFO cone of the leaves (while skipping the edge) - // (a) mark the nodes in the cone using the current TravId - // (b) collect the nodes that have external fanouts into p->vFanoutRoots - while ( Abc_NtkRRTfo_int(p->vFaninLeaves, p->vFanoutRoots, LevelMax, pEdgeFanin, pEdgeFanout) ); - - // mark the fanout roots - Vec_PtrForEachEntry( p->vFanoutRoots, pObj, i ) - pObj->fMarkA = 1; - // collect roots reachable from the fanout (p->vRoots) - RetValue = Abc_NtkRRTfo_rec( pEdgeFanout, p->vRoots, LevelMax + 1 ); - // unmark the fanout roots - Vec_PtrForEachEntry( p->vFanoutRoots, pObj, i ) - pObj->fMarkA = 0; - - // return if the window is infeasible - if ( RetValue == 0 ) - return 0; - - // collect the DFS-ordered new cone (p->vCone) and new leaves (p->vLeaves) - // using the previous marks coming from the TFO cone - Abc_NtkIncrementTravId( p->pNtk ); - Vec_PtrForEachEntry( p->vRoots, pObj, i ) - Abc_NtkRRTfi_rec( pObj, p->vLeaves, p->vCone, LevelMin ); - - // create a new network - p->pWnd = Abc_NtkWindow( p->pNtk, p->vLeaves, p->vCone, p->vRoots ); - return 1; -} - -/**Function************************************************************* - - Synopsis [Marks the nodes in the TFI and collects their leaves.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRRTfi_int( Vec_Ptr_t * vLeaves, int LevelLimit ) -{ - Abc_Obj_t * pObj, * pNext; - int i, k, LevelMax, nSize; - assert( LevelLimit >= 0 ); - // find the maximum level of leaves - LevelMax = 0; - Vec_PtrForEachEntry( vLeaves, pObj, i ) - if ( LevelMax < (int)pObj->Level ) - LevelMax = pObj->Level; - // if the nodes are all PIs, LevelMax == 0 - if ( LevelMax <= LevelLimit ) - return 0; - // expand the nodes with the minimum level - nSize = Vec_PtrSize(vLeaves); - Vec_PtrForEachEntryStop( vLeaves, pObj, i, nSize ) - { - if ( LevelMax != (int)pObj->Level ) - continue; - Abc_ObjForEachFanin( pObj, pNext, k ) - { - if ( Abc_NodeIsTravIdCurrent(pNext) ) - continue; - Abc_NodeSetTravIdCurrent( pNext ); - Vec_PtrPush( vLeaves, pNext ); - } - } - // remove old nodes (cannot remove a PI) - k = 0; - Vec_PtrForEachEntry( vLeaves, pObj, i ) - { - if ( LevelMax == (int)pObj->Level ) - continue; - Vec_PtrWriteEntry( vLeaves, k++, pObj ); - } - Vec_PtrShrink( vLeaves, k ); - if ( Vec_PtrSize(vLeaves) > 2000 ) - return 0; - return 1; -} - -/**Function************************************************************* - - Synopsis [Marks the nodes in the TFO and collects their roots.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRRTfo_int( Vec_Ptr_t * vLeaves, Vec_Ptr_t * vRoots, int LevelLimit, Abc_Obj_t * pEdgeFanin, Abc_Obj_t * pEdgeFanout ) -{ - Abc_Obj_t * pObj, * pNext; - int i, k, LevelMin, nSize, fObjIsRoot; - // find the minimum level of leaves - LevelMin = ABC_INFINITY; - Vec_PtrForEachEntry( vLeaves, pObj, i ) - if ( LevelMin > (int)pObj->Level ) - LevelMin = pObj->Level; - // if the minimum level exceed the limit, we are done - if ( LevelMin > LevelLimit ) - return 0; - // expand the nodes with the minimum level - nSize = Vec_PtrSize(vLeaves); - Vec_PtrForEachEntryStop( vLeaves, pObj, i, nSize ) - { - if ( LevelMin != (int)pObj->Level ) - continue; - fObjIsRoot = 0; - Abc_ObjForEachFanout( pObj, pNext, k ) - { - // check if the fanout is outside of the cone - if ( Abc_ObjIsCo(pNext) || pNext->Level > (unsigned)LevelLimit ) - { - fObjIsRoot = 1; - continue; - } - // skip the edge under check - if ( pObj == pEdgeFanin && pNext == pEdgeFanout ) - continue; - // skip the visited fanouts - if ( Abc_NodeIsTravIdCurrent(pNext) ) - continue; - Abc_NodeSetTravIdCurrent( pNext ); - Vec_PtrPush( vLeaves, pNext ); - } - if ( fObjIsRoot ) - Vec_PtrPush( vRoots, pObj ); - } - // remove old nodes - k = 0; - Vec_PtrForEachEntry( vLeaves, pObj, i ) - { - if ( LevelMin == (int)pObj->Level ) - continue; - Vec_PtrWriteEntry( vLeaves, k++, pObj ); - } - Vec_PtrShrink( vLeaves, k ); - if ( Vec_PtrSize(vLeaves) > 2000 ) - return 0; - return 1; -} - -/**Function************************************************************* - - Synopsis [Collects the roots in the TFO of the node.] - - Description [Note that this procedure can be improved by - marking and skipping the visited nodes.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkRRTfo_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vRoots, int LevelLimit ) -{ - Abc_Obj_t * pFanout; - int i; - // if we encountered a node outside of the TFO cone of the fanins, quit - if ( Abc_ObjIsCo(pNode) || pNode->Level > (unsigned)LevelLimit ) - return 0; - // if we encountered a node on the boundary, add it to the roots - if ( pNode->fMarkA ) - { - Vec_PtrPushUnique( vRoots, pNode ); - return 1; - } - // mark the node with the current TravId (needed to have all internal nodes marked) - Abc_NodeSetTravIdCurrent( pNode ); - // traverse the fanouts - Abc_ObjForEachFanout( pNode, pFanout, i ) - if ( !Abc_NtkRRTfo_rec( pFanout, vRoots, LevelLimit ) ) - return 0; - return 1; -} - -/**Function************************************************************* - - Synopsis [Collects the leaves and cone of the roots.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkRRTfi_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vCone, int LevelLimit ) -{ - Abc_Obj_t * pFanin; - int i; - // skip visited nodes - if ( Abc_NodeIsTravIdCurrent(pNode) ) - return; - // add node to leaves if it is not in TFI cone of the leaves (marked before) or below the limit - if ( !Abc_NodeIsTravIdPrevious(pNode) || (int)pNode->Level <= LevelLimit ) - { - Abc_NodeSetTravIdCurrent( pNode ); - Vec_PtrPush( vLeaves, pNode ); - return; - } - // mark the node as visited - Abc_NodeSetTravIdCurrent( pNode ); - // call for the node's fanins - Abc_ObjForEachFanin( pNode, pFanin, i ) - Abc_NtkRRTfi_rec( pFanin, vLeaves, vCone, LevelLimit ); - // add the node to the cone in topological order - Vec_PtrPush( vCone, pNode ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkWindow( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vCone, Vec_Ptr_t * vRoots ) -{ - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pObj; - int fCheck = 1; - int i; - assert( Abc_NtkIsStrash(pNtk) ); - // start the network - pNtkNew = Abc_NtkAlloc( pNtk->ntkType, pNtk->ntkFunc, 1 ); - // duplicate the name and the spec - pNtkNew->pName = Extra_UtilStrsav( "temp" ); - // map the constant nodes - Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkNew); - // create and map the PIs - Vec_PtrForEachEntry( vLeaves, pObj, i ) - pObj->pCopy = Abc_NtkCreatePi(pNtkNew); - // copy the AND gates - Vec_PtrForEachEntry( vCone, pObj, i ) - pObj->pCopy = Abc_AigAnd( pNtkNew->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) ); - // compare the number of nodes before and after - if ( Vec_PtrSize(vCone) != Abc_NtkNodeNum(pNtkNew) ) - printf( "Warning: Structural hashing during windowing reduced %d nodes (this is a bug).\n", - Vec_PtrSize(vCone) - Abc_NtkNodeNum(pNtkNew) ); - // create the POs - Vec_PtrForEachEntry( vRoots, pObj, i ) - { - assert( !Abc_ObjIsComplement(pObj->pCopy) ); - Abc_ObjAddFanin( Abc_NtkCreatePo(pNtkNew), pObj->pCopy ); - } - // add the PI/PO names - Abc_NtkAddDummyPiNames( pNtkNew ); - Abc_NtkAddDummyPoNames( pNtkNew ); - Abc_NtkAddDummyAssertNames( pNtkNew ); - // check - if ( fCheck && !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkWindow: The network check has failed.\n" ); - return NULL; - } - return pNtkNew; -} - - -/**Function************************************************************* - - Synopsis [Starts simulation to detect non-redundant edges.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkRRSimulateStart( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pObj; - unsigned uData, uData0, uData1; - int i; - Abc_AigConst1(pNtk)->pData = (void *)~((unsigned)0); - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pData = (void *)SIM_RANDOM_UNSIGNED; - Abc_NtkForEachNode( pNtk, pObj, i ) - { - if ( i == 0 ) continue; - uData0 = (unsigned)Abc_ObjFanin0(pObj)->pData; - uData1 = (unsigned)Abc_ObjFanin1(pObj)->pData; - uData = Abc_ObjFaninC0(pObj)? ~uData0 : uData0; - uData &= Abc_ObjFaninC1(pObj)? ~uData1 : uData1; - assert( pObj->pData == NULL ); - pObj->pData = (void *)uData; - } -} - -/**Function************************************************************* - - Synopsis [Stops simulation to detect non-redundant edges.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkRRSimulateStop( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pObj; - int i; - Abc_NtkForEachObj( pNtk, pObj, i ) - pObj->pData = NULL; -} - - - - - - - -static void Sim_TraverseNodes_rec( Abc_Obj_t * pRoot, Vec_Str_t * vTargets, Vec_Ptr_t * vNodes ); -static void Sim_CollectNodes_rec( Abc_Obj_t * pRoot, Vec_Ptr_t * vField ); -static void Sim_SimulateCollected( Vec_Str_t * vTargets, Vec_Ptr_t * vNodes, Vec_Ptr_t * vField ); - -/**Function************************************************************* - - Synopsis [Simulation to detect non-redundant edges.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Str_t * Abc_NtkRRSimulate( Abc_Ntk_t * pNtk ) -{ - Vec_Ptr_t * vNodes, * vField; - Vec_Str_t * vTargets; - Abc_Obj_t * pObj; - unsigned uData, uData0, uData1; - int PrevCi, Phase, i, k; - - // start the candidates - vTargets = Vec_StrStart( Abc_NtkObjNumMax(pNtk) + 1 ); - Abc_NtkForEachNode( pNtk, pObj, i ) - { - Phase = ((Abc_ObjFanoutNum(Abc_ObjFanin1(pObj)) > 1) << 1); - Phase |= (Abc_ObjFanoutNum(Abc_ObjFanin0(pObj)) > 1); - Vec_StrWriteEntry( vTargets, pObj->Id, (char)Phase ); - } - - // simulate patters and store them in copy - Abc_AigConst1(pNtk)->pCopy = (Abc_Obj_t *)~((unsigned)0); - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pCopy = (Abc_Obj_t *)SIM_RANDOM_UNSIGNED; - Abc_NtkForEachNode( pNtk, pObj, i ) - { - if ( i == 0 ) continue; - uData0 = (unsigned)Abc_ObjFanin0(pObj)->pData; - uData1 = (unsigned)Abc_ObjFanin1(pObj)->pData; - uData = Abc_ObjFaninC0(pObj)? ~uData0 : uData0; - uData &= Abc_ObjFaninC1(pObj)? ~uData1 : uData1; - pObj->pCopy = (Abc_Obj_t *)uData; - } - // store the result in data - Abc_NtkForEachCo( pNtk, pObj, i ) - { - uData0 = (unsigned)Abc_ObjFanin0(pObj)->pData; - if ( Abc_ObjFaninC0(pObj) ) - pObj->pData = (void *)~uData0; - else - pObj->pData = (void *)uData0; - } - - // refine the candidates - for ( PrevCi = 0; PrevCi < Abc_NtkCiNum(pNtk); PrevCi = i ) - { - vNodes = Vec_PtrAlloc( 10 ); - Abc_NtkIncrementTravId( pNtk ); - for ( i = PrevCi; i < Abc_NtkCiNum(pNtk); i++ ) - { - Sim_TraverseNodes_rec( Abc_NtkCi(pNtk, i), vTargets, vNodes ); - if ( Vec_PtrSize(vNodes) > 128 ) - break; - } - // collect the marked nodes in the topological order - vField = Vec_PtrAlloc( 10 ); - Abc_NtkIncrementTravId( pNtk ); - Abc_NtkForEachCo( pNtk, pObj, k ) - Sim_CollectNodes_rec( pObj, vField ); - - // simulate these nodes - Sim_SimulateCollected( vTargets, vNodes, vField ); - // prepare for the next loop - Vec_PtrFree( vNodes ); - } - - // clean - Abc_NtkForEachObj( pNtk, pObj, i ) - pObj->pData = NULL; - return vTargets; -} - -/**Function************************************************************* - - Synopsis [Collects nodes starting from the given node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Sim_TraverseNodes_rec( Abc_Obj_t * pRoot, Vec_Str_t * vTargets, Vec_Ptr_t * vNodes ) -{ - Abc_Obj_t * pFanout; - char Entry; - int k; - if ( Abc_NodeIsTravIdCurrent(pRoot) ) - return; - Abc_NodeSetTravIdCurrent( pRoot ); - // save the reached targets - Entry = Vec_StrEntry(vTargets, pRoot->Id); - if ( Entry & 1 ) - Vec_PtrPush( vNodes, Abc_ObjNot(pRoot) ); - if ( Entry & 2 ) - Vec_PtrPush( vNodes, pRoot ); - // explore the fanouts - Abc_ObjForEachFanout( pRoot, pFanout, k ) - Sim_TraverseNodes_rec( pFanout, vTargets, vNodes ); -} - -/**Function************************************************************* - - Synopsis [Collects nodes starting from the given node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Sim_CollectNodes_rec( Abc_Obj_t * pRoot, Vec_Ptr_t * vField ) -{ - Abc_Obj_t * pFanin; - int i; - if ( Abc_NodeIsTravIdCurrent(pRoot) ) - return; - if ( !Abc_NodeIsTravIdPrevious(pRoot) ) - return; - Abc_NodeSetTravIdCurrent( pRoot ); - Abc_ObjForEachFanin( pRoot, pFanin, i ) - Sim_CollectNodes_rec( pFanin, vField ); - if ( !Abc_ObjIsCo(pRoot) ) - pRoot->pData = (void *)Vec_PtrSize(vField); - Vec_PtrPush( vField, pRoot ); -} - -/**Function************************************************************* - - Synopsis [Simulate the given nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Sim_SimulateCollected( Vec_Str_t * vTargets, Vec_Ptr_t * vNodes, Vec_Ptr_t * vField ) -{ - Abc_Obj_t * pObj, * pFanin0, * pFanin1, * pDisproved; - Vec_Ptr_t * vSims; - unsigned * pUnsigned, * pUnsignedF; - int i, k, Phase, fCompl; - // get simulation info - vSims = Sim_UtilInfoAlloc( Vec_PtrSize(vField), Vec_PtrSize(vNodes), 0 ); - // simulate the nodes - Vec_PtrForEachEntry( vField, pObj, i ) - { - if ( Abc_ObjIsCi(pObj) ) - { - pUnsigned = Vec_PtrEntry( vSims, i ); - for ( k = 0; k < Vec_PtrSize(vNodes); k++ ) - pUnsigned[k] = (unsigned)pObj->pCopy; - continue; - } - if ( Abc_ObjIsCo(pObj) ) - { - pUnsigned = Vec_PtrEntry( vSims, i ); - pUnsignedF = Vec_PtrEntry( vSims, (int)Abc_ObjFanin0(pObj)->pData ); - if ( Abc_ObjFaninC0(pObj) ) - for ( k = 0; k < Vec_PtrSize(vNodes); k++ ) - pUnsigned[k] = ~pUnsignedF[k]; - else - for ( k = 0; k < Vec_PtrSize(vNodes); k++ ) - pUnsigned[k] = pUnsignedF[k]; - // update targets - for ( k = 0; k < Vec_PtrSize(vNodes); k++ ) - { - if ( pUnsigned[k] == (unsigned)pObj->pData ) - continue; - pDisproved = Vec_PtrEntry( vNodes, k ); - fCompl = Abc_ObjIsComplement(pDisproved); - pDisproved = Abc_ObjRegular(pDisproved); - Phase = Vec_StrEntry( vTargets, pDisproved->Id ); - if ( fCompl ) - Phase = (Phase & 2); - else - Phase = (Phase & 1); - Vec_StrWriteEntry( vTargets, pDisproved->Id, (char)Phase ); - } - continue; - } - // simulate the node - pFanin0 = Abc_ObjFanin0(pObj); - pFanin1 = Abc_ObjFanin1(pObj); - } -} - - - -/* - { - unsigned uData; - if ( pFanin == Abc_ObjFanin0(pNode) ) - { - uData = (unsigned)Abc_ObjFanin1(pNode)->pData; - uData = Abc_ObjFaninC1(pNode)? ~uData : uData; - } - else if ( pFanin == Abc_ObjFanin1(pNode) ) - { - uData = (unsigned)Abc_ObjFanin0(pNode)->pData; - uData = Abc_ObjFaninC0(pNode)? ~uData : uData; - } - uData ^= (unsigned)pNode->pData; -// Extra_PrintBinary( stdout, &uData, 32 ); printf( "\n" ); - if ( Extra_WordCountOnes(uData) > 8 ) - continue; - } -*/ - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcSat.c b/src/base/abci/abcSat.c deleted file mode 100644 index 58614584..00000000 --- a/src/base/abci/abcSat.c +++ /dev/null @@ -1,884 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcSat.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Procedures to solve the miter using the internal SAT sat_solver.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcSat.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "satSolver.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static sat_solver * Abc_NtkMiterSatCreateLogic( Abc_Ntk_t * pNtk, int fAllPrimes ); -extern Vec_Int_t * Abc_NtkGetCiSatVarNums( Abc_Ntk_t * pNtk ); -static nMuxes; - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Attempts to solve the miter using an internal SAT sat_solver.] - - Description [Returns -1 if timed out; 0 if SAT; 1 if UNSAT.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkMiterSat( Abc_Ntk_t * pNtk, sint64 nConfLimit, sint64 nInsLimit, int fVerbose, sint64 * pNumConfs, sint64 * pNumInspects ) -{ - sat_solver * pSat; - lbool status; - int RetValue, clk; - - if ( pNumConfs ) - *pNumConfs = 0; - if ( pNumInspects ) - *pNumInspects = 0; - - assert( Abc_NtkLatchNum(pNtk) == 0 ); - -// if ( Abc_NtkPoNum(pNtk) > 1 ) -// fprintf( stdout, "Warning: The miter has %d outputs. SAT will try to prove all of them.\n", Abc_NtkPoNum(pNtk) ); - - // load clauses into the sat_solver - clk = clock(); - pSat = Abc_NtkMiterSatCreate( pNtk, 0 ); - if ( pSat == NULL ) - return 1; -//printf( "%d \n", pSat->clauses.size ); -//sat_solver_delete( pSat ); -//return 1; - -// printf( "Created SAT problem with %d variable and %d clauses. ", sat_solver_nvars(pSat), sat_solver_nclauses(pSat) ); -// PRT( "Time", clock() - clk ); - - // simplify the problem - clk = clock(); - status = sat_solver_simplify(pSat); -// printf( "Simplified the problem to %d variables and %d clauses. ", sat_solver_nvars(pSat), sat_solver_nclauses(pSat) ); -// PRT( "Time", clock() - clk ); - if ( status == 0 ) - { - sat_solver_delete( pSat ); -// printf( "The problem is UNSATISFIABLE after simplification.\n" ); - return 1; - } - - // solve the miter - clk = clock(); - if ( fVerbose ) - pSat->verbosity = 1; - status = sat_solver_solve( pSat, NULL, NULL, (sint64)nConfLimit, (sint64)nInsLimit, (sint64)0, (sint64)0 ); - if ( status == l_Undef ) - { -// printf( "The problem timed out.\n" ); - RetValue = -1; - } - else if ( status == l_True ) - { -// printf( "The problem is SATISFIABLE.\n" ); - RetValue = 0; - } - else if ( status == l_False ) - { -// printf( "The problem is UNSATISFIABLE.\n" ); - RetValue = 1; - } - else - assert( 0 ); -// PRT( "SAT sat_solver time", clock() - clk ); -// printf( "The number of conflicts = %d.\n", (int)pSat->sat_solver_stats.conflicts ); - - // if the problem is SAT, get the counterexample - if ( status == l_True ) - { -// Vec_Int_t * vCiIds = Abc_NtkGetCiIds( pNtk ); - Vec_Int_t * vCiIds = Abc_NtkGetCiSatVarNums( pNtk ); - pNtk->pModel = Sat_SolverGetModel( pSat, vCiIds->pArray, vCiIds->nSize ); - Vec_IntFree( vCiIds ); - } - // free the sat_solver - if ( fVerbose ) - Sat_SolverPrintStats( stdout, pSat ); - - if ( pNumConfs ) - *pNumConfs = (int)pSat->stats.conflicts; - if ( pNumInspects ) - *pNumInspects = (int)pSat->stats.inspects; - -sat_solver_store_write( pSat, "trace.cnf" ); -sat_solver_store_free( pSat ); - - sat_solver_delete( pSat ); - return RetValue; -} - -/**Function************************************************************* - - Synopsis [Returns the array of CI IDs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Int_t * Abc_NtkGetCiSatVarNums( Abc_Ntk_t * pNtk ) -{ - Vec_Int_t * vCiIds; - Abc_Obj_t * pObj; - int i; - vCiIds = Vec_IntAlloc( Abc_NtkCiNum(pNtk) ); - Abc_NtkForEachCi( pNtk, pObj, i ) - Vec_IntPush( vCiIds, (int)pObj->pCopy ); - return vCiIds; -} - - - -/**Function************************************************************* - - Synopsis [Adds trivial clause.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkClauseTriv( sat_solver * pSat, Abc_Obj_t * pNode, Vec_Int_t * vVars ) -{ -//printf( "Adding triv %d. %d\n", Abc_ObjRegular(pNode)->Id, (int)pSat->sat_solver_stats.clauses ); - vVars->nSize = 0; - Vec_IntPush( vVars, toLitCond( (int)Abc_ObjRegular(pNode)->pCopy, Abc_ObjIsComplement(pNode) ) ); -// Vec_IntPush( vVars, toLitCond( (int)Abc_ObjRegular(pNode)->Id, Abc_ObjIsComplement(pNode) ) ); - return sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); -} - -/**Function************************************************************* - - Synopsis [Adds trivial clause.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkClauseTop( sat_solver * pSat, Vec_Ptr_t * vNodes, Vec_Int_t * vVars ) -{ - Abc_Obj_t * pNode; - int i; -//printf( "Adding triv %d. %d\n", Abc_ObjRegular(pNode)->Id, (int)pSat->sat_solver_stats.clauses ); - vVars->nSize = 0; - Vec_PtrForEachEntry( vNodes, pNode, i ) - Vec_IntPush( vVars, toLitCond( (int)Abc_ObjRegular(pNode)->pCopy, Abc_ObjIsComplement(pNode) ) ); -// Vec_IntPush( vVars, toLitCond( (int)Abc_ObjRegular(pNode)->Id, Abc_ObjIsComplement(pNode) ) ); - return sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); -} - -/**Function************************************************************* - - Synopsis [Adds trivial clause.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkClauseAnd( sat_solver * pSat, Abc_Obj_t * pNode, Vec_Ptr_t * vSuper, Vec_Int_t * vVars ) -{ - int fComp1, Var, Var1, i; -//printf( "Adding AND %d. (%d) %d\n", pNode->Id, vSuper->nSize+1, (int)pSat->sat_solver_stats.clauses ); - - assert( !Abc_ObjIsComplement( pNode ) ); - assert( Abc_ObjIsNode( pNode ) ); - -// nVars = sat_solver_nvars(pSat); - Var = (int)pNode->pCopy; -// Var = pNode->Id; - -// assert( Var < nVars ); - for ( i = 0; i < vSuper->nSize; i++ ) - { - // get the predecessor nodes - // get the complemented attributes of the nodes - fComp1 = Abc_ObjIsComplement(vSuper->pArray[i]); - // determine the variable numbers - Var1 = (int)Abc_ObjRegular(vSuper->pArray[i])->pCopy; -// Var1 = (int)Abc_ObjRegular(vSuper->pArray[i])->Id; - - // check that the variables are in the SAT manager -// assert( Var1 < nVars ); - - // suppose the AND-gate is A * B = C - // add !A => !C or A + !C - // fprintf( pFile, "%d %d 0%c", Var1, -Var, 10 ); - vVars->nSize = 0; - Vec_IntPush( vVars, toLitCond(Var1, fComp1) ); - Vec_IntPush( vVars, toLitCond(Var, 1 ) ); - if ( !sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ) ) - return 0; - } - - // add A & B => C or !A + !B + C -// fprintf( pFile, "%d %d %d 0%c", -Var1, -Var2, Var, 10 ); - vVars->nSize = 0; - for ( i = 0; i < vSuper->nSize; i++ ) - { - // get the predecessor nodes - // get the complemented attributes of the nodes - fComp1 = Abc_ObjIsComplement(vSuper->pArray[i]); - // determine the variable numbers - Var1 = (int)Abc_ObjRegular(vSuper->pArray[i])->pCopy; -// Var1 = (int)Abc_ObjRegular(vSuper->pArray[i])->Id; - // add this variable to the array - Vec_IntPush( vVars, toLitCond(Var1, !fComp1) ); - } - Vec_IntPush( vVars, toLitCond(Var, 0) ); - return sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); -} - -/**Function************************************************************* - - Synopsis [Adds trivial clause.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkClauseMux( sat_solver * pSat, Abc_Obj_t * pNode, Abc_Obj_t * pNodeC, Abc_Obj_t * pNodeT, Abc_Obj_t * pNodeE, Vec_Int_t * vVars ) -{ - int VarF, VarI, VarT, VarE, fCompT, fCompE; -//printf( "Adding mux %d. %d\n", pNode->Id, (int)pSat->sat_solver_stats.clauses ); - - assert( !Abc_ObjIsComplement( pNode ) ); - assert( Abc_NodeIsMuxType( pNode ) ); - // get the variable numbers - VarF = (int)pNode->pCopy; - VarI = (int)pNodeC->pCopy; - VarT = (int)Abc_ObjRegular(pNodeT)->pCopy; - VarE = (int)Abc_ObjRegular(pNodeE)->pCopy; -// VarF = (int)pNode->Id; -// VarI = (int)pNodeC->Id; -// VarT = (int)Abc_ObjRegular(pNodeT)->Id; -// VarE = (int)Abc_ObjRegular(pNodeE)->Id; - - // get the complementation flags - fCompT = Abc_ObjIsComplement(pNodeT); - fCompE = Abc_ObjIsComplement(pNodeE); - - // f = ITE(i, t, e) - // i' + t' + f - // i' + t + f' - // i + e' + f - // i + e + f' - // create four clauses - vVars->nSize = 0; - Vec_IntPush( vVars, toLitCond(VarI, 1) ); - Vec_IntPush( vVars, toLitCond(VarT, 1^fCompT) ); - Vec_IntPush( vVars, toLitCond(VarF, 0) ); - if ( !sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ) ) - return 0; - vVars->nSize = 0; - Vec_IntPush( vVars, toLitCond(VarI, 1) ); - Vec_IntPush( vVars, toLitCond(VarT, 0^fCompT) ); - Vec_IntPush( vVars, toLitCond(VarF, 1) ); - if ( !sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ) ) - return 0; - vVars->nSize = 0; - Vec_IntPush( vVars, toLitCond(VarI, 0) ); - Vec_IntPush( vVars, toLitCond(VarE, 1^fCompE) ); - Vec_IntPush( vVars, toLitCond(VarF, 0) ); - if ( !sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ) ) - return 0; - vVars->nSize = 0; - Vec_IntPush( vVars, toLitCond(VarI, 0) ); - Vec_IntPush( vVars, toLitCond(VarE, 0^fCompE) ); - Vec_IntPush( vVars, toLitCond(VarF, 1) ); - if ( !sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ) ) - return 0; - - if ( VarT == VarE ) - { -// assert( fCompT == !fCompE ); - return 1; - } - - // two additional clauses - // t' & e' -> f' t + e + f' - // t & e -> f t' + e' + f - vVars->nSize = 0; - Vec_IntPush( vVars, toLitCond(VarT, 0^fCompT) ); - Vec_IntPush( vVars, toLitCond(VarE, 0^fCompE) ); - Vec_IntPush( vVars, toLitCond(VarF, 1) ); - if ( !sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ) ) - return 0; - vVars->nSize = 0; - Vec_IntPush( vVars, toLitCond(VarT, 1^fCompT) ); - Vec_IntPush( vVars, toLitCond(VarE, 1^fCompE) ); - Vec_IntPush( vVars, toLitCond(VarF, 0) ); - return sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); -} - -/**Function************************************************************* - - Synopsis [Returns the array of nodes to be combined into one multi-input AND-gate.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkCollectSupergate_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vSuper, int fFirst, int fStopAtMux ) -{ - int RetValue1, RetValue2, i; - // check if the node is visited - if ( Abc_ObjRegular(pNode)->fMarkB ) - { - // check if the node occurs in the same polarity - for ( i = 0; i < vSuper->nSize; i++ ) - if ( vSuper->pArray[i] == pNode ) - return 1; - // check if the node is present in the opposite polarity - for ( i = 0; i < vSuper->nSize; i++ ) - if ( vSuper->pArray[i] == Abc_ObjNot(pNode) ) - return -1; - assert( 0 ); - return 0; - } - // if the new node is complemented or a PI, another gate begins - if ( !fFirst ) - if ( Abc_ObjIsComplement(pNode) || !Abc_ObjIsNode(pNode) || Abc_ObjFanoutNum(pNode) > 1 || fStopAtMux && Abc_NodeIsMuxType(pNode) ) - { - Vec_PtrPush( vSuper, pNode ); - Abc_ObjRegular(pNode)->fMarkB = 1; - return 0; - } - assert( !Abc_ObjIsComplement(pNode) ); - assert( Abc_ObjIsNode(pNode) ); - // go through the branches - RetValue1 = Abc_NtkCollectSupergate_rec( Abc_ObjChild0(pNode), vSuper, 0, fStopAtMux ); - RetValue2 = Abc_NtkCollectSupergate_rec( Abc_ObjChild1(pNode), vSuper, 0, fStopAtMux ); - if ( RetValue1 == -1 || RetValue2 == -1 ) - return -1; - // return 1 if at least one branch has a duplicate - return RetValue1 || RetValue2; -} - -/**Function************************************************************* - - Synopsis [Returns the array of nodes to be combined into one multi-input AND-gate.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkCollectSupergate( Abc_Obj_t * pNode, int fStopAtMux, Vec_Ptr_t * vNodes ) -{ - int RetValue, i; - assert( !Abc_ObjIsComplement(pNode) ); - // collect the nodes in the implication supergate - Vec_PtrClear( vNodes ); - RetValue = Abc_NtkCollectSupergate_rec( pNode, vNodes, 1, fStopAtMux ); - assert( vNodes->nSize > 1 ); - // unmark the visited nodes - for ( i = 0; i < vNodes->nSize; i++ ) - Abc_ObjRegular((Abc_Obj_t *)vNodes->pArray[i])->fMarkB = 0; - // if we found the node and its complement in the same implication supergate, - // return empty set of nodes (meaning that we should use constant-0 node) - if ( RetValue == -1 ) - vNodes->nSize = 0; -} - - -/**Function************************************************************* - - Synopsis [Computes the factor of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkNodeFactor( Abc_Obj_t * pObj, int nLevelMax ) -{ -// nLevelMax = ((nLevelMax)/2)*3; - assert( (int)pObj->Level <= nLevelMax ); -// return (int)(100000000.0 * pow(0.999, nLevelMax - pObj->Level)); - return (int)(100000000.0 * (1 + 0.01 * pObj->Level)); -// return (int)(100000000.0 / ((nLevelMax)/2)*3 - pObj->Level); -} - -/**Function************************************************************* - - Synopsis [Sets up the SAT sat_solver.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkMiterSatCreateInt( sat_solver * pSat, Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode, * pFanin, * pNodeC, * pNodeT, * pNodeE; - Vec_Ptr_t * vNodes, * vSuper; - Vec_Int_t * vVars; - int i, k, fUseMuxes = 1; - int clk1 = clock(); -// int fOrderCiVarsFirst = 0; - int nLevelsMax = Abc_AigLevel(pNtk); - int RetValue = 0; - - assert( Abc_NtkIsStrash(pNtk) ); - - // clean the CI node pointers - Abc_NtkForEachCi( pNtk, pNode, i ) - pNode->pCopy = NULL; - - // start the data structures - vNodes = Vec_PtrAlloc( 1000 ); // the nodes corresponding to vars in the sat_solver - vSuper = Vec_PtrAlloc( 100 ); // the nodes belonging to the given implication supergate - vVars = Vec_IntAlloc( 100 ); // the temporary array for variables in the clause - - // add the clause for the constant node - pNode = Abc_AigConst1(pNtk); - pNode->fMarkA = 1; - pNode->pCopy = (Abc_Obj_t *)vNodes->nSize; - Vec_PtrPush( vNodes, pNode ); - Abc_NtkClauseTriv( pSat, pNode, vVars ); -/* - // add the PI variables first - Abc_NtkForEachCi( pNtk, pNode, i ) - { - pNode->fMarkA = 1; - pNode->pCopy = (Abc_Obj_t *)vNodes->nSize; - Vec_PtrPush( vNodes, pNode ); - } -*/ - // collect the nodes that need clauses and top-level assignments - Vec_PtrClear( vSuper ); - Abc_NtkForEachCo( pNtk, pNode, i ) - { - // get the fanin - pFanin = Abc_ObjFanin0(pNode); - // create the node's variable - if ( pFanin->fMarkA == 0 ) - { - pFanin->fMarkA = 1; - pFanin->pCopy = (Abc_Obj_t *)vNodes->nSize; - Vec_PtrPush( vNodes, pFanin ); - } - // add the trivial clause - Vec_PtrPush( vSuper, Abc_ObjChild0(pNode) ); - } - if ( !Abc_NtkClauseTop( pSat, vSuper, vVars ) ) - goto Quits; - - - // add the clauses - Vec_PtrForEachEntry( vNodes, pNode, i ) - { - assert( !Abc_ObjIsComplement(pNode) ); - if ( !Abc_AigNodeIsAnd(pNode) ) - continue; -//printf( "%d ", pNode->Id ); - - // add the clauses - if ( fUseMuxes && Abc_NodeIsMuxType(pNode) ) - { - nMuxes++; - - pNodeC = Abc_NodeRecognizeMux( pNode, &pNodeT, &pNodeE ); - Vec_PtrClear( vSuper ); - Vec_PtrPush( vSuper, pNodeC ); - Vec_PtrPush( vSuper, pNodeT ); - Vec_PtrPush( vSuper, pNodeE ); - // add the fanin nodes to explore - Vec_PtrForEachEntry( vSuper, pFanin, k ) - { - pFanin = Abc_ObjRegular(pFanin); - if ( pFanin->fMarkA == 0 ) - { - pFanin->fMarkA = 1; - pFanin->pCopy = (Abc_Obj_t *)vNodes->nSize; - Vec_PtrPush( vNodes, pFanin ); - } - } - // add the clauses - if ( !Abc_NtkClauseMux( pSat, pNode, pNodeC, pNodeT, pNodeE, vVars ) ) - goto Quits; - } - else - { - // get the supergate - Abc_NtkCollectSupergate( pNode, fUseMuxes, vSuper ); - // add the fanin nodes to explore - Vec_PtrForEachEntry( vSuper, pFanin, k ) - { - pFanin = Abc_ObjRegular(pFanin); - if ( pFanin->fMarkA == 0 ) - { - pFanin->fMarkA = 1; - pFanin->pCopy = (Abc_Obj_t *)vNodes->nSize; - Vec_PtrPush( vNodes, pFanin ); - } - } - // add the clauses - if ( vSuper->nSize == 0 ) - { - if ( !Abc_NtkClauseTriv( pSat, Abc_ObjNot(pNode), vVars ) ) -// if ( !Abc_NtkClauseTriv( pSat, pNode, vVars ) ) - goto Quits; - } - else - { - if ( !Abc_NtkClauseAnd( pSat, pNode, vSuper, vVars ) ) - goto Quits; - } - } - } -/* - // set preferred variables - if ( fOrderCiVarsFirst ) - { - int * pPrefVars = ALLOC( int, Abc_NtkCiNum(pNtk) ); - int nVars = 0; - Abc_NtkForEachCi( pNtk, pNode, i ) - { - if ( pNode->fMarkA == 0 ) - continue; - pPrefVars[nVars++] = (int)pNode->pCopy; - } - nVars = ABC_MIN( nVars, 10 ); - ASat_SolverSetPrefVars( pSat, pPrefVars, nVars ); - } -*/ - RetValue = 1; -Quits : - // delete - Vec_IntFree( vVars ); - Vec_PtrFree( vNodes ); - Vec_PtrFree( vSuper ); - return RetValue; -} - -/**Function************************************************************* - - Synopsis [Sets up the SAT sat_solver.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void * Abc_NtkMiterSatCreate( Abc_Ntk_t * pNtk, int fAllPrimes ) -{ - sat_solver * pSat; - Abc_Obj_t * pNode; - int RetValue, i, clk = clock(); - - assert( Abc_NtkIsStrash(pNtk) || Abc_NtkIsBddLogic(pNtk) ); - if ( Abc_NtkIsBddLogic(pNtk) ) - return Abc_NtkMiterSatCreateLogic(pNtk, fAllPrimes); - - nMuxes = 0; - pSat = sat_solver_new(); -//sat_solver_store_alloc( pSat ); - RetValue = Abc_NtkMiterSatCreateInt( pSat, pNtk ); -sat_solver_store_mark_roots( pSat ); - - Abc_NtkForEachObj( pNtk, pNode, i ) - pNode->fMarkA = 0; -// ASat_SolverWriteDimacs( pSat, "temp_sat.cnf", NULL, NULL, 1 ); - if ( RetValue == 0 ) - { - sat_solver_delete(pSat); - return NULL; - } -// printf( "Ands = %6d. Muxes = %6d (%5.2f %%). ", Abc_NtkNodeNum(pNtk), nMuxes, 300.0*nMuxes/Abc_NtkNodeNum(pNtk) ); -// PRT( "Creating sat_solver", clock() - clk ); - return pSat; -} - - - - -/**Function************************************************************* - - Synopsis [Adds clauses for the internal node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeAddClauses( sat_solver * pSat, char * pSop0, char * pSop1, Abc_Obj_t * pNode, Vec_Int_t * vVars ) -{ - Abc_Obj_t * pFanin; - int i, c, nFanins; - int RetValue; - char * pCube; - - nFanins = Abc_ObjFaninNum( pNode ); - assert( nFanins == Abc_SopGetVarNum( pSop0 ) ); - -// if ( nFanins == 0 ) - if ( Cudd_Regular(pNode->pData) == Cudd_ReadOne(pNode->pNtk->pManFunc) ) - { - vVars->nSize = 0; -// if ( Abc_SopIsConst1(pSop1) ) - if ( !Cudd_IsComplement(pNode->pData) ) - Vec_IntPush( vVars, toLit(pNode->Id) ); - else - Vec_IntPush( vVars, lit_neg(toLit(pNode->Id)) ); - RetValue = sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); - if ( !RetValue ) - { - printf( "The CNF is trivially UNSAT.\n" ); - return 0; - } - return 1; - } - - // add clauses for the negative phase - for ( c = 0; ; c++ ) - { - // get the cube - pCube = pSop0 + c * (nFanins + 3); - if ( *pCube == 0 ) - break; - // add the clause - vVars->nSize = 0; - Abc_ObjForEachFanin( pNode, pFanin, i ) - { - if ( pCube[i] == '0' ) - Vec_IntPush( vVars, toLit(pFanin->Id) ); - else if ( pCube[i] == '1' ) - Vec_IntPush( vVars, lit_neg(toLit(pFanin->Id)) ); - } - Vec_IntPush( vVars, lit_neg(toLit(pNode->Id)) ); - RetValue = sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); - if ( !RetValue ) - { - printf( "The CNF is trivially UNSAT.\n" ); - return 0; - } - } - - // add clauses for the positive phase - for ( c = 0; ; c++ ) - { - // get the cube - pCube = pSop1 + c * (nFanins + 3); - if ( *pCube == 0 ) - break; - // add the clause - vVars->nSize = 0; - Abc_ObjForEachFanin( pNode, pFanin, i ) - { - if ( pCube[i] == '0' ) - Vec_IntPush( vVars, toLit(pFanin->Id) ); - else if ( pCube[i] == '1' ) - Vec_IntPush( vVars, lit_neg(toLit(pFanin->Id)) ); - } - Vec_IntPush( vVars, toLit(pNode->Id) ); - RetValue = sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); - if ( !RetValue ) - { - printf( "The CNF is trivially UNSAT.\n" ); - return 0; - } - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Adds clauses for the PO node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeAddClausesTop( sat_solver * pSat, Abc_Obj_t * pNode, Vec_Int_t * vVars ) -{ - Abc_Obj_t * pFanin; - int RetValue; - - pFanin = Abc_ObjFanin0(pNode); - if ( Abc_ObjFaninC0(pNode) ) - { - vVars->nSize = 0; - Vec_IntPush( vVars, toLit(pFanin->Id) ); - Vec_IntPush( vVars, toLit(pNode->Id) ); - RetValue = sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); - if ( !RetValue ) - { - printf( "The CNF is trivially UNSAT.\n" ); - return 0; - } - - vVars->nSize = 0; - Vec_IntPush( vVars, lit_neg(toLit(pFanin->Id)) ); - Vec_IntPush( vVars, lit_neg(toLit(pNode->Id)) ); - RetValue = sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); - if ( !RetValue ) - { - printf( "The CNF is trivially UNSAT.\n" ); - return 0; - } - } - else - { - vVars->nSize = 0; - Vec_IntPush( vVars, lit_neg(toLit(pFanin->Id)) ); - Vec_IntPush( vVars, toLit(pNode->Id) ); - RetValue = sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); - if ( !RetValue ) - { - printf( "The CNF is trivially UNSAT.\n" ); - return 0; - } - - vVars->nSize = 0; - Vec_IntPush( vVars, toLit(pFanin->Id) ); - Vec_IntPush( vVars, lit_neg(toLit(pNode->Id)) ); - RetValue = sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); - if ( !RetValue ) - { - printf( "The CNF is trivially UNSAT.\n" ); - return 0; - } - } - - vVars->nSize = 0; - Vec_IntPush( vVars, toLit(pNode->Id) ); - RetValue = sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); - if ( !RetValue ) - { - printf( "The CNF is trivially UNSAT.\n" ); - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Sets up the SAT sat_solver.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -sat_solver * Abc_NtkMiterSatCreateLogic( Abc_Ntk_t * pNtk, int fAllPrimes ) -{ - sat_solver * pSat; - Extra_MmFlex_t * pMmFlex; - Abc_Obj_t * pNode; - Vec_Str_t * vCube; - Vec_Int_t * vVars; - char * pSop0, * pSop1; - int i; - - assert( Abc_NtkIsBddLogic(pNtk) ); - - // transfer the IDs to the copy field - Abc_NtkForEachPi( pNtk, pNode, i ) - pNode->pCopy = (void *)pNode->Id; - - // start the data structures - pSat = sat_solver_new(); -sat_solver_store_alloc( pSat ); - pMmFlex = Extra_MmFlexStart(); - vCube = Vec_StrAlloc( 100 ); - vVars = Vec_IntAlloc( 100 ); - - // add clauses for each internal nodes - Abc_NtkForEachNode( pNtk, pNode, i ) - { - // derive SOPs for both phases of the node - Abc_NodeBddToCnf( pNode, pMmFlex, vCube, fAllPrimes, &pSop0, &pSop1 ); - // add the clauses to the sat_solver - if ( !Abc_NodeAddClauses( pSat, pSop0, pSop1, pNode, vVars ) ) - { - sat_solver_delete( pSat ); - pSat = NULL; - goto finish; - } - } - // add clauses for each PO - Abc_NtkForEachPo( pNtk, pNode, i ) - { - if ( !Abc_NodeAddClausesTop( pSat, pNode, vVars ) ) - { - sat_solver_delete( pSat ); - pSat = NULL; - goto finish; - } - } -sat_solver_store_mark_roots( pSat ); - -finish: - // delete - Vec_StrFree( vCube ); - Vec_IntFree( vVars ); - Extra_MmFlexStop( pMmFlex ); - return pSat; -} - - - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcStrash.c b/src/base/abci/abcStrash.c deleted file mode 100644 index c77f8dea..00000000 --- a/src/base/abci/abcStrash.c +++ /dev/null @@ -1,478 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcStrash.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Strashing of the current network.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcStrash.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "extra.h" -#include "dec.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Abc_NtkStrashPerform( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew, int fAllNodes, int fRecord ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Reapplies structural hashing to the AIG.] - - Description [Because of the structural hashing, this procedure should not - change the number of nodes. It is useful to detect the bugs in the original AIG.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkRestrash( Abc_Ntk_t * pNtk, bool fCleanup ) -{ - extern int timeRetime; - Abc_Ntk_t * pNtkAig; - Abc_Obj_t * pObj; - int i, nNodes;//, RetValue; - assert( Abc_NtkIsStrash(pNtk) ); -//timeRetime = clock(); - // print warning about choice nodes - if ( Abc_NtkGetChoiceNum( pNtk ) ) - printf( "Warning: The choice nodes in the original AIG are removed by strashing.\n" ); - // start the new network (constants and CIs of the old network will point to the their counterparts in the new network) - pNtkAig = Abc_NtkStartFrom( pNtk, ABC_NTK_STRASH, ABC_FUNC_AIG ); - // restrash the nodes (assuming a topological order of the old network) - Abc_NtkForEachNode( pNtk, pObj, i ) - pObj->pCopy = Abc_AigAnd( pNtkAig->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) ); - // finalize the network - Abc_NtkFinalize( pNtk, pNtkAig ); - // print warning about self-feed latches -// if ( Abc_NtkCountSelfFeedLatches(pNtkAig) ) -// printf( "Warning: The network has %d self-feeding latches.\n", Abc_NtkCountSelfFeedLatches(pNtkAig) ); - // perform cleanup if requested - if ( fCleanup && (nNodes = Abc_AigCleanup(pNtkAig->pManFunc)) ) - printf( "Abc_NtkRestrash(): AIG cleanup removed %d nodes (this is a bug).\n", nNodes ); - // duplicate EXDC - if ( pNtk->pExdc ) - pNtkAig->pExdc = Abc_NtkDup( pNtk->pExdc ); - // make sure everything is okay - if ( !Abc_NtkCheck( pNtkAig ) ) - { - printf( "Abc_NtkStrash: The network check has failed.\n" ); - Abc_NtkDelete( pNtkAig ); - return NULL; - } -//timeRetime = clock() - timeRetime; -// if ( RetValue = Abc_NtkRemoveSelfFeedLatches(pNtkAig) ) -// printf( "Modified %d self-feeding latches. The result may not verify.\n", RetValue ); - return pNtkAig; - -} - -/**Function************************************************************* - - Synopsis [Reapplies structural hashing to the AIG.] - - Description [Because of the structural hashing, this procedure should not - change the number of nodes. It is useful to detect the bugs in the original AIG.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkRestrashZero( Abc_Ntk_t * pNtk, bool fCleanup ) -{ - extern int timeRetime; - Abc_Ntk_t * pNtkAig; - Abc_Obj_t * pObj; - int i, nNodes;//, RetValue; - assert( Abc_NtkIsStrash(pNtk) ); -//timeRetime = clock(); - // print warning about choice nodes - if ( Abc_NtkGetChoiceNum( pNtk ) ) - printf( "Warning: The choice nodes in the original AIG are removed by strashing.\n" ); - // start the new network (constants and CIs of the old network will point to the their counterparts in the new network) - pNtkAig = Abc_NtkStartFrom( pNtk, ABC_NTK_STRASH, ABC_FUNC_AIG ); - // complement the 1-values registers - Abc_NtkForEachLatch( pNtk, pObj, i ) - if ( Abc_LatchIsInit1(pObj) ) - Abc_ObjFanout0(pObj)->pCopy = Abc_ObjNot(Abc_ObjFanout0(pObj)->pCopy); - // restrash the nodes (assuming a topological order of the old network) - Abc_NtkForEachNode( pNtk, pObj, i ) - pObj->pCopy = Abc_AigAnd( pNtkAig->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) ); - // finalize the network - Abc_NtkFinalize( pNtk, pNtkAig ); - // complement the 1-valued registers - Abc_NtkForEachLatch( pNtkAig, pObj, i ) - if ( Abc_LatchIsInit1(pObj) ) - Abc_ObjXorFaninC( Abc_ObjFanin0(pObj), 0 ); - // set all constant-0 values - Abc_NtkForEachLatch( pNtkAig, pObj, i ) - Abc_LatchSetInit0( pObj ); - - // print warning about self-feed latches -// if ( Abc_NtkCountSelfFeedLatches(pNtkAig) ) -// printf( "Warning: The network has %d self-feeding latches.\n", Abc_NtkCountSelfFeedLatches(pNtkAig) ); - // perform cleanup if requested - if ( fCleanup && (nNodes = Abc_AigCleanup(pNtkAig->pManFunc)) ) - printf( "Abc_NtkRestrash(): AIG cleanup removed %d nodes (this is a bug).\n", nNodes ); - // duplicate EXDC - if ( pNtk->pExdc ) - pNtkAig->pExdc = Abc_NtkDup( pNtk->pExdc ); - // make sure everything is okay - if ( !Abc_NtkCheck( pNtkAig ) ) - { - printf( "Abc_NtkStrash: The network check has failed.\n" ); - Abc_NtkDelete( pNtkAig ); - return NULL; - } -//timeRetime = clock() - timeRetime; -// if ( RetValue = Abc_NtkRemoveSelfFeedLatches(pNtkAig) ) -// printf( "Modified %d self-feeding latches. The result may not verify.\n", RetValue ); - return pNtkAig; - -} - -/**Function************************************************************* - - Synopsis [Transforms logic network into structurally hashed AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkStrash( Abc_Ntk_t * pNtk, int fAllNodes, int fCleanup, int fRecord ) -{ - Abc_Ntk_t * pNtkAig; - int nNodes; - assert( Abc_NtkIsLogic(pNtk) || Abc_NtkIsStrash(pNtk) ); - // consider the special case when the network is already structurally hashed - if ( Abc_NtkIsStrash(pNtk) ) - return Abc_NtkRestrash( pNtk, fCleanup ); - // convert the node representation in the logic network to the AIG form - if ( !Abc_NtkToAig(pNtk) ) - { - printf( "Converting to AIGs has failed.\n" ); - return NULL; - } - // perform strashing -// Abc_NtkCleanCopy( pNtk ); - pNtkAig = Abc_NtkStartFrom( pNtk, ABC_NTK_STRASH, ABC_FUNC_AIG ); - Abc_NtkStrashPerform( pNtk, pNtkAig, fAllNodes, fRecord ); - Abc_NtkFinalize( pNtk, pNtkAig ); - // print warning about self-feed latches -// if ( Abc_NtkCountSelfFeedLatches(pNtkAig) ) -// printf( "Warning: The network has %d self-feeding latches.\n", Abc_NtkCountSelfFeedLatches(pNtkAig) ); - // perform cleanup if requested - nNodes = fCleanup? Abc_AigCleanup(pNtkAig->pManFunc) : 0; -// if ( nNodes ) -// printf( "Warning: AIG cleanup removed %d nodes (this is not a bug).\n", nNodes ); - // duplicate EXDC - if ( pNtk->pExdc ) - pNtkAig->pExdc = Abc_NtkDup( pNtk->pExdc ); - // make sure everything is okay - if ( !Abc_NtkCheck( pNtkAig ) ) - { - printf( "Abc_NtkStrash: The network check has failed.\n" ); - Abc_NtkDelete( pNtkAig ); - return NULL; - } - return pNtkAig; -} - -/**Function************************************************************* - - Synopsis [Appends the second network to the first.] - - Description [Modifies the first network by adding the logic of the second. - Performs structural hashing while appending the networks. Does not change - the second network. Returns 0 if the appending failed, 1 otherise.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkAppend( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int fAddPos ) -{ - Abc_Obj_t * pObj; - char * pName; - int i, nNewCis; - // the first network should be an AIG - assert( Abc_NtkIsStrash(pNtk1) ); - assert( Abc_NtkIsLogic(pNtk2) || Abc_NtkIsStrash(pNtk2) ); - if ( Abc_NtkIsLogic(pNtk2) && !Abc_NtkToAig(pNtk2) ) - { - printf( "Converting to AIGs has failed.\n" ); - return 0; - } - // check that the networks have the same PIs - // reorder PIs of pNtk2 according to pNtk1 - if ( !Abc_NtkCompareSignals( pNtk1, pNtk2, 1, 1 ) ) - printf( "Abc_NtkAppend(): The union of the network PIs is computed (warning).\n" ); - // perform strashing - nNewCis = 0; - Abc_NtkCleanCopy( pNtk2 ); - if ( Abc_NtkIsStrash(pNtk2) ) - Abc_AigConst1(pNtk2)->pCopy = Abc_AigConst1(pNtk1); - Abc_NtkForEachCi( pNtk2, pObj, i ) - { - pName = Abc_ObjName(pObj); - pObj->pCopy = Abc_NtkFindCi(pNtk1, Abc_ObjName(pObj)); - if ( pObj->pCopy == NULL ) - { - pObj->pCopy = Abc_NtkDupObj(pNtk1, pObj, 1); - nNewCis++; - } - } - if ( nNewCis ) - printf( "Warning: Procedure Abc_NtkAppend() added %d new CIs.\n", nNewCis ); - // add pNtk2 to pNtk1 while strashing - if ( Abc_NtkIsLogic(pNtk2) ) - Abc_NtkStrashPerform( pNtk2, pNtk1, 1, 0 ); - else - Abc_NtkForEachNode( pNtk2, pObj, i ) - pObj->pCopy = Abc_AigAnd( pNtk1->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) ); - // add the COs of the second network - if ( fAddPos ) - { - Abc_NtkForEachPo( pNtk2, pObj, i ) - { - Abc_NtkDupObj( pNtk1, pObj, 0 ); - Abc_ObjAddFanin( pObj->pCopy, Abc_ObjChild0Copy(pObj) ); - Abc_ObjAssignName( pObj->pCopy, Abc_ObjName(pObj->pCopy), NULL ); - } - } - else - { - Abc_Obj_t * pObjOld, * pDriverOld, * pDriverNew; - int fCompl, iNodeId; - // OR the choices - Abc_NtkForEachCo( pNtk2, pObj, i ) - { - iNodeId = Nm_ManFindIdByNameTwoTypes( pNtk1->pManName, Abc_ObjName(pObj), ABC_OBJ_PO, ABC_OBJ_BI ); - assert( iNodeId >= 0 ); - pObjOld = Abc_NtkObj( pNtk1, iNodeId ); - // derive the new driver - pDriverOld = Abc_ObjChild0( pObjOld ); - pDriverNew = Abc_ObjChild0Copy( pObj ); - pDriverNew = Abc_AigOr( pNtk1->pManFunc, pDriverOld, pDriverNew ); - if ( Abc_ObjRegular(pDriverOld) == Abc_ObjRegular(pDriverNew) ) - continue; - // replace the old driver by the new driver - fCompl = Abc_ObjRegular(pDriverOld)->fPhase ^ Abc_ObjRegular(pDriverNew)->fPhase; - Abc_ObjPatchFanin( pObjOld, Abc_ObjRegular(pDriverOld), Abc_ObjNotCond(Abc_ObjRegular(pDriverNew), fCompl) ); - } - } - // make sure that everything is okay - if ( !Abc_NtkCheck( pNtk1 ) ) - { - printf( "Abc_NtkAppend: The network check has failed.\n" ); - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Prepares the network for strashing.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkStrashPerform( Abc_Ntk_t * pNtkOld, Abc_Ntk_t * pNtkNew, int fAllNodes, int fRecord ) -{ - ProgressBar * pProgress; - Vec_Ptr_t * vNodes; - Abc_Obj_t * pNodeOld; - int i, clk = clock(); - assert( Abc_NtkIsLogic(pNtkOld) ); - assert( Abc_NtkIsStrash(pNtkNew) ); -// vNodes = Abc_NtkDfs( pNtkOld, fAllNodes ); - vNodes = Abc_NtkDfsIter( pNtkOld, fAllNodes ); -//printf( "Nodes = %d. ", Vec_PtrSize(vNodes) ); -//PRT( "Time", clock() - clk ); - pProgress = Extra_ProgressBarStart( stdout, vNodes->nSize ); - Vec_PtrForEachEntry( vNodes, pNodeOld, i ) - { - Extra_ProgressBarUpdate( pProgress, i, NULL ); - pNodeOld->pCopy = Abc_NodeStrash( pNtkNew, pNodeOld, fRecord ); - } - Extra_ProgressBarStop( pProgress ); - Vec_PtrFree( vNodes ); -} - -/**Function************************************************************* - - Synopsis [Transfers the AIG from one manager into another.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeStrash_rec( Abc_Aig_t * pMan, Hop_Obj_t * pObj ) -{ - assert( !Hop_IsComplement(pObj) ); - if ( !Hop_ObjIsNode(pObj) || Hop_ObjIsMarkA(pObj) ) - return; - Abc_NodeStrash_rec( pMan, Hop_ObjFanin0(pObj) ); - Abc_NodeStrash_rec( pMan, Hop_ObjFanin1(pObj) ); - pObj->pData = Abc_AigAnd( pMan, (Abc_Obj_t *)Hop_ObjChild0Copy(pObj), (Abc_Obj_t *)Hop_ObjChild1Copy(pObj) ); - assert( !Hop_ObjIsMarkA(pObj) ); // loop detection - Hop_ObjSetMarkA( pObj ); -} - -/**Function************************************************************* - - Synopsis [Strashes one logic node.] - - Description [Assume the network is in the AIG form] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NodeStrash( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNodeOld, int fRecord ) -{ - Hop_Man_t * pMan; - Hop_Obj_t * pRoot; - Abc_Obj_t * pFanin; - int i; - assert( Abc_ObjIsNode(pNodeOld) ); - assert( Abc_NtkHasAig(pNodeOld->pNtk) && !Abc_NtkIsStrash(pNodeOld->pNtk) ); - // get the local AIG manager and the local root node - pMan = pNodeOld->pNtk->pManFunc; - pRoot = pNodeOld->pData; - // check the constant case - if ( Abc_NodeIsConst(pNodeOld) || Hop_Regular(pRoot) == Hop_ManConst1(pMan) ) - return Abc_ObjNotCond( Abc_AigConst1(pNtkNew), Hop_IsComplement(pRoot) ); - // perform special case-strashing using the record of AIG subgraphs - if ( fRecord && Abc_NtkRecIsRunning() && Abc_ObjFaninNum(pNodeOld) > 2 && Abc_ObjFaninNum(pNodeOld) <= Abc_NtkRecVarNum() ) - { - extern Vec_Int_t * Abc_NtkRecMemory(); - extern int Abc_NtkRecStrashNode( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pObj, unsigned * pTruth, int nVars ); - int nVars = Abc_NtkRecVarNum(); - Vec_Int_t * vMemory = Abc_NtkRecMemory(); - unsigned * pTruth = Abc_ConvertAigToTruth( pMan, Hop_Regular(pRoot), nVars, vMemory, 0 ); - assert( Extra_TruthSupportSize(pTruth, nVars) == Abc_ObjFaninNum(pNodeOld) ); // should be swept - if ( Hop_IsComplement(pRoot) ) - Extra_TruthNot( pTruth, pTruth, nVars ); - if ( Abc_NtkRecStrashNode( pNtkNew, pNodeOld, pTruth, nVars ) ) - return pNodeOld->pCopy; - } - // set elementary variables - Abc_ObjForEachFanin( pNodeOld, pFanin, i ) - Hop_IthVar(pMan, i)->pData = pFanin->pCopy; - // strash the AIG of this node - Abc_NodeStrash_rec( pNtkNew->pManFunc, Hop_Regular(pRoot) ); - Hop_ConeUnmark_rec( Hop_Regular(pRoot) ); - // return the final node - return Abc_ObjNotCond( Hop_Regular(pRoot)->pData, Hop_IsComplement(pRoot) ); -} - - - - - - - -/**Function************************************************************* - - Synopsis [Copies the topmost levels of the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Obj_t * Abc_NtkTopmost_rec( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNode, int LevelCut ) -{ - assert( !Abc_ObjIsComplement(pNode) ); - if ( pNode->pCopy ) - return pNode->pCopy; - if ( pNode->Level <= (unsigned)LevelCut ) - return pNode->pCopy = Abc_NtkCreatePi( pNtkNew ); - Abc_NtkTopmost_rec( pNtkNew, Abc_ObjFanin0(pNode), LevelCut ); - Abc_NtkTopmost_rec( pNtkNew, Abc_ObjFanin1(pNode), LevelCut ); - return pNode->pCopy = Abc_AigAnd( pNtkNew->pManFunc, Abc_ObjChild0Copy(pNode), Abc_ObjChild1Copy(pNode) ); -} - -/**Function************************************************************* - - Synopsis [Copies the topmost levels of the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkTopmost( Abc_Ntk_t * pNtk, int nLevels ) -{ - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pObjNew, * pPoNew; - int LevelCut; - assert( Abc_NtkIsStrash(pNtk) ); - assert( Abc_NtkCoNum(pNtk) == 1 ); - // get the cutoff level - LevelCut = ABC_MAX( 0, Abc_AigLevel(pNtk) - nLevels ); - // start the network - pNtkNew = Abc_NtkAlloc( ABC_NTK_STRASH, ABC_FUNC_AIG, 1 ); - pNtkNew->pName = Extra_UtilStrsav(pNtk->pName); - Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkNew); - // create PIs below the cut and nodes above the cut - Abc_NtkCleanCopy( pNtk ); - pObjNew = Abc_NtkTopmost_rec( pNtkNew, Abc_ObjFanin0(Abc_NtkPo(pNtk, 0)), LevelCut ); - pObjNew = Abc_ObjNotCond( pObjNew, Abc_ObjFaninC0(Abc_NtkPo(pNtk, 0)) ); - // add the PO node and name - pPoNew = Abc_NtkCreatePo(pNtkNew); - Abc_ObjAddFanin( pPoNew, pObjNew ); - Abc_NtkAddDummyPiNames( pNtkNew ); - Abc_ObjAssignName( pPoNew, Abc_ObjName(Abc_NtkPo(pNtk, 0)), NULL ); - // make sure everything is okay - if ( !Abc_NtkCheck( pNtkNew ) ) - { - printf( "Abc_NtkTopmost: The network check has failed.\n" ); - Abc_NtkDelete( pNtkNew ); - return NULL; - } - return pNtkNew; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcSweep.c b/src/base/abci/abcSweep.c deleted file mode 100644 index 1ae8745b..00000000 --- a/src/base/abci/abcSweep.c +++ /dev/null @@ -1,948 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcDsd.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Technology dependent sweep.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcDsd.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "fraig.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Abc_NtkFraigSweepUsingExdc( Fraig_Man_t * pMan, Abc_Ntk_t * pNtk ); -static stmm_table * Abc_NtkFraigEquiv( Abc_Ntk_t * pNtk, int fUseInv, int fVerbose, int fVeryVerbose ); -static void Abc_NtkFraigTransform( Abc_Ntk_t * pNtk, stmm_table * tEquiv, int fUseInv, bool fVerbose ); -static void Abc_NtkFraigMergeClassMapped( Abc_Ntk_t * pNtk, Abc_Obj_t * pChain, int fUseInv, int fVerbose ); -static void Abc_NtkFraigMergeClass( Abc_Ntk_t * pNtk, Abc_Obj_t * pChain, int fUseInv, int fVerbose ); -static int Abc_NodeDroppingCost( Abc_Obj_t * pNode ); - -static int Abc_NtkReduceNodes( Abc_Ntk_t * pNtk, Vec_Ptr_t * vNodes ); -static void Abc_NodeSweep( Abc_Obj_t * pNode, int fVerbose ); -static void Abc_NodeConstantInput( Abc_Obj_t * pNode, Abc_Obj_t * pFanin, bool fConst0 ); -static void Abc_NodeComplementInput( Abc_Obj_t * pNode, Abc_Obj_t * pFanin ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Sweping functionally equivalence nodes.] - - Description [Removes gates with equivalent functionality. Works for - both technology-independent and mapped networks. If the flag is set, - allows adding inverters at the gate outputs.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -bool Abc_NtkFraigSweep( Abc_Ntk_t * pNtk, int fUseInv, int fExdc, int fVerbose, int fVeryVerbose ) -{ - Fraig_Params_t Params; - Abc_Ntk_t * pNtkAig; - Fraig_Man_t * pMan; - stmm_table * tEquiv; - Abc_Obj_t * pObj; - int i, fUseTrick; - - assert( !Abc_NtkIsStrash(pNtk) ); - - // save gate assignments - fUseTrick = 0; - if ( Abc_NtkIsMappedLogic(pNtk) ) - { - fUseTrick = 1; - Abc_NtkForEachNode( pNtk, pObj, i ) - pObj->pNext = pObj->pData; - } - // derive the AIG - pNtkAig = Abc_NtkStrash( pNtk, 0, 1, 0 ); - // reconstruct gate assignments - if ( fUseTrick ) - { - extern void * Abc_FrameReadLibGen(); - Hop_ManStop( pNtk->pManFunc ); - pNtk->pManFunc = Abc_FrameReadLibGen(); - pNtk->ntkFunc = ABC_FUNC_MAP; - Abc_NtkForEachNode( pNtk, pObj, i ) - pObj->pData = pObj->pNext, pObj->pNext = NULL; - } - - // perform fraiging of the AIG - Fraig_ParamsSetDefault( &Params ); - pMan = Abc_NtkToFraig( pNtkAig, &Params, 0, 0 ); - // cannot use EXDC with FRAIG because it can create classes of equivalent FRAIG nodes - // with representative nodes that do not correspond to the nodes with the current network - - // update FRAIG using EXDC - if ( fExdc ) - { - if ( pNtk->pExdc == NULL ) - printf( "Warning: Networks has no EXDC.\n" ); - else - Abc_NtkFraigSweepUsingExdc( pMan, pNtk ); - } - // assign levels to the nodes of the network - Abc_NtkLevel( pNtk ); - - // collect the classes of equivalent nets - tEquiv = Abc_NtkFraigEquiv( pNtk, fUseInv, fVerbose, fVeryVerbose ); - - // transform the network into the equivalent one - Abc_NtkFraigTransform( pNtk, tEquiv, fUseInv, fVerbose ); - stmm_free_table( tEquiv ); - - // free the manager - Fraig_ManFree( pMan ); - Abc_NtkDelete( pNtkAig ); - - // cleanup the dangling nodes - if ( Abc_NtkHasMapping(pNtk) ) - Abc_NtkCleanup( pNtk, fVerbose ); - else - Abc_NtkSweep( pNtk, fVerbose ); - - // check - if ( !Abc_NtkCheck( pNtk ) ) - { - printf( "Abc_NtkFraigSweep: The network check has failed.\n" ); - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Sweep the network using EXDC.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFraigSweepUsingExdc( Fraig_Man_t * pMan, Abc_Ntk_t * pNtk ) -{ - Fraig_Node_t * gNodeExdc, * gNode, * gNodeRes; - Abc_Obj_t * pNode, * pNodeAig; - int i; - extern Fraig_Node_t * Abc_NtkToFraigExdc( Fraig_Man_t * pMan, Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkExdc ); - - assert( pNtk->pExdc ); - // derive FRAIG node representing don't-cares in the EXDC network - gNodeExdc = Abc_NtkToFraigExdc( pMan, pNtk, pNtk->pExdc ); - // update the node pointers - Abc_NtkForEachNode( pNtk, pNode, i ) - { - // skip the constant input nodes - if ( Abc_ObjFaninNum(pNode) == 0 ) - continue; - // get the strashed node - pNodeAig = pNode->pCopy; - // skip the dangling nodes - if ( pNodeAig == NULL ) - continue; - // get the FRAIG node - gNode = Fraig_NotCond( Abc_ObjRegular(pNodeAig)->pCopy, Abc_ObjIsComplement(pNodeAig) ); - // perform ANDing with EXDC - gNodeRes = Fraig_NodeAnd( pMan, gNode, Fraig_Not(gNodeExdc) ); - // write the node back - Abc_ObjRegular(pNodeAig)->pCopy = (Abc_Obj_t *)Fraig_NotCond( gNodeRes, Abc_ObjIsComplement(pNodeAig) ); - } -} - -/**Function************************************************************* - - Synopsis [Collects equivalence classses of node in the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -stmm_table * Abc_NtkFraigEquiv( Abc_Ntk_t * pNtk, int fUseInv, int fVerbose, int fVeryVerbose ) -{ - Abc_Obj_t * pList, * pNode, * pNodeAig; - Fraig_Node_t * gNode; - Abc_Obj_t ** ppSlot; - stmm_table * tStrash2Net; - stmm_table * tResult; - stmm_generator * gen; - int c, Counter; - - // create mapping of strashed nodes into the corresponding network nodes - tStrash2Net = stmm_init_table(stmm_ptrcmp,stmm_ptrhash); - Abc_NtkForEachNode( pNtk, pNode, c ) - { - // skip the constant input nodes - if ( Abc_ObjFaninNum(pNode) == 0 ) - continue; - // get the strashed node - pNodeAig = pNode->pCopy; - // skip the dangling nodes - if ( pNodeAig == NULL ) - continue; - // skip the nodes that fanout into COs - if ( Abc_NodeFindCoFanout(pNode) ) - continue; - // get the FRAIG node - gNode = Fraig_NotCond( Abc_ObjRegular(pNodeAig)->pCopy, Abc_ObjIsComplement(pNodeAig) ); - if ( !stmm_find_or_add( tStrash2Net, (char *)Fraig_Regular(gNode), (char ***)&ppSlot ) ) - *ppSlot = NULL; - // add the node to the list - pNode->pNext = *ppSlot; - *ppSlot = pNode; - // mark the node if it is complemented - pNode->fPhase = Fraig_IsComplement(gNode); - } - - // print the classes - c = 0; - Counter = 0; - tResult = stmm_init_table(stmm_ptrcmp,stmm_ptrhash); - stmm_foreach_item( tStrash2Net, gen, (char **)&gNode, (char **)&pList ) - { - // skip the trival classes - if ( pList == NULL || pList->pNext == NULL ) - continue; - // add the non-trival class - stmm_insert( tResult, (char *)pList, NULL ); - // count nodes in the non-trival classes - for ( pNode = pList; pNode; pNode = pNode->pNext ) - Counter++; - - if ( fVeryVerbose ) - { - printf( "Class %2d : {", c ); - for ( pNode = pList; pNode; pNode = pNode->pNext ) - { - pNode->pCopy = NULL; - printf( " %s", Abc_ObjName(pNode) ); - printf( "(%c)", pNode->fPhase? '-' : '+' ); - printf( "(%d)", pNode->Level ); - } - printf( " }\n" ); - c++; - } - } - if ( fVerbose || fVeryVerbose ) - { - printf( "Sweeping stats for network \"%s\":\n", pNtk->pName ); - printf( "Internal nodes = %d. Different functions (up to compl) = %d.\n", Abc_NtkNodeNum(pNtk), stmm_count(tStrash2Net) ); - printf( "Non-trivial classes = %d. Nodes in non-trivial classes = %d.\n", stmm_count(tResult), Counter ); - } - stmm_free_table( tStrash2Net ); - return tResult; -} - - -/**Function************************************************************* - - Synopsis [Transforms the network using the equivalence relation on nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFraigTransform( Abc_Ntk_t * pNtk, stmm_table * tEquiv, int fUseInv, bool fVerbose ) -{ - stmm_generator * gen; - Abc_Obj_t * pList; - if ( stmm_count(tEquiv) == 0 ) - return; - // merge nodes in the classes - if ( Abc_NtkHasMapping( pNtk ) ) - { - Abc_NtkDelayTrace( pNtk ); - stmm_foreach_item( tEquiv, gen, (char **)&pList, NULL ) - Abc_NtkFraigMergeClassMapped( pNtk, pList, fUseInv, fVerbose ); - } - else - { - stmm_foreach_item( tEquiv, gen, (char **)&pList, NULL ) - Abc_NtkFraigMergeClass( pNtk, pList, fUseInv, fVerbose ); - } -} - - -/**Function************************************************************* - - Synopsis [Transforms the list of one-phase equivalent nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFraigMergeClassMapped( Abc_Ntk_t * pNtk, Abc_Obj_t * pChain, int fUseInv, int fVerbose ) -{ - Abc_Obj_t * pListDir, * pListInv; - Abc_Obj_t * pNodeMin, * pNode, * pNext; - float Arrival1, Arrival2; - - assert( pChain ); - assert( pChain->pNext ); - - // divide the nodes into two parts: - // those that need the invertor and those that don't need - pListDir = pListInv = NULL; - for ( pNode = pChain, pNext = pChain->pNext; - pNode; - pNode = pNext, pNext = pNode? pNode->pNext : NULL ) - { - // check to which class the node belongs - if ( pNode->fPhase == 1 ) - { - pNode->pNext = pListDir; - pListDir = pNode; - } - else - { - pNode->pNext = pListInv; - pListInv = pNode; - } - } - - // find the node with the smallest number of logic levels - pNodeMin = pListDir; - for ( pNode = pListDir; pNode; pNode = pNode->pNext ) - { - Arrival1 = Abc_NodeReadArrival(pNodeMin)->Worst; - Arrival2 = Abc_NodeReadArrival(pNode )->Worst; -// assert( Abc_ObjIsCi(pNodeMin) || Arrival1 > 0 ); -// assert( Abc_ObjIsCi(pNode) || Arrival2 > 0 ); - if ( Arrival1 > Arrival2 || - Arrival1 == Arrival2 && pNodeMin->Level > pNode->Level || - Arrival1 == Arrival2 && pNodeMin->Level == pNode->Level && - Abc_NodeDroppingCost(pNodeMin) < Abc_NodeDroppingCost(pNode) ) - pNodeMin = pNode; - } - - // move the fanouts of the direct nodes - for ( pNode = pListDir; pNode; pNode = pNode->pNext ) - if ( pNode != pNodeMin ) - Abc_ObjTransferFanout( pNode, pNodeMin ); - - // find the node with the smallest number of logic levels - pNodeMin = pListInv; - for ( pNode = pListInv; pNode; pNode = pNode->pNext ) - { - Arrival1 = Abc_NodeReadArrival(pNodeMin)->Worst; - Arrival2 = Abc_NodeReadArrival(pNode )->Worst; -// assert( Abc_ObjIsCi(pNodeMin) || Arrival1 > 0 ); -// assert( Abc_ObjIsCi(pNode) || Arrival2 > 0 ); - if ( Arrival1 > Arrival2 || - Arrival1 == Arrival2 && pNodeMin->Level > pNode->Level || - Arrival1 == Arrival2 && pNodeMin->Level == pNode->Level && - Abc_NodeDroppingCost(pNodeMin) < Abc_NodeDroppingCost(pNode) ) - pNodeMin = pNode; - } - - // move the fanouts of the direct nodes - for ( pNode = pListInv; pNode; pNode = pNode->pNext ) - if ( pNode != pNodeMin ) - Abc_ObjTransferFanout( pNode, pNodeMin ); -} - -/**Function************************************************************* - - Synopsis [Process one equivalence class of nodes.] - - Description [This function does not remove the nodes. It only switches - around the connections.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFraigMergeClass( Abc_Ntk_t * pNtk, Abc_Obj_t * pChain, int fUseInv, int fVerbose ) -{ - Abc_Obj_t * pListDir, * pListInv; - Abc_Obj_t * pNodeMin, * pNodeMinInv; - Abc_Obj_t * pNode, * pNext; - - assert( pChain ); - assert( pChain->pNext ); - - // find the node with the smallest number of logic levels - pNodeMin = pChain; - for ( pNode = pChain->pNext; pNode; pNode = pNode->pNext ) - if ( pNodeMin->Level > pNode->Level || - ( pNodeMin->Level == pNode->Level && - Abc_NodeDroppingCost(pNodeMin) < Abc_NodeDroppingCost(pNode) ) ) - pNodeMin = pNode; - - // divide the nodes into two parts: - // those that need the invertor and those that don't need - pListDir = pListInv = NULL; - for ( pNode = pChain, pNext = pChain->pNext; - pNode; - pNode = pNext, pNext = pNode? pNode->pNext : NULL ) - { - if ( pNode == pNodeMin ) - continue; - // check to which class the node belongs - if ( pNodeMin->fPhase == pNode->fPhase ) - { - pNode->pNext = pListDir; - pListDir = pNode; - } - else - { - pNode->pNext = pListInv; - pListInv = pNode; - } - } - - // move the fanouts of the direct nodes - for ( pNode = pListDir; pNode; pNode = pNode->pNext ) - Abc_ObjTransferFanout( pNode, pNodeMin ); - - // skip if there are no inverted nodes - if ( pListInv == NULL ) - return; - - // add the invertor - pNodeMinInv = Abc_NtkCreateNodeInv( pNtk, pNodeMin ); - - // move the fanouts of the inverted nodes - for ( pNode = pListInv; pNode; pNode = pNode->pNext ) - Abc_ObjTransferFanout( pNode, pNodeMinInv ); -} - - -/**Function************************************************************* - - Synopsis [Returns the number of literals saved if this node becomes useless.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeDroppingCost( Abc_Obj_t * pNode ) -{ - return 1; -} - - - - - -/**Function************************************************************* - - Synopsis [Removes dangling nodes.] - - Description [Returns the number of nodes removed.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkCleanup( Abc_Ntk_t * pNtk, int fVerbose ) -{ - Vec_Ptr_t * vNodes; - int Counter; - assert( Abc_NtkIsLogic(pNtk) ); - // mark the nodes reachable from the POs - vNodes = Abc_NtkDfs( pNtk, 0 ); - Counter = Abc_NtkReduceNodes( pNtk, vNodes ); - if ( fVerbose ) - printf( "Cleanup removed %d dangling nodes.\n", Counter ); - Vec_PtrFree( vNodes ); - return Counter; -} - -/**Function************************************************************* - - Synopsis [Preserves the nodes collected in the array.] - - Description [Returns the number of nodes removed.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkReduceNodes( Abc_Ntk_t * pNtk, Vec_Ptr_t * vNodes ) -{ - Abc_Obj_t * pNode; - int i, Counter; - assert( Abc_NtkIsLogic(pNtk) ); - // mark the nodes reachable from the POs - Vec_PtrForEachEntry( vNodes, pNode, i ) - pNode->fMarkA = 1; - // remove the non-marked nodes - Counter = 0; - Abc_NtkForEachNode( pNtk, pNode, i ) - if ( pNode->fMarkA == 0 ) - { - Abc_NtkDeleteObj( pNode ); - Counter++; - } - // unmark the remaining nodes - Vec_PtrForEachEntry( vNodes, pNode, i ) - pNode->fMarkA = 0; - // check - if ( !Abc_NtkCheck( pNtk ) ) - printf( "Abc_NtkCleanup: The network check has failed.\n" ); - return Counter; -} - - - - -/**Function************************************************************* - - Synopsis [Tranditional sweep of the network.] - - Description [Propagates constant and single-input node, removes dangling nodes.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkSweep( Abc_Ntk_t * pNtk, int fVerbose ) -{ - Vec_Ptr_t * vNodes; - Abc_Obj_t * pNode, * pFanout, * pDriver; - int i, nNodesOld; - assert( Abc_NtkIsLogic(pNtk) ); - // convert network to BDD representation - if ( !Abc_NtkToBdd(pNtk) ) - { - fprintf( stdout, "Converting to BDD has failed.\n" ); - return 1; - } - // perform cleanup - nNodesOld = Abc_NtkNodeNum(pNtk); - Abc_NtkCleanup( pNtk, 0 ); - // prepare nodes for sweeping - Abc_NtkRemoveDupFanins(pNtk); - Abc_NtkMinimumBase(pNtk); - // collect sweepable nodes - vNodes = Vec_PtrAlloc( 100 ); - Abc_NtkForEachNode( pNtk, pNode, i ) - if ( Abc_ObjFaninNum(pNode) < 2 ) - Vec_PtrPush( vNodes, pNode ); - // sweep the nodes - while ( Vec_PtrSize(vNodes) > 0 ) - { - // get any sweepable node - pNode = Vec_PtrPop(vNodes); - if ( !Abc_ObjIsNode(pNode) ) - continue; - // get any non-CO fanout of this node - pFanout = Abc_NodeFindNonCoFanout(pNode); - if ( pFanout == NULL ) - continue; - assert( Abc_ObjIsNode(pFanout) ); - // transform the function of the fanout - if ( Abc_ObjFaninNum(pNode) == 0 ) - Abc_NodeConstantInput( pFanout, pNode, Abc_NodeIsConst0(pNode) ); - else - { - assert( Abc_ObjFaninNum(pNode) == 1 ); - pDriver = Abc_ObjFanin0(pNode); - if ( Abc_NodeIsInv(pNode) ) - Abc_NodeComplementInput( pFanout, pNode ); - Abc_ObjPatchFanin( pFanout, pNode, pDriver ); - } - Abc_NodeRemoveDupFanins( pFanout ); - Abc_NodeMinimumBase( pFanout ); - // check if the fanout should be added - if ( Abc_ObjFaninNum(pFanout) < 2 ) - Vec_PtrPush( vNodes, pFanout ); - // check if the node has other fanouts - if ( Abc_ObjFanoutNum(pNode) > 0 ) - Vec_PtrPush( vNodes, pNode ); - else - Abc_NtkDeleteObj_rec( pNode, 1 ); - } - Vec_PtrFree( vNodes ); - // sweep a node into its CO fanout if all of this is true: - // (a) this node is a single-input node - // (b) the driver of the node has only one fanout (this node) - // (c) the driver is a node - Abc_NtkForEachCo( pNtk, pFanout, i ) - { - pNode = Abc_ObjFanin0(pFanout); - if ( Abc_ObjFaninNum(pNode) != 1 ) - continue; - pDriver = Abc_ObjFanin0(pNode); - if ( !(Abc_ObjFanoutNum(pDriver) == 1 && Abc_ObjIsNode(pDriver)) ) - continue; - // trasform this CO - if ( Abc_NodeIsInv(pNode) ) - pDriver->pData = Cudd_Not(pDriver->pData); - Abc_ObjPatchFanin( pFanout, pNode, pDriver ); - } - // perform cleanup - Abc_NtkCleanup( pNtk, 0 ); - // report - if ( fVerbose ) - printf( "Sweep removed %d nodes.\n", nNodesOld - Abc_NtkNodeNum(pNtk) ); - return nNodesOld - Abc_NtkNodeNum(pNtk); -} - - -/**Function************************************************************* - - Synopsis [Replaces the local function by its cofactor.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeConstantInput( Abc_Obj_t * pNode, Abc_Obj_t * pFanin, bool fConst0 ) -{ - DdManager * dd = pNode->pNtk->pManFunc; - DdNode * bVar, * bTemp; - int iFanin; - assert( Abc_NtkIsBddLogic(pNode->pNtk) ); - if ( (iFanin = Vec_IntFind( &pNode->vFanins, pFanin->Id )) == -1 ) - { - printf( "Node %s should be among", Abc_ObjName(pFanin) ); - printf( " the fanins of node %s...\n", Abc_ObjName(pNode) ); - return; - } - bVar = Cudd_NotCond( Cudd_bddIthVar(dd, iFanin), fConst0 ); - pNode->pData = Cudd_Cofactor( dd, bTemp = pNode->pData, bVar ); Cudd_Ref( pNode->pData ); - Cudd_RecursiveDeref( dd, bTemp ); -} - -/**Function************************************************************* - - Synopsis [Changes the polarity of one fanin.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeComplementInput( Abc_Obj_t * pNode, Abc_Obj_t * pFanin ) -{ - DdManager * dd = pNode->pNtk->pManFunc; - DdNode * bVar, * bCof0, * bCof1; - int iFanin; - assert( Abc_NtkIsBddLogic(pNode->pNtk) ); - if ( (iFanin = Vec_IntFind( &pNode->vFanins, pFanin->Id )) == -1 ) - { - printf( "Node %s should be among", Abc_ObjName(pFanin) ); - printf( " the fanins of node %s...\n", Abc_ObjName(pNode) ); - return; - } - bVar = Cudd_bddIthVar( dd, iFanin ); - bCof0 = Cudd_Cofactor( dd, pNode->pData, Cudd_Not(bVar) ); Cudd_Ref( bCof0 ); - bCof1 = Cudd_Cofactor( dd, pNode->pData, bVar ); Cudd_Ref( bCof1 ); - Cudd_RecursiveDeref( dd, pNode->pData ); - pNode->pData = Cudd_bddIte( dd, bVar, bCof0, bCof1 ); Cudd_Ref( pNode->pData ); - Cudd_RecursiveDeref( dd, bCof0 ); - Cudd_RecursiveDeref( dd, bCof1 ); -} - - - -/**Function************************************************************* - - Synopsis [Removes all objects whose trav ID is not current.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NodeRemoveNonCurrentObjects( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pObj; - int Counter, i; - int fVerbose = 0; - - // report on the nodes to be deleted - if ( fVerbose ) - { - printf( "These nodes will be deleted: \n" ); - Abc_NtkForEachObj( pNtk, pObj, i ) - if ( !Abc_NodeIsTravIdCurrent( pObj ) ) - { - printf( " " ); - Abc_ObjPrint( stdout, pObj ); - } - } - - // delete the nodes - Counter = 0; - Abc_NtkForEachObj( pNtk, pObj, i ) - if ( !Abc_NodeIsTravIdCurrent( pObj ) ) - { - Abc_NtkDeleteObj( pObj ); - Counter++; - } - return Counter; -} - -/**Function************************************************************* - - Synopsis [Check if the fanin of this latch is a constant.] - - Description [Returns 0/1 if constant; -1 if not a constant.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkSetTravId_rec( Abc_Obj_t * pObj ) -{ - Abc_NodeSetTravIdCurrent(pObj); - if ( Abc_ObjFaninNum(pObj) == 0 ) - return; - assert( Abc_ObjFaninNum(pObj) == 1 ); - Abc_NtkSetTravId_rec( Abc_ObjFanin0(pObj) ); -} - -/**Function************************************************************* - - Synopsis [Check if the fanin of this latch is a constant.] - - Description [Returns 0/1 if constant; -1 if not a constant.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkCheckConstant_rec( Abc_Obj_t * pObj ) -{ - if ( Abc_ObjFaninNum(pObj) == 0 ) - { - if ( !Abc_ObjIsNode(pObj) ) - return -1; - if ( Abc_NodeIsConst0(pObj) ) - return 0; - if ( Abc_NodeIsConst1(pObj) ) - return 1; - assert( 0 ); - return -1; - } - if ( Abc_ObjIsLatch(pObj) || Abc_ObjFaninNum(pObj) > 1 ) - return -1; - if ( !Abc_ObjIsNode(pObj) || Abc_NodeIsBuf(pObj) ) - return Abc_NtkCheckConstant_rec( Abc_ObjFanin0(pObj) ); - if ( Abc_NodeIsInv(pObj) ) - { - int RetValue = Abc_NtkCheckConstant_rec( Abc_ObjFanin0(pObj) ); - if ( RetValue == 0 ) - return 1; - if ( RetValue == 1 ) - return 0; - return RetValue; - } - assert( 0 ); - return -1; -} - -/**Function************************************************************* - - Synopsis [Removes redundant latches.] - - Description [The redundant latches are of two types: - - Latches fed by a constant which matches the init value of the latch. - - Latches fed by a constant which does not match the init value of the latch - can be all replaced by one latch.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkLatchSweep( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pFanin, * pLatch, * pLatchPivot = NULL; - int Counter, RetValue, i; - Counter = 0; - // go through the latches - Abc_NtkForEachLatch( pNtk, pLatch, i ) - { - // check if the latch has constant input - RetValue = Abc_NtkCheckConstant_rec( Abc_ObjFanin0(pLatch) ); - if ( RetValue == -1 ) - continue; - // found a latch with constant fanin - if ( (RetValue == 1 && Abc_LatchIsInit0(pLatch)) || - (RetValue == 0 && Abc_LatchIsInit1(pLatch)) ) - { - // fanin constant differs from the latch init value - if ( pLatchPivot == NULL ) - { - pLatchPivot = pLatch; - continue; - } - if ( Abc_LatchInit(pLatch) != Abc_LatchInit(pLatchPivot) ) // add inverter - pFanin = Abc_NtkCreateNodeInv( pNtk, Abc_ObjFanout0(pLatchPivot) ); - else - pFanin = Abc_ObjFanout0(pLatchPivot); - } - else - pFanin = Abc_ObjFanin0(Abc_ObjFanin0(pLatch)); - // replace latch - Abc_ObjTransferFanout( Abc_ObjFanout0(pLatch), pFanin ); - // delete the extra nodes - Abc_NtkDeleteObj_rec( Abc_ObjFanout0(pLatch), 0 ); - Counter++; - } - return Counter; -} - -/**Function************************************************************* - - Synopsis [Replaces autonumnous logic by free inputs.] - - Description [Assumes that non-autonomous logic is marked with - the current ID.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkReplaceAutonomousLogic( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode, * pFanin; - Vec_Ptr_t * vNodes; - int i, k, Counter; - // collect the nodes that feed into the reachable logic - vNodes = Vec_PtrAlloc( 100 ); - Abc_NtkForEachObj( pNtk, pNode, i ) - { - // skip non-visited fanins - if ( !Abc_NodeIsTravIdCurrent(pNode) ) - continue; - // look for non-visited fanins - Abc_ObjForEachFanin( pNode, pFanin, k ) - { - // skip visited fanins - if ( Abc_NodeIsTravIdCurrent(pFanin) ) - continue; - // skip constants and latches fed by constants - if ( Abc_NtkCheckConstant_rec(pFanin) != -1 || - (Abc_ObjIsBo(pFanin) && Abc_NtkCheckConstant_rec(Abc_ObjFanin0(Abc_ObjFanin0(pFanin))) != -1) ) - { - Abc_NtkSetTravId_rec( pFanin ); - continue; - } - assert( !Abc_ObjIsLatch(pFanin) ); - Vec_PtrPush( vNodes, pFanin ); - } - } - Vec_PtrUniqify( vNodes, Abc_ObjPointerCompare ); - // replace these nodes by the PIs - Vec_PtrForEachEntry( vNodes, pNode, i ) - { - pFanin = Abc_NtkCreatePi(pNtk); - Abc_ObjAssignName( pFanin, Abc_ObjName(pFanin), NULL ); - Abc_NodeSetTravIdCurrent( pFanin ); - Abc_ObjTransferFanout( pNode, pFanin ); - } - Counter = Vec_PtrSize(vNodes); - Vec_PtrFree( vNodes ); - return Counter; -} - -/**Function************************************************************* - - Synopsis [Sequential cleanup.] - - Description [Performs three tasks: - - Removes logic that does not feed into POs. - - Removes latches driven by constant values equal to the initial state. - - Replaces the autonomous components by additional PI variables.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkCleanupSeq( Abc_Ntk_t * pNtk, int fLatchSweep, int fAutoSweep, int fVerbose ) -{ - Vec_Ptr_t * vNodes; - int Counter; - assert( Abc_NtkIsLogic(pNtk) ); - // mark the nodes reachable from the POs - vNodes = Abc_NtkDfsSeq( pNtk ); - Vec_PtrFree( vNodes ); - // remove the non-marked nodes - Counter = Abc_NodeRemoveNonCurrentObjects( pNtk ); - if ( fVerbose ) - printf( "Cleanup removed %4d dangling objects.\n", Counter ); - // check if some of the latches can be removed - if ( fLatchSweep ) - { - Counter = Abc_NtkLatchSweep( pNtk ); - if ( fVerbose ) - printf( "Cleanup removed %4d redundant latches.\n", Counter ); - } - // detect the autonomous components - if ( fAutoSweep ) - { - vNodes = Abc_NtkDfsSeqReverse( pNtk ); - Vec_PtrFree( vNodes ); - // replace them by PIs - Counter = Abc_NtkReplaceAutonomousLogic( pNtk ); - if ( fVerbose ) - printf( "Cleanup added %4d additional PIs.\n", Counter ); - // remove the non-marked nodes - Counter = Abc_NodeRemoveNonCurrentObjects( pNtk ); - if ( fVerbose ) - printf( "Cleanup removed %4d autonomous objects.\n", Counter ); - } - // check - if ( !Abc_NtkCheck( pNtk ) ) - printf( "Abc_NtkCleanupSeq: The network check has failed.\n" ); - return 1; -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcSymm.c b/src/base/abci/abcSymm.c deleted file mode 100644 index 0f76065c..00000000 --- a/src/base/abci/abcSymm.c +++ /dev/null @@ -1,229 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcSymm.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Computation of two-variable symmetries.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcSymm.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Abc_NtkSymmetriesUsingBdds( Abc_Ntk_t * pNtk, int fNaive, int fReorder, int fVerbose ); -static void Abc_NtkSymmetriesUsingSandS( Abc_Ntk_t * pNtk, int fVerbose ); -static void Ntk_NetworkSymmsBdd( DdManager * dd, Abc_Ntk_t * pNtk, int fNaive, int fVerbose ); -static void Ntk_NetworkSymmsPrint( Abc_Ntk_t * pNtk, Extra_SymmInfo_t * pSymms ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [The top level procedure to compute symmetries.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkSymmetries( Abc_Ntk_t * pNtk, int fUseBdds, int fNaive, int fReorder, int fVerbose ) -{ - if ( fUseBdds || fNaive ) - Abc_NtkSymmetriesUsingBdds( pNtk, fNaive, fReorder, fVerbose ); - else - Abc_NtkSymmetriesUsingSandS( pNtk, fVerbose ); -} - -/**Function************************************************************* - - Synopsis [Symmetry computation using simulation and SAT.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkSymmetriesUsingSandS( Abc_Ntk_t * pNtk, int fVerbose ) -{ - extern int Sim_ComputeTwoVarSymms( Abc_Ntk_t * pNtk, int fVerbose ); - int nSymms = Sim_ComputeTwoVarSymms( pNtk, fVerbose ); - printf( "The total number of symmetries is %d.\n", nSymms ); -} - -/**Function************************************************************* - - Synopsis [Symmetry computation using BDDs (both naive and smart).] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkSymmetriesUsingBdds( Abc_Ntk_t * pNtk, int fNaive, int fReorder, int fVerbose ) -{ - DdManager * dd; - int clk, clkBdd, clkSym; - int fGarbCollect = 1; - - // compute the global functions -clk = clock(); - dd = Abc_NtkBuildGlobalBdds( pNtk, 10000000, 1, fReorder, fVerbose ); - printf( "Shared BDD size = %d nodes.\n", Abc_NtkSizeOfGlobalBdds(pNtk) ); - Cudd_AutodynDisable( dd ); - if ( !fGarbCollect ) - Cudd_DisableGarbageCollection( dd ); - Cudd_zddVarsFromBddVars( dd, 2 ); -clkBdd = clock() - clk; - // create the collapsed network -clk = clock(); - Ntk_NetworkSymmsBdd( dd, pNtk, fNaive, fVerbose ); -clkSym = clock() - clk; - // undo the global functions - Abc_NtkFreeGlobalBdds( pNtk, 1 ); -printf( "Statistics of BDD-based symmetry detection:\n" ); -printf( "Algorithm = %s. Reordering = %s. Garbage collection = %s.\n", - fNaive? "naive" : "fast", fReorder? "yes" : "no", fGarbCollect? "yes" : "no" ); -PRT( "Constructing BDDs", clkBdd ); -PRT( "Computing symms ", clkSym ); -PRT( "TOTAL ", clkBdd + clkSym ); -} - -/**Function************************************************************* - - Synopsis [Symmetry computation using BDDs (both naive and smart).] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Ntk_NetworkSymmsBdd( DdManager * dd, Abc_Ntk_t * pNtk, int fNaive, int fVerbose ) -{ - Extra_SymmInfo_t * pSymms; - Abc_Obj_t * pNode; - DdNode * bFunc; - int nSymms = 0; - int nSupps = 0; - int i; - - // compute symmetry info for each PO - Abc_NtkForEachCo( pNtk, pNode, i ) - { -// bFunc = pNtk->vFuncsGlob->pArray[i]; - bFunc = Abc_ObjGlobalBdd( pNode ); - nSupps += Cudd_SupportSize( dd, bFunc ); - if ( Cudd_IsConstant(bFunc) ) - continue; - if ( fNaive ) - pSymms = Extra_SymmPairsComputeNaive( dd, bFunc ); - else - pSymms = Extra_SymmPairsCompute( dd, bFunc ); - nSymms += pSymms->nSymms; - if ( fVerbose ) - { - printf( "Output %6s (%d): ", Abc_ObjName(pNode), pSymms->nSymms ); - Ntk_NetworkSymmsPrint( pNtk, pSymms ); - } -//Extra_SymmPairsPrint( pSymms ); - Extra_SymmPairsDissolve( pSymms ); - } - printf( "Total number of vars in functional supports = %8d.\n", nSupps ); - printf( "Total number of two-variable symmetries = %8d.\n", nSymms ); -} - -/**Function************************************************************* - - Synopsis [Printing symmetry groups from the symmetry data structure.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Ntk_NetworkSymmsPrint( Abc_Ntk_t * pNtk, Extra_SymmInfo_t * pSymms ) -{ - char ** pInputNames; - int * pVarTaken; - int i, k, nVars, nSize, fStart; - - // get variable names - nVars = Abc_NtkCiNum(pNtk); - pInputNames = Abc_NtkCollectCioNames( pNtk, 0 ); - - // alloc the array of marks - pVarTaken = ALLOC( int, nVars ); - memset( pVarTaken, 0, sizeof(int) * nVars ); - - // print the groups - fStart = 1; - nSize = pSymms->nVars; - for ( i = 0; i < nSize; i++ ) - { - // skip the variable already considered - if ( pVarTaken[i] ) - continue; - // find all the vars symmetric with this one - for ( k = 0; k < nSize; k++ ) - { - if ( k == i ) - continue; - if ( pSymms->pSymms[i][k] == 0 ) - continue; - // vars i and k are symmetric - assert( pVarTaken[k] == 0 ); - // there is a new symmetry pair - if ( fStart == 1 ) - { // start a new symmetry class - fStart = 0; - printf( " { %s", pInputNames[ pSymms->pVars[i] ] ); - // mark the var as taken - pVarTaken[i] = 1; - } - printf( " %s", pInputNames[ pSymms->pVars[k] ] ); - // mark the var as taken - pVarTaken[k] = 1; - } - if ( fStart == 0 ) - { - printf( " }" ); - fStart = 1; - } - } - printf( "\n" ); - - free( pInputNames ); - free( pVarTaken ); -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcTiming.c b/src/base/abci/abcTiming.c deleted file mode 100644 index 967e4617..00000000 --- a/src/base/abci/abcTiming.c +++ /dev/null @@ -1,905 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcTiming.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Computation of timing info for mapped circuits.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcTiming.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "main.h" -#include "mio.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -struct Abc_ManTime_t_ -{ - Abc_Time_t tArrDef; - Abc_Time_t tReqDef; - Vec_Ptr_t * vArrs; - Vec_Ptr_t * vReqs; -}; - -// static functions -static Abc_ManTime_t * Abc_ManTimeStart(); -static void Abc_ManTimeExpand( Abc_ManTime_t * p, int nSize, int fProgressive ); -void Abc_NtkTimePrepare( Abc_Ntk_t * pNtk ); - -void Abc_NodeDelayTraceArrival( Abc_Obj_t * pNode ); - -// accessing the arrival and required times of a node -static inline Abc_Time_t * Abc_NodeArrival( Abc_Obj_t * pNode ) { return pNode->pNtk->pManTime->vArrs->pArray[pNode->Id]; } -static inline Abc_Time_t * Abc_NodeRequired( Abc_Obj_t * pNode ) { return pNode->pNtk->pManTime->vReqs->pArray[pNode->Id]; } - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Reads the arrival time of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Time_t * Abc_NodeReadArrival( Abc_Obj_t * pNode ) -{ - assert( pNode->pNtk->pManTime ); - return Abc_NodeArrival(pNode); -} - -/**Function************************************************************* - - Synopsis [Reads the arrival time of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Time_t * Abc_NodeReadRequired( Abc_Obj_t * pNode ) -{ - assert( pNode->pNtk->pManTime ); - return Abc_NodeRequired(pNode); -} - -/**Function************************************************************* - - Synopsis [Reads the arrival time of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Time_t * Abc_NtkReadDefaultArrival( Abc_Ntk_t * pNtk ) -{ - assert( pNtk->pManTime ); - return &pNtk->pManTime->tArrDef; -} - -/**Function************************************************************* - - Synopsis [Reads the arrival time of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Time_t * Abc_NtkReadDefaultRequired( Abc_Ntk_t * pNtk ) -{ - assert( pNtk->pManTime ); - return &pNtk->pManTime->tReqDef; -} - -/**Function************************************************************* - - Synopsis [Sets the default arrival time for the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkTimeSetDefaultArrival( Abc_Ntk_t * pNtk, float Rise, float Fall ) -{ - if ( Rise == 0.0 && Fall == 0.0 ) - return; - if ( pNtk->pManTime == NULL ) - pNtk->pManTime = Abc_ManTimeStart(); - pNtk->pManTime->tArrDef.Rise = Rise; - pNtk->pManTime->tArrDef.Fall = Fall; - pNtk->pManTime->tArrDef.Worst = ABC_MAX( Rise, Fall ); -} - -/**Function************************************************************* - - Synopsis [Sets the default arrival time for the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkTimeSetDefaultRequired( Abc_Ntk_t * pNtk, float Rise, float Fall ) -{ - if ( Rise == 0.0 && Fall == 0.0 ) - return; - if ( pNtk->pManTime == NULL ) - pNtk->pManTime = Abc_ManTimeStart(); - pNtk->pManTime->tReqDef.Rise = Rise; - pNtk->pManTime->tReqDef.Rise = Fall; - pNtk->pManTime->tReqDef.Worst = ABC_MAX( Rise, Fall ); -} - -/**Function************************************************************* - - Synopsis [Sets the arrival time for an object.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkTimeSetArrival( Abc_Ntk_t * pNtk, int ObjId, float Rise, float Fall ) -{ - Vec_Ptr_t * vTimes; - Abc_Time_t * pTime; - if ( pNtk->pManTime == NULL ) - pNtk->pManTime = Abc_ManTimeStart(); - if ( pNtk->pManTime->tArrDef.Rise == Rise && pNtk->pManTime->tArrDef.Fall == Fall ) - return; - Abc_ManTimeExpand( pNtk->pManTime, ObjId + 1, 1 ); - // set the arrival time - vTimes = pNtk->pManTime->vArrs; - pTime = vTimes->pArray[ObjId]; - pTime->Rise = Rise; - pTime->Fall = Rise; - pTime->Worst = ABC_MAX( Rise, Fall ); -} - -/**Function************************************************************* - - Synopsis [Sets the arrival time for an object.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkTimeSetRequired( Abc_Ntk_t * pNtk, int ObjId, float Rise, float Fall ) -{ - Vec_Ptr_t * vTimes; - Abc_Time_t * pTime; - if ( pNtk->pManTime == NULL ) - pNtk->pManTime = Abc_ManTimeStart(); - if ( pNtk->pManTime->tReqDef.Rise == Rise && pNtk->pManTime->tReqDef.Fall == Fall ) - return; - Abc_ManTimeExpand( pNtk->pManTime, ObjId + 1, 1 ); - // set the required time - vTimes = pNtk->pManTime->vReqs; - pTime = vTimes->pArray[ObjId]; - pTime->Rise = Rise; - pTime->Fall = Rise; - pTime->Worst = ABC_MAX( Rise, Fall ); -} - -/**Function************************************************************* - - Synopsis [Finalizes the timing manager after setting arr/req times.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkTimeInitialize( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pObj; - Abc_Time_t ** ppTimes, * pTime; - int i; - if ( pNtk->pManTime == NULL ) - return; - Abc_ManTimeExpand( pNtk->pManTime, Abc_NtkObjNumMax(pNtk), 0 ); - // set the default timing - ppTimes = (Abc_Time_t **)pNtk->pManTime->vArrs->pArray; - Abc_NtkForEachPi( pNtk, pObj, i ) - { - pTime = ppTimes[pObj->Id]; - if ( pTime->Worst != -ABC_INFINITY ) - continue; - *pTime = pNtk->pManTime->tArrDef; - } - // set the default timing - ppTimes = (Abc_Time_t **)pNtk->pManTime->vReqs->pArray; - Abc_NtkForEachPo( pNtk, pObj, i ) - { - pTime = ppTimes[pObj->Id]; - if ( pTime->Worst != -ABC_INFINITY ) - continue; - *pTime = pNtk->pManTime->tReqDef; - } - // set the 0 arrival times for latch outputs and constant nodes - ppTimes = (Abc_Time_t **)pNtk->pManTime->vArrs->pArray; - Abc_NtkForEachLatchOutput( pNtk, pObj, i ) - { - pTime = ppTimes[pObj->Id]; - pTime->Fall = pTime->Rise = pTime->Worst = 0.0; - } -} - -/**Function************************************************************* - - Synopsis [Prepares the timing manager for delay trace.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkTimePrepare( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pObj; - Abc_Time_t ** ppTimes, * pTime; - int i; - // if there is no timing manager, allocate and initialize - if ( pNtk->pManTime == NULL ) - { - pNtk->pManTime = Abc_ManTimeStart(); - Abc_NtkTimeInitialize( pNtk ); - return; - } - // if timing manager is given, expand it if necessary - Abc_ManTimeExpand( pNtk->pManTime, Abc_NtkObjNumMax(pNtk), 0 ); - // clean arrivals except for PIs - ppTimes = (Abc_Time_t **)pNtk->pManTime->vArrs->pArray; - Abc_NtkForEachNode( pNtk, pObj, i ) - { - pTime = ppTimes[pObj->Id]; - pTime->Fall = pTime->Rise = pTime->Worst = -ABC_INFINITY; - } - Abc_NtkForEachPo( pNtk, pObj, i ) - { - pTime = ppTimes[pObj->Id]; - pTime->Fall = pTime->Rise = pTime->Worst = -ABC_INFINITY; - } - // clean required except for POs -} - - - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_ManTime_t * Abc_ManTimeStart() -{ - Abc_ManTime_t * p; - p = ALLOC( Abc_ManTime_t, 1 ); - memset( p, 0, sizeof(Abc_ManTime_t) ); - p->vArrs = Vec_PtrAlloc( 0 ); - p->vReqs = Vec_PtrAlloc( 0 ); - return p; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManTimeStop( Abc_ManTime_t * p ) -{ - if ( p->vArrs->nSize > 0 ) - { - free( p->vArrs->pArray[0] ); - Vec_PtrFree( p->vArrs ); - } - if ( p->vReqs->nSize > 0 ) - { - free( p->vReqs->pArray[0] ); - Vec_PtrFree( p->vReqs ); - } - free( p ); -} - -/**Function************************************************************* - - Synopsis [Duplicates the timing manager with the PI/PO timing info.] - - Description [The PIs/POs of the new network should be allocated.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManTimeDup( Abc_Ntk_t * pNtkOld, Abc_Ntk_t * pNtkNew ) -{ - Abc_Obj_t * pObj; - Abc_Time_t ** ppTimesOld, ** ppTimesNew; - int i; - if ( pNtkOld->pManTime == NULL ) - return; - assert( Abc_NtkPiNum(pNtkOld) == Abc_NtkPiNum(pNtkNew) ); - assert( Abc_NtkPoNum(pNtkOld) == Abc_NtkPoNum(pNtkNew) ); - assert( Abc_NtkLatchNum(pNtkOld) == Abc_NtkLatchNum(pNtkNew) ); - // create the new timing manager - pNtkNew->pManTime = Abc_ManTimeStart(); - Abc_ManTimeExpand( pNtkNew->pManTime, Abc_NtkObjNumMax(pNtkNew), 0 ); - // set the default timing - pNtkNew->pManTime->tArrDef = pNtkOld->pManTime->tArrDef; - pNtkNew->pManTime->tReqDef = pNtkOld->pManTime->tReqDef; - // set the CI timing - ppTimesOld = (Abc_Time_t **)pNtkOld->pManTime->vArrs->pArray; - ppTimesNew = (Abc_Time_t **)pNtkNew->pManTime->vArrs->pArray; - Abc_NtkForEachCi( pNtkOld, pObj, i ) - *ppTimesNew[ Abc_NtkCi(pNtkNew,i)->Id ] = *ppTimesOld[ pObj->Id ]; - // set the CO timing - ppTimesOld = (Abc_Time_t **)pNtkOld->pManTime->vReqs->pArray; - ppTimesNew = (Abc_Time_t **)pNtkNew->pManTime->vReqs->pArray; - Abc_NtkForEachCo( pNtkOld, pObj, i ) - *ppTimesNew[ Abc_NtkCo(pNtkNew,i)->Id ] = *ppTimesOld[ pObj->Id ]; -} - -/**Function************************************************************* - - Synopsis [Expends the storage for timing information.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ManTimeExpand( Abc_ManTime_t * p, int nSize, int fProgressive ) -{ - Vec_Ptr_t * vTimes; - Abc_Time_t * ppTimes, * ppTimesOld, * pTime; - int nSizeOld, nSizeNew, i; - - nSizeOld = p->vArrs->nSize; - if ( nSizeOld >= nSize ) - return; - nSizeNew = fProgressive? 2 * nSize : nSize; - if ( nSizeNew < 100 ) - nSizeNew = 100; - - vTimes = p->vArrs; - Vec_PtrGrow( vTimes, nSizeNew ); - vTimes->nSize = nSizeNew; - ppTimesOld = ( nSizeOld == 0 )? NULL : vTimes->pArray[0]; - ppTimes = REALLOC( Abc_Time_t, ppTimesOld, nSizeNew ); - for ( i = 0; i < nSizeNew; i++ ) - vTimes->pArray[i] = ppTimes + i; - for ( i = nSizeOld; i < nSizeNew; i++ ) - { - pTime = vTimes->pArray[i]; - pTime->Rise = -ABC_INFINITY; - pTime->Fall = -ABC_INFINITY; - pTime->Worst = -ABC_INFINITY; - } - - vTimes = p->vReqs; - Vec_PtrGrow( vTimes, nSizeNew ); - vTimes->nSize = nSizeNew; - ppTimesOld = ( nSizeOld == 0 )? NULL : vTimes->pArray[0]; - ppTimes = REALLOC( Abc_Time_t, ppTimesOld, nSizeNew ); - for ( i = 0; i < nSizeNew; i++ ) - vTimes->pArray[i] = ppTimes + i; - for ( i = nSizeOld; i < nSizeNew; i++ ) - { - pTime = vTimes->pArray[i]; - pTime->Rise = -ABC_INFINITY; - pTime->Fall = -ABC_INFINITY; - pTime->Worst = -ABC_INFINITY; - } -} - - - - - - -/**Function************************************************************* - - Synopsis [Sets the CI node levels according to the arrival info.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkSetNodeLevelsArrival( Abc_Ntk_t * pNtkOld ) -{ - Abc_Obj_t * pNodeOld, * pNodeNew; - float tAndDelay; - int i; - if ( pNtkOld->pManTime == NULL ) - return; - if ( Mio_LibraryReadNand2(Abc_FrameReadLibGen()) == NULL ) - return; - tAndDelay = Mio_LibraryReadDelayNand2Max(Abc_FrameReadLibGen()); - Abc_NtkForEachPi( pNtkOld, pNodeOld, i ) - { - pNodeNew = pNodeOld->pCopy; - pNodeNew->Level = (int)(Abc_NodeArrival(pNodeOld)->Worst / tAndDelay); - } -} - -/**Function************************************************************* - - Synopsis [Sets the CI node levels according to the arrival info.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Time_t * Abc_NtkGetCiArrivalTimes( Abc_Ntk_t * pNtk ) -{ - Abc_Time_t * p; - Abc_Obj_t * pNode; - int i; - p = ALLOC( Abc_Time_t, Abc_NtkCiNum(pNtk) ); - memset( p, 0, sizeof(Abc_Time_t) * Abc_NtkCiNum(pNtk) ); - if ( pNtk->pManTime == NULL ) - return p; - // set the PI arrival times - Abc_NtkForEachPi( pNtk, pNode, i ) - p[i] = *Abc_NodeArrival(pNode); - return p; -} - - -/**Function************************************************************* - - Synopsis [Sets the CI node levels according to the arrival info.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -float * Abc_NtkGetCiArrivalFloats( Abc_Ntk_t * pNtk ) -{ - float * p; - Abc_Obj_t * pNode; - int i; - p = ALLOC( float, Abc_NtkCiNum(pNtk) ); - memset( p, 0, sizeof(float) * Abc_NtkCiNum(pNtk) ); - if ( pNtk->pManTime == NULL ) - return p; - // set the PI arrival times - Abc_NtkForEachPi( pNtk, pNode, i ) - p[i] = Abc_NodeArrival(pNode)->Worst; - return p; -} - - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -float Abc_NtkDelayTrace( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode, * pDriver; - Vec_Ptr_t * vNodes; - Abc_Time_t * pTime; - float tArrivalMax; - int i; - - assert( Abc_NtkIsMappedLogic(pNtk) ); - - Abc_NtkTimePrepare( pNtk ); - vNodes = Abc_NtkDfs( pNtk, 1 ); - for ( i = 0; i < vNodes->nSize; i++ ) - Abc_NodeDelayTraceArrival( vNodes->pArray[i] ); - Vec_PtrFree( vNodes ); - - // get the latest arrival times - tArrivalMax = -ABC_INFINITY; - Abc_NtkForEachCo( pNtk, pNode, i ) - { - pDriver = Abc_ObjFanin0(pNode); - pTime = Abc_NodeArrival(pDriver); - if ( tArrivalMax < pTime->Worst ) - tArrivalMax = pTime->Worst; - } - return tArrivalMax; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NodeDelayTraceArrival( Abc_Obj_t * pNode ) -{ - Abc_Obj_t * pFanin; - Abc_Time_t * pTimeIn, * pTimeOut; - float tDelayBlockRise, tDelayBlockFall; - Mio_PinPhase_t PinPhase; - Mio_Pin_t * pPin; - int i; - - // start the arrival time of the node - pTimeOut = Abc_NodeArrival(pNode); - pTimeOut->Rise = pTimeOut->Fall = -ABC_INFINITY; - // go through the pins of the gate - pPin = Mio_GateReadPins(pNode->pData); - Abc_ObjForEachFanin( pNode, pFanin, i ) - { - pTimeIn = Abc_NodeArrival(pFanin); - // get the interesting parameters of this pin - PinPhase = Mio_PinReadPhase(pPin); - tDelayBlockRise = (float)Mio_PinReadDelayBlockRise( pPin ); - tDelayBlockFall = (float)Mio_PinReadDelayBlockFall( pPin ); - // compute the arrival times of the positive phase - if ( PinPhase != MIO_PHASE_INV ) // NONINV phase is present - { - if ( pTimeOut->Rise < pTimeIn->Rise + tDelayBlockRise ) - pTimeOut->Rise = pTimeIn->Rise + tDelayBlockRise; - if ( pTimeOut->Fall < pTimeIn->Fall + tDelayBlockFall ) - pTimeOut->Fall = pTimeIn->Fall + tDelayBlockFall; - } - if ( PinPhase != MIO_PHASE_NONINV ) // INV phase is present - { - if ( pTimeOut->Rise < pTimeIn->Fall + tDelayBlockRise ) - pTimeOut->Rise = pTimeIn->Fall + tDelayBlockRise; - if ( pTimeOut->Fall < pTimeIn->Rise + tDelayBlockFall ) - pTimeOut->Fall = pTimeIn->Rise + tDelayBlockFall; - } - pPin = Mio_PinReadNext(pPin); - } - pTimeOut->Worst = ABC_MAX( pTimeOut->Rise, pTimeOut->Fall ); -} - - - - -/**Function************************************************************* - - Synopsis [Computes the level of the node using its fanin levels.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_ObjLevelNew( Abc_Obj_t * pObj ) -{ - Abc_Obj_t * pFanin; - int i, Level = 0; - Abc_ObjForEachFanin( pObj, pFanin, i ) - Level = ABC_MAX( Level, Abc_ObjLevel(pFanin) ); - return Level + 1; -} - -/**Function************************************************************* - - Synopsis [Computes the reverse level of the node using its fanout levels.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_ObjReverseLevelNew( Abc_Obj_t * pObj ) -{ - Abc_Obj_t * pFanout; - int i, LevelCur, Level = 0; - Abc_ObjForEachFanout( pObj, pFanout, i ) - { - LevelCur = Abc_ObjReverseLevel( pFanout ); - Level = ABC_MAX( Level, LevelCur ); - } - return Level + 1; -} - -/**Function************************************************************* - - Synopsis [Returns required level of the node.] - - Description [Converts the reverse levels of the node into its required - level as follows: ReqLevel(Node) = MaxLevels(Ntk) + 1 - LevelR(Node).] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_ObjRequiredLevel( Abc_Obj_t * pObj ) -{ - Abc_Ntk_t * pNtk = pObj->pNtk; - assert( pNtk->vLevelsR ); - return pNtk->LevelMax + 1 - Abc_ObjReverseLevel(pObj); -} - -/**Function************************************************************* - - Synopsis [Returns the reverse level of the node.] - - Description [The reverse level is the level of the node in reverse - topological order, starting from the COs.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_ObjReverseLevel( Abc_Obj_t * pObj ) -{ - Abc_Ntk_t * pNtk = pObj->pNtk; - assert( pNtk->vLevelsR ); - Vec_IntFillExtra( pNtk->vLevelsR, pObj->Id + 1, 0 ); - return Vec_IntEntry(pNtk->vLevelsR, pObj->Id); -} - -/**Function************************************************************* - - Synopsis [Sets the reverse level of the node.] - - Description [The reverse level is the level of the node in reverse - topological order, starting from the COs.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_ObjSetReverseLevel( Abc_Obj_t * pObj, int LevelR ) -{ - Abc_Ntk_t * pNtk = pObj->pNtk; - assert( pNtk->vLevelsR ); - Vec_IntFillExtra( pNtk->vLevelsR, pObj->Id + 1, 0 ); - Vec_IntWriteEntry( pNtk->vLevelsR, pObj->Id, LevelR ); -} - -/**Function************************************************************* - - Synopsis [Prepares for the computation of required levels.] - - Description [This procedure should be called before the required times - are used. It starts internal data structures, which records the level - from the COs of the network nodes in reverse topologogical order.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkStartReverseLevels( Abc_Ntk_t * pNtk, int nMaxLevelIncrease ) -{ - Vec_Ptr_t * vNodes; - Abc_Obj_t * pObj; - int i; - // remember the maximum number of direct levels - pNtk->LevelMax = Abc_NtkLevel(pNtk) + nMaxLevelIncrease; - // start the reverse levels - pNtk->vLevelsR = Vec_IntAlloc( 0 ); - Vec_IntFill( pNtk->vLevelsR, 1 + Abc_NtkObjNumMax(pNtk), 0 ); - // compute levels in reverse topological order - vNodes = Abc_NtkDfsReverse( pNtk ); - Vec_PtrForEachEntry( vNodes, pObj, i ) - Abc_ObjSetReverseLevel( pObj, Abc_ObjReverseLevelNew(pObj) ); - Vec_PtrFree( vNodes ); -} - -/**Function************************************************************* - - Synopsis [Cleans the data structures used to compute required levels.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkStopReverseLevels( Abc_Ntk_t * pNtk ) -{ - assert( pNtk->vLevelsR ); - Vec_IntFree( pNtk->vLevelsR ); - pNtk->vLevelsR = NULL; - pNtk->LevelMax = 0; - -} - -/**Function************************************************************* - - Synopsis [Incrementally updates level of the nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkUpdateLevel( Abc_Obj_t * pObjNew, Vec_Vec_t * vLevels ) -{ - Abc_Obj_t * pFanout, * pTemp; - int LevelOld, Lev, k, m; - // check if level has changed - LevelOld = Abc_ObjLevel(pObjNew); - if ( LevelOld == Abc_ObjLevelNew(pObjNew) ) - return; - // start the data structure for level update - // we cannot fail to visit a node when using this structure because the - // nodes are stored by their _old_ levels, which are assumed to be correct - Vec_VecClear( vLevels ); - Vec_VecPush( vLevels, LevelOld, pObjNew ); - pObjNew->fMarkA = 1; - // recursively update level - Vec_VecForEachEntryStart( vLevels, pTemp, Lev, k, LevelOld ) - { - pTemp->fMarkA = 0; - assert( Abc_ObjLevel(pTemp) == Lev ); - Abc_ObjSetLevel( pTemp, Abc_ObjLevelNew(pTemp) ); - // if the level did not change, no need to check the fanout levels - if ( Abc_ObjLevel(pTemp) == Lev ) - continue; - // schedule fanout for level update - Abc_ObjForEachFanout( pTemp, pFanout, m ) - { - if ( !Abc_ObjIsCo(pFanout) && !pFanout->fMarkA ) - { - assert( Abc_ObjLevel(pFanout) >= Lev ); - Vec_VecPush( vLevels, Abc_ObjLevel(pFanout), pFanout ); - pFanout->fMarkA = 1; - } - } - } -} - -/**Function************************************************************* - - Synopsis [Incrementally updates level of the nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkUpdateReverseLevel( Abc_Obj_t * pObjNew, Vec_Vec_t * vLevels ) -{ - Abc_Obj_t * pFanin, * pTemp; - int LevelOld, LevFanin, Lev, k, m; - // check if level has changed - LevelOld = Abc_ObjReverseLevel(pObjNew); - if ( LevelOld == Abc_ObjReverseLevelNew(pObjNew) ) - return; - // start the data structure for level update - // we cannot fail to visit a node when using this structure because the - // nodes are stored by their _old_ levels, which are assumed to be correct - Vec_VecClear( vLevels ); - Vec_VecPush( vLevels, LevelOld, pObjNew ); - pObjNew->fMarkA = 1; - // recursively update level - Vec_VecForEachEntryStart( vLevels, pTemp, Lev, k, LevelOld ) - { - pTemp->fMarkA = 0; - LevelOld = Abc_ObjReverseLevel(pTemp); - assert( LevelOld == Lev ); - Abc_ObjSetReverseLevel( pTemp, Abc_ObjReverseLevelNew(pTemp) ); - // if the level did not change, no need to check the fanout levels - if ( Abc_ObjReverseLevel(pTemp) == Lev ) - continue; - // schedule fanins for level update - Abc_ObjForEachFanin( pTemp, pFanin, m ) - { - if ( !Abc_ObjIsCi(pFanin) && !pFanin->fMarkA ) - { - LevFanin = Abc_ObjReverseLevel( pFanin ); - assert( LevFanin >= Lev ); - Vec_VecPush( vLevels, LevFanin, pFanin ); - pFanin->fMarkA = 1; - } - } - } -} - -/**Function************************************************************* - - Synopsis [Replaces the node and incrementally updates levels.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkUpdate( Abc_Obj_t * pObj, Abc_Obj_t * pObjNew, Vec_Vec_t * vLevels ) -{ - // replace the old node by the new node - pObjNew->Level = pObj->Level; - Abc_ObjReplace( pObj, pObjNew ); - // update the level of the node - Abc_NtkUpdateLevel( pObjNew, vLevels ); - Abc_ObjSetReverseLevel( pObjNew, 0 ); - Abc_NtkUpdateReverseLevel( pObjNew, vLevels ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcUnate.c b/src/base/abci/abcUnate.c deleted file mode 100644 index 20804d19..00000000 --- a/src/base/abci/abcUnate.c +++ /dev/null @@ -1,155 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcUnate.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcUnate.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Abc_NtkPrintUnateBdd( Abc_Ntk_t * pNtk, int fUseNaive, int fVerbose ); -static void Abc_NtkPrintUnateSat( Abc_Ntk_t * pNtk, int fVerbose ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Detects unate variables of the multi-output function.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintUnate( Abc_Ntk_t * pNtk, int fUseBdds, int fUseNaive, int fVerbose ) -{ - if ( fUseBdds || fUseNaive ) - Abc_NtkPrintUnateBdd( pNtk, fUseNaive, fVerbose ); - else - Abc_NtkPrintUnateSat( pNtk, fVerbose ); -} - -/**Function************************************************************* - - Synopsis [Detects unate variables using BDDs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintUnateBdd( Abc_Ntk_t * pNtk, int fUseNaive, int fVerbose ) -{ - Abc_Obj_t * pNode; - Extra_UnateInfo_t * p; - DdManager * dd; // the BDD manager used to hold shared BDDs -// DdNode ** pbGlobal; // temporary storage for global BDDs - int TotalSupps = 0; - int TotalUnate = 0; - int i, clk = clock(); - int clkBdd, clkUnate; - - // compute the global BDDs - dd = Abc_NtkBuildGlobalBdds(pNtk, 10000000, 1, 1, fVerbose); - if ( dd == NULL ) - return; -clkBdd = clock() - clk; - - // get information about the network -// dd = pNtk->pManGlob; -// dd = Abc_NtkGlobalBddMan( pNtk ); -// pbGlobal = (DdNode **)Vec_PtrArray( pNtk->vFuncsGlob ); - - // print the size of the BDDs - printf( "Shared BDD size = %6d nodes.\n", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) ); - - // perform naive BDD-based computation - if ( fUseNaive ) - { - Abc_NtkForEachCo( pNtk, pNode, i ) - { -// p = Extra_UnateComputeSlow( dd, pbGlobal[i] ); - p = Extra_UnateComputeSlow( dd, Abc_ObjGlobalBdd(pNode) ); - if ( fVerbose ) - Extra_UnateInfoPrint( p ); - TotalSupps += p->nVars; - TotalUnate += p->nUnate; - Extra_UnateInfoDissolve( p ); - } - } - // perform smart BDD-based computation - else - { - // create ZDD variables in the manager - Cudd_zddVarsFromBddVars( dd, 2 ); - Abc_NtkForEachCo( pNtk, pNode, i ) - { -// p = Extra_UnateComputeFast( dd, pbGlobal[i] ); - p = Extra_UnateComputeFast( dd, Abc_ObjGlobalBdd(pNode) ); - if ( fVerbose ) - Extra_UnateInfoPrint( p ); - TotalSupps += p->nVars; - TotalUnate += p->nUnate; - Extra_UnateInfoDissolve( p ); - } - } -clkUnate = clock() - clk - clkBdd; - - // print stats - printf( "Ins/Outs = %4d/%4d. Total supp = %5d. Total unate = %5d.\n", - Abc_NtkCiNum(pNtk), Abc_NtkCoNum(pNtk), TotalSupps, TotalUnate ); - PRT( "Glob BDDs", clkBdd ); - PRT( "Unateness", clkUnate ); - PRT( "Total ", clock() - clk ); - - // deref the PO functions -// Abc_NtkFreeGlobalBdds( pNtk ); - // stop the global BDD manager -// Extra_StopManager( pNtk->pManGlob ); -// pNtk->pManGlob = NULL; - Abc_NtkFreeGlobalBdds( pNtk, 1 ); -} - -/**Function************************************************************* - - Synopsis [Detects unate variables using SAT.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkPrintUnateSat( Abc_Ntk_t * pNtk, int fVerbose ) -{ -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcUnreach.c b/src/base/abci/abcUnreach.c deleted file mode 100644 index ea0a4cd2..00000000 --- a/src/base/abci/abcUnreach.c +++ /dev/null @@ -1,349 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcUnreach.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Computes unreachable states for small benchmarks.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcUnreach.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static DdNode * Abc_NtkTransitionRelation( DdManager * dd, Abc_Ntk_t * pNtk, int fVerbose ); -static DdNode * Abc_NtkInitStateAndVarMap( DdManager * dd, Abc_Ntk_t * pNtk, int fVerbose ); -static DdNode * Abc_NtkComputeUnreachable( DdManager * dd, Abc_Ntk_t * pNtk, DdNode * bRelation, DdNode * bInitial, bool fVerbose ); -static Abc_Ntk_t * Abc_NtkConstructExdc ( DdManager * dd, Abc_Ntk_t * pNtk, DdNode * bUnreach ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Extracts sequential DCs of the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkExtractSequentialDcs( Abc_Ntk_t * pNtk, bool fVerbose ) -{ - int fReorder = 1; - DdManager * dd; - DdNode * bRelation, * bInitial, * bUnreach; - - // remove EXDC network if present - if ( pNtk->pExdc ) - { - Abc_NtkDelete( pNtk->pExdc ); - pNtk->pExdc = NULL; - } - - // compute the global BDDs of the latches - dd = Abc_NtkBuildGlobalBdds( pNtk, 10000000, 1, 1, fVerbose ); - if ( dd == NULL ) - return 0; - if ( fVerbose ) - printf( "Shared BDD size = %6d nodes.\n", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) ); - - // create the transition relation (dereferenced global BDDs) - bRelation = Abc_NtkTransitionRelation( dd, pNtk, fVerbose ); Cudd_Ref( bRelation ); - // create the initial state and the variable map - bInitial = Abc_NtkInitStateAndVarMap( dd, pNtk, fVerbose ); Cudd_Ref( bInitial ); - // compute the unreachable states - bUnreach = Abc_NtkComputeUnreachable( dd, pNtk, bRelation, bInitial, fVerbose ); Cudd_Ref( bUnreach ); - Cudd_RecursiveDeref( dd, bRelation ); - Cudd_RecursiveDeref( dd, bInitial ); - - // reorder and disable reordering - if ( fReorder ) - { - if ( fVerbose ) - fprintf( stdout, "BDD nodes in the unreachable states before reordering %d.\n", Cudd_DagSize(bUnreach) ); - Cudd_ReduceHeap( dd, CUDD_REORDER_SYMM_SIFT, 1 ); - Cudd_AutodynDisable( dd ); - if ( fVerbose ) - fprintf( stdout, "BDD nodes in the unreachable states after reordering %d.\n", Cudd_DagSize(bUnreach) ); - } - - // allocate ZDD variables - Cudd_zddVarsFromBddVars( dd, 2 ); - // create the EXDC network representing the unreachable states - if ( pNtk->pExdc ) - Abc_NtkDelete( pNtk->pExdc ); - pNtk->pExdc = Abc_NtkConstructExdc( dd, pNtk, bUnreach ); - Cudd_RecursiveDeref( dd, bUnreach ); - Extra_StopManager( dd ); -// pNtk->pManGlob = NULL; - - // make sure that everything is okay - if ( pNtk->pExdc && !Abc_NtkCheck( pNtk->pExdc ) ) - { - printf( "Abc_NtkExtractSequentialDcs: The network check has failed.\n" ); - Abc_NtkDelete( pNtk->pExdc ); - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Computes the transition relation of the network.] - - Description [Assumes that the global BDDs are computed.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -DdNode * Abc_NtkTransitionRelation( DdManager * dd, Abc_Ntk_t * pNtk, int fVerbose ) -{ - DdNode * bRel, * bTemp, * bProd, * bVar, * bInputs; - Abc_Obj_t * pNode; - int fReorder = 1; - int i; - - // extand the BDD manager to represent NS variables - assert( dd->size == Abc_NtkCiNum(pNtk) ); - Cudd_bddIthVar( dd, Abc_NtkCiNum(pNtk) + Abc_NtkLatchNum(pNtk) - 1 ); - - // enable reordering - if ( fReorder ) - Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT ); - else - Cudd_AutodynDisable( dd ); - - // compute the transition relation - bRel = b1; Cudd_Ref( bRel ); - Abc_NtkForEachLatch( pNtk, pNode, i ) - { - bVar = Cudd_bddIthVar( dd, Abc_NtkCiNum(pNtk) + i ); -// bProd = Cudd_bddXnor( dd, bVar, pNtk->vFuncsGlob->pArray[i] ); Cudd_Ref( bProd ); - bProd = Cudd_bddXnor( dd, bVar, Abc_ObjGlobalBdd(Abc_ObjFanin0(pNode)) ); Cudd_Ref( bProd ); - bRel = Cudd_bddAnd( dd, bTemp = bRel, bProd ); Cudd_Ref( bRel ); - Cudd_RecursiveDeref( dd, bTemp ); - Cudd_RecursiveDeref( dd, bProd ); - } - // free the global BDDs -// Abc_NtkFreeGlobalBdds( pNtk ); - Abc_NtkFreeGlobalBdds( pNtk, 0 ); - - // quantify the PI variables - bInputs = Extra_bddComputeRangeCube( dd, 0, Abc_NtkPiNum(pNtk) ); Cudd_Ref( bInputs ); - bRel = Cudd_bddExistAbstract( dd, bTemp = bRel, bInputs ); Cudd_Ref( bRel ); - Cudd_RecursiveDeref( dd, bTemp ); - Cudd_RecursiveDeref( dd, bInputs ); - - // reorder and disable reordering - if ( fReorder ) - { - if ( fVerbose ) - fprintf( stdout, "BDD nodes in the transition relation before reordering %d.\n", Cudd_DagSize(bRel) ); - Cudd_ReduceHeap( dd, CUDD_REORDER_SYMM_SIFT, 100 ); - Cudd_AutodynDisable( dd ); - if ( fVerbose ) - fprintf( stdout, "BDD nodes in the transition relation after reordering %d.\n", Cudd_DagSize(bRel) ); - } - Cudd_Deref( bRel ); - return bRel; -} - -/**Function************************************************************* - - Synopsis [Computes the initial state and sets up the variable map.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -DdNode * Abc_NtkInitStateAndVarMap( DdManager * dd, Abc_Ntk_t * pNtk, int fVerbose ) -{ - DdNode ** pbVarsX, ** pbVarsY; - DdNode * bTemp, * bProd, * bVar; - Abc_Obj_t * pLatch; - int i; - - // set the variable mapping for Cudd_bddVarMap() - pbVarsX = ALLOC( DdNode *, dd->size ); - pbVarsY = ALLOC( DdNode *, dd->size ); - bProd = b1; Cudd_Ref( bProd ); - Abc_NtkForEachLatch( pNtk, pLatch, i ) - { - pbVarsX[i] = dd->vars[ Abc_NtkPiNum(pNtk) + i ]; - pbVarsY[i] = dd->vars[ Abc_NtkCiNum(pNtk) + i ]; - // get the initial value of the latch - bVar = Cudd_NotCond( pbVarsX[i], !Abc_LatchIsInit1(pLatch) ); - bProd = Cudd_bddAnd( dd, bTemp = bProd, bVar ); Cudd_Ref( bProd ); - Cudd_RecursiveDeref( dd, bTemp ); - } - Cudd_SetVarMap( dd, pbVarsX, pbVarsY, Abc_NtkLatchNum(pNtk) ); - FREE( pbVarsX ); - FREE( pbVarsY ); - - Cudd_Deref( bProd ); - return bProd; -} - -/**Function************************************************************* - - Synopsis [Computes the set of unreachable states.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -DdNode * Abc_NtkComputeUnreachable( DdManager * dd, Abc_Ntk_t * pNtk, DdNode * bTrans, DdNode * bInitial, bool fVerbose ) -{ - DdNode * bRelation, * bReached, * bCubeCs; - DdNode * bCurrent, * bNext, * bTemp; - int nIters, nMints; - - // perform reachability analisys - bCurrent = bInitial; Cudd_Ref( bCurrent ); - bReached = bInitial; Cudd_Ref( bReached ); - bRelation = bTrans; Cudd_Ref( bRelation ); - bCubeCs = Extra_bddComputeRangeCube( dd, Abc_NtkPiNum(pNtk), Abc_NtkCiNum(pNtk) ); Cudd_Ref( bCubeCs ); - for ( nIters = 1; ; nIters++ ) - { - // compute the next states - bNext = Cudd_bddAndAbstract( dd, bRelation, bCurrent, bCubeCs ); Cudd_Ref( bNext ); - Cudd_RecursiveDeref( dd, bCurrent ); - // remap these states into the current state vars - bNext = Cudd_bddVarMap( dd, bTemp = bNext ); Cudd_Ref( bNext ); - Cudd_RecursiveDeref( dd, bTemp ); - // check if there are any new states - if ( Cudd_bddLeq( dd, bNext, bReached ) ) - break; - // get the new states - bCurrent = Cudd_bddAnd( dd, bNext, Cudd_Not(bReached) ); Cudd_Ref( bCurrent ); - // minimize the new states with the reached states -// bCurrent = Cudd_bddConstrain( dd, bTemp = bCurrent, Cudd_Not(bReached) ); Cudd_Ref( bCurrent ); -// Cudd_RecursiveDeref( dd, bTemp ); - // add to the reached states - bReached = Cudd_bddOr( dd, bTemp = bReached, bNext ); Cudd_Ref( bReached ); - Cudd_RecursiveDeref( dd, bTemp ); - Cudd_RecursiveDeref( dd, bNext ); - // minimize the transition relation -// bRelation = Cudd_bddConstrain( dd, bTemp = bRelation, Cudd_Not(bReached) ); Cudd_Ref( bRelation ); -// Cudd_RecursiveDeref( dd, bTemp ); - } - Cudd_RecursiveDeref( dd, bRelation ); - Cudd_RecursiveDeref( dd, bCubeCs ); - Cudd_RecursiveDeref( dd, bNext ); - // report the stats - if ( fVerbose ) - { - nMints = (int)Cudd_CountMinterm(dd, bReached, Abc_NtkLatchNum(pNtk) ); - fprintf( stdout, "Reachability analysis completed in %d iterations.\n", nIters ); - fprintf( stdout, "The number of minterms in the reachable state set = %d. (%6.2f %%)\n", nMints, 100.0*nMints/(1<<Abc_NtkLatchNum(pNtk)) ); - } -//PRB( dd, bReached ); - Cudd_Deref( bReached ); - return Cudd_Not( bReached ); -} - -/**Function************************************************************* - - Synopsis [Creates the EXDC network.] - - Description [The set of unreachable states depends on CS variables.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Abc_Ntk_t * Abc_NtkConstructExdc( DdManager * dd, Abc_Ntk_t * pNtk, DdNode * bUnreach ) -{ - Abc_Ntk_t * pNtkNew; - Abc_Obj_t * pNode, * pNodeNew; - int * pPermute; - int i; - - // start the new network - pNtkNew = Abc_NtkAlloc( ABC_NTK_LOGIC, ABC_FUNC_BDD, 1 ); - pNtkNew->pName = Extra_UtilStrsav( "exdc" ); - pNtkNew->pSpec = NULL; - - // create PIs corresponding to LOs - Abc_NtkForEachLatchOutput( pNtk, pNode, i ) - Abc_ObjAssignName( pNode->pCopy = Abc_NtkCreatePi(pNtkNew), Abc_ObjName(pNode), NULL ); - // cannot ADD POs here because pLatch->pCopy point to the PIs - - // create a new node - pNodeNew = Abc_NtkCreateNode(pNtkNew); - // add the fanins corresponding to latch outputs - Abc_NtkForEachLatchOutput( pNtk, pNode, i ) - Abc_ObjAddFanin( pNodeNew, pNode->pCopy ); - - // create the logic function - pPermute = ALLOC( int, dd->size ); - for ( i = 0; i < dd->size; i++ ) - pPermute[i] = -1; - Abc_NtkForEachLatch( pNtk, pNode, i ) - pPermute[Abc_NtkPiNum(pNtk) + i] = i; - // remap the functions - pNodeNew->pData = Extra_TransferPermute( dd, pNtkNew->pManFunc, bUnreach, pPermute ); Cudd_Ref( pNodeNew->pData ); - free( pPermute ); - Abc_NodeMinimumBase( pNodeNew ); - - // for each CO, create PO (skip POs equal to CIs because of name conflict) - Abc_NtkForEachPo( pNtk, pNode, i ) - if ( !Abc_ObjIsCi(Abc_ObjFanin0(pNode)) ) - Abc_ObjAssignName( pNode->pCopy = Abc_NtkCreatePo(pNtkNew), Abc_ObjName(pNode), NULL ); - Abc_NtkForEachLatchInput( pNtk, pNode, i ) - Abc_ObjAssignName( pNode->pCopy = Abc_NtkCreatePo(pNtkNew), Abc_ObjName(pNode), NULL ); - - // link to the POs of the network - Abc_NtkForEachPo( pNtk, pNode, i ) - if ( !Abc_ObjIsCi(Abc_ObjFanin0(pNode)) ) - Abc_ObjAddFanin( pNode->pCopy, pNodeNew ); - Abc_NtkForEachLatchInput( pNtk, pNode, i ) - Abc_ObjAddFanin( pNode->pCopy, pNodeNew ); - - // remove the extra nodes - Abc_AigCleanup( pNtkNew->pManFunc ); - - // fix the problem with complemented and duplicated CO edges - Abc_NtkLogicMakeSimpleCos( pNtkNew, 0 ); - - // transform the network to the SOP representation - if ( !Abc_NtkBddToSop( pNtkNew, 0 ) ) - { - printf( "Abc_NtkConstructExdc(): Converting to SOPs has failed.\n" ); - return NULL; - } - return pNtkNew; -// return NULL; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcVerify.c b/src/base/abci/abcVerify.c deleted file mode 100644 index 9c9bbcfd..00000000 --- a/src/base/abci/abcVerify.c +++ /dev/null @@ -1,1018 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcVerify.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Combinational and sequential verification for two networks.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcVerify.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "fraig.h" -#include "sim.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Abc_NtkVerifyReportError( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int * pModel ); -extern void Abc_NtkVerifyReportErrorSeq( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int * pModel, int nFrames ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Verifies combinational equivalence by brute-force SAT.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkCecSat( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nConfLimit, int nInsLimit ) -{ - extern Abc_Ntk_t * Abc_NtkMulti( Abc_Ntk_t * pNtk, int nThresh, int nFaninMax, int fCnf, int fMulti, int fSimple, int fFactor ); - Abc_Ntk_t * pMiter; - Abc_Ntk_t * pCnf; - int RetValue; - - // get the miter of the two networks - pMiter = Abc_NtkMiter( pNtk1, pNtk2, 1, 0 ); - if ( pMiter == NULL ) - { - printf( "Miter computation has failed.\n" ); - return; - } - RetValue = Abc_NtkMiterIsConstant( pMiter ); - if ( RetValue == 0 ) - { - printf( "Networks are NOT EQUIVALENT after structural hashing.\n" ); - // report the error - pMiter->pModel = Abc_NtkVerifyGetCleanModel( pMiter, 1 ); - Abc_NtkVerifyReportError( pNtk1, pNtk2, pMiter->pModel ); - FREE( pMiter->pModel ); - Abc_NtkDelete( pMiter ); - return; - } - if ( RetValue == 1 ) - { - Abc_NtkDelete( pMiter ); - printf( "Networks are equivalent after structural hashing.\n" ); - return; - } - - // convert the miter into a CNF - pCnf = Abc_NtkMulti( pMiter, 0, 100, 1, 0, 0, 0 ); - Abc_NtkDelete( pMiter ); - if ( pCnf == NULL ) - { - printf( "Renoding for CNF has failed.\n" ); - return; - } - - // solve the CNF using the SAT solver - RetValue = Abc_NtkMiterSat( pCnf, (sint64)nConfLimit, (sint64)nInsLimit, 0, NULL, NULL ); - if ( RetValue == -1 ) - printf( "Networks are undecided (SAT solver timed out).\n" ); - else if ( RetValue == 0 ) - printf( "Networks are NOT EQUIVALENT after SAT.\n" ); - else - printf( "Networks are equivalent after SAT.\n" ); - if ( pCnf->pModel ) - Abc_NtkVerifyReportError( pNtk1, pNtk2, pCnf->pModel ); - FREE( pCnf->pModel ); - Abc_NtkDelete( pCnf ); -} - - -/**Function************************************************************* - - Synopsis [Verifies sequential equivalence by fraiging followed by SAT.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkCecFraig( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, int fVerbose ) -{ - Prove_Params_t Params, * pParams = &Params; -// Fraig_Params_t Params; -// Fraig_Man_t * pMan; - Abc_Ntk_t * pMiter; - int RetValue; - - // get the miter of the two networks - pMiter = Abc_NtkMiter( pNtk1, pNtk2, 1, 0 ); - if ( pMiter == NULL ) - { - printf( "Miter computation has failed.\n" ); - return; - } - RetValue = Abc_NtkMiterIsConstant( pMiter ); - if ( RetValue == 0 ) - { - printf( "Networks are NOT EQUIVALENT after structural hashing.\n" ); - // report the error - pMiter->pModel = Abc_NtkVerifyGetCleanModel( pMiter, 1 ); - Abc_NtkVerifyReportError( pNtk1, pNtk2, pMiter->pModel ); - FREE( pMiter->pModel ); - Abc_NtkDelete( pMiter ); - return; - } - if ( RetValue == 1 ) - { - printf( "Networks are equivalent after structural hashing.\n" ); - Abc_NtkDelete( pMiter ); - return; - } -/* - // convert the miter into a FRAIG - Fraig_ParamsSetDefault( &Params ); - Params.fVerbose = fVerbose; - Params.nSeconds = nSeconds; -// Params.fFuncRed = 0; -// Params.nPatsRand = 0; -// Params.nPatsDyna = 0; - pMan = Abc_NtkToFraig( pMiter, &Params, 0, 0 ); - Fraig_ManProveMiter( pMan ); - - // analyze the result - RetValue = Fraig_ManCheckMiter( pMan ); - // report the result - if ( RetValue == -1 ) - printf( "Networks are undecided (SAT solver timed out on the final miter).\n" ); - else if ( RetValue == 1 ) - printf( "Networks are equivalent after fraiging.\n" ); - else if ( RetValue == 0 ) - { - printf( "Networks are NOT EQUIVALENT after fraiging.\n" ); - Abc_NtkVerifyReportError( pNtk1, pNtk2, Fraig_ManReadModel(pMan) ); - } - else assert( 0 ); - // delete the fraig manager - Fraig_ManFree( pMan ); - // delete the miter - Abc_NtkDelete( pMiter ); -*/ - // solve the CNF using the SAT solver - Prove_ParamsSetDefault( pParams ); - pParams->nItersMax = 5; -// RetValue = Abc_NtkMiterProve( &pMiter, pParams ); -// pParams->fVerbose = 1; - RetValue = Abc_NtkIvyProve( &pMiter, pParams ); - if ( RetValue == -1 ) - printf( "Networks are undecided (resource limits is reached).\n" ); - else if ( RetValue == 0 ) - { - int * pSimInfo = Abc_NtkVerifySimulatePattern( pMiter, pMiter->pModel ); - if ( pSimInfo[0] != 1 ) - printf( "ERROR in Abc_NtkMiterProve(): Generated counter-example is invalid.\n" ); - else - printf( "Networks are NOT EQUIVALENT.\n" ); - free( pSimInfo ); - } - else - printf( "Networks are equivalent.\n" ); - if ( pMiter->pModel ) - Abc_NtkVerifyReportError( pNtk1, pNtk2, pMiter->pModel ); - Abc_NtkDelete( pMiter ); -} - -/**Function************************************************************* - - Synopsis [Verifies sequential equivalence by fraiging followed by SAT.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkCecFraigPart( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, int nPartSize, int fVerbose ) -{ - extern int Cmd_CommandExecute( void * pAbc, char * sCommand ); - extern void * Abc_FrameGetGlobalFrame(); - - Prove_Params_t Params, * pParams = &Params; - Abc_Ntk_t * pMiter, * pMiterPart; - Abc_Obj_t * pObj; - int i, RetValue, Status, nOutputs; - - // solve the CNF using the SAT solver - Prove_ParamsSetDefault( pParams ); - pParams->nItersMax = 5; - // pParams->fVerbose = 1; - - assert( nPartSize > 0 ); - - // get the miter of the two networks - pMiter = Abc_NtkMiter( pNtk1, pNtk2, 1, nPartSize ); - if ( pMiter == NULL ) - { - printf( "Miter computation has failed.\n" ); - return; - } - RetValue = Abc_NtkMiterIsConstant( pMiter ); - if ( RetValue == 0 ) - { - printf( "Networks are NOT EQUIVALENT after structural hashing.\n" ); - // report the error - pMiter->pModel = Abc_NtkVerifyGetCleanModel( pMiter, 1 ); - Abc_NtkVerifyReportError( pNtk1, pNtk2, pMiter->pModel ); - FREE( pMiter->pModel ); - Abc_NtkDelete( pMiter ); - return; - } - if ( RetValue == 1 ) - { - printf( "Networks are equivalent after structural hashing.\n" ); - Abc_NtkDelete( pMiter ); - return; - } - - Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "unset progressbar" ); - - // solve the problem iteratively for each output of the miter - Status = 1; - nOutputs = 0; - Abc_NtkForEachPo( pMiter, pObj, i ) - { - if ( Abc_ObjFanin0(pObj) == Abc_AigConst1(pMiter) ) - { - if ( Abc_ObjFaninC0(pObj) ) // complemented -> const 0 - RetValue = 1; - else - RetValue = 0; - pMiterPart = NULL; - } - else - { - // get the cone of this output - pMiterPart = Abc_NtkCreateCone( pMiter, Abc_ObjFanin0(pObj), Abc_ObjName(pObj), 0 ); - if ( Abc_ObjFaninC0(pObj) ) - Abc_ObjXorFaninC( Abc_NtkPo(pMiterPart,0), 0 ); - // solve the cone - // RetValue = Abc_NtkMiterProve( &pMiterPart, pParams ); - RetValue = Abc_NtkIvyProve( &pMiterPart, pParams ); - } - - if ( RetValue == -1 ) - { - printf( "Networks are undecided (resource limits is reached).\r" ); - Status = -1; - } - else if ( RetValue == 0 ) - { - int * pSimInfo = Abc_NtkVerifySimulatePattern( pMiterPart, pMiterPart->pModel ); - if ( pSimInfo[0] != 1 ) - printf( "ERROR in Abc_NtkMiterProve(): Generated counter-example is invalid.\n" ); - else - printf( "Networks are NOT EQUIVALENT. \n" ); - free( pSimInfo ); - Status = 0; - break; - } - else - { - printf( "Finished part %5d (out of %5d)\r", i+1, Abc_NtkPoNum(pMiter) ); - nOutputs += nPartSize; - } -// if ( pMiter->pModel ) -// Abc_NtkVerifyReportError( pNtk1, pNtk2, pMiter->pModel ); - if ( pMiterPart ) - Abc_NtkDelete( pMiterPart ); - } - - Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "set progressbar" ); - - if ( Status == 1 ) - printf( "Networks are equivalent. \n" ); - else if ( Status == -1 ) - printf( "Timed out after verifying %d outputs (out of %d).\n", nOutputs, Abc_NtkCoNum(pNtk1) ); - Abc_NtkDelete( pMiter ); -} - -/**Function************************************************************* - - Synopsis [Verifies sequential equivalence by fraiging followed by SAT.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkCecFraigPartAuto( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, int fVerbose ) -{ - extern int Abc_NtkCombinePos( Abc_Ntk_t * pNtk, int fAnd ); - extern Vec_Ptr_t * Abc_NtkPartitionSmart( Abc_Ntk_t * pNtk, int nPartSizeLimit, int fVerbose ); - extern void Abc_NtkConvertCos( Abc_Ntk_t * pNtk, Vec_Int_t * vOuts, Vec_Ptr_t * vOnePtr ); - extern int Cmd_CommandExecute( void * pAbc, char * sCommand ); - extern void * Abc_FrameGetGlobalFrame(); - - Vec_Ptr_t * vParts, * vOnePtr; - Vec_Int_t * vOne; - Prove_Params_t Params, * pParams = &Params; - Abc_Ntk_t * pMiter, * pMiterPart; - int i, RetValue, Status, nOutputs; - - // solve the CNF using the SAT solver - Prove_ParamsSetDefault( pParams ); - pParams->nItersMax = 5; - // pParams->fVerbose = 1; - - // get the miter of the two networks - pMiter = Abc_NtkMiter( pNtk1, pNtk2, 1, 1 ); - if ( pMiter == NULL ) - { - printf( "Miter computation has failed.\n" ); - return; - } - RetValue = Abc_NtkMiterIsConstant( pMiter ); - if ( RetValue == 0 ) - { - printf( "Networks are NOT EQUIVALENT after structural hashing.\n" ); - // report the error - pMiter->pModel = Abc_NtkVerifyGetCleanModel( pMiter, 1 ); - Abc_NtkVerifyReportError( pNtk1, pNtk2, pMiter->pModel ); - FREE( pMiter->pModel ); - Abc_NtkDelete( pMiter ); - return; - } - if ( RetValue == 1 ) - { - printf( "Networks are equivalent after structural hashing.\n" ); - Abc_NtkDelete( pMiter ); - return; - } - - Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "unset progressbar" ); - - // partition the outputs - vParts = Abc_NtkPartitionSmart( pMiter, 300, 0 ); - - // fraig each partition - Status = 1; - nOutputs = 0; - vOnePtr = Vec_PtrAlloc( 1000 ); - Vec_PtrForEachEntry( vParts, vOne, i ) - { - // get this part of the miter - Abc_NtkConvertCos( pMiter, vOne, vOnePtr ); - pMiterPart = Abc_NtkCreateConeArray( pMiter, vOnePtr, 0 ); - Abc_NtkCombinePos( pMiterPart, 0 ); - // check the miter for being constant - RetValue = Abc_NtkMiterIsConstant( pMiterPart ); - if ( RetValue == 0 ) - { - printf( "Networks are NOT EQUIVALENT after partitioning.\n" ); - Abc_NtkDelete( pMiterPart ); - break; - } - if ( RetValue == 1 ) - { - Abc_NtkDelete( pMiterPart ); - continue; - } - printf( "Verifying part %4d (out of %4d) PI = %5d. PO = %5d. And = %6d. Lev = %4d.\r", - i+1, Vec_PtrSize(vParts), Abc_NtkPiNum(pMiterPart), Abc_NtkPoNum(pMiterPart), - Abc_NtkNodeNum(pMiterPart), Abc_AigLevel(pMiterPart) ); - // solve the problem - RetValue = Abc_NtkIvyProve( &pMiterPart, pParams ); - if ( RetValue == -1 ) - { - printf( "Networks are undecided (resource limits is reached).\r" ); - Status = -1; - } - else if ( RetValue == 0 ) - { - int * pSimInfo = Abc_NtkVerifySimulatePattern( pMiterPart, pMiterPart->pModel ); - if ( pSimInfo[0] != 1 ) - printf( "ERROR in Abc_NtkMiterProve(): Generated counter-example is invalid.\n" ); - else - printf( "Networks are NOT EQUIVALENT. \n" ); - free( pSimInfo ); - Status = 0; - Abc_NtkDelete( pMiterPart ); - break; - } - else - { -// printf( "Finished part %5d (out of %5d)\r", i+1, Vec_PtrSize(vParts) ); - nOutputs += Vec_IntSize(vOne); - } - Abc_NtkDelete( pMiterPart ); - } - printf( " \r" ); - Vec_VecFree( (Vec_Vec_t *)vParts ); - Vec_PtrFree( vOnePtr ); - - Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "set progressbar" ); - - if ( Status == 1 ) - printf( "Networks are equivalent. \n" ); - else if ( Status == -1 ) - printf( "Timed out after verifying %d outputs (out of %d).\n", nOutputs, Abc_NtkCoNum(pNtk1) ); - Abc_NtkDelete( pMiter ); -} - -/**Function************************************************************* - - Synopsis [Verifies sequential equivalence by brute-force SAT.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkSecSat( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nConfLimit, int nInsLimit, int nFrames ) -{ - extern Abc_Ntk_t * Abc_NtkMulti( Abc_Ntk_t * pNtk, int nThresh, int nFaninMax, int fCnf, int fMulti, int fSimple, int fFactor ); - Abc_Ntk_t * pMiter; - Abc_Ntk_t * pFrames; - Abc_Ntk_t * pCnf; - int RetValue; - - // get the miter of the two networks - pMiter = Abc_NtkMiter( pNtk1, pNtk2, 0, 0 ); - if ( pMiter == NULL ) - { - printf( "Miter computation has failed.\n" ); - return; - } - RetValue = Abc_NtkMiterIsConstant( pMiter ); - if ( RetValue == 0 ) - { - Abc_NtkDelete( pMiter ); - printf( "Networks are NOT EQUIVALENT after structural hashing.\n" ); - return; - } - if ( RetValue == 1 ) - { - Abc_NtkDelete( pMiter ); - printf( "Networks are equivalent after structural hashing.\n" ); - return; - } - - // create the timeframes - pFrames = Abc_NtkFrames( pMiter, nFrames, 1 ); - Abc_NtkDelete( pMiter ); - if ( pFrames == NULL ) - { - printf( "Frames computation has failed.\n" ); - return; - } - RetValue = Abc_NtkMiterIsConstant( pFrames ); - if ( RetValue == 0 ) - { - Abc_NtkDelete( pFrames ); - printf( "Networks are NOT EQUIVALENT after framing.\n" ); - return; - } - if ( RetValue == 1 ) - { - Abc_NtkDelete( pFrames ); - printf( "Networks are equivalent after framing.\n" ); - return; - } - - // convert the miter into a CNF - pCnf = Abc_NtkMulti( pFrames, 0, 100, 1, 0, 0, 0 ); - Abc_NtkDelete( pFrames ); - if ( pCnf == NULL ) - { - printf( "Renoding for CNF has failed.\n" ); - return; - } - - // solve the CNF using the SAT solver - RetValue = Abc_NtkMiterSat( pCnf, (sint64)nConfLimit, (sint64)nInsLimit, 0, NULL, NULL ); - if ( RetValue == -1 ) - printf( "Networks are undecided (SAT solver timed out).\n" ); - else if ( RetValue == 0 ) - printf( "Networks are NOT EQUIVALENT after SAT.\n" ); - else - printf( "Networks are equivalent after SAT.\n" ); - Abc_NtkDelete( pCnf ); -} - -/**Function************************************************************* - - Synopsis [Verifies combinational equivalence by fraiging followed by SAT] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Abc_NtkSecFraig( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, int nFrames, int fVerbose ) -{ - Fraig_Params_t Params; - Fraig_Man_t * pMan; - Abc_Ntk_t * pMiter; - Abc_Ntk_t * pFrames; - int RetValue; - - // get the miter of the two networks - pMiter = Abc_NtkMiter( pNtk1, pNtk2, 0, 0 ); - if ( pMiter == NULL ) - { - printf( "Miter computation has failed.\n" ); - return 0; - } - RetValue = Abc_NtkMiterIsConstant( pMiter ); - if ( RetValue == 0 ) - { - printf( "Networks are NOT EQUIVALENT after structural hashing.\n" ); - // report the error - pMiter->pModel = Abc_NtkVerifyGetCleanModel( pMiter, nFrames ); - Abc_NtkVerifyReportErrorSeq( pNtk1, pNtk2, pMiter->pModel, nFrames ); - FREE( pMiter->pModel ); - Abc_NtkDelete( pMiter ); - return 0; - } - if ( RetValue == 1 ) - { - Abc_NtkDelete( pMiter ); - printf( "Networks are equivalent after structural hashing.\n" ); - return 1; - } - - // create the timeframes - pFrames = Abc_NtkFrames( pMiter, nFrames, 1 ); - Abc_NtkDelete( pMiter ); - if ( pFrames == NULL ) - { - printf( "Frames computation has failed.\n" ); - return 0; - } - RetValue = Abc_NtkMiterIsConstant( pFrames ); - if ( RetValue == 0 ) - { - printf( "Networks are NOT EQUIVALENT after framing.\n" ); - // report the error - pFrames->pModel = Abc_NtkVerifyGetCleanModel( pFrames, 1 ); -// Abc_NtkVerifyReportErrorSeq( pNtk1, pNtk2, pFrames->pModel, nFrames ); - FREE( pFrames->pModel ); - Abc_NtkDelete( pFrames ); - return 0; - } - if ( RetValue == 1 ) - { - Abc_NtkDelete( pFrames ); - printf( "Networks are equivalent after framing.\n" ); - return 1; - } - - // convert the miter into a FRAIG - Fraig_ParamsSetDefault( &Params ); - Params.fVerbose = fVerbose; - Params.nSeconds = nSeconds; -// Params.fFuncRed = 0; -// Params.nPatsRand = 0; -// Params.nPatsDyna = 0; - pMan = Abc_NtkToFraig( pFrames, &Params, 0, 0 ); - Fraig_ManProveMiter( pMan ); - - // analyze the result - RetValue = Fraig_ManCheckMiter( pMan ); - // report the result - if ( RetValue == -1 ) - printf( "Networks are undecided (SAT solver timed out on the final miter).\n" ); - else if ( RetValue == 1 ) - printf( "Networks are equivalent after fraiging.\n" ); - else if ( RetValue == 0 ) - { - printf( "Networks are NOT EQUIVALENT after fraiging.\n" ); -// Abc_NtkVerifyReportErrorSeq( pNtk1, pNtk2, Fraig_ManReadModel(pMan), nFrames ); - } - else assert( 0 ); - // delete the fraig manager - Fraig_ManFree( pMan ); - // delete the miter - Abc_NtkDelete( pFrames ); - return RetValue == 1; -} - -/**Function************************************************************* - - Synopsis [Returns a dummy pattern full of zeros.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int * Abc_NtkVerifyGetCleanModel( Abc_Ntk_t * pNtk, int nFrames ) -{ - int * pModel = ALLOC( int, Abc_NtkCiNum(pNtk) * nFrames ); - memset( pModel, 0, sizeof(int) * Abc_NtkCiNum(pNtk) * nFrames ); - return pModel; -} - -/**Function************************************************************* - - Synopsis [Returns the PO values under the given input pattern.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int * Abc_NtkVerifySimulatePattern( Abc_Ntk_t * pNtk, int * pModel ) -{ - Abc_Obj_t * pNode; - int * pValues, Value0, Value1, i; - int fStrashed = 0; - if ( !Abc_NtkIsStrash(pNtk) ) - { - pNtk = Abc_NtkStrash(pNtk, 0, 0, 0); - fStrashed = 1; - } -/* - printf( "Counter example: " ); - Abc_NtkForEachCi( pNtk, pNode, i ) - printf( " %d", pModel[i] ); - printf( "\n" ); -*/ - // increment the trav ID - Abc_NtkIncrementTravId( pNtk ); - // set the CI values - Abc_AigConst1(pNtk)->pCopy = (void *)1; - Abc_NtkForEachCi( pNtk, pNode, i ) - pNode->pCopy = (void *)pModel[i]; - // simulate in the topological order - Abc_NtkForEachNode( pNtk, pNode, i ) - { - Value0 = ((int)Abc_ObjFanin0(pNode)->pCopy) ^ Abc_ObjFaninC0(pNode); - Value1 = ((int)Abc_ObjFanin1(pNode)->pCopy) ^ Abc_ObjFaninC1(pNode); - pNode->pCopy = (void *)(Value0 & Value1); - } - // fill the output values - pValues = ALLOC( int, Abc_NtkCoNum(pNtk) ); - Abc_NtkForEachCo( pNtk, pNode, i ) - pValues[i] = ((int)Abc_ObjFanin0(pNode)->pCopy) ^ Abc_ObjFaninC0(pNode); - if ( fStrashed ) - Abc_NtkDelete( pNtk ); - return pValues; -} - - -/**Function************************************************************* - - Synopsis [Reports mismatch between the two networks.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkVerifyReportError( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int * pModel ) -{ - Vec_Ptr_t * vNodes; - Abc_Obj_t * pNode; - int * pValues1, * pValues2; - int nErrors, nPrinted, i, iNode = -1; - - assert( Abc_NtkCiNum(pNtk1) == Abc_NtkCiNum(pNtk2) ); - assert( Abc_NtkCoNum(pNtk1) == Abc_NtkCoNum(pNtk2) ); - // get the CO values under this model - pValues1 = Abc_NtkVerifySimulatePattern( pNtk1, pModel ); - pValues2 = Abc_NtkVerifySimulatePattern( pNtk2, pModel ); - // count the mismatches - nErrors = 0; - for ( i = 0; i < Abc_NtkCoNum(pNtk1); i++ ) - nErrors += (int)( pValues1[i] != pValues2[i] ); - printf( "Verification failed for at least %d outputs: ", nErrors ); - // print the first 3 outputs - nPrinted = 0; - for ( i = 0; i < Abc_NtkCoNum(pNtk1); i++ ) - if ( pValues1[i] != pValues2[i] ) - { - if ( iNode == -1 ) - iNode = i; - printf( " %s", Abc_ObjName(Abc_NtkCo(pNtk1,i)) ); - if ( ++nPrinted == 3 ) - break; - } - if ( nPrinted != nErrors ) - printf( " ..." ); - printf( "\n" ); - // report mismatch for the first output - if ( iNode >= 0 ) - { - printf( "Output %s: Value in Network1 = %d. Value in Network2 = %d.\n", - Abc_ObjName(Abc_NtkCo(pNtk1,iNode)), pValues1[iNode], pValues2[iNode] ); - printf( "Input pattern: " ); - // collect PIs in the cone - pNode = Abc_NtkCo(pNtk1,iNode); - vNodes = Abc_NtkNodeSupport( pNtk1, &pNode, 1 ); - // set the PI numbers - Abc_NtkForEachCi( pNtk1, pNode, i ) - pNode->pCopy = (void*)i; - // print the model - pNode = Vec_PtrEntry( vNodes, 0 ); - if ( Abc_ObjIsCi(pNode) ) - { - Vec_PtrForEachEntry( vNodes, pNode, i ) - { - assert( Abc_ObjIsCi(pNode) ); - printf( " %s=%d", Abc_ObjName(pNode), pModel[(int)pNode->pCopy] ); - } - } - printf( "\n" ); - Vec_PtrFree( vNodes ); - } - free( pValues1 ); - free( pValues2 ); -} - - -/**Function************************************************************* - - Synopsis [Computes the COs in the support of the PO in the given frame.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkGetSeqPoSupp( Abc_Ntk_t * pNtk, int iFrame, int iNumPo ) -{ - Abc_Ntk_t * pFrames; - Abc_Obj_t * pObj, * pNodePo; - Vec_Ptr_t * vSupp; - int i, k; - // get the timeframes of the network - pFrames = Abc_NtkFrames( pNtk, iFrame + 1, 0 ); -//Abc_NtkShowAig( pFrames ); - - // get the PO of the timeframes - pNodePo = Abc_NtkPo( pFrames, iFrame * Abc_NtkPoNum(pNtk) + iNumPo ); - // set the support - vSupp = Abc_NtkNodeSupport( pFrames, &pNodePo, 1 ); - // mark the support of the frames - Abc_NtkForEachCi( pFrames, pObj, i ) - pObj->pCopy = NULL; - Vec_PtrForEachEntry( vSupp, pObj, i ) - pObj->pCopy = (void *)1; - // mark the support of the network if the support of the timeframes is marked - Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pCopy = NULL; - Abc_NtkForEachLatch( pNtk, pObj, i ) - if ( Abc_NtkBox(pFrames, i)->pCopy ) - pObj->pCopy = (void *)1; - Abc_NtkForEachPi( pNtk, pObj, i ) - for ( k = 0; k <= iFrame; k++ ) - if ( Abc_NtkPi(pFrames, k*Abc_NtkPiNum(pNtk) + i)->pCopy ) - pObj->pCopy = (void *)1; - // free stuff - Vec_PtrFree( vSupp ); - Abc_NtkDelete( pFrames ); -} - -/**Function************************************************************* - - Synopsis [Reports mismatch between the two sequential networks.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkVerifyReportErrorSeq( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int * pModel, int nFrames ) -{ - Vec_Ptr_t * vInfo1, * vInfo2; - Abc_Obj_t * pObj, * pObjError, * pObj1, * pObj2; - int ValueError1, ValueError2; - unsigned * pPats1, * pPats2; - int i, o, k, nErrors, iFrameError, iNodePo, nPrinted; - int fRemove1 = 0, fRemove2 = 0; - - if ( !Abc_NtkIsStrash(pNtk1) ) - fRemove1 = 1, pNtk1 = Abc_NtkStrash( pNtk1, 0, 0, 0 ); - if ( !Abc_NtkIsStrash(pNtk2) ) - fRemove2 = 1, pNtk2 = Abc_NtkStrash( pNtk2, 0, 0, 0 ); - - // simulate sequential circuits - vInfo1 = Sim_SimulateSeqModel( pNtk1, nFrames, pModel ); - vInfo2 = Sim_SimulateSeqModel( pNtk2, nFrames, pModel ); - - // look for a discrepancy in the PO values - nErrors = 0; - pObjError = NULL; - for ( i = 0; i < nFrames; i++ ) - { - if ( pObjError ) - break; - Abc_NtkForEachPo( pNtk1, pObj1, o ) - { - pObj2 = Abc_NtkPo( pNtk2, o ); - pPats1 = Sim_SimInfoGet(vInfo1, pObj1); - pPats2 = Sim_SimInfoGet(vInfo2, pObj2); - if ( pPats1[i] == pPats2[i] ) - continue; - nErrors++; - if ( pObjError == NULL ) - { - pObjError = pObj1; - iFrameError = i; - iNodePo = o; - ValueError1 = (pPats1[i] > 0); - ValueError2 = (pPats2[i] > 0); - } - } - } - - if ( pObjError == NULL ) - { - printf( "No output mismatches detected.\n" ); - Sim_UtilInfoFree( vInfo1 ); - Sim_UtilInfoFree( vInfo2 ); - if ( fRemove1 ) Abc_NtkDelete( pNtk1 ); - if ( fRemove2 ) Abc_NtkDelete( pNtk2 ); - return; - } - - printf( "Verification failed for at least %d output%s of frame %d: ", nErrors, (nErrors>1? "s":""), iFrameError+1 ); - // print the first 3 outputs - nPrinted = 0; - Abc_NtkForEachPo( pNtk1, pObj1, o ) - { - pObj2 = Abc_NtkPo( pNtk2, o ); - pPats1 = Sim_SimInfoGet(vInfo1, pObj1); - pPats2 = Sim_SimInfoGet(vInfo2, pObj2); - if ( pPats1[iFrameError] == pPats2[iFrameError] ) - continue; - printf( " %s", Abc_ObjName(pObj1) ); - if ( ++nPrinted == 3 ) - break; - } - if ( nPrinted != nErrors ) - printf( " ..." ); - printf( "\n" ); - - // mark CIs of the networks in the cone of influence of this output - Abc_NtkGetSeqPoSupp( pNtk1, iFrameError, iNodePo ); - Abc_NtkGetSeqPoSupp( pNtk2, iFrameError, iNodePo ); - - // report mismatch for the first output - printf( "Output %s: Value in Network1 = %d. Value in Network2 = %d.\n", - Abc_ObjName(pObjError), ValueError1, ValueError2 ); - - printf( "The cone of influence of output %s in Network1:\n", Abc_ObjName(pObjError) ); - printf( "PIs: " ); - Abc_NtkForEachPi( pNtk1, pObj, i ) - if ( pObj->pCopy ) - printf( "%s ", Abc_ObjName(pObj) ); - printf( "\n" ); - printf( "Latches: " ); - Abc_NtkForEachLatch( pNtk1, pObj, i ) - if ( pObj->pCopy ) - printf( "%s ", Abc_ObjName(pObj) ); - printf( "\n" ); - - printf( "The cone of influence of output %s in Network2:\n", Abc_ObjName(pObjError) ); - printf( "PIs: " ); - Abc_NtkForEachPi( pNtk2, pObj, i ) - if ( pObj->pCopy ) - printf( "%s ", Abc_ObjName(pObj) ); - printf( "\n" ); - printf( "Latches: " ); - Abc_NtkForEachLatch( pNtk2, pObj, i ) - if ( pObj->pCopy ) - printf( "%s ", Abc_ObjName(pObj) ); - printf( "\n" ); - - // print the patterns - for ( i = 0; i <= iFrameError; i++ ) - { - printf( "Frame %d: ", i+1 ); - - printf( "PI(1):" ); - Abc_NtkForEachPi( pNtk1, pObj, k ) - if ( pObj->pCopy ) - printf( "%d", Sim_SimInfoGet(vInfo1, pObj)[i] > 0 ); - printf( " " ); - printf( "L(1):" ); - Abc_NtkForEachLatch( pNtk1, pObj, k ) - if ( pObj->pCopy ) - printf( "%d", Sim_SimInfoGet(vInfo1, pObj)[i] > 0 ); - printf( " " ); - printf( "%s(1):", Abc_ObjName(pObjError) ); - printf( "%d", Sim_SimInfoGet(vInfo1, pObjError)[i] > 0 ); - - printf( " " ); - - printf( "PI(2):" ); - Abc_NtkForEachPi( pNtk2, pObj, k ) - if ( pObj->pCopy ) - printf( "%d", Sim_SimInfoGet(vInfo2, pObj)[i] > 0 ); - printf( " " ); - printf( "L(2):" ); - Abc_NtkForEachLatch( pNtk2, pObj, k ) - if ( pObj->pCopy ) - printf( "%d", Sim_SimInfoGet(vInfo2, pObj)[i] > 0 ); - printf( " " ); - printf( "%s(2):", Abc_ObjName(pObjError) ); - printf( "%d", Sim_SimInfoGet(vInfo2, pObjError)[i] > 0 ); - - printf( "\n" ); - } - Abc_NtkForEachCi( pNtk1, pObj, i ) - pObj->pCopy = NULL; - Abc_NtkForEachCi( pNtk2, pObj, i ) - pObj->pCopy = NULL; - - Sim_UtilInfoFree( vInfo1 ); - Sim_UtilInfoFree( vInfo2 ); - if ( fRemove1 ) Abc_NtkDelete( pNtk1 ); - if ( fRemove2 ) Abc_NtkDelete( pNtk2 ); -} - -/**Function************************************************************* - - Synopsis [Simulates buggy miter emailed by Mike.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkSimulteBuggyMiter( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pObj; - int i; - int * pModel1, * pModel2, * pResult1, * pResult2; - char * vPiValues1 = "01001011100000000011010110101000000"; - char * vPiValues2 = "11001101011101011111110100100010001"; - - assert( strlen(vPiValues1) == (unsigned)Abc_NtkPiNum(pNtk) ); - assert( 1 == Abc_NtkPoNum(pNtk) ); - - pModel1 = ALLOC( int, Abc_NtkCiNum(pNtk) ); - Abc_NtkForEachPi( pNtk, pObj, i ) - pModel1[i] = vPiValues1[i] - '0'; - Abc_NtkForEachLatch( pNtk, pObj, i ) - pModel1[Abc_NtkPiNum(pNtk)+i] = ((int)pObj->pData) - 1; - - pResult1 = Abc_NtkVerifySimulatePattern( pNtk, pModel1 ); - printf( "Value = %d\n", pResult1[0] ); - - pModel2 = ALLOC( int, Abc_NtkCiNum(pNtk) ); - Abc_NtkForEachPi( pNtk, pObj, i ) - pModel2[i] = vPiValues2[i] - '0'; - Abc_NtkForEachLatch( pNtk, pObj, i ) - pModel2[Abc_NtkPiNum(pNtk)+i] = pResult1[Abc_NtkPoNum(pNtk)+i]; - - pResult2 = Abc_NtkVerifySimulatePattern( pNtk, pModel2 ); - printf( "Value = %d\n", pResult2[0] ); - - free( pModel1 ); - free( pModel2 ); - free( pResult1 ); - free( pResult2 ); -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abcXsim.c b/src/base/abci/abcXsim.c deleted file mode 100644 index 5d9e4634..00000000 --- a/src/base/abci/abcXsim.c +++ /dev/null @@ -1,227 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcXsim.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Using X-valued simulation.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcXsim.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -#define XVS0 ABC_INIT_ZERO -#define XVS1 ABC_INIT_ONE -#define XVSX ABC_INIT_DC - -static inline void Abc_ObjSetXsim( Abc_Obj_t * pObj, int Value ) { pObj->pCopy = (void *)Value; } -static inline int Abc_ObjGetXsim( Abc_Obj_t * pObj ) { return (int)pObj->pCopy; } -static inline int Abc_XsimInv( int Value ) -{ - if ( Value == XVS0 ) - return XVS1; - if ( Value == XVS1 ) - return XVS0; - assert( Value == XVSX ); - return XVSX; -} -static inline int Abc_XsimAnd( int Value0, int Value1 ) -{ - if ( Value0 == XVS0 || Value1 == XVS0 ) - return XVS0; - if ( Value0 == XVSX || Value1 == XVSX ) - return XVSX; - assert( Value0 == XVS1 && Value1 == XVS1 ); - return XVS1; -} -static inline int Abc_XsimRand2() -{ - return (rand() & 1) ? XVS1 : XVS0; -} -static inline int Abc_XsimRand3() -{ - int RetValue; - do { - RetValue = rand() & 3; - } while ( RetValue == 0 ); - return RetValue; -} -static inline int Abc_ObjGetXsimFanin0( Abc_Obj_t * pObj ) -{ - int RetValue; - RetValue = Abc_ObjGetXsim(Abc_ObjFanin0(pObj)); - return Abc_ObjFaninC0(pObj)? Abc_XsimInv(RetValue) : RetValue; -} -static inline int Abc_ObjGetXsimFanin1( Abc_Obj_t * pObj ) -{ - int RetValue; - RetValue = Abc_ObjGetXsim(Abc_ObjFanin1(pObj)); - return Abc_ObjFaninC1(pObj)? Abc_XsimInv(RetValue) : RetValue; -} -static inline void Abc_XsimPrint( FILE * pFile, int Value ) -{ - if ( Value == XVS0 ) - { - fprintf( pFile, "0" ); - return; - } - if ( Value == XVS1 ) - { - fprintf( pFile, "1" ); - return; - } - assert( Value == XVSX ); - fprintf( pFile, "x" ); -} - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Performs X-valued simulation of the sequential network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkXValueSimulate( Abc_Ntk_t * pNtk, int nFrames, int fXInputs, int fXState, int fVerbose ) -{ - Abc_Obj_t * pObj; - int i, f; - assert( Abc_NtkIsStrash(pNtk) ); - srand( 0x12341234 ); - // start simulation - Abc_ObjSetXsim( Abc_AigConst1(pNtk), XVS1 ); - if ( fXInputs ) - { - Abc_NtkForEachPi( pNtk, pObj, i ) - Abc_ObjSetXsim( pObj, XVSX ); - } - else - { - Abc_NtkForEachPi( pNtk, pObj, i ) - Abc_ObjSetXsim( pObj, Abc_XsimRand2() ); - } - if ( fXState ) - { - Abc_NtkForEachLatch( pNtk, pObj, i ) - Abc_ObjSetXsim( Abc_ObjFanout0(pObj), XVSX ); - } - else - { - Abc_NtkForEachLatch( pNtk, pObj, i ) - Abc_ObjSetXsim( Abc_ObjFanout0(pObj), Abc_LatchInit(pObj) ); - } - // simulate and print the result - fprintf( stdout, "Frame : Inputs : Latches : Outputs\n" ); - for ( f = 0; f < nFrames; f++ ) - { - Abc_AigForEachAnd( pNtk, pObj, i ) - Abc_ObjSetXsim( pObj, Abc_XsimAnd(Abc_ObjGetXsimFanin0(pObj), Abc_ObjGetXsimFanin1(pObj)) ); - Abc_NtkForEachCo( pNtk, pObj, i ) - Abc_ObjSetXsim( pObj, Abc_ObjGetXsimFanin0(pObj) ); - // print out - fprintf( stdout, "%2d : ", f ); - Abc_NtkForEachPi( pNtk, pObj, i ) - Abc_XsimPrint( stdout, Abc_ObjGetXsim(pObj) ); - fprintf( stdout, " : " ); - Abc_NtkForEachLatch( pNtk, pObj, i ) - { -// if ( Abc_ObjGetXsim(Abc_ObjFanout0(pObj)) != XVSX ) -// printf( " %s=", Abc_ObjName(pObj) ); - Abc_XsimPrint( stdout, Abc_ObjGetXsim(Abc_ObjFanout0(pObj)) ); - } - fprintf( stdout, " : " ); - Abc_NtkForEachPo( pNtk, pObj, i ) - Abc_XsimPrint( stdout, Abc_ObjGetXsim(pObj) ); - if ( Abc_NtkAssertNum(pNtk) ) - { - fprintf( stdout, " : " ); - Abc_NtkForEachAssert( pNtk, pObj, i ) - Abc_XsimPrint( stdout, Abc_ObjGetXsim(pObj) ); - } - fprintf( stdout, "\n" ); - // assign input values - if ( fXInputs ) - { - Abc_NtkForEachPi( pNtk, pObj, i ) - Abc_ObjSetXsim( pObj, XVSX ); - } - else - { - Abc_NtkForEachPi( pNtk, pObj, i ) - Abc_ObjSetXsim( pObj, Abc_XsimRand2() ); - } - // transfer the latch values - Abc_NtkForEachLatch( pNtk, pObj, i ) - Abc_ObjSetXsim( Abc_ObjFanout0(pObj), Abc_ObjGetXsim(Abc_ObjFanin0(pObj)) ); - } -} - -/**Function************************************************************* - - Synopsis [Cycles the circuit to create a new initial state.] - - Description [Simulates the circuit with random input for the given - number of timeframes to get a better initial state.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkCycleInitState( Abc_Ntk_t * pNtk, int nFrames, int fVerbose ) -{ - Abc_Obj_t * pObj; - int i, f; - assert( Abc_NtkIsStrash(pNtk) ); - srand( 0x12341234 ); - // initialize the values - Abc_ObjSetXsim( Abc_AigConst1(pNtk), XVS1 ); - Abc_NtkForEachPi( pNtk, pObj, i ) - Abc_ObjSetXsim( pObj, Abc_XsimRand2() ); - Abc_NtkForEachLatch( pNtk, pObj, i ) - Abc_ObjSetXsim( Abc_ObjFanout0(pObj), Abc_LatchIsInit1(pObj)? XVS1 : XVS0 ); - // simulate for the given number of timeframes - for ( f = 0; f < nFrames; f++ ) - { - Abc_AigForEachAnd( pNtk, pObj, i ) - Abc_ObjSetXsim( pObj, Abc_XsimAnd(Abc_ObjGetXsimFanin0(pObj), Abc_ObjGetXsimFanin1(pObj)) ); - Abc_NtkForEachCo( pNtk, pObj, i ) - Abc_ObjSetXsim( pObj, Abc_ObjGetXsimFanin0(pObj) ); - // assign input values - Abc_NtkForEachPi( pNtk, pObj, i ) - Abc_ObjSetXsim( pObj, Abc_XsimRand2() ); - // transfer the latch values - Abc_NtkForEachLatch( pNtk, pObj, i ) - Abc_ObjSetXsim( Abc_ObjFanout0(pObj), Abc_ObjGetXsim(Abc_ObjFanin0(pObj)) ); - } - // set the final values - Abc_NtkForEachLatch( pNtk, pObj, i ) - pObj->pData = (void *)Abc_ObjGetXsim(Abc_ObjFanout0(pObj)); -} - -/////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abc_.c b/src/base/abci/abc_.c deleted file mode 100644 index 75ec88c3..00000000 --- a/src/base/abci/abc_.c +++ /dev/null @@ -1,48 +0,0 @@ -/**CFile**************************************************************** - - FileName [abc_.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abc_.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/base/abci/abc_new.h b/src/base/abci/abc_new.h deleted file mode 100644 index 3460bb38..00000000 --- a/src/base/abci/abc_new.h +++ /dev/null @@ -1,23 +0,0 @@ -struct Abc_Obj_t_ // 6 words -{ - Abc_Obj_t * pCopy; // the copy of this object - Abc_Ntk_t * pNtk; // the host network - int Id; // the object ID - int TravId; // the traversal ID - int nRefs; // the number of fanouts - unsigned Type : 4; // the object type - unsigned fMarkA : 1; // the multipurpose mark - unsigned fMarkB : 1; // the multipurpose mark - unsigned fPhase : 1; // the flag to mark the phase of equivalent node - unsigned fPersist: 1; // marks the persistant AIG node - unsigned nFanins : 24; // the level of the node - Abc_Obj_t * Fanins[0]; // the array of fanins -}; - -struct Abc_Pin_t_ // 4 words -{ - Abc_Pin_t * pNext; - Abc_Pin_t * pPrev; - Abc_Obj_t * pFanin; - Abc_Obj_t * pFanout; -}; diff --git a/src/base/abci/module.make b/src/base/abci/module.make deleted file mode 100644 index f6c73102..00000000 --- a/src/base/abci/module.make +++ /dev/null @@ -1,55 +0,0 @@ -SRC += src/base/abci/abc.c \ - src/base/abci/abcAttach.c \ - src/base/abci/abcAuto.c \ - src/base/abci/abcBalance.c \ - src/base/abci/abcBmc.c \ - src/base/abci/abcCas.c \ - src/base/abci/abcClpBdd.c \ - src/base/abci/abcClpSop.c \ - src/base/abci/abcCut.c \ - src/base/abci/abcDar.c \ - src/base/abci/abcDebug.c \ - src/base/abci/abcDress.c \ - src/base/abci/abcDsd.c \ - src/base/abci/abcEspresso.c \ - src/base/abci/abcExtract.c \ - src/base/abci/abcFpga.c \ - src/base/abci/abcFpgaFast.c \ - src/base/abci/abcFraig.c \ - src/base/abci/abcFxu.c \ - src/base/abci/abcGen.c \ - src/base/abci/abcHaig.c \ - src/base/abci/abcIf.c \ - src/base/abci/abcIvy.c \ - src/base/abci/abcLut.c \ - src/base/abci/abcMap.c \ - src/base/abci/abcMini.c \ - src/base/abci/abcMiter.c \ - src/base/abci/abcMulti.c \ - src/base/abci/abcNtbdd.c \ - src/base/abci/abcOdc.c \ - src/base/abci/abcOrder.c \ - src/base/abci/abcPart.c \ - src/base/abci/abcPlace.c \ - src/base/abci/abcPrint.c \ - src/base/abci/abcProve.c \ - src/base/abci/abcQbf.c \ - src/base/abci/abcQuant.c \ - src/base/abci/abcRec.c \ - src/base/abci/abcReconv.c \ - src/base/abci/abcRefactor.c \ - src/base/abci/abcRenode.c \ - src/base/abci/abcReorder.c \ - src/base/abci/abcRestruct.c \ - src/base/abci/abcResub.c \ - src/base/abci/abcRewrite.c \ - src/base/abci/abcRr.c \ - src/base/abci/abcSat.c \ - src/base/abci/abcStrash.c \ - src/base/abci/abcSweep.c \ - src/base/abci/abcSymm.c \ - src/base/abci/abcTiming.c \ - src/base/abci/abcUnate.c \ - src/base/abci/abcUnreach.c \ - src/base/abci/abcVerify.c \ - src/base/abci/abcXsim.c |