/**CFile***********************************************************************

  FileName    [cuddZddMisc.c]

  PackageName [cudd]

  Synopsis    [Miscellaneous utility functions for ZDDs.]

  Description [External procedures included in this module:
                    <ul>
                    <li> Cudd_zddDagSize()
                    <li> Cudd_zddCountMinterm()
                    <li> Cudd_zddPrintSubtable()
                    </ul>
               Internal procedures included in this module:
                    <ul>
                    </ul>
               Static procedures included in this module:
                    <ul>
                    <li> cuddZddDagInt()
                    </ul>
              ]

  SeeAlso     []

  Author      [Hyong-Kyoon Shin, In-Ho Moon]

  Copyright   [Copyright (c) 1995-2004, 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 <math.h>
#include "misc/util/util_hack.h"
#include "cuddInt.h"

ABC_NAMESPACE_IMPL_START



/*---------------------------------------------------------------------------*/
/* Constant declarations                                                     */
/*---------------------------------------------------------------------------*/


/*---------------------------------------------------------------------------*/
/* Stucture declarations                                                     */
/*---------------------------------------------------------------------------*/


/*---------------------------------------------------------------------------*/
/* Type declarations                                                         */
/*---------------------------------------------------------------------------*/


/*---------------------------------------------------------------------------*/
/* Variable declarations                                                     */
/*---------------------------------------------------------------------------*/

#ifndef lint
static char rcsid[] DD_UNUSED = "$Id: cuddZddMisc.c,v 1.16 2009/02/20 02:14:58 fabio Exp $";
#endif

/*---------------------------------------------------------------------------*/
/* Macro declarations                                                        */
/*---------------------------------------------------------------------------*/


/**AutomaticStart*************************************************************/

/*---------------------------------------------------------------------------*/
/* Static function prototypes                                                */
/*---------------------------------------------------------------------------*/

static int cuddZddDagInt (DdNode *n, st__table *tab);

/**AutomaticEnd***************************************************************/


/*---------------------------------------------------------------------------*/
/* Definition of exported functions                                          */
/*---------------------------------------------------------------------------*/


/**Function********************************************************************

  Synopsis    [Counts the number of nodes in a ZDD.]

  Description [Counts the number of nodes in a ZDD. This function
  duplicates Cudd_DagSize and is only retained for compatibility.]

  SideEffects [None]

  SeeAlso     [Cudd_DagSize]

******************************************************************************/
int
Cudd_zddDagSize(
  DdNode * p_node)
{

    int         i;
    st__table    *table;

    table = st__init_table( st__ptrcmp, st__ptrhash);
    i = cuddZddDagInt(p_node, table);
    st__free_table(table);
    return(i);

} /* end of Cudd_zddDagSize */


/**Function********************************************************************

  Synopsis    [Counts the number of minterms of a ZDD.]

  Description [Counts the number of minterms of the ZDD rooted at
  <code>node</code>. This procedure takes a parameter
  <code>path</code> that specifies how many variables are in the
  support of the function. If the procedure runs out of memory, it
  returns (double) CUDD_OUT_OF_MEM.]

  SideEffects [None]

  SeeAlso     [Cudd_zddCountDouble]

******************************************************************************/
double
Cudd_zddCountMinterm(
  DdManager * zdd,
  DdNode * node,
  int  path)
{
    double      dc_var, minterms;

    dc_var = (double)((double)(zdd->sizeZ) - (double)path);
    minterms = Cudd_zddCountDouble(zdd, node) / pow(2.0, dc_var);
    return(minterms);

} /* end of Cudd_zddCountMinterm */


/**Function********************************************************************

  Synopsis    [Prints the ZDD table.]

  Description [Prints the ZDD table for debugging purposes.]

  SideEffects [None]

  SeeAlso     []

******************************************************************************/
void
Cudd_zddPrintSubtable(
  DdManager * table)
{
    int         i, j;
    DdNode      *z1, *z1_next, *base;
    DdSubtable  *ZSubTable;

    base = table->one;
    for (i = table->sizeZ - 1; i >= 0; i--) {
        ZSubTable = &(table->subtableZ[i]);
        printf("subtable[%d]:\n", i);
        for (j = ZSubTable->slots - 1; j >= 0; j--) {
            z1 = ZSubTable->nodelist[j];
            while (z1 != NIL(DdNode)) {
                (void) fprintf(table->out,
#if SIZEOF_VOID_P == 8
                    "ID = 0x%lx\tindex = %u\tr = %u\t",
                    (ptruint) z1 / (ptruint) sizeof(DdNode),
                    z1->index, z1->ref);
#else
                    "ID = 0x%x\tindex = %hu\tr = %hu\t",
                    (ptruint) z1 / (ptruint) sizeof(DdNode),
                    z1->index, z1->ref);
#endif
                z1_next = cuddT(z1);
                if (Cudd_IsConstant(z1_next)) {
                    (void) fprintf(table->out, "T = %d\t\t",
                        (z1_next == base));
                }
                else {
#if SIZEOF_VOID_P == 8
                    (void) fprintf(table->out, "T = 0x%lx\t",
                        (ptruint) z1_next / (ptruint) sizeof(DdNode));
#else
                    (void) fprintf(table->out, "T = 0x%x\t",
                        (ptruint) z1_next / (ptruint) sizeof(DdNode));
#endif
                }
                z1_next = cuddE(z1);
                if (Cudd_IsConstant(z1_next)) {
                    (void) fprintf(table->out, "E = %d\n",
                        (z1_next == base));
                }
                else {
#if SIZEOF_VOID_P == 8
                    (void) fprintf(table->out, "E = 0x%lx\n",
                        (ptruint) z1_next / (ptruint) sizeof(DdNode));
#else
                    (void) fprintf(table->out, "E = 0x%x\n",
                        (ptruint) z1_next / (ptruint) sizeof(DdNode));
#endif
                }

                z1_next = z1->next;
                z1 = z1_next;
            }
        }
    }
    putchar('\n');

} /* Cudd_zddPrintSubtable */


/*---------------------------------------------------------------------------*/
/* Definition of static functions                                            */
/*---------------------------------------------------------------------------*/


/**Function********************************************************************

  Synopsis    [Performs the recursive step of Cudd_zddDagSize.]

  Description [Performs the recursive step of Cudd_zddDagSize. Does
  not check for out-of-memory conditions.]

  SideEffects [None]

  SeeAlso     []

******************************************************************************/
static int
cuddZddDagInt(
  DdNode * n,
  st__table * tab)
{
    if (n == NIL(DdNode))
        return(0);

    if ( st__is_member(tab, (char *)n) == 1)
        return(0);

    if (Cudd_IsConstant(n))
        return(0);

    (void) st__insert(tab, (char *)n, NIL(char));
    return(1 + cuddZddDagInt(cuddT(n), tab) +
        cuddZddDagInt(cuddE(n), tab));

} /* cuddZddDagInt */


ABC_NAMESPACE_IMPL_END

