You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1394 lines
43 KiB
1394 lines
43 KiB
/**CFile***********************************************************************
|
|
|
|
FileName [main.c]
|
|
|
|
PackageName [ntr]
|
|
|
|
Synopsis [Main program for the nanotrav program.]
|
|
|
|
Description []
|
|
|
|
SeeAlso []
|
|
|
|
Author [Fabio Somenzi]
|
|
|
|
Copyright [Copyright (c) 1995-2012, Regents of the University of Colorado
|
|
|
|
All rights reserved.
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions
|
|
are met:
|
|
|
|
Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
Redistributions in binary form must reproduce the above copyright
|
|
notice, this list of conditions and the following disclaimer in the
|
|
documentation and/or other materials provided with the distribution.
|
|
|
|
Neither the name of the University of Colorado nor the names of its
|
|
contributors may be used to endorse or promote products derived from
|
|
this software without specific prior written permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
POSSIBILITY OF SUCH DAMAGE.]
|
|
|
|
******************************************************************************/
|
|
|
|
#include "ntr.h"
|
|
#include "cuddInt.h"
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Constant declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#define NTR_VERSION\
|
|
"Nanotrav Version #0.12, Release date 2003/12/31"
|
|
|
|
#define BUFLENGTH 8192
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Stucture declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Type declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Variable declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#ifndef lint
|
|
static char rcsid[] UTIL_UNUSED = "$Id: main.c,v 1.41 2012/02/05 01:53:01 fabio Exp fabio $";
|
|
#endif
|
|
|
|
static char buffer[BUFLENGTH];
|
|
#ifdef DD_DEBUG
|
|
extern st_table *checkMinterms (BnetNetwork *net, DdManager *dd, st_table *previous);
|
|
#endif
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Macro declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/**AutomaticStart*************************************************************/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Static function prototypes */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
static NtrOptions * mainInit ();
|
|
static void ntrReadOptions (int argc, char **argv, NtrOptions *option);
|
|
static void ntrReadOptionsFile (char *name, char ***argv, int *argc);
|
|
static char* readLine (FILE *fp);
|
|
static FILE * open_file (char *filename, const char *mode);
|
|
static int reorder (BnetNetwork *net, DdManager *dd, NtrOptions *option);
|
|
static void freeOption (NtrOptions *option);
|
|
static DdManager * startCudd (NtrOptions *option, int nvars);
|
|
static int ntrReadTree (DdManager *dd, char *treefile, int nvars);
|
|
|
|
/**AutomaticEnd***************************************************************/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Definition of exported functions */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Main program for ntr.]
|
|
|
|
Description [Main program for ntr. Performs initialization. Reads command
|
|
line options and network(s). Builds BDDs with reordering, and optionally
|
|
does reachability analysis. Prints stats.]
|
|
|
|
SideEffects [None]
|
|
|
|
SeeAlso []
|
|
|
|
******************************************************************************/
|
|
int
|
|
main(
|
|
int argc,
|
|
char ** argv)
|
|
{
|
|
NtrOptions *option; /* options */
|
|
FILE *fp1; /* first network file pointer */
|
|
BnetNetwork *net1 = NULL; /* first network */
|
|
FILE *fp2; /* second network file pointer */
|
|
BnetNetwork *net2 = NULL; /* second network */
|
|
DdManager *dd; /* pointer to DD manager */
|
|
int exitval; /* return value of Cudd_CheckZeroRef */
|
|
int ok; /* overall return value from main() */
|
|
int result; /* stores the return value of functions */
|
|
BnetNode *node; /* auxiliary pointer to network node */
|
|
int i; /* loop index */
|
|
int j; /* loop index */
|
|
double *signatures; /* array of signatures */
|
|
int pr; /* verbosity level */
|
|
int reencoded; /* linear transformations attempted */
|
|
|
|
/* Initialize. */
|
|
option = mainInit();
|
|
ntrReadOptions(argc,argv,option);
|
|
pr = option->verb;
|
|
reencoded = option->reordering == CUDD_REORDER_LINEAR ||
|
|
option->reordering == CUDD_REORDER_LINEAR_CONVERGE ||
|
|
option->autoMethod == CUDD_REORDER_LINEAR ||
|
|
option->autoMethod == CUDD_REORDER_LINEAR_CONVERGE;
|
|
/* Currently traversal requires global BDDs. Override whatever
|
|
** was specified for locGlob.
|
|
*/
|
|
if (option->traverse == TRUE || option->envelope == TRUE ||
|
|
option->scc == TRUE) {
|
|
option->locGlob = BNET_GLOBAL_DD;
|
|
}
|
|
|
|
/* Read the first network... */
|
|
fp1 = open_file(option->file1, "r");
|
|
net1 = Bnet_ReadNetwork(fp1,pr);
|
|
(void) fclose(fp1);
|
|
if (net1 == NULL) {
|
|
(void) fprintf(stderr,"Syntax error in %s.\n",option->file1);
|
|
exit(2);
|
|
}
|
|
/* ... and optionally echo it to the standard output. */
|
|
if (pr > 2) {
|
|
Bnet_PrintNetwork(net1);
|
|
}
|
|
|
|
/* Read the second network... */
|
|
if (option->verify == TRUE || option->second == TRUE ||
|
|
option->clip > 0.0 || option->dontcares) {
|
|
fp2 = open_file(option->file2, "r");
|
|
net2 = Bnet_ReadNetwork(fp2,pr);
|
|
(void) fclose(fp2);
|
|
if (net2 == NULL) {
|
|
(void) fprintf(stderr,"Syntax error in %s.\n",option->file2);
|
|
exit(2);
|
|
}
|
|
/* ... and optionally echo it to the standard output. */
|
|
if (pr > 2) {
|
|
Bnet_PrintNetwork(net2);
|
|
}
|
|
}
|
|
|
|
/* Initialize manager. We start with 0 variables, because
|
|
** Ntr_buildDDs will create new variables rather than using
|
|
** whatever already exists.
|
|
*/
|
|
dd = startCudd(option,net1->ninputs);
|
|
if (dd == NULL) { exit(2); }
|
|
|
|
/* Build the BDDs for the nodes of the first network. */
|
|
result = Ntr_buildDDs(net1,dd,option,NULL);
|
|
if (result == 0) { exit(2); }
|
|
|
|
/* Build the BDDs for the nodes of the second network if requested. */
|
|
if (option->verify == TRUE || option->second == TRUE ||
|
|
option->clip > 0.0 || option->dontcares == TRUE) {
|
|
char *nodesave = option->node;
|
|
option->node = NULL;
|
|
result = Ntr_buildDDs(net2,dd,option,net1);
|
|
option->node = nodesave;
|
|
if (result == 0) { exit(2); }
|
|
}
|
|
|
|
if (option->noBuild == TRUE) {
|
|
Bnet_FreeNetwork(net1);
|
|
if (option->verify == TRUE || option->second == TRUE ||
|
|
option->clip > 0.0) {
|
|
Bnet_FreeNetwork(net2);
|
|
}
|
|
freeOption(option);
|
|
exit(0);
|
|
}
|
|
if (option->locGlob != BNET_LOCAL_DD) {
|
|
/* Print the order before the final reordering. */
|
|
(void) printf("Order before final reordering\n");
|
|
result = Bnet_PrintOrder(net1,dd);
|
|
if (result == 0) exit(2);
|
|
}
|
|
|
|
/* Perform final reordering */
|
|
if (option->zddtest == FALSE) {
|
|
result = reorder(net1,dd,option);
|
|
if (result == 0) exit(2);
|
|
|
|
/* Print final order. */
|
|
if ((option->reordering != CUDD_REORDER_NONE || option->gaOnOff) &&
|
|
option->locGlob != BNET_LOCAL_DD) {
|
|
(void) printf("New order\n");
|
|
result = Bnet_PrintOrder(net1,dd);
|
|
if (result == 0) exit(2);
|
|
}
|
|
|
|
/* Print the re-encoded inputs. */
|
|
if (pr >= 1 && reencoded == 1) {
|
|
for (i = 0; i < net1->npis; i++) {
|
|
if (!st_lookup(net1->hash,net1->inputs[i],&node)) {
|
|
exit(2);
|
|
}
|
|
(void) fprintf(stdout,"%s:",node->name);
|
|
Cudd_PrintDebug(dd,node->dd,Cudd_ReadSize(dd),pr);
|
|
}
|
|
for (i = 0; i < net1->nlatches; i++) {
|
|
if (!st_lookup(net1->hash,net1->latches[i][1],&node)) {
|
|
exit(2);
|
|
}
|
|
(void) fprintf(stdout,"%s:",node->name);
|
|
Cudd_PrintDebug(dd,node->dd,Cudd_ReadSize(dd),pr);
|
|
}
|
|
if (pr >= 3) {
|
|
result = Cudd_PrintLinear(dd);
|
|
if (result == 0) exit(2);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Verify (combinational) equivalence. */
|
|
if (option->verify == TRUE) {
|
|
result = Ntr_VerifyEquivalence(dd,net1,net2,option);
|
|
if (result == 0) {
|
|
(void) printf("Verification abnormally terminated\n");
|
|
exit(2);
|
|
} else if (result == -1) {
|
|
(void) printf("Combinational verification failed\n");
|
|
} else {
|
|
(void) printf("Verification succeeded\n");
|
|
}
|
|
}
|
|
|
|
/* Traverse if requested and if the circuit is sequential. */
|
|
result = Ntr_Trav(dd,net1,option);
|
|
if (result == 0) exit(2);
|
|
|
|
/* Traverse with trasitive closure. */
|
|
result = Ntr_ClosureTrav(dd,net1,option);
|
|
if (result == 0) exit(2);
|
|
|
|
/* Compute outer envelope if requested and if the circuit is sequential. */
|
|
if (option->envelope == TRUE && net1->nlatches > 0) {
|
|
NtrPartTR *T;
|
|
T = Ntr_buildTR(dd,net1,option,option->image);
|
|
result = Ntr_Envelope(dd,T,NULL,option);
|
|
Ntr_freeTR(dd,T);
|
|
}
|
|
|
|
/* Compute SCCs if requested and if the circuit is sequential. */
|
|
result = Ntr_SCC(dd,net1,option);
|
|
if (result == 0) exit(2);
|
|
|
|
/* Test Constrain Decomposition. */
|
|
if (option->partition == TRUE && net1->nlatches > 0) {
|
|
NtrPartTR *T;
|
|
DdNode *product;
|
|
DdNode **decomp;
|
|
int sharingSize;
|
|
T = Ntr_buildTR(dd,net1,option,NTR_IMAGE_MONO);
|
|
decomp = Cudd_bddConstrainDecomp(dd,T->part[0]);
|
|
if (decomp == NULL) exit(2);
|
|
sharingSize = Cudd_SharingSize(decomp, Cudd_ReadSize(dd));
|
|
(void) fprintf(stdout, "Decomposition Size: %d components %d nodes\n",
|
|
Cudd_ReadSize(dd), sharingSize);
|
|
product = Cudd_ReadOne(dd);
|
|
Cudd_Ref(product);
|
|
for (i = 0; i < Cudd_ReadSize(dd); i++) {
|
|
DdNode *intermediate = Cudd_bddAnd(dd, product, decomp[i]);
|
|
if (intermediate == NULL) {
|
|
exit(2);
|
|
}
|
|
Cudd_Ref(intermediate);
|
|
Cudd_IterDerefBdd(dd, product);
|
|
product = intermediate;
|
|
}
|
|
if (product != T->part[0])
|
|
exit(2);
|
|
Cudd_IterDerefBdd(dd, product);
|
|
for (i = 0; i < Cudd_ReadSize(dd); i++) {
|
|
Cudd_IterDerefBdd(dd, decomp[i]);
|
|
}
|
|
FREE(decomp);
|
|
Ntr_freeTR(dd,T);
|
|
}
|
|
|
|
/* Test char-to-vect conversion. */
|
|
result = Ntr_TestCharToVect(dd,net1,option);
|
|
if (result == 0) exit(2);
|
|
|
|
/* Test extraction of two-literal clauses. */
|
|
result = Ntr_TestTwoLiteralClauses(dd,net1,option);
|
|
if (result == 0) exit(2);
|
|
|
|
/* Test BDD minimization functions. */
|
|
result = Ntr_TestMinimization(dd,net1,net2,option);
|
|
if (result == 0) exit(2);
|
|
|
|
/* Test density-related functions. */
|
|
result = Ntr_TestDensity(dd,net1,option);
|
|
if (result == 0) exit(2);
|
|
|
|
/* Test decomposition functions. */
|
|
result = Ntr_TestDecomp(dd,net1,option);
|
|
if (result == 0) exit(2);
|
|
|
|
/* Test cofactor estimation functions. */
|
|
result = Ntr_TestCofactorEstimate(dd,net1,option);
|
|
if (result == 0) exit(2);
|
|
|
|
/* Test BDD clipping functions. */
|
|
result = Ntr_TestClipping(dd,net1,net2,option);
|
|
if (result == 0) exit(2);
|
|
|
|
/* Test BDD equivalence and containment under DC functions. */
|
|
result = Ntr_TestEquivAndContain(dd,net1,net2,option);
|
|
if (result == 0) exit(2);
|
|
|
|
/* Test BDD Cudd_bddClosestCube. */
|
|
result = Ntr_TestClosestCube(dd,net1,option);
|
|
if (result == 0) exit(2);
|
|
|
|
/* Test ZDDs if requested. */
|
|
if (option->stateOnly == FALSE && option->zddtest == TRUE) {
|
|
result = Ntr_testZDD(dd,net1,option);
|
|
if (result == 0)
|
|
(void) fprintf(stdout,"ZDD test failed.\n");
|
|
result = Ntr_testISOP(dd,net1,option);
|
|
if (result == 0)
|
|
(void) fprintf(stdout,"ISOP test failed.\n");
|
|
}
|
|
|
|
/* Compute maximum flow if requested and if the circuit is sequential. */
|
|
if (option->maxflow == TRUE && net1->nlatches > 0) {
|
|
result = Ntr_maxflow(dd,net1,option);
|
|
if (result == 0)
|
|
(void) fprintf(stdout,"Maxflow computation failed.\n");
|
|
}
|
|
|
|
/* Compute shortest paths if requested and if the circuit is sequential. */
|
|
if (option->shortPath != NTR_SHORT_NONE && net1->nlatches > 0) {
|
|
result = Ntr_ShortestPaths(dd,net1,option);
|
|
if (result == 0)
|
|
(void) fprintf(stdout,"Shortest paths computation failed.\n");
|
|
}
|
|
|
|
/* Compute output signatures if so requested. */
|
|
if (option->signatures) {
|
|
(void) printf("Positive cofactor measures\n");
|
|
for (i = 0; i < net1->noutputs; i++) {
|
|
if (!st_lookup(net1->hash,net1->outputs[i],&node)) {
|
|
exit(2);
|
|
}
|
|
signatures = Cudd_CofMinterm(dd, node->dd);
|
|
if (signatures) {
|
|
(void) printf("%s:\n", node->name);
|
|
for (j = 0; j < Cudd_ReadSize(dd); j++) {
|
|
if((j%5 == 0)&&i) (void) printf("\n");
|
|
(void) printf("%5d: %-#8.4g ", j, signatures[j]);
|
|
}
|
|
(void) printf("\n");
|
|
FREE(signatures);
|
|
} else {
|
|
(void) printf("Signature computation failed.\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Dump BDDs if so requested. */
|
|
if (option->bdddump && option->second == FALSE &&
|
|
option->density == FALSE && option->decomp == FALSE &&
|
|
option->cofest == FALSE && option->clip < 0.0 &&
|
|
option->scc == FALSE) {
|
|
(void) printf("Dumping BDDs to %s\n", option->dumpfile);
|
|
if (option->node != NULL) {
|
|
if (!st_lookup(net1->hash,option->node,&node)) {
|
|
exit(2);
|
|
}
|
|
result = Bnet_bddArrayDump(dd,net1,option->dumpfile,&(node->dd),
|
|
&(node->name),1,option->dumpFmt);
|
|
} else {
|
|
result = Bnet_bddDump(dd, net1, option->dumpfile,
|
|
option->dumpFmt, reencoded);
|
|
}
|
|
if (result != 1) {
|
|
(void) printf("BDD dump failed.\n");
|
|
}
|
|
}
|
|
|
|
/* Print stats and clean up. */
|
|
if (pr >= 0) {
|
|
result = Cudd_PrintInfo(dd,stdout);
|
|
if (result != 1) {
|
|
(void) printf("Cudd_PrintInfo failed.\n");
|
|
}
|
|
}
|
|
|
|
#if defined(DD_DEBUG) && !defined(DD_NO_DEATH_ROW)
|
|
(void) fprintf(dd->err,"%d empty slots in death row\n",
|
|
cuddTimesInDeathRow(dd,NULL));
|
|
#endif
|
|
(void) printf("Final size: %ld\n", Cudd_ReadNodeCount(dd));
|
|
|
|
/* Dispose of node BDDs. */
|
|
node = net1->nodes;
|
|
while (node != NULL) {
|
|
if (node->dd != NULL &&
|
|
node->type != BNET_INPUT_NODE &&
|
|
node->type != BNET_PRESENT_STATE_NODE) {
|
|
Cudd_IterDerefBdd(dd,node->dd);
|
|
}
|
|
node = node->next;
|
|
}
|
|
/* Dispose of network. */
|
|
Bnet_FreeNetwork(net1);
|
|
/* Do the same cleanup for the second network if it was created. */
|
|
if (option->verify == TRUE || option->second == TRUE ||
|
|
option->clip > 0.0 || option->dontcares == TRUE) {
|
|
node = net2->nodes;
|
|
while (node != NULL) {
|
|
if (node->dd != NULL &&
|
|
node->type != BNET_INPUT_NODE &&
|
|
node->type != BNET_PRESENT_STATE_NODE) {
|
|
Cudd_IterDerefBdd(dd,node->dd);
|
|
}
|
|
node = node->next;
|
|
}
|
|
Bnet_FreeNetwork(net2);
|
|
}
|
|
|
|
/* Check reference counts: At this point we should have dereferenced
|
|
** everything we had, except in the case of re-encoding.
|
|
*/
|
|
exitval = Cudd_CheckZeroRef(dd);
|
|
ok = exitval != 0; /* ok == 0 means O.K. */
|
|
if (exitval != 0) {
|
|
(void) fflush(stdout);
|
|
(void) fprintf(stderr,
|
|
"%d non-zero DD reference counts after dereferencing\n", exitval);
|
|
}
|
|
|
|
#ifdef DD_DEBUG
|
|
Cudd_CheckKeys(dd);
|
|
#endif
|
|
|
|
Cudd_Quit(dd);
|
|
|
|
if (pr >= 0) (void) printf("total time = %s\n",
|
|
util_print_time(util_cpu_time() - option->initialTime));
|
|
freeOption(option);
|
|
if (pr >= 0) util_print_cpu_stats(stdout);
|
|
|
|
#ifdef MNEMOSYNE
|
|
mnem_writestats();
|
|
#endif
|
|
|
|
exit(ok);
|
|
/* NOTREACHED */
|
|
|
|
} /* end of main */
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Definition of internal functions */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Definition of static functions */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Allocates the option structure and initializes it.]
|
|
|
|
Description []
|
|
|
|
SideEffects [none]
|
|
|
|
SeeAlso [ntrReadOptions]
|
|
|
|
******************************************************************************/
|
|
static NtrOptions *
|
|
mainInit(
|
|
)
|
|
{
|
|
NtrOptions *option;
|
|
|
|
/* Initialize option structure. */
|
|
option = ALLOC(NtrOptions,1);
|
|
option->initialTime = util_cpu_time();
|
|
option->verify = FALSE;
|
|
option->second = FALSE;
|
|
option->file1 = NULL;
|
|
option->file2 = NULL;
|
|
option->traverse = FALSE;
|
|
option->depend = FALSE;
|
|
option->image = NTR_IMAGE_MONO;
|
|
option->imageClip = 1.0;
|
|
option->approx = NTR_UNDER_APPROX;
|
|
option->threshold = -1;
|
|
option->from = NTR_FROM_NEW;
|
|
option->groupnsps = NTR_GROUP_NONE;
|
|
option->closure = FALSE;
|
|
option->closureClip = 1.0;
|
|
option->envelope = FALSE;
|
|
option->scc = FALSE;
|
|
option->maxflow = FALSE;
|
|
option->shortPath = NTR_SHORT_NONE;
|
|
option->selectiveTrace = FALSE;
|
|
option->zddtest = FALSE;
|
|
option->printcover = FALSE;
|
|
option->sinkfile = NULL;
|
|
option->partition = FALSE;
|
|
option->char2vect = FALSE;
|
|
option->density = FALSE;
|
|
option->quality = 1.0;
|
|
option->decomp = FALSE;
|
|
option->cofest = FALSE;
|
|
option->clip = -1.0;
|
|
option->dontcares = FALSE;
|
|
option->closestCube = FALSE;
|
|
option->clauses = FALSE;
|
|
option->noBuild = FALSE;
|
|
option->stateOnly = FALSE;
|
|
option->node = NULL;
|
|
option->locGlob = BNET_GLOBAL_DD;
|
|
option->progress = FALSE;
|
|
option->cacheSize = 32768;
|
|
option->maxMemory = 0; /* set automatically */
|
|
option->maxMemHard = 0; /* don't set */
|
|
option->maxLive = ~0; /* very large number */
|
|
option->slots = CUDD_UNIQUE_SLOTS;
|
|
option->ordering = PI_PS_FROM_FILE;
|
|
option->orderPiPs = NULL;
|
|
option->reordering = CUDD_REORDER_NONE;
|
|
option->autoMethod = CUDD_REORDER_SIFT;
|
|
option->autoDyn = 0;
|
|
option->treefile = NULL;
|
|
option->firstReorder = DD_FIRST_REORDER;
|
|
option->countDead = FALSE;
|
|
option->maxGrowth = 20;
|
|
option->groupcheck = CUDD_GROUP_CHECK7;
|
|
option->arcviolation = 10;
|
|
option->symmviolation = 10;
|
|
option->recomb = DD_DEFAULT_RECOMB;
|
|
option->nodrop = TRUE;
|
|
option->signatures = FALSE;
|
|
option->verb = 0;
|
|
option->gaOnOff = 0;
|
|
option->populationSize = 0; /* use default */
|
|
option->numberXovers = 0; /* use default */
|
|
option->bdddump = FALSE;
|
|
option->dumpFmt = 0; /* dot */
|
|
option->dumpfile = NULL;
|
|
option->store = -1; /* do not store */
|
|
option->storefile = NULL;
|
|
option->load = FALSE;
|
|
option->loadfile = NULL;
|
|
|
|
return(option);
|
|
|
|
} /* end of mainInit */
|
|
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Reads the command line options.]
|
|
|
|
Description [Reads the command line options. Scans the command line
|
|
one argument at a time and performs a switch on each arguement it
|
|
hits. Some arguemnts also read in the following arg from the list
|
|
(i.e., -f also gets the filename which should folow.)
|
|
Gives a usage message and exits if any unrecognized args are found.]
|
|
|
|
SideEffects [May initialize the random number generator.]
|
|
|
|
SeeAlso [mainInit ntrReadOptionsFile]
|
|
|
|
******************************************************************************/
|
|
static void
|
|
ntrReadOptions(
|
|
int argc,
|
|
char ** argv,
|
|
NtrOptions * option)
|
|
{
|
|
int i = 0;
|
|
|
|
if (argc < 2) goto usage;
|
|
|
|
if (STRING_EQUAL(argv[1],"-f")) {
|
|
ntrReadOptionsFile(argv[2],&argv,&argc);
|
|
}
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
if (argv[i][0] != '-' ) {
|
|
if (option->file1 == NULL) {
|
|
option->file1 = util_strsav(argv[i]);
|
|
} else {
|
|
goto usage;
|
|
}
|
|
} else if (STRING_EQUAL(argv[i],"-second")) {
|
|
i++;
|
|
option->file2 = util_strsav(argv[i]);
|
|
option->second = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-verify")) {
|
|
i++;
|
|
option->file2 = util_strsav(argv[i]);
|
|
option->verify = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-trav")) {
|
|
option->traverse = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-depend")) {
|
|
option->traverse = TRUE;
|
|
option->depend = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-image")) {
|
|
i++;
|
|
if (STRING_EQUAL(argv[i],"part")) {
|
|
option->image = NTR_IMAGE_PART;
|
|
} else if (STRING_EQUAL(argv[i],"clip")) {
|
|
option->image = NTR_IMAGE_CLIP;
|
|
} else if (STRING_EQUAL(argv[i],"depend")) {
|
|
option->image = NTR_IMAGE_DEPEND;
|
|
} else if (STRING_EQUAL(argv[i],"mono")) {
|
|
option->image = NTR_IMAGE_MONO;
|
|
} else {
|
|
goto usage;
|
|
}
|
|
} else if (STRING_EQUAL(argv[i],"-depth")) {
|
|
i++;
|
|
option->imageClip = (double) atof(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-cdepth")) {
|
|
i++;
|
|
option->closureClip = (double) atof(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-approx")) {
|
|
i++;
|
|
if (STRING_EQUAL(argv[i],"under")) {
|
|
option->approx = NTR_UNDER_APPROX;
|
|
} else if (STRING_EQUAL(argv[i],"over")) {
|
|
option->approx = NTR_OVER_APPROX;
|
|
} else {
|
|
goto usage;
|
|
}
|
|
} else if (STRING_EQUAL(argv[i],"-threshold")) {
|
|
i++;
|
|
option->threshold = (int) atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-from")) {
|
|
i++;
|
|
if (STRING_EQUAL(argv[i],"new")) {
|
|
option->from = NTR_FROM_NEW;
|
|
} else if (STRING_EQUAL(argv[i],"reached")) {
|
|
option->from = NTR_FROM_REACHED;
|
|
} else if (STRING_EQUAL(argv[i],"restrict")) {
|
|
option->from = NTR_FROM_RESTRICT;
|
|
} else if (STRING_EQUAL(argv[i],"compact")) {
|
|
option->from = NTR_FROM_COMPACT;
|
|
} else if (STRING_EQUAL(argv[i],"squeeze")) {
|
|
option->from = NTR_FROM_SQUEEZE;
|
|
} else if (STRING_EQUAL(argv[i],"subset")) {
|
|
option->from = NTR_FROM_UNDERAPPROX;
|
|
} else if (STRING_EQUAL(argv[i],"superset")) {
|
|
option->from = NTR_FROM_OVERAPPROX;
|
|
} else {
|
|
goto usage;
|
|
}
|
|
} else if (STRING_EQUAL(argv[i],"-groupnsps")) {
|
|
i++;
|
|
if (STRING_EQUAL(argv[i],"none")) {
|
|
option->groupnsps = NTR_GROUP_NONE;
|
|
} else if (STRING_EQUAL(argv[i],"default")) {
|
|
option->groupnsps = NTR_GROUP_DEFAULT;
|
|
} else if (STRING_EQUAL(argv[i],"fixed")) {
|
|
option->groupnsps = NTR_GROUP_FIXED;
|
|
} else {
|
|
goto usage;
|
|
}
|
|
} else if (STRING_EQUAL(argv[i],"-closure")) {
|
|
option->closure = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-envelope")) {
|
|
option->envelope = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-scc")) {
|
|
option->scc = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-maxflow")) {
|
|
option->maxflow = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-shortpaths")) {
|
|
i++;
|
|
if (STRING_EQUAL(argv[i],"none")) {
|
|
option->shortPath = NTR_SHORT_NONE;
|
|
} else if (STRING_EQUAL(argv[i],"bellman")) {
|
|
option->shortPath = NTR_SHORT_BELLMAN;
|
|
} else if (STRING_EQUAL(argv[i],"floyd")) {
|
|
option->shortPath = NTR_SHORT_FLOYD;
|
|
} else if (STRING_EQUAL(argv[i],"square")) {
|
|
option->shortPath = NTR_SHORT_SQUARE;
|
|
} else {
|
|
goto usage;
|
|
}
|
|
} else if (STRING_EQUAL(argv[i],"-selective")) {
|
|
option->selectiveTrace = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-zdd")) {
|
|
option->zddtest = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-cover")) {
|
|
option->zddtest = TRUE;
|
|
option->printcover = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-sink")) {
|
|
i++;
|
|
option->maxflow = TRUE;
|
|
option->sinkfile = util_strsav(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-part")) {
|
|
option->partition = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-char2vect")) {
|
|
option->char2vect = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-density")) {
|
|
option->density = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-quality")) {
|
|
i++;
|
|
option->quality = (double) atof(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-decomp")) {
|
|
option->decomp = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-cofest")) {
|
|
option->cofest = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-clip")) {
|
|
i++;
|
|
option->clip = (double) atof(argv[i]);
|
|
i++;
|
|
option->file2 = util_strsav(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-dctest")) {
|
|
option->dontcares = TRUE;
|
|
i++;
|
|
option->file2 = util_strsav(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-closest")) {
|
|
option->closestCube = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-clauses")) {
|
|
option->clauses = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-nobuild")) {
|
|
option->noBuild = TRUE;
|
|
option->reordering = CUDD_REORDER_NONE;
|
|
} else if (STRING_EQUAL(argv[i],"-delta")) {
|
|
option->stateOnly = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-node")) {
|
|
i++;
|
|
option->node = util_strsav(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-local")) {
|
|
option->locGlob = BNET_LOCAL_DD;
|
|
} else if (STRING_EQUAL(argv[i],"-progress")) {
|
|
option->progress = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-cache")) {
|
|
i++;
|
|
option->cacheSize = (int) atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-maxmem")) {
|
|
i++;
|
|
option->maxMemory = 1048576 * (int) atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-memhard")) {
|
|
i++;
|
|
option->maxMemHard = 1048576 * (int) atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-maxlive")) {
|
|
i++;
|
|
option->maxLive = (unsigned int) atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-slots")) {
|
|
i++;
|
|
option->slots = (int) atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-ordering")) {
|
|
i++;
|
|
if (STRING_EQUAL(argv[i],"dfs")) {
|
|
option->ordering = PI_PS_DFS;
|
|
} else if (STRING_EQUAL(argv[i],"hw")) {
|
|
option->ordering = PI_PS_FROM_FILE;
|
|
} else {
|
|
goto usage;
|
|
}
|
|
} else if (STRING_EQUAL(argv[i],"-order")) {
|
|
i++;
|
|
option->ordering = PI_PS_GIVEN;
|
|
option->orderPiPs = util_strsav(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-reordering")) {
|
|
i++;
|
|
if (STRING_EQUAL(argv[i],"none")) {
|
|
option->reordering = CUDD_REORDER_NONE;
|
|
} else if (STRING_EQUAL(argv[i],"random")) {
|
|
option->reordering = CUDD_REORDER_RANDOM;
|
|
} else if (STRING_EQUAL(argv[i],"bernard") ||
|
|
STRING_EQUAL(argv[i],"pivot")) {
|
|
option->reordering = CUDD_REORDER_RANDOM_PIVOT;
|
|
} else if (STRING_EQUAL(argv[i],"sifting")) {
|
|
option->reordering = CUDD_REORDER_SIFT;
|
|
} else if (STRING_EQUAL(argv[i],"converge")) {
|
|
option->reordering = CUDD_REORDER_SIFT_CONVERGE;
|
|
} else if (STRING_EQUAL(argv[i],"symm")) {
|
|
option->reordering = CUDD_REORDER_SYMM_SIFT;
|
|
} else if (STRING_EQUAL(argv[i],"cosymm")) {
|
|
option->reordering = CUDD_REORDER_SYMM_SIFT_CONV;
|
|
} else if (STRING_EQUAL(argv[i],"tree") ||
|
|
STRING_EQUAL(argv[i],"group")) {
|
|
option->reordering = CUDD_REORDER_GROUP_SIFT;
|
|
} else if (STRING_EQUAL(argv[i],"cotree") ||
|
|
STRING_EQUAL(argv[i],"cogroup")) {
|
|
option->reordering = CUDD_REORDER_GROUP_SIFT_CONV;
|
|
} else if (STRING_EQUAL(argv[i],"win2")) {
|
|
option->reordering = CUDD_REORDER_WINDOW2;
|
|
} else if (STRING_EQUAL(argv[i],"win3")) {
|
|
option->reordering = CUDD_REORDER_WINDOW3;
|
|
} else if (STRING_EQUAL(argv[i],"win4")) {
|
|
option->reordering = CUDD_REORDER_WINDOW4;
|
|
} else if (STRING_EQUAL(argv[i],"win2conv")) {
|
|
option->reordering = CUDD_REORDER_WINDOW2_CONV;
|
|
} else if (STRING_EQUAL(argv[i],"win3conv")) {
|
|
option->reordering = CUDD_REORDER_WINDOW3_CONV;
|
|
} else if (STRING_EQUAL(argv[i],"win4conv")) {
|
|
option->reordering = CUDD_REORDER_WINDOW4_CONV;
|
|
} else if (STRING_EQUAL(argv[i],"annealing")) {
|
|
option->reordering = CUDD_REORDER_ANNEALING;
|
|
} else if (STRING_EQUAL(argv[i],"genetic")) {
|
|
option->reordering = CUDD_REORDER_GENETIC;
|
|
} else if (STRING_EQUAL(argv[i],"linear")) {
|
|
option->reordering = CUDD_REORDER_LINEAR;
|
|
} else if (STRING_EQUAL(argv[i],"linconv")) {
|
|
option->reordering = CUDD_REORDER_LINEAR_CONVERGE;
|
|
} else if (STRING_EQUAL(argv[i],"exact")) {
|
|
option->reordering = CUDD_REORDER_EXACT;
|
|
} else {
|
|
goto usage;
|
|
}
|
|
} else if (STRING_EQUAL(argv[i],"-autodyn")) {
|
|
option->autoDyn = 3;
|
|
} else if (STRING_EQUAL(argv[i],"-autodynB")) {
|
|
option->autoDyn |= 1;
|
|
} else if (STRING_EQUAL(argv[i],"-autodynZ")) {
|
|
option->autoDyn |= 2;
|
|
} else if (STRING_EQUAL(argv[i],"-automethod")) {
|
|
i++;
|
|
if (STRING_EQUAL(argv[i],"none")) {
|
|
option->autoMethod = CUDD_REORDER_NONE;
|
|
} else if (STRING_EQUAL(argv[i],"random")) {
|
|
option->autoMethod = CUDD_REORDER_RANDOM;
|
|
} else if (STRING_EQUAL(argv[i],"bernard") ||
|
|
STRING_EQUAL(argv[i],"pivot")) {
|
|
option->autoMethod = CUDD_REORDER_RANDOM_PIVOT;
|
|
} else if (STRING_EQUAL(argv[i],"sifting")) {
|
|
option->autoMethod = CUDD_REORDER_SIFT;
|
|
} else if (STRING_EQUAL(argv[i],"converge")) {
|
|
option->autoMethod = CUDD_REORDER_SIFT_CONVERGE;
|
|
} else if (STRING_EQUAL(argv[i],"symm")) {
|
|
option->autoMethod = CUDD_REORDER_SYMM_SIFT;
|
|
} else if (STRING_EQUAL(argv[i],"cosymm")) {
|
|
option->autoMethod = CUDD_REORDER_SYMM_SIFT_CONV;
|
|
} else if (STRING_EQUAL(argv[i],"tree") ||
|
|
STRING_EQUAL(argv[i],"group")) {
|
|
option->autoMethod = CUDD_REORDER_GROUP_SIFT;
|
|
} else if (STRING_EQUAL(argv[i],"cotree") ||
|
|
STRING_EQUAL(argv[i],"cogroup")) {
|
|
option->autoMethod = CUDD_REORDER_GROUP_SIFT_CONV;
|
|
} else if (STRING_EQUAL(argv[i],"win2")) {
|
|
option->autoMethod = CUDD_REORDER_WINDOW2;
|
|
} else if (STRING_EQUAL(argv[i],"win3")) {
|
|
option->autoMethod = CUDD_REORDER_WINDOW3;
|
|
} else if (STRING_EQUAL(argv[i],"win4")) {
|
|
option->autoMethod = CUDD_REORDER_WINDOW4;
|
|
} else if (STRING_EQUAL(argv[i],"win2conv")) {
|
|
option->autoMethod = CUDD_REORDER_WINDOW2_CONV;
|
|
} else if (STRING_EQUAL(argv[i],"win3conv")) {
|
|
option->autoMethod = CUDD_REORDER_WINDOW3_CONV;
|
|
} else if (STRING_EQUAL(argv[i],"win4conv")) {
|
|
option->autoMethod = CUDD_REORDER_WINDOW4_CONV;
|
|
} else if (STRING_EQUAL(argv[i],"annealing")) {
|
|
option->autoMethod = CUDD_REORDER_ANNEALING;
|
|
} else if (STRING_EQUAL(argv[i],"genetic")) {
|
|
option->autoMethod = CUDD_REORDER_GENETIC;
|
|
} else if (STRING_EQUAL(argv[i],"linear")) {
|
|
option->autoMethod = CUDD_REORDER_LINEAR;
|
|
} else if (STRING_EQUAL(argv[i],"linconv")) {
|
|
option->autoMethod = CUDD_REORDER_LINEAR_CONVERGE;
|
|
} else if (STRING_EQUAL(argv[i],"exact")) {
|
|
option->autoMethod = CUDD_REORDER_EXACT;
|
|
} else {
|
|
goto usage;
|
|
}
|
|
} else if (STRING_EQUAL(argv[i],"-tree")) {
|
|
i++;
|
|
option->treefile = util_strsav(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-first")) {
|
|
i++;
|
|
option->firstReorder = (int)atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-countdead")) {
|
|
option->countDead = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-growth")) {
|
|
i++;
|
|
option->maxGrowth = (int)atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-groupcheck")) {
|
|
i++;
|
|
if (STRING_EQUAL(argv[i],"check")) {
|
|
option->groupcheck = CUDD_GROUP_CHECK;
|
|
} else if (STRING_EQUAL(argv[i],"nocheck")) {
|
|
option->groupcheck = CUDD_NO_CHECK;
|
|
} else if (STRING_EQUAL(argv[i],"check2")) {
|
|
option->groupcheck = CUDD_GROUP_CHECK2;
|
|
} else if (STRING_EQUAL(argv[i],"check3")) {
|
|
option->groupcheck = CUDD_GROUP_CHECK3;
|
|
} else if (STRING_EQUAL(argv[i],"check4")) {
|
|
option->groupcheck = CUDD_GROUP_CHECK4;
|
|
} else if (STRING_EQUAL(argv[i],"check5")) {
|
|
option->groupcheck = CUDD_GROUP_CHECK5;
|
|
} else if (STRING_EQUAL(argv[i],"check6")) {
|
|
option->groupcheck = CUDD_GROUP_CHECK6;
|
|
} else if (STRING_EQUAL(argv[i],"check7")) {
|
|
option->groupcheck = CUDD_GROUP_CHECK7;
|
|
} else if (STRING_EQUAL(argv[i],"check8")) {
|
|
option->groupcheck = CUDD_GROUP_CHECK8;
|
|
} else if (STRING_EQUAL(argv[i],"check9")) {
|
|
option->groupcheck = CUDD_GROUP_CHECK9;
|
|
} else {
|
|
goto usage;
|
|
}
|
|
} else if (STRING_EQUAL(argv[i],"-arcviolation")) {
|
|
i++;
|
|
option->arcviolation = (int)atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-symmviolation")) {
|
|
i++;
|
|
option->symmviolation = (int)atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-recomb")) {
|
|
i++;
|
|
option->recomb = (int)atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-drop")) {
|
|
option->nodrop = FALSE;
|
|
} else if (STRING_EQUAL(argv[i],"-sign")) {
|
|
option->signatures = TRUE;
|
|
} else if (STRING_EQUAL(argv[i],"-genetic")) {
|
|
option->gaOnOff = 1;
|
|
} else if (STRING_EQUAL(argv[i],"-genepop")) {
|
|
option->gaOnOff = 1;
|
|
i++;
|
|
option->populationSize = (int)atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-genexover")) {
|
|
option->gaOnOff = 1;
|
|
i++;
|
|
option->numberXovers = (int) atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-seed")) {
|
|
i++;
|
|
Cudd_Srandom((long)atoi(argv[i]));
|
|
} else if (STRING_EQUAL(argv[i],"-dumpfile")) {
|
|
i++;
|
|
option->bdddump = TRUE;
|
|
option->dumpfile = util_strsav(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-dumpblif")) {
|
|
option->dumpFmt = 1; /* blif */
|
|
} else if (STRING_EQUAL(argv[i],"-dumpdaVinci")) {
|
|
option->dumpFmt = 2; /* daVinci */
|
|
} else if (STRING_EQUAL(argv[i],"-dumpddcal")) {
|
|
option->dumpFmt = 3; /* DDcal */
|
|
} else if (STRING_EQUAL(argv[i],"-dumpfact")) {
|
|
option->dumpFmt = 4; /* factored form */
|
|
} else if (STRING_EQUAL(argv[i],"-dumpmv")) {
|
|
option->dumpFmt = 5; /* blif-MV */
|
|
} else if (STRING_EQUAL(argv[i],"-store")) {
|
|
i++;
|
|
option->store = (int) atoi(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-storefile")) {
|
|
i++;
|
|
option->storefile = util_strsav(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-loadfile")) {
|
|
i++;
|
|
option->load = 1;
|
|
option->loadfile = util_strsav(argv[i]);
|
|
} else if (STRING_EQUAL(argv[i],"-p")) {
|
|
i++;
|
|
option->verb = (int) atoi(argv[i]);
|
|
} else {
|
|
goto usage;
|
|
}
|
|
}
|
|
|
|
if (option->store >= 0 && option->storefile == NULL) {
|
|
(void) fprintf(stdout,"-storefile mandatory with -store\n");
|
|
exit(-1);
|
|
}
|
|
|
|
if (option->verb >= 0) {
|
|
(void) printf("# %s\n", NTR_VERSION);
|
|
/* echo command line and arguments */
|
|
(void) printf("#");
|
|
for (i = 0; i < argc; i++) {
|
|
(void) printf(" %s", argv[i]);
|
|
}
|
|
(void) printf("\n");
|
|
(void) printf("# CUDD Version ");
|
|
Cudd_PrintVersion(stdout);
|
|
(void) fflush(stdout);
|
|
}
|
|
|
|
return;
|
|
|
|
usage: /* convenient goto */
|
|
printf("Usage: please read man page\n");
|
|
if (i == 0) {
|
|
(void) fprintf(stdout,"too few arguments\n");
|
|
} else {
|
|
(void) fprintf(stdout,"option: %s is not defined\n",argv[i]);
|
|
}
|
|
exit(-1);
|
|
|
|
} /* end of ntrReadOptions */
|
|
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Reads the program options from a file.]
|
|
|
|
Description [Reads the program options from a file. Opens file. Reads
|
|
the command line from the otpions file using the read_line func. Scans
|
|
the line looking for spaces, each space is a searator and demarks a
|
|
new option. When a space is found, it is changed to a \0 to terminate
|
|
that string; then the next value of slot points to the next non-space
|
|
character. There is a limit of 1024 options.
|
|
Should produce an error (presently doesn't) on overrun of options, but
|
|
this is very unlikely to happen.]
|
|
|
|
SideEffects [none]
|
|
|
|
SeeAlso []
|
|
|
|
******************************************************************************/
|
|
static void
|
|
ntrReadOptionsFile(
|
|
char * name,
|
|
char *** argv,
|
|
int * argc)
|
|
{
|
|
char **slot;
|
|
char *line;
|
|
char c;
|
|
int index,flag;
|
|
FILE *fp;
|
|
|
|
if ((fp = fopen(name,"r")) == NULL) {
|
|
fprintf(stderr,"Error: can not find cmd file %s\n",name);
|
|
exit(-1);
|
|
}
|
|
|
|
slot = ALLOC(char *,1024);
|
|
index = 1;
|
|
line = readLine(fp);
|
|
flag = TRUE;
|
|
|
|
do {
|
|
c = *line;
|
|
if ( c == ' ') {
|
|
flag = TRUE;
|
|
*line = '\0';
|
|
} else if ( c != ' ' && flag == TRUE) {
|
|
flag = FALSE;
|
|
slot[index] = line;
|
|
index++;
|
|
}
|
|
line++;
|
|
} while ( *line != '\0');
|
|
|
|
|
|
*argv = slot;
|
|
*argc = index;
|
|
|
|
fclose(fp);
|
|
|
|
} /* end of ntrReadOptionsFile */
|
|
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Reads a line from the option file.]
|
|
|
|
Description []
|
|
|
|
SideEffects [none]
|
|
|
|
SeeAlso []
|
|
|
|
******************************************************************************/
|
|
static char*
|
|
readLine(
|
|
FILE * fp)
|
|
{
|
|
int c;
|
|
char *pbuffer;
|
|
|
|
pbuffer = buffer;
|
|
|
|
/* Strip white space from beginning of line. */
|
|
for(;;) {
|
|
c = getc(fp);
|
|
if ( c == EOF) return(NULL);
|
|
if ( c == '\n') {
|
|
*pbuffer = '\0';
|
|
return(buffer); /* got a blank line */
|
|
}
|
|
if ( c != ' ') break;
|
|
}
|
|
do {
|
|
if ( c == '\\' ) { /* if we have a continuation character.. */
|
|
do { /* scan to end of line */
|
|
c = getc(fp);
|
|
if ( c == '\n' ) break;
|
|
} while ( c != EOF);
|
|
if ( c != EOF) {
|
|
*pbuffer = ' ';
|
|
pbuffer++;
|
|
} else return( buffer);
|
|
c = getc(fp);
|
|
continue;
|
|
}
|
|
*pbuffer = (char) c;
|
|
pbuffer++;
|
|
c = getc(fp);
|
|
} while( c != '\n' && c != EOF);
|
|
*pbuffer = '\0';
|
|
return(buffer);
|
|
|
|
} /* end of readLine */
|
|
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Opens a file.]
|
|
|
|
Description [Opens a file, or fails with an error message and exits.
|
|
Allows '-' as a synonym for standard input.]
|
|
|
|
SideEffects [None]
|
|
|
|
SeeAlso []
|
|
|
|
******************************************************************************/
|
|
static FILE *
|
|
open_file(
|
|
char * filename,
|
|
const char * mode)
|
|
{
|
|
FILE *fp;
|
|
|
|
if (strcmp(filename, "-") == 0) {
|
|
return mode[0] == 'r' ? stdin : stdout;
|
|
} else if ((fp = fopen(filename, mode)) == NULL) {
|
|
perror(filename);
|
|
exit(1);
|
|
}
|
|
return(fp);
|
|
|
|
} /* end of open_file */
|
|
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Applies reordering to the DDs.]
|
|
|
|
Description [Explicitly applies reordering to the DDs. Returns 1 if
|
|
successful; 0 otherwise.]
|
|
|
|
SideEffects [None]
|
|
|
|
SeeAlso []
|
|
|
|
*****************************************************************************/
|
|
static int
|
|
reorder(
|
|
BnetNetwork * net,
|
|
DdManager * dd /* DD Manager */,
|
|
NtrOptions * option)
|
|
{
|
|
#ifdef DD_DEBUG
|
|
st_table *mintermTable; /* minterm counts for each output */
|
|
#endif
|
|
int result; /* return value from functions */
|
|
|
|
(void) printf("Number of inputs = %d\n",net->ninputs);
|
|
|
|
/* Perform the final reordering */
|
|
if (option->reordering != CUDD_REORDER_NONE) {
|
|
#ifdef DD_DEBUG
|
|
result = Cudd_DebugCheck(dd);
|
|
if (result != 0) {
|
|
(void) fprintf(stderr,"Error reported by Cudd_DebugCheck\n");
|
|
return(0);
|
|
}
|
|
result = Cudd_CheckKeys(dd);
|
|
if (result != 0) {
|
|
(void) fprintf(stderr,"Error reported by Cudd_CheckKeys\n");
|
|
return(0);
|
|
}
|
|
mintermTable = checkMinterms(net,dd,NULL);
|
|
if (mintermTable == NULL) exit(2);
|
|
#endif
|
|
|
|
dd->siftMaxVar = 1000000;
|
|
dd->siftMaxSwap = 1000000000;
|
|
result = Cudd_ReduceHeap(dd,option->reordering,1);
|
|
if (result == 0) return(0);
|
|
#ifdef DD_DEBUG
|
|
result = Cudd_DebugCheck(dd);
|
|
if (result != 0) {
|
|
(void) fprintf(stderr,"Error reported by Cudd_DebugCheck\n");
|
|
return(0);
|
|
}
|
|
result = Cudd_CheckKeys(dd);
|
|
if (result != 0) {
|
|
(void) fprintf(stderr,"Error reported by Cudd_CheckKeys\n");
|
|
return(0);
|
|
}
|
|
mintermTable = checkMinterms(net,dd,mintermTable);
|
|
#endif
|
|
|
|
/* Print symmetry stats if pertinent */
|
|
if (dd->tree == NULL &&
|
|
(option->reordering == CUDD_REORDER_SYMM_SIFT ||
|
|
option->reordering == CUDD_REORDER_SYMM_SIFT_CONV))
|
|
Cudd_SymmProfile(dd,0,dd->size - 1);
|
|
}
|
|
|
|
if (option->gaOnOff) {
|
|
result = Cudd_ReduceHeap(dd,CUDD_REORDER_GENETIC,1);
|
|
if (result == 0) {
|
|
(void) printf("Something went wrong in cuddGa\n");
|
|
return(0);
|
|
}
|
|
}
|
|
|
|
return(1);
|
|
|
|
} /* end of reorder */
|
|
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Frees the option structure and its appendages.]
|
|
|
|
Description []
|
|
|
|
SideEffects [None]
|
|
|
|
SeeAlso []
|
|
|
|
*****************************************************************************/
|
|
static void
|
|
freeOption(
|
|
NtrOptions * option)
|
|
{
|
|
if (option->file1 != NULL) FREE(option->file1);
|
|
if (option->file2 != NULL) FREE(option->file2);
|
|
if (option->orderPiPs != NULL) FREE(option->orderPiPs);
|
|
if (option->treefile != NULL) FREE(option->treefile);
|
|
if (option->sinkfile != NULL) FREE(option->sinkfile);
|
|
if (option->dumpfile != NULL) FREE(option->dumpfile);
|
|
if (option->loadfile != NULL) FREE(option->loadfile);
|
|
if (option->storefile != NULL) FREE(option->storefile);
|
|
if (option->node != NULL) FREE(option->node);
|
|
FREE(option);
|
|
|
|
} /* end of freeOption */
|
|
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Starts the CUDD manager with the desired options.]
|
|
|
|
Description [Starts the CUDD manager with the desired options.
|
|
We start with 0 variables, because Ntr_buildDDs will create new
|
|
variables rather than using whatever already exists.]
|
|
|
|
SideEffects [None]
|
|
|
|
SeeAlso []
|
|
|
|
*****************************************************************************/
|
|
static DdManager *
|
|
startCudd(
|
|
NtrOptions * option,
|
|
int nvars)
|
|
{
|
|
DdManager *dd;
|
|
int result;
|
|
|
|
dd = Cudd_Init(0, 0, option->slots, option->cacheSize, option->maxMemory);
|
|
if (dd == NULL) return(NULL);
|
|
|
|
if (option->maxMemHard != 0) {
|
|
Cudd_SetMaxMemory(dd,option->maxMemHard);
|
|
}
|
|
Cudd_SetMaxLive(dd,option->maxLive);
|
|
Cudd_SetGroupcheck(dd,option->groupcheck);
|
|
if (option->autoDyn & 1) {
|
|
Cudd_AutodynEnable(dd,option->autoMethod);
|
|
}
|
|
dd->nextDyn = option->firstReorder;
|
|
dd->countDead = (option->countDead == FALSE) ? ~0 : 0;
|
|
dd->maxGrowth = 1.0 + ((float) option->maxGrowth / 100.0);
|
|
dd->recomb = option->recomb;
|
|
dd->arcviolation = option->arcviolation;
|
|
dd->symmviolation = option->symmviolation;
|
|
dd->populationSize = option->populationSize;
|
|
dd->numberXovers = option->numberXovers;
|
|
result = ntrReadTree(dd,option->treefile,nvars);
|
|
if (result == 0) {
|
|
Cudd_Quit(dd);
|
|
return(NULL);
|
|
}
|
|
#ifndef DD_STATS
|
|
result = Cudd_EnableReorderingReporting(dd);
|
|
if (result == 0) {
|
|
(void) fprintf(stderr,
|
|
"Error reported by Cudd_EnableReorderingReporting\n");
|
|
Cudd_Quit(dd);
|
|
return(NULL);
|
|
}
|
|
#endif
|
|
|
|
return(dd);
|
|
|
|
} /* end of startCudd */
|
|
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Reads the variable group tree from a file.]
|
|
|
|
Description [Reads the variable group tree from a file.
|
|
Returns 1 if successful; 0 otherwise.]
|
|
|
|
SideEffects [None]
|
|
|
|
SeeAlso []
|
|
|
|
*****************************************************************************/
|
|
static int
|
|
ntrReadTree(
|
|
DdManager * dd,
|
|
char * treefile,
|
|
int nvars)
|
|
{
|
|
FILE *fp;
|
|
MtrNode *root;
|
|
|
|
if (treefile == NULL) {
|
|
return(1);
|
|
}
|
|
|
|
if ((fp = fopen(treefile,"r")) == NULL) {
|
|
(void) fprintf(stderr,"Unable to open %s\n",treefile);
|
|
return(0);
|
|
}
|
|
|
|
root = Mtr_ReadGroups(fp,ddMax(Cudd_ReadSize(dd),nvars));
|
|
if (root == NULL) {
|
|
return(0);
|
|
}
|
|
|
|
Cudd_SetTree(dd,root);
|
|
|
|
return(1);
|
|
|
|
} /* end of ntrReadTree */
|