refactor token.c: added get_pin_number(), get_pin_and_attr()
This commit is contained in:
parent
3c16c4bf20
commit
a6462269dc
|
|
@ -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);
|
||||
|
|
|
|||
59
src/token.c
59
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");
|
||||
|
|
|
|||
|
|
@ -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, ...);
|
||||
|
|
|
|||
Loading…
Reference in New Issue