/*
 * This file is part of the Alliance CAD System
 * Copyright (C) Laboratoire LIP6 - Département ASIM
 * Universite Pierre et Marie Curie
 *
 * Home page          : http://www-asim.lip6.fr/alliance/
 * E-mail             : mailto:alliance-users@asim.lip6.fr
 *
 * This progam is  free software; you can redistribute it  and/or modify it
 * under the  terms of the GNU  General Public License as  published by the
 * Free Software Foundation;  either version 2 of the License,  or (at your
 * option) any later version.
 *
 * Alliance VLSI  CAD System  is distributed  in the hope  that it  will be
 * useful, but WITHOUT  ANY WARRANTY; without even the  implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 * Public License for more details.
 *
 * You should have received a copy  of the GNU General Public License along
 * with the GNU C Library; see the  file COPYING. If not, write to the Free
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

/*
 * Tool    : BooG - library cells utilities
 * Date    : 2000
 * Author  : Francois Donnet
 */




#ifndef LIB_UTILS_H
#define LIB_UTILS_H

#ifndef __P
# ifdef __STDC__ || __GNUC__
#  define __P(x) x
# else
#  define __P(x) ()
# endif
#endif


/*image of a port of a befig*/
typedef struct port {
	struct port* NEXT;
   char  *NAME;      /*name of bepor*/
	float T; 		/* (Tphh+Tpll+Tplh+Tphl)/4	 in ps */
   float C;		    /* Cin   in pF  */
   float R;		    /* Rout  in Ohm   */
	chain_list* ABL;	/* abl of leaf  for mapping*/
	int      STABLE;   /*non-zero if pointed by a STABLE expr in abl*/
   int	DIRECTION;	/* VDD(char*),VSS, IN(const),OUT,INOUT,TRISTATE,TRANSCV*/
   int   NEGATIV;   /*flag set to show if ABL field must be inverted or not*/
} port_list;

/*image of a befig from the cell library*/
typedef struct cell {
	struct cell* NEXT;
	port_list*	 PORT;	  /*image of bepor*/
	chain_list*	 ABL;	  /*it isn't an abl, it's leaves point on port element*/
	biabl_list*	 BIABL;	  /*for cell with condition block*/
	char*		    NAME;	  /*name of befig*/
   int          AREA;
   befig_list*  BEFIG;    /*befig represented*/
   char         MODE;     /*if 'A' (all), cell is developped in lofig*/
                          /*if 'P' (partial), it's known only as a loins name*/
   float        DELAY;    /*to memorize a temporary delay on a cell*/
} cell_list;


/***************************************************************************/
/* return a new port taken from the heap                                   */
/***************************************************************************/
extern port_list* newport __P (());

/******************************************************************************/
/*build a new cell in our library                                             */
/* port of cell is the inverted list of bepor                                 */
/******************************************************************************/
extern cell_list* addCell __P ((befig_list* befig));

/******************************************************************************/
/*build a new cell in our library                                             */
/* port of cell is the inverted list of bepor                                 */
/******************************************************************************/
extern cell_list* copyCell __P ((cell_list* old));

/******************************************************************************/
/*insert a new cell in a list of cells                                        */
/* the sort is the biggest to the lowest cell                                 */
/*  (AND a b) is after (AND a (NOT b))                                        */
/* because is always better to take the biggest cell to match for example:    */
/*  (AND (NOT a) (NOT b))  will be matched by (AND a (NOT b))                 */
/*return the new list if inserted else return NULL                            */
/******************************************************************************/
extern cell_list* classCell __P ((cell_list* new_cell, cell_list* list));

/******************************************************************************/
/*duplicate a list of port but not its contents                               */
/******************************************************************************/
extern port_list* copyport __P ((port_list* head));

/******************************************************************************/
/*  copy values of head to new recursively                                    */
/******************************************************************************/
extern void moveport __P ((port_list* head, port_list* new_head));

/******************************************************************************/
/*                    free a list of port                                     */
/******************************************************************************/
extern void delport __P ((port_list* head));


#endif
