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.
324 lines
9.2 KiB
324 lines
9.2 KiB
/*============================================================================
|
|
FILE cmpp.h
|
|
|
|
MEMBER OF process cmpp
|
|
|
|
Public Domain
|
|
|
|
Georgia Tech Research Corporation
|
|
Atlanta, Georgia 30332
|
|
PROJECT A-8503
|
|
|
|
AUTHORS
|
|
|
|
9/12/91 Bill Kuhn
|
|
|
|
MODIFICATIONS
|
|
|
|
<date> <person name> <nature of modifications>
|
|
|
|
SUMMARY
|
|
|
|
This file contains shared constants, type definitions,
|
|
and function prototypes used in the cmpp process.
|
|
|
|
INTERFACES
|
|
|
|
None.
|
|
|
|
REFERENCED FILES
|
|
|
|
None.
|
|
|
|
NON-STANDARD FEATURES
|
|
|
|
None.
|
|
|
|
============================================================================*/
|
|
|
|
|
|
#include <stdarg.h>
|
|
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
|
|
#define IFSPEC_FILENAME "ifspec.ifs"
|
|
#define UDNFUNC_FILENAME "udnfunc.c"
|
|
#define MODPATH_FILENAME "modpath.lst"
|
|
#define UDNPATH_FILENAME "udnpath.lst"
|
|
|
|
#ifdef _MSC_VER
|
|
#include <io.h>
|
|
#include <string.h>
|
|
|
|
/* If CRT debugging is being used so that crtdbg.h is included, strdup will
|
|
* be defined to a debug version. In this case, strdup should not be
|
|
* redefined to the standard version. */
|
|
#ifndef strdup
|
|
#define strdup _strdup
|
|
#endif
|
|
|
|
#define unlink _unlink
|
|
#define isatty _isatty
|
|
#define fileno _fileno
|
|
#endif /* _MSC_VER */
|
|
|
|
/* *********************************************************************** */
|
|
|
|
#define GET_IFS_TABLE 0 /* Read the entire ifs table */
|
|
#define GET_IFS_NAME 1 /* Get the C function name out of the table only */
|
|
|
|
#define MAX_NAME_LEN 1024 /* Maximum SPICE name length */
|
|
|
|
|
|
/* ******************************************************************** */
|
|
/* Structures used by parser to check for valid connections/parameters */
|
|
/* ******************************************************************** */
|
|
|
|
/*
|
|
* The direction of a connector
|
|
*/
|
|
|
|
typedef enum {
|
|
CMPP_IN,
|
|
CMPP_OUT,
|
|
CMPP_INOUT,
|
|
} Dir_t;
|
|
|
|
|
|
/*
|
|
* The type of a port
|
|
*/
|
|
|
|
typedef enum {
|
|
VOLTAGE, /* v - Single-ended voltage */
|
|
DIFF_VOLTAGE, /* vd - Differential voltage */
|
|
CURRENT, /* i - Single-ended current */
|
|
DIFF_CURRENT, /* id - Differential current */
|
|
VSOURCE_CURRENT, /* vnam - Vsource name for input current */
|
|
CONDUCTANCE, /* g - Single-ended VCIS */
|
|
DIFF_CONDUCTANCE, /* gd - Differential VCIS */
|
|
RESISTANCE, /* h - Single-ended ICVS */
|
|
DIFF_RESISTANCE, /* hd - Differential ICVS */
|
|
DIGITAL, /* d - Digital */
|
|
USER_DEFINED, /* <identifier> - Any user defined type */
|
|
} Port_Type_t;
|
|
|
|
|
|
|
|
/*
|
|
* The type of a parameter or Static_Var
|
|
*/
|
|
|
|
typedef enum {
|
|
CMPP_BOOLEAN,
|
|
CMPP_INTEGER,
|
|
CMPP_REAL,
|
|
CMPP_COMPLEX,
|
|
CMPP_STRING,
|
|
CMPP_POINTER, /* NOTE: CMPP_POINTER should not be used for Parameters -
|
|
* only Static_Vars - this is enforced by the cmpp. */
|
|
} Data_Type_t;
|
|
|
|
|
|
|
|
/*
|
|
* The complex type
|
|
*/
|
|
|
|
typedef struct {
|
|
double real;
|
|
double imag;
|
|
} Complex_t;
|
|
|
|
|
|
|
|
/*
|
|
* Values of different types.
|
|
*
|
|
* Note that a struct is used instead of a union for conformity
|
|
* with the use of the Mif_Value_t type in the simulator where
|
|
* the type must be statically initialized. ANSI C does not
|
|
* support useful initialization of unions.
|
|
*
|
|
*/
|
|
|
|
typedef struct {
|
|
|
|
bool bvalue; /* For BOOLEAN parameters */
|
|
int ivalue; /* For INTEGER parameters */
|
|
double rvalue; /* For REAL parameters */
|
|
Complex_t cvalue; /* For COMPLEX parameters */
|
|
char *svalue; /* For STRING parameters */
|
|
|
|
} Value_t;
|
|
|
|
|
|
|
|
/*
|
|
* Information about the model as a whole
|
|
*/
|
|
|
|
|
|
typedef struct {
|
|
|
|
char *c_fcn_name; /* Name used in the C function */
|
|
char *model_name; /* Name used in a spice deck */
|
|
char *description; /* Description of the model */
|
|
|
|
} Name_Info_t;
|
|
|
|
|
|
|
|
|
|
/*
|
|
* Information about a connection
|
|
*/
|
|
|
|
|
|
typedef struct {
|
|
|
|
char *name; /* Name of this connection */
|
|
char *description; /* Description of this connection */
|
|
Dir_t direction; /* IN, OUT, or INOUT */
|
|
Port_Type_t default_port_type; /* The default port type */
|
|
char *default_type; /* The default type in string form */
|
|
int num_allowed_types; /* The size of the allowed type arrays */
|
|
Port_Type_t *allowed_port_type; /* Array of allowed types */
|
|
char **allowed_type; /* Array of allowed types in string form */
|
|
bool is_array; /* True if connection is an array */
|
|
bool has_conn_ref; /* True if there is associated with an array conn */
|
|
int conn_ref; /* Subscript of the associated array conn */
|
|
bool has_lower_bound; /* True if there is an array size lower bound */
|
|
int lower_bound; /* Array size lower bound */
|
|
bool has_upper_bound; /* True if there is an array size upper bound */
|
|
int upper_bound; /* Array size upper bound */
|
|
bool null_allowed; /* True if null is allowed for this connection */
|
|
|
|
} Conn_Info_t;
|
|
|
|
|
|
|
|
|
|
/*
|
|
* Information about a parameter
|
|
*/
|
|
|
|
typedef struct {
|
|
|
|
char *name; /* Name of this parameter */
|
|
char *description; /* Description of this parameter */
|
|
Data_Type_t type; /* Data type, e.g. REAL, INTEGER, ... */
|
|
int default_value_idx;/* Start of default_values.. */
|
|
int default_value_cnt;/* Number of default_values.. */
|
|
bool has_lower_limit; /* True if there is a lower limit */
|
|
Value_t lower_limit; /* The lower limit for this parameter */
|
|
bool has_upper_limit; /* True if there is a upper limit */
|
|
Value_t upper_limit; /* The upper limit for this parameter */
|
|
bool is_array; /* True if parameter is an array */
|
|
bool has_conn_ref; /* True if there is associated with an array conn */
|
|
int conn_ref; /* Subscript of the associated array conn */
|
|
bool has_lower_bound; /* True if there is an array size lower bound */
|
|
int lower_bound; /* Array size lower bound */
|
|
bool has_upper_bound; /* True if there is an array size upper bound */
|
|
int upper_bound; /* Array size upper bound */
|
|
bool null_allowed; /* True if null is allowed for this parameter */
|
|
|
|
} Param_Info_t;
|
|
|
|
|
|
/*
|
|
* Information about an instance variable
|
|
*/
|
|
|
|
typedef struct {
|
|
|
|
char *name; /* Name of this parameter */
|
|
char *description; /* Description of this parameter */
|
|
Data_Type_t type; /* Data type, e.g. REAL, INTEGER, ... */
|
|
bool is_array; /* True if parameter is an array */
|
|
|
|
} Inst_Var_Info_t;
|
|
|
|
/* Structure used when parsing default values from the IFS file, used below. */
|
|
|
|
typedef struct {
|
|
bool has_value;
|
|
bool advance; // Used for vector default values.
|
|
Data_Type_t kind;
|
|
Value_t u; // Union holding the value.
|
|
} My_Value_t;
|
|
|
|
/*
|
|
* The all encompassing structure for the ifs table information
|
|
*/
|
|
|
|
typedef struct {
|
|
|
|
Name_Info_t name; /* The name table entries */
|
|
int num_conn; /* Number of entries in the connection table(s) */
|
|
Conn_Info_t *conn; /* Array of connection info structs */
|
|
int num_param; /* Number of entries in the parameter table(s) */
|
|
Param_Info_t *param; /* Array of parameter info structs */
|
|
int num_inst_var; /* Number of entries in the instance var table(s) */
|
|
Inst_Var_Info_t *inst_var; /* Array of instance variable info structs */
|
|
int num_default_values;
|
|
My_Value_t *defaults_var; /* Array of annotated values. */
|
|
} Ifs_Table_t;
|
|
|
|
|
|
|
|
/* *********************************************************************** */
|
|
|
|
|
|
|
|
void preprocess_ifs_file(void);
|
|
|
|
void preprocess_lst_files(void);
|
|
|
|
void preprocess_mod_file(const char *filename);
|
|
|
|
int output_paths_from_lst_file(const char *filename);
|
|
|
|
|
|
void init_error (char *program_name);
|
|
|
|
#ifdef __GNUC__
|
|
void print_error(const char *fmt, ...) __attribute__ ((format (__printf__, 1, 2)));
|
|
#else
|
|
void print_error(const char *fmt, ...);
|
|
#endif
|
|
void vprint_error(const char *fmt, va_list p);
|
|
|
|
void str_to_lower(char *s);
|
|
|
|
|
|
int read_ifs_file(const char *filename, int mode, Ifs_Table_t *ifs_table);
|
|
|
|
int write_ifs_c_file(const char *filename, Ifs_Table_t *ifs_table);
|
|
|
|
|
|
char *gen_filename(const char *filename, const char *mode);
|
|
|
|
void rem_ifs_table(Ifs_Table_t *ifs_table);
|
|
|
|
/*
|
|
* type safe variants of the <ctype.h> functions for char arguments
|
|
*/
|
|
|
|
#if !defined(isalpha_c)
|
|
|
|
inline static int char_to_int(char c) { return (unsigned char) c; }
|
|
|
|
#define isalpha_c(x) isalpha(char_to_int(x))
|
|
#define islower_c(x) islower(char_to_int(x))
|
|
#define isdigit_c(x) isdigit(char_to_int(x))
|
|
#define isalnum_c(x) isalnum(char_to_int(x))
|
|
#define isprint_c(x) isprint(char_to_int(x))
|
|
#define isblank_c(x) isblank(char_to_int(x))
|
|
#define isspace_c(x) isspace(char_to_int(x))
|
|
#define isupper_c(x) isupper(char_to_int(x))
|
|
|
|
#define tolower_c(x) ((char) tolower(char_to_int(x)))
|
|
#define toupper_c(x) ((char) toupper(char_to_int(x)))
|
|
|
|
#endif
|