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.
191 lines
7.5 KiB
191 lines
7.5 KiB
/**
|
|
@file
|
|
|
|
@ingroup nanotrav
|
|
|
|
@brief Simple-minded package to read a blif file.
|
|
|
|
@author Fabio Somenzi
|
|
|
|
@copyright@parblock
|
|
Copyright (c) 1995-2015, 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.
|
|
@endparblock
|
|
|
|
*/
|
|
|
|
#ifndef _BNET
|
|
#define _BNET
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Nested includes */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#include "util.h"
|
|
#include "st.h"
|
|
#include "cudd.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Constant declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/* Different types of nodes. (Used in the "BnetNode" type.) */
|
|
#define BNET_CONSTANT_NODE 0
|
|
#define BNET_INPUT_NODE 1
|
|
#define BNET_PRESENT_STATE_NODE 2
|
|
#define BNET_INTERNAL_NODE 3
|
|
#define BNET_OUTPUT_NODE 4
|
|
#define BNET_NEXT_STATE_NODE 5
|
|
|
|
/* Type of DD of a node. */
|
|
#define BNET_LOCAL_DD 0
|
|
#define BNET_GLOBAL_DD 1
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Stucture declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Type declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/* The following types implement a very simple data structure for a boolean
|
|
** network. The intent is to be able to read a minimal subset of the blif
|
|
** format in a data structure from which it's easy to build DDs for the
|
|
** circuit.
|
|
*/
|
|
|
|
/**
|
|
** @brief Type to store a line of the truth table of a node.
|
|
**
|
|
** @details The entire truth table implemented as a linked list of
|
|
** objects of this type.
|
|
*/
|
|
typedef struct BnetTabline {
|
|
char *values; /**< string of 1, 0, and - */
|
|
struct BnetTabline *next; /**< pointer to next table line */
|
|
} BnetTabline;
|
|
|
|
/**
|
|
** @brief Node of the boolean network.
|
|
**
|
|
** @details There is one node in the network for each primary input
|
|
** and for each .names directive. This structure has a field to point
|
|
** to the DD of the node function. The function may be either in
|
|
** terms of primary inputs, or it may be in terms of the local
|
|
** inputs. The latter implies that each node has a variable index
|
|
** associated to it at some point in time. The field "var" stores
|
|
** that variable index, and "active" says if the association is
|
|
** currently valid. (It is indeed possible for an index to be
|
|
** associated to different nodes at different times.)
|
|
*/
|
|
typedef struct BnetNode {
|
|
char *name; /**< name of the output signal */
|
|
int type; /**< input, internal, constant, ... */
|
|
int ninp; /**< number of inputs to the node */
|
|
int nfo; /**< number of fanout nodes for this node */
|
|
char **inputs; /**< input names */
|
|
BnetTabline *f; /**< truth table for this node */
|
|
int polarity; /**< f is the onset (0) or the offset (1) */
|
|
int active; /**< node has variable associated to it (1) or not (0) */
|
|
int var; /**< %DD variable index associated to this node */
|
|
DdNode *dd; /**< decision diagram for the function of this node */
|
|
int exdc_flag; /**< whether an exdc node or not */
|
|
struct BnetNode *exdc; /**< pointer to exdc of dd node */
|
|
int count; /**< auxiliary field for %DD dropping */
|
|
int level; /**< maximum distance from the inputs */
|
|
int visited; /**< flag for search */
|
|
struct BnetNode *next; /**< pointer to implement the linked list of nodes */
|
|
} BnetNode;
|
|
|
|
/**
|
|
** @brief Very simple boolean network data structure.
|
|
*/
|
|
typedef struct BnetNetwork {
|
|
char *name; /**< network name: from the .model directive */
|
|
int npis; /**< number of primary inputs */
|
|
int ninputs; /**< number of inputs */
|
|
char **inputs; /**< primary input names: from the .inputs directive */
|
|
int npos; /**< number of primary outputs */
|
|
int noutputs; /**< number of outputs */
|
|
char **outputs; /**< primary output names: from the .outputs directive */
|
|
int nlatches; /**< number of latches */
|
|
char ***latches; /**< next state names: from the .latch directives */
|
|
BnetNode *nodes; /**< linked list of the nodes */
|
|
st_table *hash; /**< symbol table to access nodes by name */
|
|
char *slope; /**< wire_load_slope */
|
|
} BnetNetwork;
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Variable declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Macro declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#ifndef TRUE
|
|
# define TRUE 1
|
|
#endif
|
|
#ifndef FALSE
|
|
# define FALSE 0
|
|
#endif
|
|
|
|
/** \cond */
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Function prototypes */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
extern BnetNetwork * Bnet_ReadNetwork (FILE *fp, int pr);
|
|
extern void Bnet_PrintNetwork (BnetNetwork *net);
|
|
extern void Bnet_FreeNetwork (BnetNetwork *net);
|
|
extern int Bnet_BuildNodeBDD (DdManager *dd, BnetNode *nd, st_table *hash, int params, int nodrop);
|
|
extern int Bnet_DfsVariableOrder (DdManager *dd, BnetNetwork *net);
|
|
extern int Bnet_bddDump (DdManager *dd, BnetNetwork *network, char *dfile, int dumpFmt, int reencoded);
|
|
extern int Bnet_bddArrayDump (DdManager *dd, BnetNetwork *network, char *dfile, DdNode **outputs, char **onames, int noutputs, int dumpFmt);
|
|
extern int Bnet_ReadOrder (DdManager *dd, char *ordFile, BnetNetwork *net, int locGlob, int nodrop);
|
|
extern int Bnet_PrintOrder (BnetNetwork * net, DdManager *dd);
|
|
|
|
/** \endcond */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
} /* end of extern "C" */
|
|
#endif
|
|
|
|
#endif /* _BNET */
|