abc-master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
casCore.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "base/main/main.h"
#include "base/cmd/cmd.h"
#include "misc/extra/extraBdd.h"
#include "cas.h"

Go to the source code of this file.

Macros

#define PRD(p)   printf( "\nDECOMPOSITION TREE:\n\n" ); PrintDecEntry( (p), 0 )
 static varibles /// More...
 
#define PRB_(f)   printf( #f " = " ); Cudd_bddPrint(dd,f); printf( "\n" )
 
#define PRK(f, n)   Cudd_PrintKMap(stdout,dd,(f),Cudd_Not(f),(n),NULL,0); printf( "K-map for function" #f "\n\n" )
 
#define PRK2(f, g, n)   Cudd_PrintKMap(stdout,dd,(f),(g),(n),NULL,0); printf( "K-map for function <" #f ", " #g ">\n\n" )
 

Functions

ABC_NAMESPACE_IMPL_START DdNodeGetSingleOutputFunction (DdManager *dd, DdNode **pbOuts, int nOuts, DdNode **pbVarsEnc, int nVarsEnc, int fVerbose)
 static functions /// More...
 
DdNodeGetSingleOutputFunctionRemapped (DdManager *dd, DdNode **pOutputs, int nOuts, DdNode **pbVarsEnc, int nVarsEnc)
 INPUT REMAPPING ///. More...
 
DdNodeGetSingleOutputFunctionRemappedNewDD (DdManager *dd, DdNode **pOutputs, int nOuts, DdManager **DdNew)
 
int CreateDecomposedNetwork (DdManager *dd, DdNode *aFunc, char **pNames, int nNames, char *FileName, int nLutSize, int fCheck, int fVerbose)
 EXTERNAL FUNCTIONS ///. More...
 
void WriteSingleOutputFunctionBlif (DdManager *dd, DdNode *aFunc, char **pNames, int nNames, char *FileName)
 
DdNodeCudd_bddTransferPermute (DdManager *ddSource, DdManager *ddDestination, DdNode *f, int *Permute)
 
int Abc_CascadeExperiment (char *pFileGeneric, DdManager *dd, DdNode **pOutputs, int nInputs, int nOutputs, int nLutSize, int fCheck, int fVerbose)
 EXTERNAL FUNCTIONS ///. More...
 
int CompareSupports (int *ptrX, int *ptrY)
 
int CompareMinterms (int *ptrX, int *ptrY)
 
int GrayCode (int BinCode)
 
void WriteDDintoBLIFfile (FILE *pFile, DdNode *Func, char *OutputName, char *Prefix, char **InputNames)
 BLIF WRITING FUNCTIONS ///. More...
 
void WriteDDintoBLIFfileReorder (DdManager *dd, FILE *pFile, DdNode *Func, char *OutputName, char *Prefix, char **InputNames)
 
static DdNode
*cuddBddTransferPermuteRecur 
ARGS ((DdManager *ddS, DdManager *ddD, DdNode *f, st__table *table, int *Permute))
 TRANSFER WITH MAPPING ///. More...
 
static DdNode
*cuddBddTransferPermute 
ARGS ((DdManager *ddS, DdManager *ddD, DdNode *f, int *Permute))
 
DdNodecuddBddTransferPermute (DdManager *ddS, DdManager *ddD, DdNode *f, int *Permute)
 
static DdNodecuddBddTransferPermuteRecur (DdManager *ddS, DdManager *ddD, DdNode *f, st__table *table, int *Permute)
 

Variables

static int s_SuppSize [MAXOUTPUTS]
 SINGLE OUTPUT FUNCTION ///. More...
 
static int s_MintOnes [MAXOUTPUTS]
 
static DdManagers_ddmin
 

Macro Definition Documentation

#define PRB_ (   f)    printf( #f " = " ); Cudd_bddPrint(dd,f); printf( "\n" )

Definition at line 59 of file casCore.c.

#define PRD (   p)    printf( "\nDECOMPOSITION TREE:\n\n" ); PrintDecEntry( (p), 0 )

static varibles ///

debugging macros ///

Definition at line 58 of file casCore.c.

#define PRK (   f,
 
)    Cudd_PrintKMap(stdout,dd,(f),Cudd_Not(f),(n),NULL,0); printf( "K-map for function" #f "\n\n" )

Definition at line 60 of file casCore.c.

#define PRK2 (   f,
  g,
 
)    Cudd_PrintKMap(stdout,dd,(f),(g),(n),NULL,0); printf( "K-map for function <" #f ", " #g ">\n\n" )

Definition at line 61 of file casCore.c.

Function Documentation

int Abc_CascadeExperiment ( char *  pFileGeneric,
DdManager dd,
DdNode **  pOutputs,
int  nInputs,
int  nOutputs,
int  nLutSize,
int  fCheck,
int  fVerbose 
)

EXTERNAL FUNCTIONS ///.

DECLARATIONS ///.

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 79 of file casCore.c.

80 {
81  int i;
82  int nVars = nInputs;
83  int nOuts = nOutputs;
84  abctime clk1;
85 
86  int nVarsEnc; // the number of additional variables to encode outputs
87  DdNode * pbVarsEnc[MAXOUTPUTS]; // the BDDs of the encoding vars
88 
89  int nNames; // the total number of all inputs
90  char * pNames[MAXINPUTS]; // the temporary storage for the input (and output encoding) names
91 
92  DdNode * aFunc; // the encoded 0-1 BDD containing all the outputs
93 
94  char FileNameIni[100];
95  char FileNameFin[100];
96  char Buffer[100];
97 
98 
99 //pTable = fopen( "stats.txt", "a+" );
100 //fprintf( pTable, "%s ", pFileGeneric );
101 //fprintf( pTable, "%d ", nVars );
102 //fprintf( pTable, "%d ", nOuts );
103 
104 
105  // assign the file names
106  strcpy( FileNameIni, pFileGeneric );
107  strcat( FileNameIni, "_ENC.blif" );
108 
109  strcpy( FileNameFin, pFileGeneric );
110  strcat( FileNameFin, "_LUT.blif" );
111 
112 
113  // create the variables to encode the outputs
114  nVarsEnc = Abc_Base2Log( nOuts );
115  for ( i = 0; i < nVarsEnc; i++ )
116  pbVarsEnc[i] = Cudd_bddNewVarAtLevel( dd, i );
117 
118 
119  // store the input names
120  nNames = nVars + nVarsEnc;
121  for ( i = 0; i < nVars; i++ )
122  {
123 // pNames[i] = Extra_UtilStrsav( pFunc->pInputNames[i] );
124  sprintf( Buffer, "pi%03d", i );
125  pNames[i] = Extra_UtilStrsav( Buffer );
126  }
127  // set the encoding variable name
128  for ( ; i < nNames; i++ )
129  {
130  sprintf( Buffer, "OutEnc_%02d", i-nVars );
131  pNames[i] = Extra_UtilStrsav( Buffer );
132  }
133 
134 
135  // print the variable order
136 // printf( "\n" );
137 // printf( "Variable order is: " );
138 // for ( i = 0; i < dd->size; i++ )
139 // printf( " %d", dd->invperm[i] );
140 // printf( "\n" );
141 
142  // derive the single-output function
143  clk1 = Abc_Clock();
144  aFunc = GetSingleOutputFunction( dd, pOutputs, nOuts, pbVarsEnc, nVarsEnc, fVerbose ); Cudd_Ref( aFunc );
145 // aFunc = GetSingleOutputFunctionRemapped( dd, pOutputs, nOuts, pbVarsEnc, nVarsEnc ); Cudd_Ref( aFunc );
146 // if ( fVerbose )
147 // printf( "Single-output function computation time = %.2f sec\n", (float)(Abc_Clock() - clk1)/(float)(CLOCKS_PER_SEC) );
148 
149 //fprintf( pTable, "%d ", Cudd_SharingSize( pOutputs, nOutputs ) );
150 //fprintf( pTable, "%d ", Extra_ProfileWidthSharingMax(dd, pOutputs, nOutputs) );
151 
152  // dispose of the multiple-output function
153 // Extra_Dissolve( pFunc );
154 
155  // reorder the single output function
156 // if ( fVerbose )
157 // printf( "Reordering variables...\n");
158  clk1 = Abc_Clock();
159 // if ( fVerbose )
160 // printf( "Node count before = %6d\n", Cudd_DagSize( aFunc ) );
161 // Cudd_ReduceHeap(dd, CUDD_REORDER_SIFT,1);
164 // Cudd_ReduceHeap(dd, CUDD_REORDER_SYMM_SIFT,1);
165 // Cudd_ReduceHeap(dd, CUDD_REORDER_SYMM_SIFT,1);
166 // Cudd_ReduceHeap(dd, CUDD_REORDER_SYMM_SIFT,1);
167 // Cudd_ReduceHeap(dd, CUDD_REORDER_SYMM_SIFT,1);
168  if ( fVerbose )
169  printf( "MTBDD reordered = %6d nodes\n", Cudd_DagSize( aFunc ) );
170  if ( fVerbose )
171  printf( "Variable reordering time = %.2f sec\n", (float)(Abc_Clock() - clk1)/(float)(CLOCKS_PER_SEC) );
172 // printf( "\n" );
173 // printf( "Variable order is: " );
174 // for ( i = 0; i < dd->size; i++ )
175 // printf( " %d", dd->invperm[i] );
176 // printf( "\n" );
177 //fprintf( pTable, "%d ", Cudd_DagSize( aFunc ) );
178 //fprintf( pTable, "%d ", Extra_ProfileWidthMax(dd, aFunc) );
179 
180  // write the single-output function into BLIF for verification
181  clk1 = Abc_Clock();
182  if ( fCheck )
183  WriteSingleOutputFunctionBlif( dd, aFunc, pNames, nNames, FileNameIni );
184 // if ( fVerbose )
185 // printf( "Single-output function writing time = %.2f sec\n", (float)(Abc_Clock() - clk1)/(float)(CLOCKS_PER_SEC) );
186 
187 /*
188  ///////////////////////////////////////////////////////////////////
189  // verification of single output function
190  clk1 = Abc_Clock();
191  {
192  BFunc g_Func;
193  DdNode * aRes;
194 
195  g_Func.dd = dd;
196  g_Func.FileInput = Extra_UtilStrsav(FileNameIni);
197 
198  if ( Extra_ReadFile( &g_Func ) == 0 )
199  {
200  printf( "\nSomething did not work out while reading the input file for verification\n");
201  Extra_Dissolve( &g_Func );
202  return;
203  }
204 
205  aRes = Cudd_BddToAdd( dd, g_Func.pOutputs[0] ); Cudd_Ref( aRes );
206 
207  if ( aRes != aFunc )
208  printf( "\nVerification FAILED!\n");
209  else
210  printf( "\nVerification okay!\n");
211 
212  Cudd_RecursiveDeref( dd, aRes );
213 
214  // delocate
215  Extra_Dissolve( &g_Func );
216  }
217  printf( "Preliminary verification time = %.2f sec\n", (float)(Abc_Clock() - clk1)/(float)(CLOCKS_PER_SEC) );
218  ///////////////////////////////////////////////////////////////////
219 */
220 
221  if ( !CreateDecomposedNetwork( dd, aFunc, pNames, nNames, FileNameFin, nLutSize, fCheck, fVerbose ) )
222  return 0;
223 
224 /*
225  ///////////////////////////////////////////////////////////////////
226  // verification of the decomposed LUT network
227  clk1 = Abc_Clock();
228  {
229  BFunc g_Func;
230  DdNode * aRes;
231 
232  g_Func.dd = dd;
233  g_Func.FileInput = Extra_UtilStrsav(FileNameFin);
234 
235  if ( Extra_ReadFile( &g_Func ) == 0 )
236  {
237  printf( "\nSomething did not work out while reading the input file for verification\n");
238  Extra_Dissolve( &g_Func );
239  return;
240  }
241 
242  aRes = Cudd_BddToAdd( dd, g_Func.pOutputs[0] ); Cudd_Ref( aRes );
243 
244  if ( aRes != aFunc )
245  printf( "\nFinal verification FAILED!\n");
246  else
247  printf( "\nFinal verification okay!\n");
248 
249  Cudd_RecursiveDeref( dd, aRes );
250 
251  // delocate
252  Extra_Dissolve( &g_Func );
253  }
254  printf( "Final verification time = %.2f sec\n", (float)(Abc_Clock() - clk1)/(float)(CLOCKS_PER_SEC) );
255  ///////////////////////////////////////////////////////////////////
256 */
257 
258  // verify the results
259  if ( fCheck )
260  {
261  char Command[200];
262  sprintf( Command, "cec %s %s", FileNameIni, FileNameFin );
264  }
265 
266  Cudd_RecursiveDeref( dd, aFunc );
267 
268  // release the names
269  for ( i = 0; i < nNames; i++ )
270  ABC_FREE( pNames[i] );
271 
272 
273 //fprintf( pTable, "\n" );
274 //fclose( pTable );
275 
276  return 1;
277 }
void Cudd_RecursiveDeref(DdManager *table, DdNode *n)
Definition: cuddRef.c:154
Definition: cudd.h:278
int Cmd_CommandExecute(void *pAbc, char *pCommandLine)
#define MAXINPUTS
INCLUDES ///.
Definition: cas.h:38
ABC_NAMESPACE_IMPL_START DdNode * GetSingleOutputFunction(DdManager *dd, DdNode **pbOuts, int nOuts, DdNode **pbVarsEnc, int nVarsEnc, int fVerbose)
static functions ///
Definition: casCore.c:508
void WriteSingleOutputFunctionBlif(DdManager *dd, DdNode *aFunc, char **pNames, int nNames, char *FileName)
Definition: casCore.c:781
static abctime Abc_Clock()
Definition: abc_global.h:279
char * Extra_UtilStrsav(const char *s)
int CreateDecomposedNetwork(DdManager *dd, DdNode *aFunc, char **pNames, int nNames, char *FileName, int nLutSize, int fCheck, int fVerbose)
EXTERNAL FUNCTIONS ///.
Definition: casDec.c:108
DdNode * Cudd_bddNewVarAtLevel(DdManager *dd, int level)
Definition: cuddAPI.c:351
void * Abc_FrameGetGlobalFrame()
Definition: mainFrame.c:593
char * sprintf()
char * strcpy()
#define ABC_FREE(obj)
Definition: abc_global.h:232
static int Abc_Base2Log(unsigned n)
Definition: abc_global.h:251
char * strcat()
int Cudd_ReduceHeap(DdManager *table, Cudd_ReorderingType heuristic, int minsize)
Definition: cuddReorder.c:176
void Cudd_Ref(DdNode *n)
Definition: cuddRef.c:129
#define MAXOUTPUTS
Definition: cas.h:39
ABC_INT64_T abctime
Definition: abc_global.h:278
int Cudd_DagSize(DdNode *node)
Definition: cuddUtil.c:442
static DdNode* cuddBddTransferPermuteRecur ARGS ( (DdManager *ddS, DdManager *ddD, DdNode *f, st__table *table, int *Permute)  )
static

TRANSFER WITH MAPPING ///.

static DdNode* cuddBddTransferPermute ARGS ( (DdManager *ddS, DdManager *ddD, DdNode *f, int *Permute)  )
static
int CompareMinterms ( int *  ptrX,
int *  ptrY 
)

Definition at line 486 of file casCore.c.

487 {
488  return ( s_MintOnes[*ptrY] - s_MintOnes[*ptrX] );
489 }
static int s_MintOnes[MAXOUTPUTS]
Definition: casCore.c:485
int CompareSupports ( int *  ptrX,
int *  ptrY 
)

Definition at line 477 of file casCore.c.

478 {
479  return ( s_SuppSize[*ptrY] - s_SuppSize[*ptrX] );
480 }
static int s_SuppSize[MAXOUTPUTS]
SINGLE OUTPUT FUNCTION ///.
Definition: casCore.c:476
int CreateDecomposedNetwork ( DdManager dd,
DdNode aFunc,
char **  pNames,
int  nNames,
char *  FileName,
int  nLutSize,
int  fCheck,
int  fVerbose 
)

EXTERNAL FUNCTIONS ///.

Definition at line 108 of file casDec.c.

113 {
114  static LUT * pLuts[MAXINPUTS]; // the LUT cascade
115  static int Profile[MAXINPUTS]; // the profile filled in with the info about the BDD width
116  static int Permute[MAXINPUTS]; // the array to store a temporary permutation of variables
117 
118  LUT * p; // the current LUT
119  int i, v;
120 
121  DdNode * bCVars[32]; // these are variables for the codes
122 
123  int nVarsRem; // the number of remaining variables
124  int PrevMulti; // column multiplicity on the previous level
125  int fLastLut; // flag to signal the last LUT
126  int nLuts;
127  int nLutsTotal = 0;
128  int nLutOutputs = 0;
129  int nLutOutputsOrig = 0;
130 
131  abctime clk1;
132 
133  s_LutSize = nLutSize;
134 
135  s_nFuncVars = nNames;
136 
137  // get the profile
138  clk1 = Abc_Clock();
139  Extra_ProfileWidth( dd, aFunc, Profile, -1 );
140 
141 
142 // for ( v = 0; v < nNames; v++ )
143 // printf( "Level = %2d, Width = %2d\n", v+1, Profile[v] );
144 
145 
146 //printf( "\n" );
147 
148  // mark-up the LUTs
149  // assuming that the manager has exactly nNames vars (new vars have not been introduced yet)
150  nVarsRem = nNames; // the number of remaining variables
151  PrevMulti = 0; // column multiplicity on the previous level
152  fLastLut = 0;
153  nLuts = 0;
154  do
155  {
156  p = (LUT*) ABC_ALLOC( char, sizeof(LUT) );
157  memset( p, 0, sizeof(LUT) );
158 
159  if ( nVarsRem + PrevMulti <= s_LutSize ) // this is the last LUT
160  {
161  p->nIns = nVarsRem + PrevMulti;
162  p->nInsP = PrevMulti;
163  p->nCols = 2;
164  p->nMulti = 1;
165  p->Level = nNames-nVarsRem;
166 
167  nVarsRem = 0;
168  PrevMulti = 1;
169 
170  fLastLut = 1;
171  }
172  else // this is not the last LUT
173  {
174  p->nIns = s_LutSize;
175  p->nInsP = PrevMulti;
176  p->nCols = Profile[nNames-(nVarsRem-(s_LutSize-PrevMulti))];
177  p->nMulti = Abc_Base2Log(p->nCols);
178  p->Level = nNames-nVarsRem;
179 
180  nVarsRem = nVarsRem-(s_LutSize-PrevMulti);
181  PrevMulti = p->nMulti;
182  }
183 
184  if ( p->nMulti >= s_LutSize )
185  {
186  printf( "The LUT size is too small\n" );
187  return 0;
188  }
189 
190  nLutOutputsOrig += p->nMulti;
191 
192 
193 //if ( fVerbose )
194 //printf( "Stage %2d: In = %3d, InP = %3d, Cols = %5d, Multi = %2d, Level = %2d\n",
195 // nLuts+1, p->nIns, p->nInsP, p->nCols, p->nMulti, p->Level );
196 
197 
198  // there should be as many columns, codes, and nodes, as there are columns on this level
199  p->pbCols = (DdNode **) ABC_ALLOC( char, p->nCols * sizeof(DdNode *) );
200  p->pbCodes = (DdNode **) ABC_ALLOC( char, p->nCols * sizeof(DdNode *) );
201  p->paNodes = (DdNode **) ABC_ALLOC( char, p->nCols * sizeof(DdNode *) );
202 
203  pLuts[nLuts] = p;
204  nLuts++;
205  }
206  while ( !fLastLut );
207 
208 
209 //if ( fVerbose )
210 //printf( "The number of cascades = %d\n", nLuts );
211 
212 
213 //fprintf( pTable, "%d ", nLuts );
214 
215 
216  // add the new variables at the bottom
217  for ( i = 0; i < s_LutSize; i++ )
218  bCVars[i] = Cudd_bddNewVar(dd);
219 
220  // for each LUT - assign the LUT and encode the columns
221  s_EncodingTime = 0;
222  for ( i = 0; i < nLuts; i++ )
223  {
224  int RetValue;
225  DdNode * bVars[32];
226  int nVars;
227  DdNode * bVarsInCube;
228  DdNode * bVarsCCube;
229  DdNode * bVarsCube;
230  int CutLevel;
231 
232  p = pLuts[i];
233 
234  // compute the columns of this LUT starting from the given set of nodes with the given codes
235  // (these codes have been remapped to depend on the topmost variables in the manager)
236  // for the first LUT, start with the constant 1 BDD
237  CutLevel = p->Level + p->nIns - p->nInsP;
238  if ( i == 0 )
240  dd, &aFunc, &(b1), 1,
241  p->paNodes, p->pbCols, CutLevel );
242  else
244  dd, pLuts[i-1]->paNodes, pLuts[i-1]->pbCodes, pLuts[i-1]->nCols,
245  p->paNodes, p->pbCols, CutLevel );
246  assert( RetValue == p->nCols );
247  // at this point, we have filled out p->paNodes[] and p->pbCols[] of this LUT
248  // pLuts[i-1]->paNodes depended on normal vars
249  // pLuts[i-1]->pbCodes depended on the topmost variables
250  // the resulting p->paNodes depend on normal ADD nodes
251  // the resulting p->pbCols depend on normal vars and topmost variables in the manager
252 
253  // perform the encoding
254 
255  // create the cube of these variables
256  // collect the topmost variables of the manager
257  nVars = p->nInsP;
258  for ( v = 0; v < nVars; v++ )
259  bVars[v] = dd->vars[ dd->invperm[v] ];
260  bVarsCCube = Extra_bddBitsToCube( dd, (1<<nVars)-1, nVars, bVars, 1 ); Cudd_Ref( bVarsCCube );
261 
262  // collect the primary input variables involved in this LUT
263  nVars = p->nIns - p->nInsP;
264  for ( v = 0; v < nVars; v++ )
265  bVars[v] = dd->vars[ dd->invperm[p->Level+v] ];
266  bVarsInCube = Extra_bddBitsToCube( dd, (1<<nVars)-1, nVars, bVars, 1 ); Cudd_Ref( bVarsInCube );
267 
268  // get the cube
269  bVarsCube = Cudd_bddAnd( dd, bVarsInCube, bVarsCCube ); Cudd_Ref( bVarsCube );
270  Cudd_RecursiveDeref( dd, bVarsInCube );
271  Cudd_RecursiveDeref( dd, bVarsCCube );
272 
273  // get the encoding relation
274  if ( i == nLuts -1 )
275  {
276  DdNode * bVar;
277  assert( p->nMulti == 1 );
278  assert( p->nCols == 2 );
279  assert( Cudd_IsConstant( p->paNodes[0] ) );
280  assert( Cudd_IsConstant( p->paNodes[1] ) );
281 
282  bVar = ( p->paNodes[0] == a1 )? bCVars[0]: Cudd_Not( bCVars[0] );
283  p->bRelation = Cudd_bddIte( dd, bVar, p->pbCols[0], p->pbCols[1] ); Cudd_Ref( p->bRelation );
284  }
285  else
286  {
287  abctime clk2 = Abc_Clock();
288 // p->bRelation = PerformTheEncoding( dd, p->pbCols, p->nCols, bVarsCube, bCVars, p->nMulti, &p->nSimple ); Cudd_Ref( p->bRelation );
289  p->bRelation = Extra_bddEncodingNonStrict( dd, p->pbCols, p->nCols, bVarsCube, bCVars, p->nMulti, &p->nSimple ); Cudd_Ref( p->bRelation );
290  s_EncodingTime += Abc_Clock() - clk2;
291  }
292 
293  // update the number of LUT outputs
294  nLutOutputs += (p->nMulti - p->nSimple);
295  nLutsTotal += p->nMulti;
296 
297 //if ( fVerbose )
298 //printf( "Stage %2d: Simple = %d\n", i+1, p->nSimple );
299 
300 if ( fVerbose )
301 printf( "Stage %3d: In = %3d InP = %3d Cols = %5d Multi = %2d Simple = %2d Level = %3d\n",
302  i+1, p->nIns, p->nInsP, p->nCols, p->nMulti, p->nSimple, p->Level );
303 
304  // get the codes from the relation (these are not necessarily cubes)
305  {
306  int c;
307  for ( c = 0; c < p->nCols; c++ )
308  {
309  p->pbCodes[c] = Cudd_bddAndAbstract( dd, p->bRelation, p->pbCols[c], bVarsCube ); Cudd_Ref( p->pbCodes[c] );
310  }
311  }
312 
313  Cudd_RecursiveDeref( dd, bVarsCube );
314 
315  // remap the codes to depend on the topmost varibles of the manager
316  // useful as a preparation for the next step
317  {
318  DdNode ** pbTemp;
319  int k, v;
320 
321  pbTemp = (DdNode **) ABC_ALLOC( char, p->nCols * sizeof(DdNode *) );
322 
323  // create the identical permutation
324  for ( v = 0; v < dd->size; v++ )
325  Permute[v] = v;
326 
327  // use the topmost variables of the manager
328  // to represent the previous level codes
329  for ( v = 0; v < p->nMulti; v++ )
330  Permute[bCVars[v]->index] = dd->invperm[v];
331 
332  Extra_bddPermuteArray( dd, p->pbCodes, pbTemp, p->nCols, Permute );
333  // the array pbTemp comes already referenced
334 
335  // deref the old codes and assign the new ones
336  for ( k = 0; k < p->nCols; k++ )
337  {
338  Cudd_RecursiveDeref( dd, p->pbCodes[k] );
339  p->pbCodes[k] = pbTemp[k];
340  }
341  ABC_FREE( pbTemp );
342  }
343  }
344  if ( fVerbose )
345  printf( "LUTs: Total = %5d. Final = %5d. Simple = %5d. (%6.2f %%) ",
346  nLutsTotal, nLutOutputs, nLutsTotal-nLutOutputs, 100.0*(nLutsTotal-nLutOutputs)/nLutsTotal );
347  if ( fVerbose )
348  printf( "Memory = %6.2f MB\n", 1.0*nLutOutputs*(1<<nLutSize)/(1<<20) );
349 // printf( "\n" );
350 
351 //fprintf( pTable, "%d ", nLutOutputsOrig );
352 //fprintf( pTable, "%d ", nLutOutputs );
353 
354  if ( fVerbose )
355  {
356  printf( "Pure decomposition time = %.2f sec\n", (float)(Abc_Clock() - clk1 - s_EncodingTime)/(float)(CLOCKS_PER_SEC) );
357  printf( "Encoding time = %.2f sec\n", (float)(s_EncodingTime)/(float)(CLOCKS_PER_SEC) );
358 // printf( "Encoding search time = %.2f sec\n", (float)(s_EncSearchTime)/(float)(CLOCKS_PER_SEC) );
359 // printf( "Encoding compute time = %.2f sec\n", (float)(s_EncComputeTime)/(float)(CLOCKS_PER_SEC) );
360  }
361 
362 
363 //fprintf( pTable, "%.2f ", (float)(s_ReadingTime)/(float)(CLOCKS_PER_SEC) );
364 //fprintf( pTable, "%.2f ", (float)(Abc_Clock() - clk1 - s_EncodingTime)/(float)(CLOCKS_PER_SEC) );
365 //fprintf( pTable, "%.2f ", (float)(s_EncodingTime)/(float)(CLOCKS_PER_SEC) );
366 //fprintf( pTable, "%.2f ", (float)(s_RemappingTime)/(float)(CLOCKS_PER_SEC) );
367 
368 
369  // write LUTs into the BLIF file
370  clk1 = Abc_Clock();
371  if ( fCheck )
372  {
373  FILE * pFile;
374  // start the file
375  pFile = fopen( FileName, "w" );
376  fprintf( pFile, ".model %s\n", FileName );
377 
378  fprintf( pFile, ".inputs" );
379  for ( i = 0; i < nNames; i++ )
380  fprintf( pFile, " %s", pNames[i] );
381  fprintf( pFile, "\n" );
382  fprintf( pFile, ".outputs F" );
383  fprintf( pFile, "\n" );
384 
385  // write the DD into the file
386  WriteLUTSintoBLIFfile( pFile, dd, pLuts, nLuts, bCVars, pNames, nNames, FileName );
387 
388  fprintf( pFile, ".end\n" );
389  fclose( pFile );
390  if ( fVerbose )
391  printf( "Output file writing time = %.2f sec\n", (float)(Abc_Clock() - clk1)/(float)(CLOCKS_PER_SEC) );
392  }
393 
394 
395  // updo the LUT cascade
396  for ( i = 0; i < nLuts; i++ )
397  {
398  p = pLuts[i];
399  for ( v = 0; v < p->nCols; v++ )
400  {
401  Cudd_RecursiveDeref( dd, p->pbCols[v] );
402  Cudd_RecursiveDeref( dd, p->pbCodes[v] );
403  Cudd_RecursiveDeref( dd, p->paNodes[v] );
404  }
405  Cudd_RecursiveDeref( dd, p->bRelation );
406 
407  ABC_FREE( p->pbCols );
408  ABC_FREE( p->pbCodes );
409  ABC_FREE( p->paNodes );
410  ABC_FREE( p );
411  }
412 
413  return 1;
414 }
char * memset()
DdNode * Cudd_bddNewVar(DdManager *dd)
Definition: cuddAPI.c:323
void Cudd_RecursiveDeref(DdManager *table, DdNode *n)
Definition: cuddRef.c:154
Definition: cudd.h:278
#define Cudd_Not(node)
Definition: cudd.h:367
void Extra_bddPermuteArray(DdManager *dd, DdNode **bNodesIn, DdNode **bNodesOut, int nNodes, int *permut)
Definition: extraBddMisc.c:961
static Llb_Mgr_t * p
Definition: llb3Image.c:950
int size
Definition: cuddInt.h:361
#define MAXINPUTS
INCLUDES ///.
Definition: cas.h:38
#define b1
Definition: extraBdd.h:76
#define Cudd_IsConstant(node)
Definition: cudd.h:352
static int s_nFuncVars
Definition: casDec.c:81
#define a1
Definition: extraBdd.h:80
DdNode * Extra_bddEncodingNonStrict(DdManager *dd, DdNode **pbColumns, int nColumns, DdNode *bVarsCol, DdNode **pCVars, int nMulti, int *pSimple)
Definition: extraBddCas.c:184
void WriteLUTSintoBLIFfile(FILE *pFile, DdManager *dd, LUT **pLuts, int nLuts, DdNode **bCVars, char **pNames, int nNames, char *FileName)
static functions ///
Definition: casDec.c:416
DdNode * bRelation
Definition: casDec.c:54
#define ABC_ALLOC(type, num)
Definition: abc_global.h:229
DdNode * Cudd_bddIte(DdManager *dd, DdNode *f, DdNode *g, DdNode *h)
Definition: cuddBddIte.c:143
static int s_LutSize
static varibles ///
Definition: casDec.c:80
static abctime Abc_Clock()
Definition: abc_global.h:279
int nMulti
Definition: casDec.c:40
DdNode ** pbCodes
Definition: casDec.c:51
DdNode * Cudd_bddAndAbstract(DdManager *manager, DdNode *f, DdNode *g, DdNode *cube)
Definition: cuddAndAbs.c:124
int Extra_bddNodePathsUnderCutArray(DdManager *dd, DdNode **paNodes, DdNode **pbCubes, int nNodes, DdNode **paNodesRes, DdNode **pbCubesRes, int CutLevel)
Definition: extraBddCas.c:355
int nCols
Definition: casDec.c:39
int nIns
Definition: casDec.c:37
#define ABC_FREE(obj)
Definition: abc_global.h:232
DdNode ** vars
Definition: cuddInt.h:390
static int Abc_Base2Log(unsigned n)
Definition: abc_global.h:251
int Extra_ProfileWidth(DdManager *dd, DdNode *F, int *Profile, int CutLevel)
Definition: extraBddCas.c:519
DdNode * Cudd_bddAnd(DdManager *dd, DdNode *f, DdNode *g)
Definition: cuddBddIte.c:314
DdNode * Extra_bddBitsToCube(DdManager *dd, int Code, int CodeWidth, DdNode **pbVars, int fMsbFirst)
Definition: extraBddMisc.c:730
DdNode ** paNodes
Definition: casDec.c:52
#define assert(ex)
Definition: util_old.h:213
int * invperm
Definition: cuddInt.h:388
int nSimple
Definition: casDec.c:41
void Cudd_Ref(DdNode *n)
Definition: cuddRef.c:129
ABC_INT64_T abctime
Definition: abc_global.h:278
type definitions ///
Definition: casDec.c:35
int nInsP
Definition: casDec.c:38
int Level
Definition: casDec.c:42
DdNode ** pbCols
Definition: casDec.c:50
long s_EncodingTime
Definition: casDec.c:83
DdNode * Cudd_bddTransferPermute ( DdManager ddSource,
DdManager ddDestination,
DdNode f,
int *  Permute 
)

Function********************************************************************

Synopsis [Convert a BDD from a manager to another one.]

Description [Convert a BDD from a manager to another one. The orders of the variables in the two managers may be different. Returns a pointer to the BDD in the destination manager if successful; NULL otherwise. The i-th entry in the array Permute tells what is the index of the i-th variable from the old manager in the new manager.]

SideEffects [None]

SeeAlso []

Definition at line 1094 of file casCore.c.

1096 {
1097  DdNode *res;
1098  do
1099  {
1100  ddDestination->reordered = 0;
1101  res = cuddBddTransferPermute( ddSource, ddDestination, f, Permute );
1102  }
1103  while ( ddDestination->reordered == 1 );
1104  return ( res );
1105 
1106 } /* end of Cudd_bddTransferPermute */
Definition: cudd.h:278
DdNode * cuddBddTransferPermute(DdManager *ddS, DdManager *ddD, DdNode *f, int *Permute)
Definition: casCore.c:1128
int reordered
Definition: cuddInt.h:409
DdNode* cuddBddTransferPermute ( DdManager ddS,
DdManager ddD,
DdNode f,
int *  Permute 
)

Function********************************************************************

Synopsis [Convert a BDD from a manager to another one.]

Description [Convert a BDD from a manager to another one. Returns a pointer to the BDD in the destination manager if successful; NULL otherwise.]

SideEffects [None]

SeeAlso [Cudd_bddTransferPermute]

Definition at line 1128 of file casCore.c.

1129 {
1130  DdNode *res;
1131  st__table *table = NULL;
1132  st__generator *gen = NULL;
1133  DdNode *key, *value;
1134 
1136  if ( table == NULL )
1137  goto failure;
1138  res = cuddBddTransferPermuteRecur( ddS, ddD, f, table, Permute );
1139  if ( res != NULL )
1140  cuddRef( res );
1141 
1142  /* Dereference all elements in the table and dispose of the table.
1143  ** This must be done also if res is NULL to avoid leaks in case of
1144  ** reordering. */
1145  gen = st__init_gen( table );
1146  if ( gen == NULL )
1147  goto failure;
1148  while ( st__gen( gen, ( const char ** ) &key, ( char ** ) &value ) )
1149  {
1150  Cudd_RecursiveDeref( ddD, value );
1151  }
1152  st__free_gen( gen );
1153  gen = NULL;
1154  st__free_table( table );
1155  table = NULL;
1156 
1157  if ( res != NULL )
1158  cuddDeref( res );
1159  return ( res );
1160 
1161  failure:
1162  if ( table != NULL )
1163  st__free_table( table );
1164  if ( gen != NULL )
1165  st__free_gen( gen );
1166  return ( NULL );
1167 
1168 } /* end of cuddBddTransferPermute */
void st__free_table(st__table *table)
Definition: st.c:81
#define cuddRef(n)
Definition: cuddInt.h:584
#define cuddDeref(n)
Definition: cuddInt.h:604
void Cudd_RecursiveDeref(DdManager *table, DdNode *n)
Definition: cuddRef.c:154
Definition: cudd.h:278
void st__free_gen(st__generator *gen)
Definition: st.c:556
int st__ptrcmp(const char *, const char *)
Definition: st.c:480
st__table * st__init_table(st__compare_func_type compare, st__hash_func_type hash)
Definition: st.c:72
static DdNode * cuddBddTransferPermuteRecur(DdManager *ddS, DdManager *ddD, DdNode *f, st__table *table, int *Permute)
Definition: casCore.c:1184
Definition: st.h:52
st__generator * st__init_gen(st__table *table)
Definition: st.c:486
enum keys key
int value
int st__ptrhash(const char *, int)
Definition: st.c:468
int st__gen(st__generator *gen, const char **key_p, char **value_p)
Definition: st.c:502
static DdNode* cuddBddTransferPermuteRecur ( DdManager ddS,
DdManager ddD,
DdNode f,
st__table table,
int *  Permute 
)
static

Function********************************************************************

Synopsis [Performs the recursive step of Cudd_bddTransferPermute.]

Description [Performs the recursive step of Cudd_bddTransferPermute. Returns a pointer to the result if successful; NULL otherwise.]

SideEffects [None]

SeeAlso [cuddBddTransferPermute]

Definition at line 1184 of file casCore.c.

1186 {
1187  DdNode *ft, *fe, *t, *e, *var, *res;
1188  DdNode *one, *zero;
1189  int index;
1190  int comple = 0;
1191 
1192  statLine( ddD );
1193  one = DD_ONE( ddD );
1194  comple = Cudd_IsComplement( f );
1195 
1196  /* Trivial cases. */
1197  if ( Cudd_IsConstant( f ) )
1198  return ( Cudd_NotCond( one, comple ) );
1199 
1200  /* Make canonical to increase the utilization of the cache. */
1201  f = Cudd_NotCond( f, comple );
1202  /* Now f is a regular pointer to a non-constant node. */
1203 
1204  /* Check the cache. */
1205  if ( st__lookup( table, ( char * ) f, ( char ** ) &res ) )
1206  return ( Cudd_NotCond( res, comple ) );
1207 
1208  /* Recursive step. */
1209  index = Permute[f->index];
1210  ft = cuddT( f );
1211  fe = cuddE( f );
1212 
1213  t = cuddBddTransferPermuteRecur( ddS, ddD, ft, table, Permute );
1214  if ( t == NULL )
1215  {
1216  return ( NULL );
1217  }
1218  cuddRef( t );
1219 
1220  e = cuddBddTransferPermuteRecur( ddS, ddD, fe, table, Permute );
1221  if ( e == NULL )
1222  {
1223  Cudd_RecursiveDeref( ddD, t );
1224  return ( NULL );
1225  }
1226  cuddRef( e );
1227 
1228  zero = Cudd_Not( one );
1229  var = cuddUniqueInter( ddD, index, one, zero );
1230  if ( var == NULL )
1231  {
1232  Cudd_RecursiveDeref( ddD, t );
1233  Cudd_RecursiveDeref( ddD, e );
1234  return ( NULL );
1235  }
1236  res = cuddBddIteRecur( ddD, var, t, e );
1237  if ( res == NULL )
1238  {
1239  Cudd_RecursiveDeref( ddD, t );
1240  Cudd_RecursiveDeref( ddD, e );
1241  return ( NULL );
1242  }
1243  cuddRef( res );
1244  Cudd_RecursiveDeref( ddD, t );
1245  Cudd_RecursiveDeref( ddD, e );
1246 
1247  if ( st__add_direct( table, ( char * ) f, ( char * ) res ) ==
1248  st__OUT_OF_MEM )
1249  {
1250  Cudd_RecursiveDeref( ddD, res );
1251  return ( NULL );
1252  }
1253  return ( Cudd_NotCond( res, comple ) );
1254 
1255 } /* end of cuddBddTransferPermuteRecur */
#define cuddRef(n)
Definition: cuddInt.h:584
void Cudd_RecursiveDeref(DdManager *table, DdNode *n)
Definition: cuddRef.c:154
Definition: cudd.h:278
#define Cudd_Not(node)
Definition: cudd.h:367
int var(Lit p)
Definition: SolverTypes.h:62
#define Cudd_IsConstant(node)
Definition: cudd.h:352
#define statLine(dd)
Definition: cuddInt.h:1037
static DdNode * cuddBddTransferPermuteRecur(DdManager *ddS, DdManager *ddD, DdNode *f, st__table *table, int *Permute)
Definition: casCore.c:1184
#define Cudd_IsComplement(node)
Definition: cudd.h:425
static DdNode * one
Definition: cuddDecomp.c:112
#define cuddT(node)
Definition: cuddInt.h:636
#define st__OUT_OF_MEM
Definition: st.h:113
int st__lookup(st__table *table, const char *key, char **value)
Definition: st.c:114
DdHalfWord index
Definition: cudd.h:279
#define cuddE(node)
Definition: cuddInt.h:652
int st__add_direct(st__table *table, char *key, char *value)
Definition: st.c:205
#define Cudd_NotCond(node, c)
Definition: cudd.h:383
#define DD_ONE(dd)
Definition: cuddInt.h:911
DdNode * cuddUniqueInter(DdManager *unique, int index, DdNode *T, DdNode *E)
Definition: cuddTable.c:1128
static DdNode * zero
Definition: cuddApa.c:100
DdNode * cuddBddIteRecur(DdManager *dd, DdNode *f, DdNode *g, DdNode *h)
Definition: cuddBddIte.c:633
DdNode * GetSingleOutputFunction ( DdManager dd,
DdNode **  pbOuts,
int  nOuts,
DdNode **  pbVarsEnc,
int  nVarsEnc,
int  fVerbose 
)

static functions ///

CFile****************************************************************

FileName [casCore.c]

SystemName [ABC: Logic synthesis and verification system.]

PackageName [CASCADE: Decomposition of shared BDDs into a LUT cascade.]

Synopsis [Entrance into the implementation.]

Author [Alan Mishchenko]

Affiliation [UC Berkeley]

Date [Ver. 1.0. Started - Spring 2002.]

Revision [

Id:
casCore.c,v 1.0 2002/01/01 00:00:00 alanmi Exp

]

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 508 of file casCore.c.

509 {
510  int i;
511  DdNode * bResult, * aResult;
512  DdNode * bCube, * bTemp, * bProd;
513 
514  int Order[MAXOUTPUTS];
515 // int OrderMint[MAXOUTPUTS];
516 
517  // sort the output according to their support size
518  for ( i = 0; i < nOuts; i++ )
519  {
520  s_SuppSize[i] = Cudd_SupportSize( dd, pbOuts[i] );
521 // s_MintOnes[i] = BitCount8[i];
522  Order[i] = i;
523 // OrderMint[i] = i;
524  }
525 
526  // order the outputs
527  qsort( (void*)Order, nOuts, sizeof(int), (int(*)(const void*, const void*)) CompareSupports );
528  // order the outputs
529 // qsort( (void*)OrderMint, nOuts, sizeof(int), (int(*)(const void*, const void*)) CompareMinterms );
530 
531 
532  bResult = b0; Cudd_Ref( bResult );
533  for ( i = 0; i < nOuts; i++ )
534  {
535 // bCube = Cudd_bddBitsToCube( dd, OrderMint[i], nVarsEnc, pbVarsEnc ); Cudd_Ref( bCube );
536 // bProd = Cudd_bddAnd( dd, bCube, pbOuts[Order[nOuts-1-i]] ); Cudd_Ref( bProd );
537  bCube = Extra_bddBitsToCube( dd, i, nVarsEnc, pbVarsEnc, 1 ); Cudd_Ref( bCube );
538  bProd = Cudd_bddAnd( dd, bCube, pbOuts[Order[i]] ); Cudd_Ref( bProd );
539  Cudd_RecursiveDeref( dd, bCube );
540 
541  bResult = Cudd_bddOr( dd, bProd, bTemp = bResult ); Cudd_Ref( bResult );
542  Cudd_RecursiveDeref( dd, bTemp );
543  Cudd_RecursiveDeref( dd, bProd );
544  }
545 
546  // convert to the ADD
547 if ( fVerbose )
548 printf( "Single BDD size = %6d nodes\n", Cudd_DagSize(bResult) );
549  aResult = Cudd_BddToAdd( dd, bResult ); Cudd_Ref( aResult );
550  Cudd_RecursiveDeref( dd, bResult );
551 if ( fVerbose )
552 printf( "MTBDD = %6d nodes\n", Cudd_DagSize(aResult) );
553  Cudd_Deref( aResult );
554  return aResult;
555 }
void Cudd_RecursiveDeref(DdManager *table, DdNode *n)
Definition: cuddRef.c:154
Definition: cudd.h:278
void Cudd_Deref(DdNode *node)
Definition: cuddRef.c:438
static int s_SuppSize[MAXOUTPUTS]
SINGLE OUTPUT FUNCTION ///.
Definition: casCore.c:476
int CompareSupports(int *ptrX, int *ptrY)
Definition: casCore.c:477
DdNode * Cudd_BddToAdd(DdManager *dd, DdNode *B)
Definition: cuddBridge.c:349
DdNode * Cudd_bddOr(DdManager *dd, DdNode *f, DdNode *g)
Definition: cuddBddIte.c:381
#define b0
Definition: extraBdd.h:75
DdNode * Cudd_bddAnd(DdManager *dd, DdNode *f, DdNode *g)
Definition: cuddBddIte.c:314
DdNode * Extra_bddBitsToCube(DdManager *dd, int Code, int CodeWidth, DdNode **pbVars, int fMsbFirst)
Definition: extraBddMisc.c:730
void Cudd_Ref(DdNode *n)
Definition: cuddRef.c:129
#define MAXOUTPUTS
Definition: cas.h:39
int Cudd_SupportSize(DdManager *dd, DdNode *f)
Definition: cuddUtil.c:857
int Cudd_DagSize(DdNode *node)
Definition: cuddUtil.c:442
DdNode * GetSingleOutputFunctionRemapped ( DdManager dd,
DdNode **  pOutputs,
int  nOuts,
DdNode **  pbVarsEnc,
int  nVarsEnc 
)

INPUT REMAPPING ///.

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 602 of file casCore.c.

604 {
605  static int Permute[MAXINPUTS];
606  static DdNode * pRemapped[MAXOUTPUTS];
607 
608  DdNode * bSupp, * bTemp;
609  int i, Counter;
610  DdNode * bFunc;
611  DdNode * aFunc;
612 
614 
615  // perform the remapping
616  for ( i = 0; i < nOuts; i++ )
617  {
618  // get support
619  bSupp = Cudd_Support( dd, pOutputs[i] ); Cudd_Ref( bSupp );
620 
621  // create the variable map
622  Counter = 0;
623  for ( bTemp = bSupp; bTemp != dd->one; bTemp = cuddT(bTemp) )
624  Permute[bTemp->index] = Counter++;
625 
626  // transfer the BDD and remap it
627  pRemapped[i] = Cudd_bddPermute( dd, pOutputs[i], Permute ); Cudd_Ref( pRemapped[i] );
628 
629  // remove support
630  Cudd_RecursiveDeref( dd, bSupp );
631  }
632 
633  // perform the encoding
634  bFunc = Extra_bddEncodingBinary( dd, pRemapped, nOuts, pbVarsEnc, nVarsEnc ); Cudd_Ref( bFunc );
635 
636  // convert to ADD
637  aFunc = Cudd_BddToAdd( dd, bFunc ); Cudd_Ref( aFunc );
638  Cudd_RecursiveDeref( dd, bFunc );
639 
640  // deref the intermediate results
641  for ( i = 0; i < nOuts; i++ )
642  Cudd_RecursiveDeref( dd, pRemapped[i] );
643 
644  Cudd_Deref( aFunc );
645  return aFunc;
646 }
void Cudd_RecursiveDeref(DdManager *table, DdNode *n)
Definition: cuddRef.c:154
Definition: cudd.h:278
DdNode * Cudd_Support(DdManager *dd, DdNode *f)
Definition: cuddUtil.c:740
void Cudd_Deref(DdNode *node)
Definition: cuddRef.c:438
#define MAXINPUTS
INCLUDES ///.
Definition: cas.h:38
DdNode * Cudd_bddPermute(DdManager *manager, DdNode *node, int *permut)
Definition: cuddCompose.c:332
DdNode * Extra_bddEncodingBinary(DdManager *dd, DdNode **pbFuncs, int nFuncs, DdNode **pbVars, int nVars)
Definition: extraBddCas.c:138
DdNode * Cudd_BddToAdd(DdManager *dd, DdNode *B)
Definition: cuddBridge.c:349
static int Counter
#define cuddT(node)
Definition: cuddInt.h:636
void Cudd_AutodynDisable(DdManager *unique)
Definition: cuddAPI.c:708
DdHalfWord index
Definition: cudd.h:279
DdNode * one
Definition: cuddInt.h:345
void Cudd_Ref(DdNode *n)
Definition: cuddRef.c:129
#define MAXOUTPUTS
Definition: cas.h:39
DdNode * GetSingleOutputFunctionRemappedNewDD ( DdManager dd,
DdNode **  pOutputs,
int  nOuts,
DdManager **  DdNew 
)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 660 of file casCore.c.

662 {
663  static int Permute[MAXINPUTS];
664  static DdNode * pRemapped[MAXOUTPUTS];
665 
666  static DdNode * pbVarsEnc[MAXINPUTS];
667  int nVarsEnc;
668 
669  DdManager * ddnew;
670 
671  DdNode * bSupp, * bTemp;
672  int i, v, Counter;
673  DdNode * bFunc;
674 
675  // these are in the new manager
676  DdNode * bFuncNew;
677  DdNode * aFuncNew;
678 
679  int nVarsMax = 0;
680 
681  // perform the remapping and write the DDs into the new manager
682  for ( i = 0; i < nOuts; i++ )
683  {
684  // get support
685  bSupp = Cudd_Support( dd, pOutputs[i] ); Cudd_Ref( bSupp );
686 
687  // create the variable map
688  // to remap the DD into the upper part of the manager
689  Counter = 0;
690  for ( bTemp = bSupp; bTemp != dd->one; bTemp = cuddT(bTemp) )
691  Permute[bTemp->index] = dd->invperm[Counter++];
692 
693  // transfer the BDD and remap it
694  pRemapped[i] = Cudd_bddPermute( dd, pOutputs[i], Permute ); Cudd_Ref( pRemapped[i] );
695 
696  // remove support
697  Cudd_RecursiveDeref( dd, bSupp );
698 
699 
700  // determine the largest support size
701  if ( nVarsMax < Counter )
702  nVarsMax = Counter;
703  }
704 
705  // select the encoding variables to follow immediately after the original variables
706  nVarsEnc = Abc_Base2Log(nOuts);
707 /*
708  for ( v = 0; v < nVarsEnc; v++ )
709  if ( nVarsMax + v < dd->size )
710  pbVarsEnc[v] = dd->var[ dd->invperm[nVarsMax+v] ];
711  else
712  pbVarsEnc[v] = Cudd_bddNewVar( dd );
713 */
714  // create the new variables on top of the manager
715  for ( v = 0; v < nVarsEnc; v++ )
716  pbVarsEnc[v] = Cudd_bddNewVarAtLevel( dd, v );
717 
718 //fprintf( pTable, "%d ", Cudd_SharingSize( pRemapped, nOuts ) );
719 //fprintf( pTable, "%d ", Extra_ProfileWidthSharingMax(dd, pRemapped, nOuts) );
720 
721 
722  // perform the encoding
723  bFunc = Extra_bddEncodingBinary( dd, pRemapped, nOuts, pbVarsEnc, nVarsEnc ); Cudd_Ref( bFunc );
724 
725 
726  // find the cross-manager permutation
727  // the variable from the level v in the old manager
728  // should become a variable number v in the new manager
729  for ( v = 0; v < nVarsMax + nVarsEnc; v++ )
730  Permute[dd->invperm[v]] = v;
731 
732 
733  ///////////////////////////////////////////////////////////////////////////////
734  // start the new manager
735  ddnew = Cudd_Init( nVarsMax + nVarsEnc, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0);
736 // Cudd_AutodynDisable(ddnew);
738 
739  // transfer it to the new manager
740  bFuncNew = Cudd_bddTransferPermute( dd, ddnew, bFunc, Permute ); Cudd_Ref( bFuncNew );
741  ///////////////////////////////////////////////////////////////////////////////
742 
743 
744  // deref the intermediate results in the old manager
745  Cudd_RecursiveDeref( dd, bFunc );
746  for ( i = 0; i < nOuts; i++ )
747  Cudd_RecursiveDeref( dd, pRemapped[i] );
748 
749 
750  ///////////////////////////////////////////////////////////////////////////////
751  // convert to ADD in the new manager
752  aFuncNew = Cudd_BddToAdd( ddnew, bFuncNew ); Cudd_Ref( aFuncNew );
753  Cudd_RecursiveDeref( ddnew, bFuncNew );
754 
755  // return the manager
756  *DdNew = ddnew;
757  ///////////////////////////////////////////////////////////////////////////////
758 
759  Cudd_Deref( aFuncNew );
760  return aFuncNew;
761 }
#define CUDD_UNIQUE_SLOTS
Definition: cudd.h:97
void Cudd_RecursiveDeref(DdManager *table, DdNode *n)
Definition: cuddRef.c:154
Definition: cudd.h:278
DdNode * Cudd_bddTransferPermute(DdManager *ddSource, DdManager *ddDestination, DdNode *f, int *Permute)
Definition: casCore.c:1094
DdNode * Cudd_Support(DdManager *dd, DdNode *f)
Definition: cuddUtil.c:740
void Cudd_Deref(DdNode *node)
Definition: cuddRef.c:438
#define MAXINPUTS
INCLUDES ///.
Definition: cas.h:38
#define CUDD_CACHE_SLOTS
Definition: cudd.h:98
DdNode * Cudd_bddNewVarAtLevel(DdManager *dd, int level)
Definition: cuddAPI.c:351
DdNode * Cudd_bddPermute(DdManager *manager, DdNode *node, int *permut)
Definition: cuddCompose.c:332
DdManager * Cudd_Init(unsigned int numVars, unsigned int numVarsZ, unsigned int numSlots, unsigned int cacheSize, unsigned long maxMemory)
Definition: cuddInit.c:125
DdNode * Extra_bddEncodingBinary(DdManager *dd, DdNode **pbFuncs, int nFuncs, DdNode **pbVars, int nVars)
Definition: extraBddCas.c:138
DdNode * Cudd_BddToAdd(DdManager *dd, DdNode *B)
Definition: cuddBridge.c:349
static int Counter
#define cuddT(node)
Definition: cuddInt.h:636
DdHalfWord index
Definition: cudd.h:279
static int Abc_Base2Log(unsigned n)
Definition: abc_global.h:251
DdNode * one
Definition: cuddInt.h:345
int * invperm
Definition: cuddInt.h:388
void Cudd_AutodynEnable(DdManager *unique, Cudd_ReorderingType method)
Definition: cuddAPI.c:669
void Cudd_Ref(DdNode *n)
Definition: cuddRef.c:129
#define MAXOUTPUTS
Definition: cas.h:39
int GrayCode ( int  BinCode)

Function********************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 492 of file casCore.c.

493 {
494  return BinCode ^ ( BinCode >> 1 );
495 }
static int BinCode(int GrayCode)
Definition: extraBddKmap.c:867
void WriteDDintoBLIFfile ( FILE *  pFile,
DdNode Func,
char *  OutputName,
char *  Prefix,
char **  InputNames 
)

BLIF WRITING FUNCTIONS ///.

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 815 of file casCore.c.

822 {
823  int i;
824  st__table * visited;
825  st__generator * gen = NULL;
826  long refAddr, diff, mask;
827  DdNode * Node, * Else, * ElseR, * Then;
828 
829  /* Initialize symbol table for visited nodes. */
830  visited = st__init_table( st__ptrcmp, st__ptrhash );
831 
832  /* Collect all the nodes of this DD in the symbol table. */
833  cuddCollectNodes( Cudd_Regular(Func), visited );
834 
835  /* Find how many most significant hex digits are identical
836  ** in the addresses of all the nodes. Build a mask based
837  ** on this knowledge, so that digits that carry no information
838  ** will not be printed. This is done in two steps.
839  ** 1. We scan the symbol table to find the bits that differ
840  ** in at least 2 addresses.
841  ** 2. We choose one of the possible masks. There are 8 possible
842  ** masks for 32-bit integer, and 16 possible masks for 64-bit
843  ** integers.
844  */
845 
846  /* Find the bits that are different. */
847  refAddr = ( long )Cudd_Regular(Func);
848  diff = 0;
849  gen = st__init_gen( visited );
850  while ( st__gen( gen, ( const char ** ) &Node, NULL ) )
851  {
852  diff |= refAddr ^ ( long ) Node;
853  }
854  st__free_gen( gen );
855  gen = NULL;
856 
857  /* Choose the mask. */
858  for ( i = 0; ( unsigned ) i < 8 * sizeof( long ); i += 4 )
859  {
860  mask = ( 1 << i ) - 1;
861  if ( diff <= mask )
862  break;
863  }
864 
865 
866  // write the buffer for the output
867  fprintf( pFile, ".names %s%lx %s\n", Prefix, ( mask & (long)Cudd_Regular(Func) ) / sizeof(DdNode), OutputName );
868  fprintf( pFile, "%s 1\n", (Cudd_IsComplement(Func))? "0": "1" );
869 
870 
871  gen = st__init_gen( visited );
872  while ( st__gen( gen, ( const char ** ) &Node, NULL ) )
873  {
874  if ( Node->index == CUDD_MAXINDEX )
875  {
876  // write the terminal node
877  fprintf( pFile, ".names %s%lx\n", Prefix, ( mask & (long)Node ) / sizeof(DdNode) );
878  fprintf( pFile, " %s\n", (cuddV(Node) == 0.0)? "0": "1" );
879  continue;
880  }
881 
882  Else = cuddE(Node);
883  ElseR = Cudd_Regular(Else);
884  Then = cuddT(Node);
885 
886  assert( InputNames[Node->index] );
887  if ( Else == ElseR )
888  { // no inverter
889  fprintf( pFile, ".names %s %s%lx %s%lx %s%lx\n", InputNames[Node->index],
890  Prefix, ( mask & (long)ElseR ) / sizeof(DdNode),
891  Prefix, ( mask & (long)Then ) / sizeof(DdNode),
892  Prefix, ( mask & (long)Node ) / sizeof(DdNode) );
893  fprintf( pFile, "01- 1\n" );
894  fprintf( pFile, "1-1 1\n" );
895  }
896  else
897  { // inverter
898  int * pSlot;
899  fprintf( pFile, ".names %s %s%lx_i %s%lx %s%lx\n", InputNames[Node->index],
900  Prefix, ( mask & (long)ElseR ) / sizeof(DdNode),
901  Prefix, ( mask & (long)Then ) / sizeof(DdNode),
902  Prefix, ( mask & (long)Node ) / sizeof(DdNode) );
903  fprintf( pFile, "01- 1\n" );
904  fprintf( pFile, "1-1 1\n" );
905 
906  // if the inverter is written, skip
907  if ( ! st__find( visited, (char *)ElseR, (char ***)&pSlot ) )
908  assert( 0 );
909  if ( *pSlot )
910  continue;
911  *pSlot = 1;
912 
913  fprintf( pFile, ".names %s%lx %s%lx_i\n",
914  Prefix, ( mask & (long)ElseR ) / sizeof(DdNode),
915  Prefix, ( mask & (long)ElseR ) / sizeof(DdNode) );
916  fprintf( pFile, "0 1\n" );
917  }
918  }
919  st__free_gen( gen );
920  gen = NULL;
921  st__free_table( visited );
922 }
void st__free_table(st__table *table)
Definition: st.c:81
Definition: cudd.h:278
void st__free_gen(st__generator *gen)
Definition: st.c:556
#define Cudd_Regular(node)
Definition: cudd.h:397
int st__ptrcmp(const char *, const char *)
Definition: st.c:480
#define cuddV(node)
Definition: cuddInt.h:668
st__table * st__init_table(st__compare_func_type compare, st__hash_func_type hash)
Definition: st.c:72
#define Cudd_IsComplement(node)
Definition: cudd.h:425
Definition: st.h:52
#define cuddT(node)
Definition: cuddInt.h:636
int st__find(st__table *table, char *key, char ***slot)
Definition: st.c:264
st__generator * st__init_gen(st__table *table)
Definition: st.c:486
DdHalfWord index
Definition: cudd.h:279
#define CUDD_MAXINDEX
Definition: cudd.h:112
#define cuddE(node)
Definition: cuddInt.h:652
int cuddCollectNodes(DdNode *f, st__table *visited)
Definition: cuddUtil.c:2925
#define assert(ex)
Definition: util_old.h:213
int st__ptrhash(const char *, int)
Definition: st.c:468
int st__gen(st__generator *gen, const char **key_p, char **value_p)
Definition: st.c:502
void WriteDDintoBLIFfileReorder ( DdManager dd,
FILE *  pFile,
DdNode Func,
char *  OutputName,
char *  Prefix,
char **  InputNames 
)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 940 of file casCore.c.

947 {
948  int i;
949  st__table * visited;
950  st__generator * gen = NULL;
951  long refAddr, diff, mask;
952  DdNode * Node, * Else, * ElseR, * Then;
953 
954 
955  ///////////////////////////////////////////////////////////////
956  DdNode * bFmin;
957  abctime clk1;
958 
959  if ( s_ddmin == NULL )
961 
962  clk1 = Abc_Clock();
963  bFmin = Cudd_bddTransfer( dd, s_ddmin, Func ); Cudd_Ref( bFmin );
964 
965  // reorder
966  printf( "Nodes before = %d. ", Cudd_DagSize(bFmin) );
968 // Cudd_ReduceHeap(s_ddmin,CUDD_REORDER_SYMM_SIFT_CONV,1);
969  printf( "Nodes after = %d. \n", Cudd_DagSize(bFmin) );
970  ///////////////////////////////////////////////////////////////
971 
972 
973 
974  /* Initialize symbol table for visited nodes. */
975  visited = st__init_table( st__ptrcmp, st__ptrhash );
976 
977  /* Collect all the nodes of this DD in the symbol table. */
978  cuddCollectNodes( Cudd_Regular(bFmin), visited );
979 
980  /* Find how many most significant hex digits are identical
981  ** in the addresses of all the nodes. Build a mask based
982  ** on this knowledge, so that digits that carry no information
983  ** will not be printed. This is done in two steps.
984  ** 1. We scan the symbol table to find the bits that differ
985  ** in at least 2 addresses.
986  ** 2. We choose one of the possible masks. There are 8 possible
987  ** masks for 32-bit integer, and 16 possible masks for 64-bit
988  ** integers.
989  */
990 
991  /* Find the bits that are different. */
992  refAddr = ( long )Cudd_Regular(bFmin);
993  diff = 0;
994  gen = st__init_gen( visited );
995  while ( st__gen( gen, ( const char ** ) &Node, NULL ) )
996  {
997  diff |= refAddr ^ ( long ) Node;
998  }
999  st__free_gen( gen );
1000  gen = NULL;
1001 
1002  /* Choose the mask. */
1003  for ( i = 0; ( unsigned ) i < 8 * sizeof( long ); i += 4 )
1004  {
1005  mask = ( 1 << i ) - 1;
1006  if ( diff <= mask )
1007  break;
1008  }
1009 
1010 
1011  // write the buffer for the output
1012  fprintf( pFile, ".names %s%lx %s\n", Prefix, ( mask & (long)Cudd_Regular(bFmin) ) / sizeof(DdNode), OutputName );
1013  fprintf( pFile, "%s 1\n", (Cudd_IsComplement(bFmin))? "0": "1" );
1014 
1015 
1016  gen = st__init_gen( visited );
1017  while ( st__gen( gen, ( const char ** ) &Node, NULL ) )
1018  {
1019  if ( Node->index == CUDD_MAXINDEX )
1020  {
1021  // write the terminal node
1022  fprintf( pFile, ".names %s%lx\n", Prefix, ( mask & (long)Node ) / sizeof(DdNode) );
1023  fprintf( pFile, " %s\n", (cuddV(Node) == 0.0)? "0": "1" );
1024  continue;
1025  }
1026 
1027  Else = cuddE(Node);
1028  ElseR = Cudd_Regular(Else);
1029  Then = cuddT(Node);
1030 
1031  assert( InputNames[Node->index] );
1032  if ( Else == ElseR )
1033  { // no inverter
1034  fprintf( pFile, ".names %s %s%lx %s%lx %s%lx\n", InputNames[Node->index],
1035  Prefix, ( mask & (long)ElseR ) / sizeof(DdNode),
1036  Prefix, ( mask & (long)Then ) / sizeof(DdNode),
1037  Prefix, ( mask & (long)Node ) / sizeof(DdNode) );
1038  fprintf( pFile, "01- 1\n" );
1039  fprintf( pFile, "1-1 1\n" );
1040  }
1041  else
1042  { // inverter
1043  fprintf( pFile, ".names %s %s%lx_i %s%lx %s%lx\n", InputNames[Node->index],
1044  Prefix, ( mask & (long)ElseR ) / sizeof(DdNode),
1045  Prefix, ( mask & (long)Then ) / sizeof(DdNode),
1046  Prefix, ( mask & (long)Node ) / sizeof(DdNode) );
1047  fprintf( pFile, "01- 1\n" );
1048  fprintf( pFile, "1-1 1\n" );
1049 
1050  fprintf( pFile, ".names %s%lx %s%lx_i\n",
1051  Prefix, ( mask & (long)ElseR ) / sizeof(DdNode),
1052  Prefix, ( mask & (long)ElseR ) / sizeof(DdNode) );
1053  fprintf( pFile, "0 1\n" );
1054  }
1055  }
1056  st__free_gen( gen );
1057  gen = NULL;
1058  st__free_table( visited );
1059 
1060 
1061  //////////////////////////////////////////////////
1062  Cudd_RecursiveDeref( s_ddmin, bFmin );
1063  //////////////////////////////////////////////////
1064 }
void st__free_table(st__table *table)
Definition: st.c:81
#define CUDD_UNIQUE_SLOTS
Definition: cudd.h:97
void Cudd_RecursiveDeref(DdManager *table, DdNode *n)
Definition: cuddRef.c:154
Definition: cudd.h:278
void st__free_gen(st__generator *gen)
Definition: st.c:556
int size
Definition: cuddInt.h:361
#define Cudd_Regular(node)
Definition: cudd.h:397
int st__ptrcmp(const char *, const char *)
Definition: st.c:480
#define CUDD_CACHE_SLOTS
Definition: cudd.h:98
static abctime Abc_Clock()
Definition: abc_global.h:279
DdNode * Cudd_bddTransfer(DdManager *ddSource, DdManager *ddDestination, DdNode *f)
Definition: cuddBridge.c:409
#define cuddV(node)
Definition: cuddInt.h:668
st__table * st__init_table(st__compare_func_type compare, st__hash_func_type hash)
Definition: st.c:72
#define Cudd_IsComplement(node)
Definition: cudd.h:425
Definition: st.h:52
DdManager * Cudd_Init(unsigned int numVars, unsigned int numVarsZ, unsigned int numSlots, unsigned int cacheSize, unsigned long maxMemory)
Definition: cuddInit.c:125
#define cuddT(node)
Definition: cuddInt.h:636
st__generator * st__init_gen(st__table *table)
Definition: st.c:486
DdHalfWord index
Definition: cudd.h:279
static DdManager * s_ddmin
Definition: casCore.c:927
#define CUDD_MAXINDEX
Definition: cudd.h:112
#define cuddE(node)
Definition: cuddInt.h:652
int cuddCollectNodes(DdNode *f, st__table *visited)
Definition: cuddUtil.c:2925
#define assert(ex)
Definition: util_old.h:213
int Cudd_ReduceHeap(DdManager *table, Cudd_ReorderingType heuristic, int minsize)
Definition: cuddReorder.c:176
void Cudd_Ref(DdNode *n)
Definition: cuddRef.c:129
ABC_INT64_T abctime
Definition: abc_global.h:278
int st__ptrhash(const char *, int)
Definition: st.c:468
int st__gen(st__generator *gen, const char **key_p, char **value_p)
Definition: st.c:502
int Cudd_DagSize(DdNode *node)
Definition: cuddUtil.c:442
void WriteSingleOutputFunctionBlif ( DdManager dd,
DdNode aFunc,
char **  pNames,
int  nNames,
char *  FileName 
)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 781 of file casCore.c.

782 {
783  int i;
784  FILE * pFile;
785 
786  // start the file
787  pFile = fopen( FileName, "w" );
788  fprintf( pFile, ".model %s\n", FileName );
789 
790  fprintf( pFile, ".inputs" );
791  for ( i = 0; i < nNames; i++ )
792  fprintf( pFile, " %s", pNames[i] );
793  fprintf( pFile, "\n" );
794  fprintf( pFile, ".outputs F" );
795  fprintf( pFile, "\n" );
796 
797  // write the DD into the file
798  WriteDDintoBLIFfile( pFile, aFunc, "F", "", pNames );
799 
800  fprintf( pFile, ".end\n" );
801  fclose( pFile );
802 }
void WriteDDintoBLIFfile(FILE *pFile, DdNode *Func, char *OutputName, char *Prefix, char **InputNames)
BLIF WRITING FUNCTIONS ///.
Definition: casCore.c:815

Variable Documentation

DdManager* s_ddmin
static

Definition at line 927 of file casCore.c.

int s_MintOnes[MAXOUTPUTS]
static

Definition at line 485 of file casCore.c.

int s_SuppSize[MAXOUTPUTS]
static

SINGLE OUTPUT FUNCTION ///.

Definition at line 476 of file casCore.c.