Merge branch 'StefanSchippers:master' into master

This commit is contained in:
Chayan Deb 2025-01-12 12:59:02 +05:30 committed by GitHub
commit 05a376e678
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 109 additions and 56 deletions

View File

@ -934,7 +934,9 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
Return a list of 3-items. Each 3-item is Return a list of 3-items. Each 3-item is
an instance name followed by the symbol reference and symbol type. an instance name followed by the symbol reference and symbol type.
Example: xschem instance_list --> Example: xschem instance_list -->
{x1} {sky130_tests/bandgap.sym} {subcircuit}} {...} {...} {...} ... </pre> {x1} {sky130_tests/bandgap.sym} {subcircuit}
{...} {...} {...}
...</pre>
<li><kbd> instance_net inst pin</kbd></li><pre> <li><kbd> instance_net inst pin</kbd></li><pre>
Return the name of the net attached to pin 'pin' of instance 'inst' Return the name of the net attached to pin 'pin' of instance 'inst'
Example: xschem instance_net x3 MINUS --&gt; REF </pre> Example: xschem instance_net x3 MINUS --&gt; REF </pre>
@ -1064,7 +1066,7 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
<li><kbd> net_pin_mismatch</kbd></li><pre> <li><kbd> net_pin_mismatch</kbd></li><pre>
Highlight nets attached to selected symbols with Highlight nets attached to selected symbols with
a different name than symbol pin </pre> a different name than symbol pin </pre>
<li><kbd> netlist [-messages] [filename]</kbd></li><pre> <li><kbd> netlist [-messages | -erc | -nohier] [filename]</kbd></li><pre>
do a netlist of current schematic in currently defined netlist format do a netlist of current schematic in currently defined netlist format
if 'filename'is given use specified name for the netlist if 'filename'is given use specified name for the netlist
if 'filename' contains path components place the file in specified path location. if 'filename' contains path components place the file in specified path location.
@ -1074,6 +1076,8 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
will create the netlist in different places. will create the netlist in different places.
netlisting directory is reset to previous setting after completing this command netlisting directory is reset to previous setting after completing this command
If -messages is given return the ERC messages instead of just a fail (1) If -messages is given return the ERC messages instead of just a fail (1)
If -erc is given it means netlister is called from gui, enable show infowindow
If -nohier is given netlist only current level
or no fail (0) code. </pre> or no fail (0) code. </pre>
<li><kbd> new_process [f]</kbd></li><pre> <li><kbd> new_process [f]</kbd></li><pre>
Start a new xschem process for a schematic. Start a new xschem process for a schematic.

View File

@ -2073,6 +2073,7 @@ void get_additional_symbols(int what)
} }
} }
/* fallback = 1: if schematic attribute is set but file not existing fallback /* fallback = 1: if schematic attribute is set but file not existing fallback
* if inst == -1 use only symbol reference
* to defaut symbol schematic (symname.sym -> symname.sch) */ * to defaut symbol schematic (symname.sym -> symname.sch) */
void get_sch_from_sym(char *filename, xSymbol *sym, int inst, int fallback) void get_sch_from_sym(char *filename, xSymbol *sym, int inst, int fallback)
{ {
@ -2084,17 +2085,29 @@ void get_sch_from_sym(char *filename, xSymbol *sym, int inst, int fallback)
int cancel = 0; int cancel = 0;
int is_gen = 0; int is_gen = 0;
my_strncpy(filename, "", PATH_MAX);
if(inst >= xctx->instances) {
dbg(0, "get_sch_from_sym() error: called with invalid inst=%d\n", inst);
return;
}
if(!sym) {
dbg(0, "get_sch_from_sym() error: called with NULL sym", inst);
return;
}
/* get sch/sym name from parent schematic downloaded from web */ /* get sch/sym name from parent schematic downloaded from web */
if(is_from_web(xctx->current_dirname)) { if(is_from_web(xctx->current_dirname)) {
web_url = 1; web_url = 1;
} }
dbg(1, "get_sch_from_sym(): current_dirname= %s\n", xctx->current_dirname); dbg(1, "get_sch_from_sym(): current_dirname= %s\n", xctx->current_dirname);
dbg(1, "get_sch_from_sym(): symbol %s inst=%d web_url=%d\n", sym->name, inst, web_url); dbg(1, "get_sch_from_sym(): symbol %s inst=%d web_url=%d\n", sym->name, inst, web_url);
if(inst >= 0) { /* resolve schematic=generator.tcl( @n ) where n=11 is defined in instance attrs */
/* resolve schematic=generator.tcl( @n ) where n=11 is defined in instance attrs */ if(inst >=0 ) {
my_strdup(_ALLOC_ID_, &str_tmp, my_strdup(_ALLOC_ID_, &str_tmp, translate3(get_tok_value(xctx->inst[inst].prop_ptr,"schematic", 6),
translate3(get_tok_value(xctx->inst[inst].prop_ptr,"schematic", 6), 1, 1, xctx->inst[inst].prop_ptr, NULL, NULL));
xctx->inst[inst].prop_ptr, NULL, NULL));
} }
if(!str_tmp) my_strdup2(_ALLOC_ID_, &str_tmp, get_tok_value(sym->prop_ptr, "schematic", 6)); if(!str_tmp) my_strdup2(_ALLOC_ID_, &str_tmp, get_tok_value(sym->prop_ptr, "schematic", 6));
if(str_tmp[0]) { /* schematic attribute in symbol or instance was given */ if(str_tmp[0]) { /* schematic attribute in symbol or instance was given */
@ -2111,17 +2124,14 @@ void get_sch_from_sym(char *filename, xSymbol *sym, int inst, int fallback)
if(web_url) my_strncpy(filename, sch, PATH_MAX); if(web_url) my_strncpy(filename, sch, PATH_MAX);
else my_strncpy(filename, abs_sym_path(sch, ""), PATH_MAX); else my_strncpy(filename, abs_sym_path(sch, ""), PATH_MAX);
} }
} else {
my_strncpy(filename, "", PATH_MAX);
} }
if(has_x && fallback && !is_gen && filename[0]) { if(has_x && fallback && !is_gen && filename[0]) {
file_exists = !stat(filename, &buf); file_exists = !stat(filename, &buf);
if(!file_exists) { if(!file_exists) {
tclvareval("ask_save {Schematic ", filename, "\ndoes not exist.\nDescend into base schematic?}", NULL); tclvareval("ask_save {Schematic ", filename, "\ndoes not exist.\nDescend into base schematic?}", NULL);
if(strcmp(tclresult(), "yes") ) fallback = 0; if(strcmp(tclresult(), "yes") ) fallback = 0; /* 'no' or 'cancel' */
if(!strcmp(tclresult(), "") ) { if(!strcmp(tclresult(), "") ) { /* 'cancel' */
my_strncpy(filename, "", PATH_MAX);
cancel = 1; cancel = 1;
} }
} }

View File

@ -2303,6 +2303,7 @@ int graph_fullxzoom(int i, Graph_ctx *gr, int dataset)
Raw *raw = NULL; Raw *raw = NULL;
const char *ptr; const char *ptr;
raw = xctx->raw;
autoload = !strboolcmp(get_tok_value(r->prop_ptr,"autoload", 0), "1"); autoload = !strboolcmp(get_tok_value(r->prop_ptr,"autoload", 0), "1");
if(autoload == 0) autoload = 2; if(autoload == 0) autoload = 2;
ptr = get_tok_value(r->prop_ptr,"rawfile", 0); ptr = get_tok_value(r->prop_ptr,"rawfile", 0);
@ -2336,7 +2337,6 @@ int graph_fullxzoom(int i, Graph_ctx *gr, int dataset)
} }
} }
raw = xctx->raw;
/* if doing double variable DC sweeps raw->datasets == 1 but there are multiple curves. /* if doing double variable DC sweeps raw->datasets == 1 but there are multiple curves.
* find_closest_wave() may return a dataset number that is > 0 but its a "virtual" dataset * find_closest_wave() may return a dataset number that is > 0 but its a "virtual" dataset
* since double DC sweeps just do multiple sweeps by wrapping the sweep variable * since double DC sweeps just do multiple sweeps by wrapping the sweep variable
@ -2360,6 +2360,7 @@ int graph_fullxzoom(int i, Graph_ctx *gr, int dataset)
xx1 = mylog10(xx1); xx1 = mylog10(xx1);
xx2 = mylog10(xx2); xx2 = mylog10(xx2);
} }
dbg(1, "graph_fullxzoom(): xx1=%g, xx2=%g\n");
my_strdup(_ALLOC_ID_, &r->prop_ptr, subst_token(r->prop_ptr, "x1", dtoa(xx1))); my_strdup(_ALLOC_ID_, &r->prop_ptr, subst_token(r->prop_ptr, "x1", dtoa(xx1)));
my_strdup(_ALLOC_ID_, &r->prop_ptr, subst_token(r->prop_ptr, "x2", dtoa(xx2))); my_strdup(_ALLOC_ID_, &r->prop_ptr, subst_token(r->prop_ptr, "x2", dtoa(xx2)));
@ -2409,7 +2410,7 @@ int graph_fullyzoom(xRect *r, Graph_ctx *gr, int graph_dataset)
ptr = get_tok_value(r->prop_ptr,"rawfile", 0); ptr = get_tok_value(r->prop_ptr,"rawfile", 0);
if(!ptr[0]) { if(!ptr[0]) {
if(raw && raw->rawfile) my_strdup2(_ALLOC_ID_, &custom_rawfile, raw->rawfile); if(xctx->raw && xctx->raw->rawfile) my_strdup2(_ALLOC_ID_, &custom_rawfile, xctx->raw->rawfile);
else my_strdup2(_ALLOC_ID_, &custom_rawfile, ""); else my_strdup2(_ALLOC_ID_, &custom_rawfile, "");
} else { } else {
my_strdup2(_ALLOC_ID_, &custom_rawfile, ptr); my_strdup2(_ALLOC_ID_, &custom_rawfile, ptr);
@ -2431,7 +2432,6 @@ int graph_fullyzoom(xRect *r, Graph_ctx *gr, int graph_dataset)
extra_rawfile(autoload, custom_rawfile, sim_type[0] ? sim_type : xctx->raw->sim_type, -1.0, -1.0); extra_rawfile(autoload, custom_rawfile, sim_type[0] ? sim_type : xctx->raw->sim_type, -1.0, -1.0);
} }
raw = xctx->raw; raw = xctx->raw;
my_strdup2(_ALLOC_ID_, &nd, find_nth(ntok, "%", "\"", 0, 2)); my_strdup2(_ALLOC_ID_, &nd, find_nth(ntok, "%", "\"", 0, 2));
/* if %<n> is specified after node name, <n> is the dataset number to plot in graph */ /* if %<n> is specified after node name, <n> is the dataset number to plot in graph */
if(nd[0]) { if(nd[0]) {
@ -3860,7 +3860,7 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct)
if(custom_rawfile[0]) { if(custom_rawfile[0]) {
if(extra_rawfile(autoload, custom_rawfile, sim_type[0] ? sim_type : if(extra_rawfile(autoload, custom_rawfile, sim_type[0] ? sim_type :
(xctx->raw && xctx->raw->sim_type ? xctx->raw->sim_type : NULL), -1.0, -1.0) == 0) { (xctx->raw && xctx->raw->sim_type ? xctx->raw->sim_type : NULL), -1.0, -1.0) == 0) {
valid_rawfile = 0; valid_rawfile = 0;
} }
} }
my_strdup2(_ALLOC_ID_, &nd, find_nth(ntok, "%", "\"", 0, 2)); my_strdup2(_ALLOC_ID_, &nd, find_nth(ntok, "%", "\"", 0, 2));

View File

@ -1423,10 +1423,12 @@ static int name_unlabeled_instances()
int i, j; int i, j;
xInstance * const inst = xctx->inst; xInstance * const inst = xctx->inst;
int const instances = xctx->instances; int const instances = xctx->instances;
int rects, all_unconn; int rects;
/* name nets that do not touch ipin opin alias instances */ /* name nets that do not touch ipin opin alias instances */
dbg(2, "name_unlabeled_instances(): naming nets that dont touch labels\n");
#if 0 /* does not work */
int all_unconn;
for (i = 0; i < instances; ++i) for (i = 0; i < instances; ++i)
{ {
if(!inst[i].node) continue; if(!inst[i].node) continue;
@ -1438,7 +1440,6 @@ static int name_unlabeled_instances()
if(inst[i].node[j] == NULL) if(inst[i].node[j] == NULL)
{ {
all_unconn++; all_unconn++;
err |= set_unnamed_inst(i, j);
} }
} }
if(rects > 0 && all_unconn == rects && for_netlist > 0 && xctx->netlist_count > 0) { if(rects > 0 && all_unconn == rects && for_netlist > 0 && xctx->netlist_count > 0) {
@ -1450,6 +1451,23 @@ static int name_unlabeled_instances()
} }
} }
} }
#endif
dbg(2, "name_unlabeled_instances(): naming nets that dont touch labels\n");
for (i = 0; i < instances; ++i)
{
if(!inst[i].node) continue;
if(skip_instance(i, 0, netlist_lvs_ignore)) continue;
if(inst[i].ptr != -1) {
rects=(inst[i].ptr+ xctx->sym)->rects[PINLAYER];
for(j = 0; j < rects; ++j) {
if(inst[i].node[j] == NULL)
{
err |= set_unnamed_inst(i, j);
}
}
}
}
return err; return err;
} }

View File

@ -2413,7 +2413,10 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
* Return a list of 3-items. Each 3-item is * Return a list of 3-items. Each 3-item is
* an instance name followed by the symbol reference and symbol type. * an instance name followed by the symbol reference and symbol type.
* Example: xschem instance_list --> * Example: xschem instance_list -->
* {x1} {sky130_tests/bandgap.sym} {subcircuit}} {...} {...} {...} ... */ * {x1} {sky130_tests/bandgap.sym} {subcircuit}
* {...} {...} {...}
* ...
*/
else if(!strcmp(argv[1], "instance_list")) else if(!strcmp(argv[1], "instance_list"))
{ {
int i; int i;
@ -2663,7 +2666,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
/* is_symgen symbol /* is_symgen symbol
* tell if 'symbol' is a generator (symbol(param1,param2,...) */ * tell if 'symbol' is a generator (symbol(param1,param2,...) */
else if(!strcmp(argv[1], "is_symgen")) else if(!strcmp(argv[1], "is_generator"))
{ {
char s[30]; char s[30];
if(argc > 2) { if(argc > 2) {
@ -3181,7 +3184,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
hilight_net_pin_mismatches(); hilight_net_pin_mismatches();
} }
/* netlist [-messages] [filename] /* netlist [-messages | -erc | -nohier] [filename]
* do a netlist of current schematic in currently defined netlist format * do a netlist of current schematic in currently defined netlist format
* if 'filename'is given use specified name for the netlist * if 'filename'is given use specified name for the netlist
* if 'filename' contains path components place the file in specified path location. * if 'filename' contains path components place the file in specified path location.
@ -3191,51 +3194,62 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
* will create the netlist in different places. * will create the netlist in different places.
* netlisting directory is reset to previous setting after completing this command * netlisting directory is reset to previous setting after completing this command
* If -messages is given return the ERC messages instead of just a fail (1) * If -messages is given return the ERC messages instead of just a fail (1)
* If -erc is given it means netlister is called from gui, enable show infowindow
* If -nohier is given netlist only current level
* or no fail (0) code. */ * or no fail (0) code. */
else if(!strcmp(argv[1], "netlist") ) else if(!strcmp(argv[1], "netlist") )
{ {
char *saveshow = NULL; char *saveshow = NULL;
int err = 0; int err = 0;
int messages = 0; int hier_netlist = 1;
int i, messages = 0;
int erc = 0;
const char *fname = NULL; const char *fname = NULL;
const char *path; const char *path;
char savedir[PATH_MAX];
int done_netlist = 0; int done_netlist = 0;
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
yyparse_error = 0; yyparse_error = 0;
my_strdup(_ALLOC_ID_, &saveshow, tclgetvar("show_infowindow_after_netlist")); my_strdup(_ALLOC_ID_, &saveshow, tclgetvar("show_infowindow_after_netlist"));
if(argc <= 2 || (argc > 2 && strcmp(argv[2], "-erc"))) { /* xschem netlist NOT invoked from GUI */
tclsetvar("show_infowindow_after_netlist", "never"); my_strncpy(savedir, tclgetvar("netlist_dir"), S(savedir));
} for(i = 2; i < argc; i++) {
if(argc > 2) { if(argv[i][0] == '-') {
if(!strcmp(argv[2], "-messages")) { if(!strcmp(argv[i], "-messages")) {
messages = 1; messages = 1;
if(argc > 3) fname = argv[3]; } else if(!strcmp(argv[i], "-erc")) {
} else if(strcmp(argv[2], "-erc")) { erc = 1;
fname = argv[2]; } else if(!strcmp(argv[i], "-nohier")) {
} hier_netlist = 0;
if(fname) {
my_strncpy(xctx->netlist_name, get_cell_w_ext(fname, 0), S(xctx->netlist_name));
tclvareval("file dirname ", fname, NULL);
path = tclresult();
if(strchr(fname, '/')) {
set_netlist_dir(1, path);
} }
} else {
fname = argv[i];
break;
}
}
if(erc == 0) tclsetvar("show_infowindow_after_netlist", "never");
if(fname) {
my_strncpy(xctx->netlist_name, get_cell_w_ext(fname, 0), S(xctx->netlist_name));
tclvareval("file dirname ", fname, NULL);
path = tclresult();
if(strchr(fname, '/')) {
set_netlist_dir(1, path);
} }
} }
if(set_netlist_dir(0, NULL) ) { if(set_netlist_dir(0, NULL) ) {
done_netlist = 1; done_netlist = 1;
if(xctx->netlist_type == CAD_SPICE_NETLIST) if(xctx->netlist_type == CAD_SPICE_NETLIST)
err = global_spice_netlist(1); /* 1 means global netlist */ err = global_spice_netlist(hier_netlist); /* 1 means global netlist */
else if(xctx->netlist_type == CAD_VHDL_NETLIST) else if(xctx->netlist_type == CAD_VHDL_NETLIST)
err = global_vhdl_netlist(1); err = global_vhdl_netlist(hier_netlist);
else if(xctx->netlist_type == CAD_VERILOG_NETLIST) else if(xctx->netlist_type == CAD_VERILOG_NETLIST)
err = global_verilog_netlist(1); err = global_verilog_netlist(hier_netlist);
else if(xctx->netlist_type == CAD_TEDAX_NETLIST) else if(xctx->netlist_type == CAD_TEDAX_NETLIST)
global_tedax_netlist(1); global_tedax_netlist(hier_netlist);
else else
if(has_x) tcleval("tk_messageBox -type ok -parent [xschem get topwindow] " if(has_x) tcleval("tk_messageBox -type ok -parent [xschem get topwindow] "
"-message {Please Set netlisting mode (Options menu)}"); "-message {Please Set netlisting mode (Options menu)}");
if( (argc ==3 && strcmp(argv[2], "-erc") ) || argc > 3) { if( (erc == 0) ) {
my_strncpy(xctx->netlist_name, "", S(xctx->netlist_name)); my_strncpy(xctx->netlist_name, "", S(xctx->netlist_name));
} }
} }
@ -3256,6 +3270,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
} }
} }
tclsetvar("show_infowindow_after_netlist", saveshow); tclsetvar("show_infowindow_after_netlist", saveshow);
set_netlist_dir(1, savedir);
if(done_netlist) { if(done_netlist) {
if(messages) { if(messages) {
Tcl_SetResult(interp, xctx->infowindow_text, TCL_VOLATILE); Tcl_SetResult(interp, xctx->infowindow_text, TCL_VOLATILE);
@ -5652,7 +5667,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
char n[100]; char n[100];
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
if(argc > 2 && !strcmp(argv[2], "derived_symbols")) derived_symbols = 1; if(argc > 2 && !strcmp(argv[2], "derived_symbols")) derived_symbols = 1;
else if(argc > 2) { else if(argc > 2 && argv[2][0]) {
one_symbol = 1; one_symbol = 1;
i = get_symbol(argv[2]); i = get_symbol(argv[2]);
if(i >=0) Tcl_AppendResult(interp, my_itoa(i), " {", xctx->sym[i].name, "}", NULL); if(i >=0) Tcl_AppendResult(interp, my_itoa(i), " {", xctx->sym[i].name, "}", NULL);

View File

@ -165,7 +165,7 @@ char *get_generator_command(const char *str)
#endif #endif
dbg(1, "get_generator_command(): cmd_filename=%s\n", cmd_filename); dbg(1, "get_generator_command(): cmd_filename=%s\n", cmd_filename);
dbg(1, "get_generator_command(): gen_cmd=%s\n", gen_cmd); dbg(1, "get_generator_command(): gen_cmd=%s\n", gen_cmd);
dbg(1, "get_generator_command(): is_symgen=%d\n", is_generator(str)); dbg(1, "get_generator_command(): is_generator=%d\n", is_generator(str));
end: end:
my_free(_ALLOC_ID_, &cmd); my_free(_ALLOC_ID_, &cmd);

View File

@ -1787,7 +1787,7 @@ proc cellview_setlabels {w symbol sym_sch default_sch sym_spice_sym_def} {
$w configure -fg $symfg $w configure -fg $symfg
} else { } else {
if {[$w get] eq $default_sch} { if {[$w get] eq $default_sch} {
puts "need to clear schematic attr in symbol" puts "$symbol: need to clear schematic attr in symbol"
} elseif {[$w get] eq $sym_sch} { } elseif {[$w get] eq $sym_sch} {
$w configure -bg $symbg $w configure -bg $symbg
} else { } else {
@ -1799,7 +1799,19 @@ proc cellview_setlabels {w symbol sym_sch default_sch sym_spice_sym_def} {
} }
} }
proc cellview {} { proc cellview_edit_item {w sym_spice_sym_def} {
if {[xschem is_generator [$w get]]} {
set f [$w get]
regsub {\(.*} $f {} f
textwindow [abs_sym_path $f]
} elseif { $sym_spice_sym_def eq {}} {
xschem load_new_window [$w get]
} else {
editdata $sym_spice_sym_def {Symbol spice_sym_def attribute}
}
}
proc cellview {{derived_symbols {}}} {
global keep_symbols nolist_libs global keep_symbols nolist_libs
if {[info tclversion] >= 8.5} { if {[info tclversion] >= 8.5} {
@ -1824,7 +1836,7 @@ proc cellview {} {
frame .cv.center frame .cv.center
set sf [sframe .cv.center] set sf [sframe .cv.center]
# puts sf=$sf # puts sf=$sf
set syms [join [lsort -index 1 [xschem symbols]]] set syms [join [lsort -index 1 [xschem symbols $derived_symbols]]]
foreach {i symbol} $syms { foreach {i symbol} $syms {
set abs_sch [xschem get_sch_from_sym -1 $symbol] set abs_sch [xschem get_sch_from_sym -1 $symbol]
set abs_sym [abs_sym_path $symbol] set abs_sym [abs_sym_path $symbol]
@ -1838,7 +1850,6 @@ proc cellview {} {
} }
if {$skip} { continue } if {$skip} { continue }
set sym_sch [rel_sym_path $abs_sch] set sym_sch [rel_sym_path $abs_sch]
set default_sch [add_ext $symbol .sch]
set type [xschem getprop symbol $symbol type] set type [xschem getprop symbol $symbol type]
set sym_spice_sym_def [xschem getprop symbol $symbol spice_sym_def] set sym_spice_sym_def [xschem getprop symbol $symbol spice_sym_def]
if {$type eq {subcircuit}} { if {$type eq {subcircuit}} {
@ -1850,12 +1861,7 @@ proc cellview {} {
entry $sf.f$i.s -width 45 -borderwidth 1 -relief sunken -font $font entry $sf.f$i.s -width 45 -borderwidth 1 -relief sunken -font $font
balloon $sf.f$i.s $abs_sch balloon $sf.f$i.s $abs_sch
button $sf.f$i.b -text Sch -padx 4 -borderwidth 1 -pady 0 -font $font \ button $sf.f$i.b -text Sch -padx 4 -borderwidth 1 -pady 0 -font $font \
-command " -command "cellview_edit_item $sf.f$i.s [list $sym_spice_sym_def]"
if { [list $sym_spice_sym_def] eq {}} {
xschem load_new_window \[$sf.f$i.s get\]
} else {
editdata [list $sym_spice_sym_def] {Symbol spice_sym_def attribute}
}"
if {$sym_spice_sym_def eq {}} { if {$sym_spice_sym_def eq {}} {
$sf.f$i.s insert 0 $sym_sch $sf.f$i.s insert 0 $sym_sch
} else { } else {