* netdefs.h - netlist definitions for arbitrary netlists
*
* Copyright (C) 2004, 2007, 2008 Stefan Jahn <stefan@lkcc.org>
*
* This 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, or (at your option)
* any later version.
*
* This software 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 this package; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* $Id$
*
*/
#ifndef __NETDEFS_H__
#define __NETDEFS_H__
namespace qucs {
class environment;
}
struct node_t {
char * node;
char * xlate;
int xlatenr;
struct node_t * next;
};
struct value_t {
char * ident;
char * unit;
char * scale;
double value;
int var;
int subst;
int hint;
int range;
struct value_t * next;
};
struct pair_t {
char * key;
struct value_t * value;
struct pair_t * next;
};
struct definition_t {
char * type;
char * instance;
struct node_t * nodes;
struct pair_t * pairs;
struct definition_t * next;
struct definition_t * sub;
qucs::environment * env;
void * eqns;
int duplicate;
int action;
int substrate;
int nonlinear;
int nodeset;
int line;
int copy;
int ncount;
char * text;
char * subcircuit;
struct value_t * values;
struct define_t * define;
};
struct property_t {
const char * key;
int type;
struct {
nr_double_t d;
const char * s;
} defaultval;
struct {
char il;
nr_double_t l;
nr_double_t h;
char ih;
const char * str[8];
} range;
};
struct define_t {
const char * type;
int nodes;
int action;
int substrate;
int nonlinear;
struct property_t * required;
struct property_t * optional;
};
#define MAX_PORTS 256
#define PROP_ACTION 1
#define PROP_COMPONENT 0
#define PROP_SUBSTRATE 1
#define PROP_NO_SUBSTRATE 0
#define PROP_NONLINEAR 1
#define PROP_LINEAR 0
#define PROP_NODES -1
#define PROP_NO_PROP { NULL, PROP_REAL, { PROP_NO_VAL, PROP_NO_STR }, \
PROP_NO_RANGE }
#define PROP_NO_VAL 0.0
#define PROP_NO_STR ((char *) -1)
#define PROP_NO_RANGE { '.', 0, 0, '.', { NULL } }
#define PROP_VAL_MAX std::numeric_limits<nr_double_t>::max()
#define PROP_VAL_MIN std::numeric_limits<nr_double_t>::min()
#define PROP_POS_RANGE { '[', 0, 0, '.', { NULL } }
#define PROP_NEG_RANGE { '.', 0, 0, ']', { NULL } }
#define PROP_POS_RANGEX { ']', 0, 0, '.', { NULL } }
#define PROP_NEG_RANGEX { '.', 0, 0, '[', { NULL } }
#define PROP_MIN_VAL(k) { '[', k, 0, '.', { NULL } }
#define PROP_MAX_VAL(k) { '.', 0, k, ']', { NULL } }
#define PROP_MIN_VALX(k) { ']', k, 0, '.', { NULL } }
#define PROP_MAX_VALX(k) { '.', 0, k, '[', { NULL } }
#define PROP_RNG_X01I { ']', 0, 1, ']', { NULL } }
#define PROP_RNGII(f,t) { '[', f, t, ']', { NULL } }
#define PROP_RNGXI(f,t) { ']', f, t, ']', { NULL } }
#define PROP_RNGIX(f,t) { '[', f, t, '[', { NULL } }
#define PROP_RNGXX(f,t) { ']', f, t, '[', { NULL } }
#define PROP_RNG_STR1(s) \
{ '.', 0, 0, '.', { s, NULL } }
#define PROP_RNG_STR2(s1,s2) \
{ '.', 0, 0, '.', { s1, s2, NULL } }
#define PROP_RNG_STR3(s1,s2,s3) \
{ '.', 0, 0, '.', { s1, s2, s3, NULL } }
#define PROP_RNG_STR4(s1,s2,s3,s4) \
{ '.', 0, 0, '.', { s1, s2, s3, s4, NULL } }
#define PROP_RNG_STR5(s1,s2,s3,s4,s5) \
{ '.', 0, 0, '.', { s1, s2, s3, s4, s5, NULL } }
#define PROP_RNG_STR6(s1,s2,s3,s4,s5,s6) \
{ '.', 0, 0, '.', { s1, s2, s3, s4, s5, s6, NULL } }
#define PROP_RNG_STR7(s1,s2,s3,s4,s5,s6,s7) \
{ '.', 0, 0, '.', { s1, s2, s3, s4, s5, s6, s7, NULL } }
#define PROP_RNG_YESNO PROP_RNG_STR2 ("yes", "no")
#define PROP_RNG_BJT PROP_RNG_STR2 ("npn", "pnp")
#define PROP_RNG_FET PROP_RNG_STR2 ("nfet", "pfet")
#define PROP_RNG_MOS PROP_RNG_STR2 ("nmos", "pmos")
#define PROP_RNG_TYP PROP_RNG_STR4 ("lin", "log", "list", "const")
#define PROP_RNG_SOL \
PROP_RNG_STR5 ("CroutLU", "DoolittleLU", "HouseholderQR", \
"HouseholderLQ", "GolubSVD")
#define PROP_RNG_DIS \
PROP_RNG_STR7 ("Kirschning", "Kobayashi", "Yamashita", "Getsinger", \
"Schneider", "Pramanick", "Hammerstad")
#define PROP_RNG_MOD \
PROP_RNG_STR3 ("Wheeler", "Schneider", "Hammerstad")
#define PROP_RNG_MRSCORR \
PROP_RNG_STR3 ("Chew_Kong", "Giannini", "OldQucsNoCorrection")
#define PROP_RNG_MRSMOD \
PROP_RNG_STR3 ("March", "Giannini", "OldQucsModel")
#define PROP_NONE -1
#define PROP_INT 0
#define PROP_REAL 1
#define PROP_STR 2
#define PROP_LIST 3
#define PROP_IS_PROP(prop) ((prop).key != NULL)
#define PROP_IS_VAL(prop) ((prop).type != PROP_STR)
#define PROP_IS_INT(prop) ((prop).type == PROP_INT)
#define PROP_IS_STR(prop) (!PROP_IS_VAL (prop))
#define PROP_IS_LST(prop) ((prop).type == PROP_LIST)
#define PROP_HAS_RANGE(prop) ((prop).range.l != 0 || (prop).range.h != 0 || \
(prop).range.il != '.' || (prop).range.ih != '.')
#define PROP_HAS_STR(prop) ((prop).range.str[0] != NULL)
#define PROP_REQ static struct property_t required
#define PROP_OPT static struct property_t optional
#define PROP_DEF required, optional
#define create_definition() \
((struct definition_t *) calloc (sizeof (struct definition_t), 1))
#define create_value() \
((struct value_t *) calloc (sizeof (struct value_t), 1))
#define create_node() \
((struct node_t *) calloc (sizeof (struct node_t), 1))
#define create_pair() \
((struct pair_t *) calloc (sizeof (struct pair_t), 1))
#endif