inpcom.c, rewrite subckt_w_params business

This commit is contained in:
rlar 2013-05-30 12:48:51 +02:00
parent 956e7ad625
commit 761ca9963d
1 changed files with 56 additions and 32 deletions

View File

@ -48,8 +48,10 @@ static struct library {
static int num_libraries;
static char *subckt_w_params[N_SUBCKT_W_PARAMS];
static int num_subckt_w_params;
struct names {
char *names[N_SUBCKT_W_PARAMS];
int num_names;
};
struct function_env
{
@ -82,15 +84,15 @@ static char *readline(FILE *fd);
static int get_number_terminals(char *c);
static void inp_stripcomments_deck(struct line *deck);
static void inp_stripcomments_line(char *s);
static void inp_fix_for_numparam(struct line *deck);
static void inp_fix_for_numparam(struct names *subckt_w_params, struct line *deck);
static void inp_remove_excess_ws(struct line *deck);
static void expand_section_references(struct line *deck, int call_depth, char *dir_name);
static void inp_grab_func(struct function_env *, struct line *deck);
static void inp_fix_inst_calls_for_numparam(struct line *deck);
static void inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck);
static void inp_expand_macros_in_func(struct function_env *);
static struct line *inp_expand_macros_in_deck(struct function_env *, struct line *deck);
static void inp_fix_param_values(struct line *deck);
static void inp_reorder_params(struct line *deck, struct line *list_head, struct line *end);
static void inp_reorder_params(struct names *subckt_w_params, struct line *deck, struct line *list_head, struct line *end);
static int inp_split_multi_param_lines(struct line *deck, int line_number);
static void inp_sort_params(struct line *start_card, struct line *end_card, struct line *card_bf_start, struct line *s_c, struct line *e_c);
static char *inp_remove_ws(char *s);
@ -239,6 +241,23 @@ read_a_lib(char *y, int call_depth, char *dir_name)
}
static struct names *
new_names(void)
{
struct names *p = TMALLOC(struct names, 1);
p -> num_names = 0;
return p;
}
static void
delete_names(struct names *p)
{
tfree(p);
}
/*-------------------------------------------------------------------------
Read the entire input file and return a pointer to the first line of
the linked list of 'card' records in data. The pointer is stored in
@ -306,7 +325,6 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile
bool found_end = FALSE, shell_eol_continuation = FALSE;
if (call_depth == 0) {
num_subckt_w_params = 0;
num_libraries = 0;
global = NULL;
found_end = FALSE;
@ -716,7 +734,9 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile
if (call_depth == 0) {
inp_fix_for_numparam(working);
struct names *subckt_w_params = new_names();
inp_fix_for_numparam(subckt_w_params, working);
inp_remove_excess_ws(working);
comment_out_unused_subckt_models(working, line_number);
@ -734,8 +754,12 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile
for (newcard = working; newcard; newcard = newcard->li_next)
end = newcard;
inp_reorder_params(working, cc, end);
inp_fix_inst_calls_for_numparam(working);
inp_reorder_params(subckt_w_params, working, cc, end);
inp_fix_inst_calls_for_numparam(subckt_w_params, working);
delete_names(subckt_w_params);
subckt_w_params = NULL;
inp_fix_gnd_name(working);
inp_chk_for_multi_in_vcvs(working, &line_number);
@ -1973,32 +1997,32 @@ inp_change_quotes(char *s)
static void
new_subckt_w_params(char *str)
add_name(struct names *p, char *name)
{
if (num_subckt_w_params >= N_SUBCKT_W_PARAMS) {
if (p->num_names >= N_SUBCKT_W_PARAMS) {
fprintf(stderr, "ERROR, N_SUBCKT_W_PARMS overflow\n");
controlled_exit(EXIT_FAILURE);
}
subckt_w_params[num_subckt_w_params++] = str;
p->names[p->num_names++] = name;
}
static char **
find_subckt_w_params(char *subckt_name)
find_name(struct names *p, char *name)
{
int i;
for (i = 0; i < num_subckt_w_params; i++)
if (strcmp(subckt_w_params[i], subckt_name) == 0)
return & subckt_w_params[i];
for (i = 0; i < p->num_names; i++)
if (strcmp(p->names[i], name) == 0)
return & p->names[i];
return NULL;
}
static char*
inp_fix_subckt(char *s)
inp_fix_subckt(struct names *subckt_w_params, char *s)
{
struct line *head = NULL, *newcard = NULL, *start_card = NULL, *end_card = NULL, *prev_card = NULL, *c = NULL;
char *equal, *beg, *buffer, *ptr1, *ptr2, *str, *new_str = NULL;
@ -2013,7 +2037,7 @@ inp_fix_subckt(char *s)
for (ptr2 = ptr1; *ptr2 && !isspace(*ptr2) && !isquote(*ptr2); ptr2++)
;
new_subckt_w_params(copy_substring(ptr1, ptr2));
add_name(subckt_w_params, copy_substring(ptr1, ptr2));
/* go to beginning of first parameter word */
/* s will contain only subckt definition */
@ -2217,7 +2241,7 @@ inp_remove_ws(char *s)
No changes to lines in .control section !
*/
static void
inp_fix_for_numparam(struct line *c)
inp_fix_for_numparam(struct names *subckt_w_params, struct line *c)
{
bool found_control = FALSE;
@ -2244,7 +2268,7 @@ inp_fix_for_numparam(struct line *c)
}
if (ciprefix(".subckt", c->li_line))
c->li_line = inp_fix_subckt(c->li_line);
c->li_line = inp_fix_subckt(subckt_w_params, c->li_line);
}
}
@ -2525,7 +2549,7 @@ found_mult_param(int num_params, char *param_names[])
Function is called from inp_fix_inst_calls_for_numparam() */
static int
inp_fix_subckt_multiplier(struct line *subckt_card,
inp_fix_subckt_multiplier(struct names *subckt_w_params, struct line *subckt_card,
int num_subckt_params, char *subckt_param_names[], char *subckt_param_values[])
{
struct line *card;
@ -2538,7 +2562,7 @@ inp_fix_subckt_multiplier(struct line *subckt_card,
if (!strstr(subckt_card->li_line, "params:")) {
new_str = TMALLOC(char, strlen(subckt_card->li_line) + 13);
sprintf(new_str, "%s params: m=1", subckt_card->li_line);
new_subckt_w_params(get_subckt_model_name(subckt_card->li_line));
add_name(subckt_w_params, get_subckt_model_name(subckt_card->li_line));
} else {
new_str = TMALLOC(char, strlen(subckt_card->li_line) + 5);
sprintf(new_str, "%s m=1", subckt_card->li_line);
@ -2569,7 +2593,7 @@ inp_fix_subckt_multiplier(struct line *subckt_card,
static void
inp_fix_inst_calls_for_numparam(struct line *deck)
inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck)
{
struct line *c;
struct line *d, *p = NULL;
@ -2620,7 +2644,7 @@ inp_fix_inst_calls_for_numparam(struct line *deck)
num_subckt_params = inp_get_params(p->li_line, subckt_param_names, subckt_param_values);
if (num_subckt_params == 0 || !found_mult_param(num_subckt_params, subckt_param_names))
inp_fix_subckt_multiplier(p, num_subckt_params, subckt_param_names, subckt_param_values);
inp_fix_subckt_multiplier(subckt_w_params, p, num_subckt_params, subckt_param_names, subckt_param_values);
}
}
tfree(subckt_name);
@ -2647,7 +2671,7 @@ inp_fix_inst_calls_for_numparam(struct line *deck)
if (ciprefix("x", inst_line)) {
subckt_name = inp_get_subckt_name(inst_line);
if (find_subckt_w_params(subckt_name)) {
if (find_name(subckt_w_params, subckt_name)) {
sprintf(name_w_space, "%s ", subckt_name);
/* find .subckt line */
@ -3784,7 +3808,7 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car
static void
inp_add_params_to_subckt(struct line *subckt_card)
inp_add_params_to_subckt(struct names *subckt_w_params, struct line *subckt_card)
{
struct line *card = subckt_card->li_next;
char *curr_line = card->li_line;
@ -3802,7 +3826,7 @@ inp_add_params_to_subckt(struct line *subckt_card)
subckt_name = skip_non_ws(subckt_card->li_line);
subckt_name = skip_ws(subckt_name);
end_ptr = skip_non_ws(subckt_name);
new_subckt_w_params(copy_substring(subckt_name, end_ptr));
add_name(subckt_w_params, copy_substring(subckt_name, end_ptr));
} else {
new_line = TMALLOC(char, strlen(subckt_line) + strlen(param_ptr) + 2);
sprintf(new_line, "%s %s", subckt_line, param_ptr);
@ -3835,7 +3859,7 @@ inp_add_params_to_subckt(struct line *subckt_card)
*/
static struct line *
inp_reorder_params_subckt(struct line *subckt_card)
inp_reorder_params_subckt(struct names *subckt_w_params, struct line *subckt_card)
{
struct line *first_param_card = NULL;
struct line *last_param_card = NULL;
@ -3854,7 +3878,7 @@ inp_reorder_params_subckt(struct line *subckt_card)
}
if (ciprefix(".subckt", curr_line)) {
prev_card = inp_reorder_params_subckt(c);
prev_card = inp_reorder_params_subckt(subckt_w_params, c);
c = prev_card->li_next;
continue;
}
@ -3862,7 +3886,7 @@ inp_reorder_params_subckt(struct line *subckt_card)
if (ciprefix(".ends", curr_line)) {
if (first_param_card) {
inp_sort_params(first_param_card, last_param_card, subckt_card, subckt_card, c);
inp_add_params_to_subckt(subckt_card);
inp_add_params_to_subckt(subckt_w_params, subckt_card);
}
return c;
}
@ -3892,7 +3916,7 @@ inp_reorder_params_subckt(struct line *subckt_card)
static void
inp_reorder_params(struct line *deck, struct line *list_head, struct line *end)
inp_reorder_params(struct names *subckt_w_params, struct line *deck, struct line *list_head, struct line *end)
{
struct line *first_param_card = NULL;
struct line *last_param_card = NULL;
@ -3911,7 +3935,7 @@ inp_reorder_params(struct line *deck, struct line *list_head, struct line *end)
}
if (ciprefix(".subckt", curr_line)) {
prev_card = inp_reorder_params_subckt(c);
prev_card = inp_reorder_params_subckt(subckt_w_params, c);
c = prev_card->li_next;
continue;
}