ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Performs one iteration of AIG rewriting.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Aig_Man_t * Dar_ManRewriteDefault( Aig_Man_t * pAig ) { Aig_Man_t * pTemp; Dar_RwrPar_t Pars, * pPars = &Pars; Dar_ManDefaultRwrParams( pPars ); pAig = Aig_ManDupDfs( pAig ); Dar_ManRewrite( pAig, pPars ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); return pAig; }
/**Function************************************************************* Synopsis [Reproduces script "compress".] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Aig_Man_t * Dar_NewCompress( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fPower, int fVerbose ) //alias compress2 "b -l; rw -l; rwz -l; b -l; rwz -l; b -l" { Aig_Man_t * pTemp; Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr; Dar_RefPar_t ParsRef, * pParsRef = &ParsRef; Dar_ManDefaultRwrParams( pParsRwr ); Dar_ManDefaultRefParams( pParsRef ); pParsRwr->fUpdateLevel = fUpdateLevel; pParsRef->fUpdateLevel = fUpdateLevel; pParsRwr->fPower = fPower; pParsRwr->fVerbose = 0;//fVerbose; pParsRef->fVerbose = 0;//fVerbose; // pAig = Aig_ManDupDfs( pAig ); if ( fVerbose ) printf( "Starting: " ), Aig_ManPrintStats( pAig ); // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig ); // refactor Dar_ManRefactor( pAig, pParsRef ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Refactor: " ), Aig_ManPrintStats( pAig ); // balance if ( fBalance ) { pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig ); } pParsRwr->fUseZeros = 1; pParsRef->fUseZeros = 1; // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "RewriteZ: " ), Aig_ManPrintStats( pAig ); return pAig; }
/**Function************************************************************* Synopsis [Performs one iteration of AIG rewriting.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Aig_Man_t * Dar_ManRewriteDefault( Aig_Man_t * pAig ) { Aig_Man_t * pTemp; Dar_RwrPar_t Pars, * pPars = &Pars; Dar_ManDefaultRwrParams( pPars ); pAig = Aig_ManDup( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); Dar_ManRewrite( pAig, pPars ); pAig = Aig_ManDup( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); return pAig; }
/**Function************************************************************* Synopsis [Reproduces script "compress2".] Description [] SideEffects [This procedure does not tighten level during restructuring.] SeeAlso [] ***********************************************************************/ Aig_Man_t * Dar_ManRwsat( Aig_Man_t * pAig, int fBalance, int fVerbose ) //alias rwsat "st; rw -l; b -l; rw -l; rf -l" { Aig_Man_t * pTemp; Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr; Dar_RefPar_t ParsRef, * pParsRef = &ParsRef; Dar_ManDefaultRwrParams( pParsRwr ); Dar_ManDefaultRefParams( pParsRef ); pParsRwr->fUpdateLevel = 0; pParsRef->fUpdateLevel = 0; pParsRwr->fVerbose = fVerbose; pParsRef->fVerbose = fVerbose; // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDup( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); // refactor Dar_ManRefactor( pAig, pParsRef ); pAig = Aig_ManDup( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); // balance if ( fBalance ) { pAig = Dar_ManBalance( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); } // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDup( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); return pAig; }
/**Function************************************************************* Synopsis [Reproduces script "rwsat".] Description [] SideEffects [This procedure does not tighten level during restructuring.] SeeAlso [] ***********************************************************************/ Aig_Man_t * Dar_ManRwsat( Aig_Man_t * pAig, int fBalance, int fVerbose ) //alias rwsat "st; rw -l; b -l; rw -l; rf -l" { Aig_Man_t * pTemp; abctime Time = pAig->Time2Quit; Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr; Dar_RefPar_t ParsRef, * pParsRef = &ParsRef; Dar_ManDefaultRwrParams( pParsRwr ); Dar_ManDefaultRefParams( pParsRef ); pParsRwr->fUpdateLevel = 0; pParsRef->fUpdateLevel = 0; pParsRwr->fVerbose = fVerbose; pParsRef->fVerbose = fVerbose; //printf( "1" ); pAig = Aig_ManDupDfs( pAig ); if ( fVerbose ) printf( "Starting: " ), Aig_ManPrintStats( pAig ); //printf( "2" ); // balance if ( fBalance ) { pAig->Time2Quit = Time; pAig = Dar_ManBalance( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig ); if ( Time && Abc_Clock() > Time ) { if ( pAig ) Aig_ManStop( pAig ); return NULL; } } //Aig_ManDumpBlif( pAig, "inter.blif", NULL, NULL ); //printf( "3" ); // rewrite pAig->Time2Quit = Time; Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig ); if ( Time && Abc_Clock() > Time ) { if ( pAig ) Aig_ManStop( pAig ); return NULL; } //printf( "4" ); // refactor pAig->Time2Quit = Time; Dar_ManRefactor( pAig, pParsRef ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Refactor: " ), Aig_ManPrintStats( pAig ); if ( Time && Abc_Clock() > Time ) { if ( pAig ) Aig_ManStop( pAig ); return NULL; } //printf( "5" ); // balance if ( fBalance ) { pAig->Time2Quit = Time; pAig = Dar_ManBalance( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig ); if ( Time && Abc_Clock() > Time ) { if ( pAig ) Aig_ManStop( pAig ); return NULL; } } //printf( "6" ); // rewrite pAig->Time2Quit = Time; Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig ); if ( Time && Abc_Clock() > Time ) { if ( pAig ) Aig_ManStop( pAig ); return NULL; } //printf( "7" ); return pAig; }
/**Function************************************************************* Synopsis [Reproduces script "compress2".] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Aig_Man_t * Dar_NewCompress2( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fFanout, int fPower, int fLightSynth, int fVerbose ) //alias compress2 "b -l; rw -l; rf -l; b -l; rw -l; rwz -l; b -l; rfz -l; rwz -l; b -l" { Aig_Man_t * pTemp; Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr; Dar_RefPar_t ParsRef, * pParsRef = &ParsRef; Dar_ManDefaultRwrParams( pParsRwr ); Dar_ManDefaultRefParams( pParsRef ); pParsRwr->fUpdateLevel = fUpdateLevel; pParsRef->fUpdateLevel = fUpdateLevel; pParsRwr->fFanout = fFanout; pParsRwr->fPower = fPower; pParsRwr->fVerbose = 0;//fVerbose; pParsRef->fVerbose = 0;//fVerbose; // pAig = Aig_ManDupDfs( pAig ); if ( fVerbose ) printf( "Starting: " ), Aig_ManPrintStats( pAig ); // skip if lighter synthesis is requested if ( !fLightSynth ) { // rewrite //Dar_ManRewrite( pAig, pParsRwr ); // pParsRwr->fUpdateLevel = 0; // disable level update // this change was requested in July and later disabled Dar_ManRewrite( pAig, pParsRwr ); // pParsRwr->fUpdateLevel = fUpdateLevel; // reenable level update if needed pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig ); // refactor Dar_ManRefactor( pAig, pParsRef ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Refactor: " ), Aig_ManPrintStats( pAig ); } // balance pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig ); // skip if lighter synthesis is requested if ( !fLightSynth ) { // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig ); } pParsRwr->fUseZeros = 1; pParsRef->fUseZeros = 1; // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "RewriteZ: " ), Aig_ManPrintStats( pAig ); // skip if lighter synthesis is requested if ( !fLightSynth ) { // balance if ( fBalance ) { pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig ); } } // refactor Dar_ManRefactor( pAig, pParsRef ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "RefactorZ: " ), Aig_ManPrintStats( pAig ); // skip if lighter synthesis is requested if ( !fLightSynth ) { // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "RewriteZ: " ), Aig_ManPrintStats( pAig ); } // balance if ( fBalance ) { pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig ); } return pAig; }
/**Function************************************************************* Synopsis [Reproduces script "compress2".] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Aig_Man_t * Dar_ManCompress2( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fFanout, int fPower, int fVerbose ) //alias compress2 "b -l; rw -l; rf -l; b -l; rw -l; rwz -l; b -l; rfz -l; rwz -l; b -l" { Aig_Man_t * pTemp; Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr; Dar_RefPar_t ParsRef, * pParsRef = &ParsRef; Dar_ManDefaultRwrParams( pParsRwr ); Dar_ManDefaultRefParams( pParsRef ); pParsRwr->fUpdateLevel = fUpdateLevel; pParsRef->fUpdateLevel = fUpdateLevel; pParsRwr->fFanout = fFanout; pParsRwr->fPower = fPower; pParsRwr->fVerbose = 0;//fVerbose; pParsRef->fVerbose = 0;//fVerbose; pAig = Aig_ManDupDfs( pAig ); if ( fVerbose ) printf( "Starting: " ), Aig_ManPrintStats( pAig ); /* // balance if ( fBalance ) { pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig ); } */ // rewrite // Dar_ManRewrite( pAig, pParsRwr ); pParsRwr->fUpdateLevel = 0; // disable level update Dar_ManRewrite( pAig, pParsRwr ); pParsRwr->fUpdateLevel = fUpdateLevel; // reenable level update if needed pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig ); // refactor Dar_ManRefactor( pAig, pParsRef ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Refactor: " ), Aig_ManPrintStats( pAig ); // balance // if ( fBalance ) { pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig ); } // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig ); pParsRwr->fUseZeros = 1; pParsRef->fUseZeros = 1; // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "RewriteZ: " ), Aig_ManPrintStats( pAig ); // balance if ( fBalance ) { pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig ); } // refactor Dar_ManRefactor( pAig, pParsRef ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "RefactorZ: " ), Aig_ManPrintStats( pAig ); // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDupDfs( pTemp = pAig ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "RewriteZ: " ), Aig_ManPrintStats( pAig ); // balance if ( fBalance ) { pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); Aig_ManStop( pTemp ); if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig ); } return pAig; }
void ToCNFAIG::toCNF(const BBNodeAIG& top, Cnf_Dat_t*& cnfData, ToSATBase::ASTNodeToSATVar& nodeToVar, bool needAbsRef, BBNodeManagerAIG& mgr) { assert(cnfData == NULL); Aig_ObjCreatePo(mgr.aigMgr, top.n); if (!needAbsRef) { Aig_ManCleanup( mgr.aigMgr); // remove nodes not connected to the PO. } Aig_ManCheck( mgr.aigMgr); // check that AIG looks ok. assert(Aig_ManPoNum(mgr.aigMgr) == 1); // UseZeroes gives assertion errors. // Rewriting is sometimes very slow. Can it be configured to be faster? // What about refactoring??? int nodeCount = mgr.aigMgr->nObjs[AIG_OBJ_AND]; if (uf.stats_flag) cerr << "Nodes before AIG rewrite:" << nodeCount << endl; if (!needAbsRef && uf.isSet("aig-rewrite","0")) { Dar_LibStart(); Aig_Man_t * pTemp; Dar_RwrPar_t Pars, *pPars = &Pars; Dar_ManDefaultRwrParams(pPars); // Assertion errors occur with this enabled. // pPars->fUseZeros = 1; // For mul63bit.smt2 with iterations =3 & nCutsMax = 8 // CNF generation was taking 139 seconds, solving 10 seconds. // With nCutsMax =2, CNF generation takes 16 seconds, solving 10 seconds. // The rewriting doesn't remove as many nodes of course.. int iterations = 3; for (int i = 0; i < iterations; i++) { mgr.aigMgr = Aig_ManDup(pTemp = mgr.aigMgr, 0); Aig_ManStop(pTemp); Dar_ManRewrite(mgr.aigMgr, pPars); mgr.aigMgr = Aig_ManDup(pTemp = mgr.aigMgr, 0); Aig_ManStop(pTemp); if (uf.stats_flag) cerr << "After rewrite [" << i << "] nodes:" << mgr.aigMgr->nObjs[AIG_OBJ_AND] << endl; if (nodeCount == mgr.aigMgr->nObjs[AIG_OBJ_AND]) break; } } if (!uf.isSet("simple-cnf","0")) { cnfData = Cnf_Derive(mgr.aigMgr, 0); if (uf.stats_flag) cerr << "advanced CNF" << endl; } else { cnfData = Cnf_DeriveSimple(mgr.aigMgr, 0); if (uf.stats_flag) cerr << "simple CNF" << endl; } BBNodeManagerAIG::SymbolToBBNode::const_iterator it; assert(nodeToVar.size() == 0); //todo. cf. with addvariables above... // Each symbol maps to a vector of CNF variables. for (it = mgr.symbolToBBNode.begin(); it != mgr.symbolToBBNode.end(); it++) { const ASTNode& n = it->first; const vector<BBNodeAIG> &b = it->second; assert(nodeToVar.find(n) == nodeToVar.end()); const int width = (n.GetType() == BOOLEAN_TYPE) ? 1 : n.GetValueWidth(); // INT_MAX for parts of symbols that didn't get encoded. vector<unsigned> v(width, ~((unsigned) 0)); for (unsigned i = 0; i < b.size(); i++) { if (!b[i].IsNull()) { Aig_Obj_t * pObj; pObj = (Aig_Obj_t*) Vec_PtrEntry(mgr.aigMgr->vPis, b[i].symbol_index); v[i] = cnfData->pVarNums[pObj->Id]; } } nodeToVar.insert(make_pair(n, v)); } assert(cnfData != NULL); }
/**Function************************************************************* Synopsis [Reproduces script "compress2".] Description [] SideEffects [This procedure does not tighten level during restructuring.] SeeAlso [] ***********************************************************************/ Aig_Man_t * Dar_ManCompress2( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fVerbose ) //alias compress2 "b -l; rw -l; rf -l; b -l; rw -l; rwz -l; b -l; rfz -l; rwz -l; b -l" { Aig_Man_t * pTemp; Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr; Dar_RefPar_t ParsRef, * pParsRef = &ParsRef; Dar_ManDefaultRwrParams( pParsRwr ); Dar_ManDefaultRefParams( pParsRef ); pParsRwr->fUpdateLevel = fUpdateLevel; pParsRef->fUpdateLevel = fUpdateLevel; pParsRwr->fVerbose = fVerbose; pParsRef->fVerbose = fVerbose; // balance if ( fBalance ) { // pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); // Aig_ManStop( pTemp ); } // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDup( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); // refactor Dar_ManRefactor( pAig, pParsRef ); pAig = Aig_ManDup( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); // balance // if ( fBalance ) { pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); Aig_ManStop( pTemp ); } // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDup( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); pParsRwr->fUseZeros = 1; pParsRef->fUseZeros = 1; // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDup( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); // balance if ( fBalance ) { pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); Aig_ManStop( pTemp ); } // refactor Dar_ManRefactor( pAig, pParsRef ); pAig = Aig_ManDup( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); // rewrite Dar_ManRewrite( pAig, pParsRwr ); pAig = Aig_ManDup( pTemp = pAig, 0 ); Aig_ManStop( pTemp ); // balance if ( fBalance ) { pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel ); Aig_ManStop( pTemp ); } return pAig; }