From 8005405ed7cf61873b07c0ae9581680081064dc9 Mon Sep 17 00:00:00 2001 From: MyskYko Date: Wed, 5 Mar 2025 14:44:12 -0800 Subject: [PATCH] update rrr --- src/aig/gia/gia.h | 2 +- src/aig/gia/giaRrr.cpp | 10 +- src/base/abci/abc.c | 51 +- src/opt/rrr/rrr.h | 6 +- src/opt/rrr/rrrAbc.h | 4 +- src/opt/rrr/rrrAnalyzer.h | 13 +- src/opt/rrr/rrrAndNetwork.h | 605 +++++++++++++++++----- src/opt/rrr/rrrBddAnalyzer.h | 57 +-- src/opt/rrr/rrrBddManager.h | 848 +++++++++++++++++++++++++++++++ src/opt/rrr/rrrBddMspfAnalyzer.h | 60 +-- src/opt/rrr/rrrOptimizer.h | 214 ++++---- src/opt/rrr/rrrParameter.h | 8 +- src/opt/rrr/rrrPartitioner.h | 323 ++++++++++++ src/opt/rrr/rrrSatSolver.h | 18 +- src/opt/rrr/rrrScheduler.h | 399 ++++++++++++--- src/opt/rrr/rrrSimulator.h | 40 +- src/opt/rrr/rrrTypes.h | 146 +----- src/opt/rrr/rrrUtils.h | 215 ++++++++ 18 files changed, 2448 insertions(+), 571 deletions(-) create mode 100644 src/opt/rrr/rrrBddManager.h create mode 100644 src/opt/rrr/rrrPartitioner.h create mode 100644 src/opt/rrr/rrrUtils.h diff --git a/src/aig/gia/gia.h b/src/aig/gia/gia.h index a8f3c4875..b950da4be 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 nOptimizerVerbose, int nAnalyzerVerbose, int nSimulatorVerbose, int nSatSolverVerbose, int fUseBddCspf, int fUseBddMspf, int nConflictLimit, int nSortType, int nOptimizerFlow, int nSchedulerFlow ); +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 ); /*=== 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 21e343337..df3b91e60 100644 --- a/src/aig/gia/giaRrr.cpp +++ b/src/aig/gia/giaRrr.cpp @@ -5,14 +5,15 @@ ABC_NAMESPACE_IMPL_START -Gia_Man_t *Gia_ManRrr(Gia_Man_t *pGia, int iSeed, int nWords, int nTimeout, int nSchedulerVerbose, int nOptimizerVerbose, int nAnalyzerVerbose, int nSimulatorVerbose, int nSatSolverVerbose, int fUseBddCspf, int fUseBddMspf, int nConflictLimit, int nSortType, int nOptimizerFlow, int nSchedulerFlow) { +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) { rrr::AndNetwork ntk; - ntk.Read(pGia, rrr::GiaReader); + ntk.Read(pGia, rrr::GiaReader); rrr::Parameter Par; Par.iSeed = iSeed; Par.nWords = nWords; Par.nTimeout = nTimeout; Par.nSchedulerVerbose = nSchedulerVerbose; + Par.nPartitionerVerbose = nPartitionerVerbose; Par.nOptimizerVerbose = nOptimizerVerbose; Par.nAnalyzerVerbose = nAnalyzerVerbose; Par.nSimulatorVerbose = nSimulatorVerbose; @@ -23,6 +24,11 @@ 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.nDistance = nDistance; + Par.nRestarts = nRestarts; + Par.nThreads = nThreads; + Par.nWindowSize = nWindowSize; + Par.fDeterministic = fDeterministic; 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 04b70102a..4bf22bd88 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, nOptimizerVerbose = 0, nAnalyzerVerbose = 0, nSimulatorVerbose = 0, nSatSolverVerbose = 0, fUseBddCspf = 0, fUseBddMspf = 0, nConflictLimit = 0, nSortType = 12, nOptimizerFlow = 0, nSchedulerFlow = 0; + 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; Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "XYRWTCGSOAPQabh" ) ) != EOF ) + while ( ( c = Extra_UtilGetopt( argc, argv, "XYNJKDRWTCGVPOAQSabdh" ) ) != EOF ) { switch ( c ) { @@ -45471,6 +45471,22 @@ int Abc_CommandAbc9Rrr( Abc_Frame_t * pAbc, int argc, char ** argv ) nSchedulerFlow = atoi(argv[globalUtilOptind]); globalUtilOptind++; break; + case 'N': + nRestarts = atoi(argv[globalUtilOptind]); + globalUtilOptind++; + break; + case 'J': + nThreads = atoi(argv[globalUtilOptind]); + globalUtilOptind++; + break; + case 'K': + nWindowSize = atoi(argv[globalUtilOptind]); + globalUtilOptind++; + break; + case 'D': + nDistance = atoi(argv[globalUtilOptind]); + globalUtilOptind++; + break; case 'R': iSeed = atoi(argv[globalUtilOptind]); globalUtilOptind++; @@ -45491,10 +45507,14 @@ int Abc_CommandAbc9Rrr( Abc_Frame_t * pAbc, int argc, char ** argv ) nSortType = atoi(argv[globalUtilOptind]); globalUtilOptind++; break; - case 'S': + case 'V': nSchedulerVerbose = atoi(argv[globalUtilOptind]); globalUtilOptind++; break; + case 'P': + nPartitionerVerbose = atoi(argv[globalUtilOptind]); + globalUtilOptind++; + break; case 'O': nOptimizerVerbose = atoi(argv[globalUtilOptind]); globalUtilOptind++; @@ -45503,11 +45523,11 @@ int Abc_CommandAbc9Rrr( Abc_Frame_t * pAbc, int argc, char ** argv ) nAnalyzerVerbose = atoi(argv[globalUtilOptind]); globalUtilOptind++; break; - case 'P': + case 'Q': nSimulatorVerbose = atoi(argv[globalUtilOptind]); globalUtilOptind++; break; - case 'Q': + case 'S': nSatSolverVerbose = atoi(argv[globalUtilOptind]); globalUtilOptind++; break; @@ -45517,6 +45537,9 @@ int Abc_CommandAbc9Rrr( Abc_Frame_t * pAbc, int argc, char ** argv ) case 'b': fUseBddMspf ^= 1; break; + case 'd': + fDeterministic ^= 1; + break; case 'h': goto usage; default: @@ -45535,14 +45558,14 @@ int Abc_CommandAbc9Rrr( Abc_Frame_t * pAbc, int argc, char ** argv ) return 1; } - pNew = Gia_ManRrr( pAbc->pGia, iSeed, nWords, nTimeout, nSchedulerVerbose, nOptimizerVerbose, nAnalyzerVerbose, nSimulatorVerbose, nSatSolverVerbose, fUseBddCspf, fUseBddMspf, nConflictLimit, nSortType, nOptimizerFlow, nSchedulerFlow ); + 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 ); Abc_FrameUpdateGia( pAbc, pNew ); return 0; usage: - Abc_Print( -2, "usage: rrr [-XYRWTCGSOAPQ num] [-abh]\n" ); + Abc_Print( -2, "usage: rrr [-XYNJKDRWTCGVPOAQS num] [-abdh]\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" ); @@ -45552,18 +45575,24 @@ usage: 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-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-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 [default = %d]\n", nConflictLimit ); + 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-S num : scheduler verbosity level [default = %d]\n", nSchedulerVerbose ); + 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 ); Abc_Print( -2, "\t-A num : analyzer verbosity level [default = %d]\n", nAnalyzerVerbose ); - Abc_Print( -2, "\t-P num : simulator verbosity level [default = %d]\n", nSimulatorVerbose ); - Abc_Print( -2, "\t-Q num : SAT solver verbosity level [default = %d]\n", nSatSolverVerbose ); + Abc_Print( -2, "\t-Q num : simulator verbosity level [default = %d]\n", nSimulatorVerbose ); + Abc_Print( -2, "\t-S num : SAT solver verbosity level [default = %d]\n", nSatSolverVerbose ); 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-h : print the command usage\n"); return 1; } diff --git a/src/opt/rrr/rrr.h b/src/opt/rrr/rrr.h index d306da3af..f737b7ffc 100644 --- a/src/opt/rrr/rrr.h +++ b/src/opt/rrr/rrr.h @@ -1,15 +1,11 @@ #pragma once -#include - -#include "rrrParameter.h" -#include "rrrTypes.h" #include "rrrAndNetwork.h" #include "rrrScheduler.h" #include "rrrOptimizer.h" -#include "rrrAnalyzer.h" #include "rrrBddAnalyzer.h" #include "rrrBddMspfAnalyzer.h" +#include "rrrAnalyzer.h" #include "rrrSatSolver.h" #include "rrrSimulator.h" diff --git a/src/opt/rrr/rrrAbc.h b/src/opt/rrr/rrrAbc.h index 5fc2e1ff5..307d5e0d0 100644 --- a/src/opt/rrr/rrrAbc.h +++ b/src/opt/rrr/rrrAbc.h @@ -1,11 +1,11 @@ #pragma once -#include - #include "aig/gia/gia.h" #include "base/main/main.h" #include "base/cmd/cmd.h" +#include "rrrUtils.h" + ABC_NAMESPACE_CXX_HEADER_START namespace rrr { diff --git a/src/opt/rrr/rrrAnalyzer.h b/src/opt/rrr/rrrAnalyzer.h index a01d811c7..0689a3d11 100644 --- a/src/opt/rrr/rrrAnalyzer.h +++ b/src/opt/rrr/rrrAnalyzer.h @@ -1,8 +1,7 @@ #pragma once -#include - #include "rrrParameter.h" +#include "rrrUtils.h" ABC_NAMESPACE_CXX_HEADER_START @@ -23,7 +22,7 @@ namespace rrr { public: // constructors - Analyzer(Ntk *pNtk, Parameter const *pPar); + Analyzer(Parameter const *pPar); void UpdateNetwork(Ntk *pNtk_, bool fSame); // checks @@ -34,11 +33,11 @@ namespace rrr { /* {{{ Constructors */ template - Analyzer::Analyzer(Ntk *pNtk, Parameter const *pPar) : - pNtk(pNtk), + Analyzer::Analyzer(Parameter const *pPar) : + pNtk(NULL), nVerbose(pPar->nAnalyzerVerbose), - sim(pNtk, pPar), - sol(pNtk, pPar) { + sim(pPar), + sol(pPar) { } template diff --git a/src/opt/rrr/rrrAndNetwork.h b/src/opt/rrr/rrrAndNetwork.h index 2d321186c..00afd2386 100644 --- a/src/opt/rrr/rrrAndNetwork.h +++ b/src/opt/rrr/rrrAndNetwork.h @@ -1,17 +1,12 @@ #pragma once -#include -#include +#include #include -#include -#include -#include -#include +#include #include -#include #include "rrrParameter.h" -#include "rrrTypes.h" +#include "rrrUtils.h" ABC_NAMESPACE_CXX_HEADER_START @@ -57,8 +52,9 @@ namespace rrr { // other private functions int CreateNode(); void SortInts(itr it); - void StartTraversal(); + unsigned StartTraversal(int n = 1); void EndTraversal(); + void ForEachTfiRec(int id, std::function const &f); void TakenAction(Action const &action) const; public: @@ -71,8 +67,8 @@ namespace rrr { void Clear(); void Reserve(int nReserve); int AddPi(); - int AddPo(int id, bool c); int AddAnd(int id0, int id1, bool c0, bool c1); + int AddPo(int id, bool c); template void Read(Ntk *pFrom, Reader &reader); @@ -84,6 +80,7 @@ namespace rrr { int GetNumPos() const; int GetConst0() const; int GetPi(int idx) const; + int GetPo(int idx) const; std::vector GetPis() const; std::vector GetInts() const; std::vector GetPisInts() const; @@ -104,17 +101,31 @@ namespace rrr { bool GetCompl(int id, int idx) const; int FindFanin(int id, int fi) const; bool IsReconvergent(int id); + std::vector GetNeighbors(int id, bool fPis, int nHops); + template