| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Abc_CommandUnfold2( Abc_Frame_t * pAbc, int argc, char ** argv ) |
| { |
| Abc_Ntk_t * pNtk, * pNtkRes; |
| int nFrames; |
| int nConfs; |
| int nProps; |
| int fStruct = 0; |
| int fOldAlgo = 0; |
| int fVerbose; |
| int c; |
| extern Abc_Ntk_t * Abc_NtkDarUnfold2( Abc_Ntk_t * pNtk, int nFrames, int nConfs, int nProps, int fStruct, int fOldAlgo, int fVerbose ); |
| pNtk = Abc_FrameReadNtk(pAbc); |
| // set defaults |
| nFrames = 1; |
| nConfs = 1000; |
| nProps = 1000; |
| fVerbose = 0; |
| Extra_UtilGetoptReset(); |
| while ( ( c = Extra_UtilGetopt( argc, argv, "CPvh" ) ) != EOF ) |
| { |
| switch ( c ) |
| { |
| /* case 'F': */ |
| /* if ( globalUtilOptind >= argc ) */ |
| /* { */ |
| /* Abc_Print( -1, "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 'C': |
| if ( globalUtilOptind >= argc ) |
| { |
| Abc_Print( -1, "Command line switch \"-C\" should be followed by an integer.\n" ); |
| goto usage; |
| } |
| nConfs = atoi(argv[globalUtilOptind]); |
| globalUtilOptind++; |
| if ( nConfs < 0 ) |
| goto usage; |
| break; |
| case 'P': |
| if ( globalUtilOptind >= argc ) |
| { |
| Abc_Print( -1, "Command line switch \"-P\" should be followed by an integer.\n" ); |
| goto usage; |
| } |
| nProps = atoi(argv[globalUtilOptind]); |
| globalUtilOptind++; |
| if ( nProps < 0 ) |
| goto usage; |
| break; |
| case 'v': |
| fVerbose ^= 1; |
| break; |
| case 'h': |
| goto usage; |
| default: |
| goto usage; |
| } |
| } |
| if ( pNtk == NULL ) |
| { |
| Abc_Print( -1, "Empty network.\n" ); |
| return 1; |
| } |
| if ( Abc_NtkIsComb(pNtk) ) |
| { |
| Abc_Print( -1, "The network is combinational.\n" ); |
| return 0; |
| } |
| if ( !Abc_NtkIsStrash(pNtk) ) |
| { |
| Abc_Print( -1, "Currently only works for structurally hashed circuits.\n" ); |
| return 0; |
| } |
| if ( Abc_NtkConstrNum(pNtk) > 0 ) |
| { |
| Abc_Print( -1, "Constraints are already extracted.\n" ); |
| return 0; |
| } |
| if ( Abc_NtkPoNum(pNtk) > 1 && !fStruct ) |
| { |
| Abc_Print( -1, "Functional constraint extraction works for single-output miters (use \"orpos\").\n" ); |
| return 0; |
| } |
| // modify the current network |
| pNtkRes = Abc_NtkDarUnfold2( pNtk, nFrames, nConfs, nProps, fStruct, fOldAlgo, fVerbose ); |
| if ( pNtkRes == NULL ) |
| { |
| Abc_Print( 1,"Transformation has failed.\n" ); |
| return 0; |
| } |
| // replace the current network |
| Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); |
| return 0; |
| usage: |
| Abc_Print( -2, "usage: unfold2 [-FCP num] [-savh]\n" ); |
| Abc_Print( -2, "\t unfold hidden constraints as separate outputs\n" ); |
| Abc_Print( -2, "\t-C num : the max number of conflicts in SAT solving [default = %d]\n", nConfs ); |
| Abc_Print( -2, "\t-P num : the max number of constraint propagations [default = %d]\n", nProps ); |
| Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); |
| Abc_Print( -2, "\t-h : print the command usage\n"); |
| return 1; |
| } |
| |
| |
| |
| int Abc_CommandFold2( Abc_Frame_t * pAbc, int argc, char ** argv ) |
| { |
| Abc_Ntk_t * pNtk, * pNtkRes; |
| int fCompl; |
| int fVerbose; |
| int c; |
| extern Abc_Ntk_t * Abc_NtkDarFold2( Abc_Ntk_t * pNtk, int fCompl, int fVerbose , int); |
| pNtk = Abc_FrameReadNtk(pAbc); |
| // set defaults |
| fCompl = 0; |
| fVerbose = 0; |
| Extra_UtilGetoptReset(); |
| while ( ( c = Extra_UtilGetopt( argc, argv, "cvh" ) ) != EOF ) |
| { |
| switch ( c ) |
| { |
| /* case 'c': */ |
| /* fCompl ^= 1; */ |
| /* break; */ |
| case 'v': |
| fVerbose ^= 1; |
| break; |
| case 'h': |
| goto usage; |
| default: |
| goto usage; |
| } |
| } |
| if ( pNtk == NULL ) |
| { |
| Abc_Print( -1, "Empty network.\n" ); |
| return 1; |
| } |
| if ( !Abc_NtkIsStrash(pNtk) ) |
| { |
| Abc_Print( -1, "Currently only works for structurally hashed circuits.\n" ); |
| return 0; |
| } |
| if ( Abc_NtkConstrNum(pNtk) == 0 ) |
| { |
| Abc_Print( 0, "The network has no constraints.\n" ); |
| return 0; |
| } |
| if ( Abc_NtkIsComb(pNtk) ) |
| Abc_Print( 0, "The network is combinational.\n" ); |
| // modify the current network |
| pNtkRes = Abc_NtkDarFold2( pNtk, fCompl, fVerbose ,0); |
| if ( pNtkRes == NULL ) |
| { |
| Abc_Print( 1,"Transformation has failed.\n" ); |
| return 0; |
| } |
| // replace the current network |
| Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes ); |
| return 0; |
| usage: |
| Abc_Print( -2, "usage: fold [-cvh]\n" ); |
| Abc_Print( -2, "\t folds constraints represented as separate outputs\n" ); |
| // Abc_Print( -2, "\t-c : toggle complementing constraints while folding [default = %s]\n", fCompl? "yes": "no" ); |
| Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); |
| Abc_Print( -2, "\t-h : print the command usage\n"); |
| return 1; |
| } |