refactor token.c: added get_pin_number(), get_pin_and_attr()

This commit is contained in:
stefan schippers 2023-06-16 23:08:00 +02:00
parent 3c16c4bf20
commit a6462269dc
3 changed files with 34 additions and 69 deletions

View File

@ -39,20 +39,16 @@ void statusmsg(char str[],int n)
static int get_symbol(const char *s)
{
int i, found=0;
for(i=0;i<xctx->symbols; ++i) {
if(isonlydigit(s)) {
i=atoi(s);
found = 1;
} else for(i=0;i<xctx->symbols; ++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;i<xctx->instances; ++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);

View File

@ -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");

View File

@ -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, ...);