bussed nets/pins in hierTEDAx netlists

This commit is contained in:
Stefan Frederik 2020-11-28 16:41:35 +01:00
parent 0e35d65cac
commit d47a569f9f
4 changed files with 46 additions and 16 deletions

View File

@ -809,7 +809,7 @@ void attach_labels_to_inst() /* offloaded from callback.c 20171005 */
rct=symbol->rect[PINLAYER];
for(i=0;i<npin;i++) {
my_strdup(8, &labname,get_tok_value(rct[i].prop_ptr,"name",1));
my_strdup(8, &labname,get_tok_value(rct[i].prop_ptr,"name",0));
dbg(1,"attach_labels_to_inst(): 2 --> labname=%s\n", labname);
pinx0 = (rct[i].x1+rct[i].x2)/2;

View File

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

View File

@ -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 : "<NULL>", TCL_VOLATILE);
my_free(1203, &r);
}
}
else if(!strcmp(argv[1],"get_tok_size") )
{
char s[30];

View File

@ -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<no_of_pins; i++) {
net_name(inst,i, &mult, 0, 1); /* only to trigger erc errors if any */
fprintf(fd, "__map__ %s -> %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;i<no_of_pins; i++) {
my_strdup2(531, &net, net_name(inst,i, &net_mult, 0, 1));
my_strdup2(1196, &pinname,
get_tok_value((xctx->inst[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);
}
}