From 27f2429d764d057c2e8cdc882332aa1583cee028 Mon Sep 17 00:00:00 2001 From: MyskYko Date: Sun, 6 Apr 2025 15:46:02 -0700 Subject: [PATCH] update rrr --- src/aig/gia/gia.h | 2 +- src/aig/gia/giaRrr.cpp | 11 +- src/base/abci/abc.c | 44 ++- src/opt/rrr/rrr.h | 38 ++- src/opt/rrr/rrrAndNetwork.h | 138 ++++++++- src/opt/rrr/rrrBddMspfAnalyzer.h | 2 +- src/opt/rrr/rrrLevelBasePartitioner.h | 293 +++++++++++++++++++ src/opt/rrr/rrrOptimizer.h | 388 +++++++++++++++++++++++--- src/opt/rrr/rrrParameter.h | 11 +- src/opt/rrr/rrrPartitioner.h | 277 +++++++++--------- src/opt/rrr/rrrSatSolver.h | 2 +- src/opt/rrr/rrrScheduler.h | 145 +++++----- src/opt/rrr/rrrSimulator.h | 58 +++- src/opt/rrr/rrrUtils.h | 242 +++++++++++++--- 14 files changed, 1337 insertions(+), 314 deletions(-) create mode 100644 src/opt/rrr/rrrLevelBasePartitioner.h diff --git a/src/aig/gia/gia.h b/src/aig/gia/gia.h index b950da4be..273c530ec 100644 --- a/src/aig/gia/gia.h +++ b/src/aig/gia/gia.h @@ -1808,7 +1808,7 @@ extern Gia_Man_t * Gia_ManTransductionBdd( Gia_Man_t * pGia, int nType, extern Gia_Man_t * Gia_ManTransductionTt( Gia_Man_t * pGia, int nType, int fMspf, int nRandom, int nSortType, int nPiShuffle, int nParameter, int fLevel, Gia_Man_t * pExdc, int fNewLine, int nVerbose ); /*=== giaRrr.cpp ===========================================================*/ -extern Gia_Man_t * Gia_ManRrr( Gia_Man_t *pGia, int iSeed, int nWords, int nTimeout, int nSchedulerVerbose, int nPartitionerVerbose, int nOptimizerVerbose, int nAnalyzerVerbose, int nSimulatorVerbose, int nSatSolverVerbose, int fUseBddCspf, int fUseBddMspf, int nConflictLimit, int nSortType, int nOptimizerFlow, int nSchedulerFlow, int nDistance, int nRestarts, int nThreads, int nWindowSize, int fDeterministic ); +extern Gia_Man_t * Gia_ManRrr( Gia_Man_t *pGia, int iSeed, int nWords, int nTimeout, int nSchedulerVerbose, int nPartitionerVerbose, int nOptimizerVerbose, int nAnalyzerVerbose, int nSimulatorVerbose, int nSatSolverVerbose, int fUseBddCspf, int fUseBddMspf, int nConflictLimit, int nSortType, int nOptimizerFlow, int nSchedulerFlow, int nPartitionType, int nDistance, int nJobs, int nThreads, int nPartitionSize, int nPartitionSizeMin, int fDeterministic, int nParallelPartitions, int fOptOnInsert, int fGreedy ); /*=== giaCTas.c ===========================================================*/ typedef struct Tas_Man_t_ Tas_Man_t; diff --git a/src/aig/gia/giaRrr.cpp b/src/aig/gia/giaRrr.cpp index df3b91e60..1eccd4dc2 100644 --- a/src/aig/gia/giaRrr.cpp +++ b/src/aig/gia/giaRrr.cpp @@ -5,7 +5,7 @@ ABC_NAMESPACE_IMPL_START -Gia_Man_t *Gia_ManRrr(Gia_Man_t *pGia, int iSeed, int nWords, int nTimeout, int nSchedulerVerbose, int nPartitionerVerbose, int nOptimizerVerbose, int nAnalyzerVerbose, int nSimulatorVerbose, int nSatSolverVerbose, int fUseBddCspf, int fUseBddMspf, int nConflictLimit, int nSortType, int nOptimizerFlow, int nSchedulerFlow, int nDistance, int nRestarts, int nThreads, int nWindowSize, int fDeterministic) { +Gia_Man_t *Gia_ManRrr(Gia_Man_t *pGia, int iSeed, int nWords, int nTimeout, int nSchedulerVerbose, int nPartitionerVerbose, int nOptimizerVerbose, int nAnalyzerVerbose, int nSimulatorVerbose, int nSatSolverVerbose, int fUseBddCspf, int fUseBddMspf, int nConflictLimit, int nSortType, int nOptimizerFlow, int nSchedulerFlow, int nPartitionType, int nDistance, int nJobs, int nThreads, int nPartitionSize, int nPartitionSizeMin, int fDeterministic, int nParallelPartitions, int fOptOnInsert, int fGreedy) { rrr::AndNetwork ntk; ntk.Read(pGia, rrr::GiaReader); rrr::Parameter Par; @@ -24,11 +24,16 @@ Gia_Man_t *Gia_ManRrr(Gia_Man_t *pGia, int iSeed, int nWords, int nTimeout, int Par.nSortType = nSortType; Par.nOptimizerFlow = nOptimizerFlow; Par.nSchedulerFlow = nSchedulerFlow; + Par.nPartitionType = nPartitionType; Par.nDistance = nDistance; - Par.nRestarts = nRestarts; + Par.nJobs = nJobs; Par.nThreads = nThreads; - Par.nWindowSize = nWindowSize; + Par.nPartitionSize = nPartitionSize; + Par.nPartitionSizeMin = nPartitionSizeMin; Par.fDeterministic = fDeterministic; + Par.nParallelPartitions = nParallelPartitions; + Par.fOptOnInsert = fOptOnInsert; + Par.fGreedy = fGreedy; rrr::Perform(&ntk, &Par); Gia_Man_t *pNew = rrr::CreateGia(&ntk); return pNew; diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index 4bf22bd88..2875b3a1b 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -45457,9 +45457,9 @@ int Abc_CommandAbc9Rrr( Abc_Frame_t * pAbc, int argc, char ** argv ) { Gia_Man_t *pNew; int c; - int iSeed = 0, nWords = 10, nTimeout = 0, nSchedulerVerbose = 1, nPartitionerVerbose = 0, nOptimizerVerbose = 0, nAnalyzerVerbose = 0, nSimulatorVerbose = 0, nSatSolverVerbose = 0, fUseBddCspf = 0, fUseBddMspf = 0, nConflictLimit = 0, nSortType = 12, nOptimizerFlow = 0, nSchedulerFlow = 0, nDistance = 0, nRestarts = 0, nThreads = 1, nWindowSize = 0, fDeterministic = 1; + int iSeed = 0, nWords = 10, nTimeout = 0, nSchedulerVerbose = 1, nPartitionerVerbose = 0, nOptimizerVerbose = 0, nAnalyzerVerbose = 0, nSimulatorVerbose = 0, nSatSolverVerbose = 0, fUseBddCspf = 0, fUseBddMspf = 0, nConflictLimit = 0, nSortType = -1, nOptimizerFlow = 0, nSchedulerFlow = 0, nPartitionType = 0, nDistance = 0, nJobs = 1, nThreads = 1, nPartitionSize = 0, nPartitionSizeMin = 0, fDeterministic = 1, nParallelPartitions = 1, fOptOnInsert = 0, fGreedy = 1; Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "XYNJKDRWTCGVPOAQSabdh" ) ) != EOF ) + while ( ( c = Extra_UtilGetopt( argc, argv, "XYZNJKLBDRWTCGVPOAQSabdegh" ) ) != EOF ) { switch ( c ) { @@ -45471,8 +45471,12 @@ int Abc_CommandAbc9Rrr( Abc_Frame_t * pAbc, int argc, char ** argv ) nSchedulerFlow = atoi(argv[globalUtilOptind]); globalUtilOptind++; break; + case 'Z': + nPartitionType = atoi(argv[globalUtilOptind]); + globalUtilOptind++; + break; case 'N': - nRestarts = atoi(argv[globalUtilOptind]); + nJobs = atoi(argv[globalUtilOptind]); globalUtilOptind++; break; case 'J': @@ -45480,7 +45484,15 @@ int Abc_CommandAbc9Rrr( Abc_Frame_t * pAbc, int argc, char ** argv ) globalUtilOptind++; break; case 'K': - nWindowSize = atoi(argv[globalUtilOptind]); + nPartitionSize = atoi(argv[globalUtilOptind]); + globalUtilOptind++; + break; + case 'L': + nPartitionSizeMin = atoi(argv[globalUtilOptind]); + globalUtilOptind++; + break; + case 'B': + nParallelPartitions = atoi(argv[globalUtilOptind]); globalUtilOptind++; break; case 'D': @@ -45540,6 +45552,12 @@ int Abc_CommandAbc9Rrr( Abc_Frame_t * pAbc, int argc, char ** argv ) case 'd': fDeterministic ^= 1; break; + case 'e': + fOptOnInsert ^= 1; + break; + case 'g': + fGreedy ^= 1; + break; case 'h': goto usage; default: @@ -45558,32 +45576,38 @@ int Abc_CommandAbc9Rrr( Abc_Frame_t * pAbc, int argc, char ** argv ) return 1; } - pNew = Gia_ManRrr( pAbc->pGia, iSeed, nWords, nTimeout, nSchedulerVerbose, nPartitionerVerbose, nOptimizerVerbose, nAnalyzerVerbose, nSimulatorVerbose, nSatSolverVerbose, fUseBddCspf, fUseBddMspf, nConflictLimit, nSortType, nOptimizerFlow, nSchedulerFlow, nDistance, nRestarts, nThreads, nWindowSize, fDeterministic ); + pNew = Gia_ManRrr( pAbc->pGia, iSeed, nWords, nTimeout, nSchedulerVerbose, nPartitionerVerbose, nOptimizerVerbose, nAnalyzerVerbose, nSimulatorVerbose, nSatSolverVerbose, fUseBddCspf, fUseBddMspf, nConflictLimit, nSortType, nOptimizerFlow, nSchedulerFlow, nPartitionType, nDistance, nJobs, nThreads, nPartitionSize, nPartitionSizeMin, fDeterministic, nParallelPartitions, fOptOnInsert, fGreedy ); Abc_FrameUpdateGia( pAbc, pNew ); return 0; usage: - Abc_Print( -2, "usage: rrr [-XYNJKDRWTCGVPOAQS num] [-abdh]\n" ); + Abc_Print( -2, "usage: rrr [-XYZNJKLBDRWTCGVPOAQS num] [-abdegh]\n" ); Abc_Print( -2, "\t perform optimization\n" ); Abc_Print( -2, "\t-X num : method [default = %d]\n", nOptimizerFlow ); Abc_Print( -2, "\t 0: single-add resub\n" ); Abc_Print( -2, "\t 1: multi-add resub\n" ); Abc_Print( -2, "\t 2: repeat 0 and 1\n" ); + Abc_Print( -2, "\t 3: random one meaningful resub\n" ); Abc_Print( -2, "\t-Y num : flow [default = %d]\n", nSchedulerFlow ); Abc_Print( -2, "\t 0: apply method once\n" ); Abc_Print( -2, "\t 1: iterate like transtoch\n" ); Abc_Print( -2, "\t 2: iterate like deepsyn\n" ); - Abc_Print( -2, "\t-N num : number of restarts or windows [default = %d]\n", nRestarts ); + Abc_Print( -2, "\t-Z num : partition [default = %d]\n", nPartitionType ); + Abc_Print( -2, "\t 0: distance base\n" ); + Abc_Print( -2, "\t 1: level base\n" ); + Abc_Print( -2, "\t-N num : number of jobs to create by restarting or partitioning [default = %d]\n", nJobs ); Abc_Print( -2, "\t-J num : number of threads [default = %d]\n", nThreads ); - Abc_Print( -2, "\t-K num : window size (0 = no partitioning) [default = %d]\n", nWindowSize ); + Abc_Print( -2, "\t-K num : partition size (0 = no partitioning) [default = %d]\n", nPartitionSize ); + Abc_Print( -2, "\t-K num : minimum partition size [default = %d]\n", nPartitionSizeMin ); + Abc_Print( -2, "\t-B num : max number of partitions in parallel [default = %d]\n", nParallelPartitions ); Abc_Print( -2, "\t-D num : distance between nodes (0 = no limit) [default = %d]\n", nDistance ); Abc_Print( -2, "\t-R num : random number generator seed [default = %d]\n", iSeed ); Abc_Print( -2, "\t-W num : number of simulation words [default = %d]\n", nWords ); Abc_Print( -2, "\t-T num : timeout in seconds (0 = no timeout) [default = %d]\n", nTimeout ); Abc_Print( -2, "\t-C num : conflict limit (0 = no limit) [default = %d]\n", nConflictLimit ); - Abc_Print( -2, "\t-G num : fanin cost function [default = %d]\n", nSortType ); + Abc_Print( -2, "\t-G num : fanin cost function (-1 = random) [default = %d]\n", nSortType ); Abc_Print( -2, "\t-V num : scheduler verbosity level [default = %d]\n", nSchedulerVerbose ); Abc_Print( -2, "\t-P num : partitioner verbosity level [default = %d]\n", nPartitionerVerbose ); Abc_Print( -2, "\t-O num : optimizer verbosity level [default = %d]\n", nOptimizerVerbose ); @@ -45593,6 +45617,8 @@ usage: Abc_Print( -2, "\t-a : use BDD-based analyzer (CSPF) [default = %s]\n", fUseBddCspf? "yes": "no" ); Abc_Print( -2, "\t-b : use BDD-based analyzer (MSPF) [default = %s]\n", fUseBddMspf? "yes": "no" ); Abc_Print( -2, "\t-d : ensure deterministic execution [default = %s]\n", fDeterministic? "yes": "no" ); + Abc_Print( -2, "\t-e : apply c2rs; dc2 after importing changes of partitions [default = %s]\n", fOptOnInsert? "yes": "no" ); + Abc_Print( -2, "\t-g : discard changes that increased the cost [default = %s]\n", fGreedy? "yes": "no" ); Abc_Print( -2, "\t-h : print the command usage\n"); return 1; } diff --git a/src/opt/rrr/rrr.h b/src/opt/rrr/rrr.h index f737b7ffc..c08d562ae 100644 --- a/src/opt/rrr/rrr.h +++ b/src/opt/rrr/rrr.h @@ -8,6 +8,8 @@ #include "rrrAnalyzer.h" #include "rrrSatSolver.h" #include "rrrSimulator.h" +#include "rrrPartitioner.h" +#include "rrrLevelBasePartitioner.h" ABC_NAMESPACE_CXX_HEADER_START @@ -16,15 +18,33 @@ namespace rrr { template void Perform(Ntk *pNtk, Parameter const *pPar) { assert(!pPar->fUseBddCspf || !pPar->fUseBddMspf); - if(pPar->fUseBddCspf) { - Scheduler>> sch(pNtk, pPar); - sch.Run(); - } else if(pPar->fUseBddMspf) { - Scheduler>> sch(pNtk, pPar); - sch.Run(); - } else { - Scheduler, rrr::SatSolver>>> sch(pNtk, pPar); - sch.Run(); + switch(pPar->nPartitionType) { + case 0: + if(pPar->fUseBddCspf) { + Scheduler>, Partitioner> sch(pNtk, pPar); + sch.Run(); + } else if(pPar->fUseBddMspf) { + Scheduler>, Partitioner> sch(pNtk, pPar); + sch.Run(); + } else { + Scheduler, SatSolver>>, Partitioner> sch(pNtk, pPar); + sch.Run(); + } + break; + case 1: + if(pPar->fUseBddCspf) { + Scheduler>, LevelBasePartitioner> sch(pNtk, pPar); + sch.Run(); + } else if(pPar->fUseBddMspf) { + Scheduler>, LevelBasePartitioner> sch(pNtk, pPar); + sch.Run(); + } else { + Scheduler, SatSolver>>, LevelBasePartitioner> sch(pNtk, pPar); + sch.Run(); + } + break; + default: + assert(0); } } diff --git a/src/opt/rrr/rrrAndNetwork.h b/src/opt/rrr/rrrAndNetwork.h index 00afd2386..f39bbdc4d 100644 --- a/src/opt/rrr/rrrAndNetwork.h +++ b/src/opt/rrr/rrrAndNetwork.h @@ -54,7 +54,7 @@ namespace rrr { void SortInts(itr it); unsigned StartTraversal(int n = 1); void EndTraversal(); - void ForEachTfiRec(int id, std::function const &f); + void ForEachTfiRec(int id, std::function const &func); void TakenAction(Action const &action) const; public: @@ -102,13 +102,15 @@ namespace rrr { int FindFanin(int id, int fi) const; bool IsReconvergent(int id); std::vector GetNeighbors(int id, bool fPis, int nHops); - template