From a6462269dcb91c81ece1c0fe83df70ec6ce12622 Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Fri, 16 Jun 2023 23:08:00 +0200 Subject: [PATCH] refactor token.c: added get_pin_number(), get_pin_and_attr() --- src/scheduler.c | 43 ++++++++++++----------------------- src/token.c | 59 ++++++++++++++++--------------------------------- src/xschem.h | 1 + 3 files changed, 34 insertions(+), 69 deletions(-) diff --git a/src/scheduler.c b/src/scheduler.c index fb7e553f..f5cdc6b8 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -39,20 +39,16 @@ void statusmsg(char str[],int n) static int get_symbol(const char *s) { int i, found=0; - for(i=0;isymbols; ++i) { + if(isonlydigit(s)) { + i=atoi(s); + found = 1; + } else for(i=0;isymbols; ++i) { if(!strcmp(xctx->sym[i].name, s)) { found=1; break; } } - dbg(1, "get_symbol(): found=%d, i=%d\n", found, i); - if(!found) { - if(!isonlydigit(s)) return -1; - i=atoi(s); - } - if(i<0 || i>xctx->symbols) { - return -1; - } + if(!found || i < 0 || i >= xctx->symbols) return -1; return i; } @@ -61,9 +57,14 @@ int get_instance(const char *s) int i, found=0; Int_hashentry *entry; - if(xctx->floater_inst_table.table) { + if(isonlydigit(s)) { + i=atoi(s); + found = 1; + } + else if(xctx->floater_inst_table.table) { entry = int_hash_lookup(&xctx->floater_inst_table, s, 0, XLOOKUP); i = entry ? entry->value : -1; + found = 1; } else { for(i=0;iinstances; ++i) { if(!strcmp(xctx->inst[i].instname, s)) { @@ -71,15 +72,8 @@ int get_instance(const char *s) break; } } - dbg(1, "get_instance(): found=%d, i=%d\n", found, i); - if(!found) { - if(!isonlydigit(s)) return -1; - i=atoi(s); - } - if(i<0 || i>xctx->instances) { - return -1; - } } + if(!found || i < 0 || i >= xctx->instances) return -1; return i; } @@ -1242,7 +1236,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg /* 0 1 2 3 4 5 */ /* xschem getprop instance_pin X10 PLUS [pin_attr] */ /* xschem getprop instance_pin X10 1 [pin_attr] */ - int inst, n=-1; + int inst, n; size_t tmp; char *subtok=NULL; const char *value=NULL; @@ -1254,16 +1248,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg Tcl_SetResult(interp, "xschem getprop: instance not found", TCL_STATIC); return TCL_ERROR; } - if(isonlydigit(argv[4])) { - n = atoi(argv[4]); - } - else { - xSymbol *ptr = xctx->inst[inst].ptr+ xctx->sym; - for(n = 0; n < ptr->rects[PINLAYER]; ++n) { - char *prop = ptr->rect[PINLAYER][n].prop_ptr; - if(!strcmp(get_tok_value(prop, "name",0), argv[4])) break; - } - } + n = get_pin_number(inst, argv[4]); if(n>=0 && n < (xctx->inst[inst].ptr+ xctx->sym)->rects[PINLAYER]) { if(argc < 6) { Tcl_SetResult(interp, (xctx->inst[inst].ptr+ xctx->sym)->rect[PINLAYER][n].prop_ptr, TCL_VOLATILE); diff --git a/src/token.c b/src/token.c index 0b44f977..a0514175 100644 --- a/src/token.c +++ b/src/token.c @@ -445,6 +445,21 @@ const char *list_tokens(const char *s, int with_quotes) } } +int get_pin_number(int inst, const char *pin_name) +{ + int n = -1; + if(isonlydigit(pin_name)) { + n = atoi(pin_name); + } + else if(pin_name[0]) { + for(n = 0 ; n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]; ++n) { + char *prop = (xctx->inst[inst].ptr + xctx->sym)->rect[PINLAYER][n].prop_ptr; + if(!strcmp(get_tok_value(prop,"name",0), pin_name)) break; + } + } + return n; +} + /* given @#ADD[3:0]:net_name return ADD[3:0] in pin_num_or_name and net_name in pin_attr */ static void get_pin_and_attr(const char *token, char **pin_num_or_name, char **pin_attr) { @@ -987,17 +1002,8 @@ static void print_vhdl_primitive(FILE *fd, int inst) /* netlist primitives, 200 pin_num_or_name[0]='\0'; pin_attr[0]='\0'; - n=-1; get_pin_and_attr(token, &pin_num_or_name, &pin_attr); - if(isonlydigit(pin_num_or_name)) { - n = atoi(pin_num_or_name); - } - else if(pin_num_or_name[0]) { - for(n = 0 ; n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]; ++n) { - char *prop = (xctx->inst[inst].ptr + xctx->sym)->rect[PINLAYER][n].prop_ptr; - if(!strcmp(get_tok_value(prop,"name",0), pin_num_or_name)) break; - } - } + n = get_pin_number(inst, pin_num_or_name); if(n>=0 && pin_attr[0] && n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]) { char *pin_attr_value = NULL; int is_net_name = !strcmp(pin_attr, "net_name"); @@ -2088,17 +2094,8 @@ int print_spice_element(FILE *fd, int inst) pin_num_or_name[0]='\0'; pin_attr[0]='\0'; - n=-1; get_pin_and_attr(token, &pin_num_or_name, &pin_attr); - if(isonlydigit(pin_num_or_name)) { - n = atoi(pin_num_or_name); - } - else if(pin_num_or_name[0]) { - for(n = 0 ; n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]; ++n) { - char *prop = (xctx->inst[inst].ptr + xctx->sym)->rect[PINLAYER][n].prop_ptr; - if(!strcmp(get_tok_value(prop,"name",0), pin_num_or_name)) break; - } - } + n = get_pin_number(inst, pin_num_or_name); if(n>=0 && pin_attr[0] && n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]) { char *pin_attr_value = NULL; int is_net_name = !strcmp(pin_attr, "net_name"); @@ -2732,17 +2729,8 @@ static void print_verilog_primitive(FILE *fd, int inst) /* netlist switch level pin_num_or_name[0]='\0'; pin_attr[0]='\0'; - n=-1; get_pin_and_attr(token, &pin_num_or_name, &pin_attr); - if(isonlydigit(pin_num_or_name)) { - n = atoi(pin_num_or_name); - } - else if(pin_num_or_name[0]) { - for(n = 0 ; n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]; ++n) { - char *prop = (xctx->inst[inst].ptr + xctx->sym)->rect[PINLAYER][n].prop_ptr; - if(!strcmp(get_tok_value(prop,"name",0), pin_num_or_name)) break; - } - } + n = get_pin_number(inst, pin_num_or_name); if(n>=0 && pin_attr[0] && n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]) { char *pin_attr_value = NULL; int is_net_name = !strcmp(pin_attr, "net_name"); @@ -3176,17 +3164,8 @@ static char *get_pin_attr(const char *token, int inst, int s_pnetname) pin_num_or_name[0]='\0'; pin_attr[0]='\0'; - n=-1; get_pin_and_attr(token, &pin_num_or_name, &pin_attr); - if(isonlydigit(pin_num_or_name)) { - n = atoi(pin_num_or_name); - } - else if(pin_num_or_name[0]) { - for(n = 0 ; n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]; ++n) { - char *prop = (xctx->inst[inst].ptr + xctx->sym)->rect[PINLAYER][n].prop_ptr; - if(!strcmp(get_tok_value(prop,"name",0), pin_num_or_name)) break; - } - } + n = get_pin_number(inst, pin_num_or_name); if(n>=0 && pin_attr[0] && n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]) { char *pin_attr_value = NULL; int is_net_name = !strcmp(pin_attr, "net_name"); diff --git a/src/xschem.h b/src/xschem.h index bef7e811..5dfcb3dc 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -1444,6 +1444,7 @@ extern void print_spice_subckt_nodes(FILE *fd, int symbol); extern void print_tedax_subckt(FILE *fd, int symbol); extern void print_vhdl_element(FILE *fd, int inst); extern void print_verilog_element(FILE *fd, int inst); +extern int get_pin_number(int inst, const char *pin_name); extern const char *get_tok_value(const char *s,const char *tok,int with_quotes); extern const char *list_tokens(const char *s, int with_quotes); extern size_t my_snprintf(char *str, size_t size, const char *fmt, ...);