From dbaa6a58f880f4c19d00a4dd5992322a0e2c4a72 Mon Sep 17 00:00:00 2001
From: Alan Mishchenko <alanmi@berkeley.edu>
Date: Thu, 18 Apr 2019 12:13:47 -0700
Subject: [PATCH] Enabling dumping of the library of minimum circuits (file support).

---
 src/opt/dau/dauNpn.c  | 35 ++++++++++++-----------------------
 src/opt/dau/dauNpn2.c | 18 +++++++++++++-----
 2 files changed, 25 insertions(+), 28 deletions(-)

diff --git a/src/opt/dau/dauNpn.c b/src/opt/dau/dauNpn.c
index b57ade6..3740eea 100644
--- a/src/opt/dau/dauNpn.c
+++ b/src/opt/dau/dauNpn.c
@@ -29,7 +29,6 @@ ABC_NAMESPACE_IMPL_START
 ///                        DECLARATIONS                              ///
 ////////////////////////////////////////////////////////////////////////
 
-//#define USE4VARS 1
 
 ////////////////////////////////////////////////////////////////////////
 ///                     FUNCTION DEFINITIONS                         ///
@@ -46,19 +45,14 @@ ABC_NAMESPACE_IMPL_START
   SeeAlso     []
 
 ***********************************************************************/
-void Dau_TruthEnum()
+void Dau_TruthEnum(int nVars)
 {
     int fUseTable = 1;
     abctime clk = Abc_Clock();
-#ifdef USE4VARS
-    int nVars   = 4;
-    int nSizeW  = 1 << 14;
-    char * pFileName = "tableW14.data";
-#else
-    int nVars   = 5;
-    int nSizeW  = 1 << 30;
-    char * pFileName = "tableW30.data";
-#endif
+    int nSizeLog = (1<<nVars) -2;
+    int nSizeW = 1 << nSizeLog;
+    char pFileName[20];
+    sprintf( pFileName, "tableW%d.data", nSizeLog );
     int nPerms  = Extra_Factorial( nVars );
     int nMints  = 1 << nVars;
     int * pPerm = Extra_PermSchedule( nVars );
@@ -177,20 +171,15 @@ int Dau_AddFunction( word tCur, int nVars, unsigned * pTable, Vec_Int_t * vNpns,
     }
     return 0;
 }
-void Dau_NetworkEnum()
+void Dau_NetworkEnum(int nVars)
 {
     abctime clk = Abc_Clock();
     int Limit = 2;
     int UseTwo = 0;
-#ifdef USE4VARS
-    int nVars = 4;
-    int nSizeW  = 1 << 14;
-    char * pFileName = "tableW14.data";
-#else
-    int nVars = 5;
-    int nSizeW  = 1 << 30;
-    char * pFileName = "tableW30.data";
-#endif
+    int nSizeLog = (1<<nVars) -2;
+    int nSizeW = 1 << nSizeLog;
+    char pFileName[20];
+    sprintf( pFileName, "tableW%d.data", nSizeLog );
     unsigned * pTable  = Dau_ReadFile( pFileName, nSizeW );
     Vec_Wec_t * vNpns  = Vec_WecStart( 32 );
     Vec_Wec_t * vNpns_ = Vec_WecStart( 32 );
@@ -380,8 +369,8 @@ void Dau_NetworkEnum()
 }
 void Dau_NetworkEnumTest()
 {
-    //Dau_TruthEnum();
-    Dau_NetworkEnum();
+    //Dau_TruthEnum(3);
+    Dau_NetworkEnum(4);
 }
 
 
diff --git a/src/opt/dau/dauNpn2.c b/src/opt/dau/dauNpn2.c
index 7bf5e09..db6958b 100644
--- a/src/opt/dau/dauNpn2.c
+++ b/src/opt/dau/dauNpn2.c
@@ -312,6 +312,7 @@ unsigned * Dau_ReadFile2( char * pFileName, int nSizeW )
 {
     abctime clk = Abc_Clock();
     FILE * pFile = fopen( pFileName, "rb" );
+    if (pFile == NULL) return NULL;
     unsigned * p = (unsigned *)ABC_CALLOC(word, nSizeW);
     int RetValue = pFile ? fread( p, sizeof(word), nSizeW, pFile ) : 0;
     RetValue = 0;
@@ -341,12 +342,19 @@ void Dtt_ManRenum( int nVars, unsigned * pTable, int * pnClasses )
 }
 unsigned * Dtt_ManLoadClasses( int nVars, int * pnClasses )
 {
+    extern Dau_TruthEnum(int);
+    
     unsigned * pTable = NULL;
-    if ( nVars == 4 )
-        pTable = Dau_ReadFile2( "tableW14.data", 1 << 14 );
-    else if ( nVars == 5 )
-        pTable = Dau_ReadFile2( "tableW30.data", 1 << 30 );
-    else assert( 0 );
+    int nSizeLog = (1<<nVars) -2;
+    int nSizeW = 1 << nSizeLog;
+    char pFileName[20];
+    sprintf( pFileName, "tableW%d.data", nSizeLog );
+    pTable = Dau_ReadFile2( pFileName, nSizeW );
+    if (pTable == NULL)
+    {
+        Dau_TruthEnum(nVars);
+        pTable = Dau_ReadFile2( pFileName, nSizeW );
+    }
     Dtt_ManRenum( nVars, pTable, pnClasses );
     return pTable;
 }
--
libgit2 0.26.0