From d47a569f9f6194fe110c3679028664bc2f3a3b10 Mon Sep 17 00:00:00 2001 From: Stefan Frederik Date: Sat, 28 Nov 2020 16:41:35 +0100 Subject: [PATCH] bussed nets/pins in hierTEDAx netlists --- src/actions.c | 2 +- src/callback.c | 4 ++-- src/scheduler.c | 10 ++++++++++ src/token.c | 46 +++++++++++++++++++++++++++++++++------------- 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/src/actions.c b/src/actions.c index b6cbd50d..0bf7fed1 100644 --- a/src/actions.c +++ b/src/actions.c @@ -809,7 +809,7 @@ void attach_labels_to_inst() /* offloaded from callback.c 20171005 */ rct=symbol->rect[PINLAYER]; for(i=0;i labname=%s\n", labname); pinx0 = (rct[i].x1+rct[i].x2)/2; diff --git a/src/callback.c b/src/callback.c index c3a5f8f2..77ed1ab4 100644 --- a/src/callback.c +++ b/src/callback.c @@ -1197,7 +1197,7 @@ int callback(int event, int mx, int my, KeySym key, if(semaphore >= 2) break; tcleval("xschem clear SYMBOL"); } - if(key=='N' && state==ShiftMask) /* hierarchical netlist */ + if(key=='n' && state==0) /* hierarchical netlist */ { yyparse_error = 0; if(semaphore >= 2) break; @@ -1219,7 +1219,7 @@ int callback(int event, int mx, int my, KeySym key, } break; } - if(key=='n' && state==0) /* netlist */ + if(key=='N' && state==ShiftMask) /* current level only netlist */ { yyparse_error = 0; if(semaphore >= 2) break; diff --git a/src/scheduler.c b/src/scheduler.c index ed4128ea..7e6208c2 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -1213,6 +1213,16 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg my_free(1150, &s); } + else if(!strcmp(argv[1],"find_nth") ) + { + if(argc>4) { + char *r = NULL; + my_strdup(1202, &r, find_nth(argv[2], argv[3][0], atoi(argv[4]))); + Tcl_SetResult(interp, r ? r : "", TCL_VOLATILE); + my_free(1203, &r); + } + } + else if(!strcmp(argv[1],"get_tok_size") ) { char s[30]; diff --git a/src/token.c b/src/token.c index b905e0de..2a45288b 100644 --- a/src/token.c +++ b/src/token.c @@ -1852,16 +1852,36 @@ void print_tedax_element(FILE *fd, int inst) no_of_pins= (xctx->inst[inst].ptr+ xctx->sym)->rects[PINLAYER]; if( !format && !strcmp((xctx->inst[inst].ptr+ xctx->sym)->type, "subcircuit") ) { - subcircuit = 1; - fprintf(fd, "__subcircuit__ %s %s\n", skip_dir(xctx->inst[inst].name), xctx->inst[inst].instname); - for(i=0;i %s\n", - get_tok_value((xctx->inst[inst].ptr+ xctx->sym)->rect[PINLAYER][i].prop_ptr,"name",0), - (xctx->inst[inst].node && xctx->inst[inst].node[i]) ? - xctx->inst[inst].node[i] : "__UNCONNECTED_PIN__"); + char *net = NULL; + char *pinname = NULL; + char *pin = NULL; + char *netbit=NULL; + char *pinbit = NULL; + int net_mult; + int pin_mult; + int n; + subcircuit = 1; + fprintf(fd, "__subcircuit__ %s %s\n", skip_dir(xctx->inst[inst].name), xctx->inst[inst].instname); + for(i=0;iinst[inst].ptr+ xctx->sym)->rect[PINLAYER][i].prop_ptr,"name",0)); + my_strdup2(1197, &pin, expandlabel(pinname, &pin_mult)); + dbg(1, "#net=%s pinname=%s pin=%s net_mult=%d pin_mult=%d\n", net, pinname, pin, net_mult, pin_mult); + for(n = 0; n < net_mult; n++) { + my_strdup(1204, &netbit, find_nth(net, ',', n+1)); + my_strdup(1205, &pinbit, find_nth(pin, ',', n+1)); + fprintf(fd, "__map__ %s -> %s\n", + pinbit ? pinbit : "__UNCONNECTED_PIN__", + netbit ? netbit : "__UNCONNECTED_PIN__"); } - fprintf(fd, "\n"); + } + my_free(1199, &net); + my_free(1200, &pin); + my_free(1201, &pinname); + my_free(1206, &pinbit); + my_free(1207, &netbit); + fprintf(fd, "\n"); } if(name==NULL || !format || !format[0]) { @@ -2263,14 +2283,14 @@ const char *net_name(int i, int j, int *mult, int hash_prefix_unnamed_net, int e else my_snprintf(str_node, S(str_node), "%s", (xctx->inst[i].node[j])+1 ); } - expandlabel(get_tok_value( - (xctx->inst[i].ptr+ xctx->sym)->rect[PINLAYER][j].prop_ptr,"name",1), mult); + expandlabel(get_tok_value( /* remove quotes --. */ + (xctx->inst[i].ptr+ xctx->sym)->rect[PINLAYER][j].prop_ptr,"name",0), mult); return expandlabel(str_node, &tmp); } else { - expandlabel(get_tok_value( - (xctx->inst[i].ptr+ xctx->sym)->rect[PINLAYER][j].prop_ptr,"name",1), mult); + expandlabel(get_tok_value( /* remove quotes --. */ + (xctx->inst[i].ptr+ xctx->sym)->rect[PINLAYER][j].prop_ptr,"name",0), mult); return expandlabel(xctx->inst[i].node[j], &tmp); } }