
/* contains the type declarations for expression handling information
 *
 * $Header: c:\\cygwin\\cvsroot/Vert03/vertlib/expression.h,v 1.1.1.1 2003/11/04 23:34:57
 * mjames Exp $
 *
 * $Log: expression.h,v $
 * Revision 1.1.1.1  2003/11/04 23:34:57  mjames
 * Imported into local repositrory
 *
 * Revision 1.8  2002/10/02 19:37:30  MJAMES
 * Moved dummy functions to a separate support file.
 *
 * Used correct number of arguments to define_pin
 *
 * Revision 1.7  2002/09/30 13:22:38  MJAMES
 * Altered the use and creation of partition
 * generics (at evaluation time of expressions within the partition )
 * This still needs checking, as evaluation of the expression may well be
 * delayed until after when the partition generics need to be defined.
 *
 * Revision 1.6  2002/09/09 10:15:54  mjames
 * Modified expression parser to match CC as previous one was
 * broken
 *
 * Revision 1.5  2002/08/14 12:04:42  mjames
 * Added declaration for eval_expression
 *
 * Revision 1.5  2002/04/04 14:53:05  mjames
 * Added mentor board station reader to the portfolio
 *
 * Revision 1.4  2001/10/31 22:20:04  mjames
 * Tidying up problematical comments caused by CVS
 * 'intelligent' comment guessing
 *
 * Revision 1.3  2001/06/06 12:10:23  mjames
 * Move from HPUX
 *
 * Revision 1.2  2000/11/29 21:51:18  mjames
 * Fine tuning of software
 *
 * Revision 1.1.1.1  2000/10/19 21:58:37  mjames
 * Mike put it here
 *
 *
 * Revision 1.19  2000/10/04  10:37:15  10:37:15  mjames (Mike James)
 * Modified for Vertical2 : support COMPONENTS and SIGNALS
 *
 * Revision 1.19  2000/10/04  10:37:15  10:37:15  mjames (Mike James)
 * Part of Release PSAVAT01
 *
 * Revision 1.18  2000/10/02  11:04:12  11:04:12  mjames (Mike James)
 * new_vhdl
 *
 * Revision 1.17  2000/09/27  14:42:30  14:42:30  mjames (Mike James)
 * Part of Release Sep_27_ST_2000
 *
 * Revision 1.16  2000/09/21  10:16:00  10:16:00  mjames (Mike James)
 * Part of Release Sep21Alpha
 *
 * Revision 1.15  2000/08/25  09:57:23  09:57:23  mjames (Mike James)
 * Part of Release Aug25_alpha
 *
 * Revision 1.14  2000/08/16  08:57:40  08:57:40  mjames (Mike James)
 * Part of Release CD01_Aug2000
 *
 * Revision 1.13  2000/08/14  14:45:19  14:45:19  mjames (Mike James)
 * Part of Release Aug_14_2000
 *
 * Revision 1.12  2000/08/11  08:30:40  08:30:40  mjames (Mike James)
 * Part of Release Aug_11_2000
 *
 * Revision 1.11  2000/08/09  10:31:57  10:31:57  mjames (Mike James)
 * Part of Release Aug__9_2000
 *
 * Revision 1.10  2000/05/31  11:43:11  11:43:11  mjames (Mike James)
 * Part of Release May_31_2000
 *
 * Revision 1.9  2000/05/08  17:01:46  17:01:46  mjames (Mike James)
 * Part of Release May__8_2000
 *
 * Revision 1.8  2000/05/08  16:59:40  16:59:40  mjames (Mike James)
 * Part of Release May__8_2000
 *
 * Revision 1.7  2000/05/08  16:57:16  16:57:16  mjames (Mike James)
 * Part of Release May__8_2000
 *
 * Revision 1.6  2000/03/08  16:18:57  16:18:57  mjames (Mike James)
 * New version including PC
 *
 * Revision 1.3  2000/01/20  15:58:58  15:58:58  mjames (Mike James)
 * Part of Release R22
 *
 * Revision 1.2  99/12/22  11:15:39  11:15:39  mjames (Mike James)
 * Part of Release Dec_22_1999
 *
 * Revision 1.1  99/06/25  14:36:23  14:36:23  mjames (Mike James)
 * Initial revision
 *
 
 
#pragma once

#include "stdio.h"
#include "generic.h"
 *  */
#if !defined _EXPRESSION
#define _EXPRESSION

/* constants for object types found at bottom of expressions */
#define EXP_CONSTANT 'C'
#define EXP_VAR_REF 'I'
#define EXP_BOOLEAN 'B'
#define EXP_VARIABLE 'V'
#define EXP_STRING 'S'
#define EXP_UNDEF_VAR 'U'
#define EXP_CHAR 'H'

/* decoding  recurse_generics
 * 0: NO_RECURSE stop expanding generics when a constant encountered
 * 1: RECURSE_CONST expand generics until one found which does not contain an expression
 * 2: RECURSE_NUMBER: expand generics until all constants are exposed
 
 constant a : integer := 3;
 constant b : integer := a + 3;
 constant c : integer := b + a;
 
 for values of expand generics :
 value 0:
 constant a : integer := 3;
 constant b : integer := a + 3;
 constant c : integer := b + a;
 
 value 1:
 constant a : integer := 3;
 constant b : integer := a + 3;
 constant c : integer := (a+3) + a;
 
 value 2:
 constant a : integer := 3;
 constant b : integer := (3) + 3;
 constant c : integer := ((3)+3) + (3);
 
 
  */

typedef enum
{
        NO_RECURSE = 0,
        RECURSE_CONST,
        RECURSE_NUMBER
} generic_print_style;

struct generic_info;
/* see database.h for the description of expression_t */
/* expression data structures .. see expression.h for handler fns */
typedef struct exp
{
        int opcode;
        union
        {
                char *s;                /* pointer to string value */
                struct generic_info *g; /* pointer to generic value */
                int i;                  /* integer part of expression */
                struct exp *e;
                int *ip; /* pointer to an integer somewhere */
        } left;          /* values */
        union
        {
                char *s; /* pointer to name */
                struct exp *e;
        } right; /* name or expression */

} expression_t;

/* place reference to a 'C' variable at the end of the tree branch */
extern expression_t *compile_variable_reference (int *v, char *s);

/* compiles a variable. When printing expression stop descent of the evaluation tree here */
extern expression_t *compile_variable (struct generic_info *gen, char *valname);

extern expression_t *compile_string (char *s);

extern expression_t *compile_char (char c);

/* an unelaborated variable reference (link at evaluation time */
extern expression_t *compile_reference (char *s);

/* compiles an integer constant */
extern expression_t *compile_constant (int k);

extern expression_t *compile_constant_string (int k, char *s);

/* compiles an boolean constant */
extern expression_t *compile_bool_constant (int k);

extern expression_t *compile_bool_constant_string (int k, char *s);

extern expression_t *compile_expression (int opcode, expression_t *left, expression_t *right);

extern void print_expression (FILE *f, expression_t *e, generic_print_style recurse_generics);

extern void
print_range_expression (FILE *f, expression_t *e, generic_print_style recurse_generics);

extern void print_msg_expression (FILE *f, char *s, expression_t *e);

/* this is actually returning the type of the generic */
extern int eval_gen_expression (struct generic_info *gen);

extern int eval_vhdl_expression (expression_t *expr, int *high, int *low);

/*******************************************/
struct socket; /* pulled in from database.h */
struct vhdl;
/*******************************************/
extern expression_t *copy_expression (expression_t *src, struct socket *skt);

extern struct vhdl *copy_vhdl (struct vhdl *vhdl, struct socket *skt);

extern void free_expression (expression_t *expr);

extern int eval_expression (expression_t *e, struct generic_info **generic_list);

#endif
