From 19757ddd8a6ece080bcdc2ba31d4c8e29b02ee4d Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Mon, 2 Jan 2023 03:04:35 +0100 Subject: [PATCH] add menu properties -> Edit header/License text, to allow inserting header or license metadata into the sch/sym file. --- src/actions.c | 1 + src/netlist.c | 18 ++++++------- src/save.c | 36 +++++++++++++++++--------- src/scheduler.c | 13 ++++++++++ src/xinit.c | 1 + src/xschem.h | 1 + src/xschem.tcl | 8 ++++++ xschem_library/devices/isource_pwl.sym | 5 ++-- 8 files changed, 60 insertions(+), 23 deletions(-) diff --git a/src/actions.c b/src/actions.c index 5836a308..6ae8dde8 100644 --- a/src/actions.c +++ b/src/actions.c @@ -621,6 +621,7 @@ void clear_drawing(void) my_free(687, &xctx->schprop); my_free(688, &xctx->schvhdlprop); my_free(689, &xctx->version_string); + if(xctx->header_text) my_free(1654, &xctx->header_text); my_free(690, &xctx->schverilogprop); for(i=0;iwires;i++) { diff --git a/src/netlist.c b/src/netlist.c index ffb82900..12cdc21f 100644 --- a/src/netlist.c +++ b/src/netlist.c @@ -1216,25 +1216,25 @@ int sym_vs_sch_pins() int endfile; char tag[1]; char filename[PATH_MAX]; + char f_version[100]; n_syms = xctx->symbols; for(i=0;isym[i].type && !strcmp(xctx->sym[i].type,"subcircuit")) { rects = xctx->sym[i].rects[PINLAYER]; - get_sch_from_sym(filename, xctx->sym + i); if(!stat(filename, &buf)) { fd = fopen(filename, "r"); pin_cnt = 0; endfile = 0; - xctx->file_version[0] = '\0'; + f_version[0] = '\0'; while(!endfile) { if(fscanf(fd," %c",tag)==EOF) break; switch(tag[0]) { case 'v': - load_ascii_string(&xctx->version_string, fd); - my_snprintf(xctx->file_version, S(xctx->file_version), "%s", - get_tok_value(xctx->version_string, "file_version", 0)); + load_ascii_string(&tmp, fd); + my_snprintf(f_version, S(f_version), "%s", + get_tok_value(tmp, "file_version", 0)); break; case 'E': @@ -1305,7 +1305,7 @@ int sym_vs_sch_pins() load_ascii_string(&tmp, fd); my_strncpy(name, tmp, S(name)); - if(!strcmp(xctx->file_version,"1.0") ) { + if(!strcmp(f_version,"1.0") ) { dbg(1, "sym_vs_sch_pins(): add_ext(name,\".sym\") = %s\n", add_ext(name, ".sym") ); my_strncpy(name, add_ext(name, ".sym"), S(name)); } @@ -1386,9 +1386,9 @@ int sym_vs_sch_pins() break; } read_line(fd, 0); /* discard any remaining characters till (but not including) newline */ - if(!xctx->file_version[0]) { - my_snprintf(xctx->file_version, S(xctx->file_version), "1.0"); - dbg(1, "sym_vs_sch_pins(): no file_version, assuming file_version=%s\n", xctx->file_version); + if(!f_version[0]) { + my_snprintf(f_version, S(f_version), "1.0"); + dbg(1, "sym_vs_sch_pins(): no file_version, assuming file_version=%s\n", f_version); } } /* while(!endfile) */ fclose(fd); diff --git a/src/save.c b/src/save.c index d4a81667..69fc40ce 100644 --- a/src/save.c +++ b/src/save.c @@ -1486,18 +1486,16 @@ static void save_line(FILE *fd, int select_only) static void write_xschem_file(FILE *fd) { size_t ty=0; - char *ptr; - - if(xctx->version_string && (ptr = strstr(xctx->version_string, "xschem")) && - (ptr - xctx->version_string < 50)) { - my_strdup2(59, &xctx->version_string, subst_token(xctx->version_string, "xschem", NULL)); - } - my_strdup2(1183, &xctx->version_string, subst_token(xctx->version_string, "version", NULL)); - my_strdup2(1184, &xctx->version_string, subst_token(xctx->version_string, "file_version", NULL)); - ptr = xctx->version_string; - while(*ptr == ' ' || *ptr == '\t' || *ptr == '\n') ptr++; /* strip leading spaces */ - fprintf(fd, "v {xschem version=%s file_version=%s\n%s}\n", XSCHEM_VERSION, XSCHEM_FILE_VERSION, ptr); - + char *tmpstring = NULL; + size_t tmpstring_size; + char *header_ptr = xctx->header_text ? xctx->header_text : ""; + tmpstring_size = strlen(header_ptr) + 100; + tmpstring = my_malloc(1652, tmpstring_size); + my_snprintf(tmpstring, tmpstring_size, "xschem version=%s file_version=%s\n%s", + XSCHEM_VERSION, XSCHEM_FILE_VERSION, header_ptr); + fprintf(fd, "v "); + save_ascii_string(tmpstring, fd, 1); + my_free(1653, &tmpstring); if(xctx->schvhdlprop && !xctx->schsymbolprop) { get_tok_value(xctx->schvhdlprop,"type",0); @@ -1839,6 +1837,7 @@ static void read_xschem_file(FILE *fd) char tag[1]; int inst_cnt; size_t ty=0; + char *ptr = NULL, *ptr2; dbg(2, "read_xschem_file(): start\n"); inst_cnt = endfile = 0; @@ -1853,6 +1852,19 @@ static void read_xschem_file(FILE *fd) if(xctx->version_string) { my_snprintf(xctx->file_version, S(xctx->file_version), "%s", get_tok_value(xctx->version_string, "file_version", 0)); + + + if((ptr2 = strstr(xctx->version_string, "xschem")) && (ptr2 - xctx->version_string < 50)) { + my_strdup2(1655, &ptr, subst_token(xctx->version_string, "xschem", NULL)); + } + my_strdup2(1656, &ptr, subst_token(ptr, "version", NULL)); + my_strdup2(1657, &ptr, subst_token(ptr, "file_version", NULL)); + + ptr2 = ptr; + while(*ptr2 == ' ' || *ptr2 =='\t') ptr2++; /* strip leading spaces */ + if(*ptr2 == '\n') ptr2++; /* strip leading newline */ + my_strdup2(1658, &xctx->header_text, ptr2); + my_free(1659,&ptr); } dbg(1, "read_xschem_file(): file_version=%s\n", xctx->file_version); break; diff --git a/src/scheduler.c b/src/scheduler.c index dcef4258..7ec90de1 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -874,6 +874,13 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg if(help != 0 ) Tcl_SetResult(interp, "1",TCL_STATIC); else Tcl_SetResult(interp, "0",TCL_STATIC); } + else if(!strcmp(argv[2], "header_text")) { + if(xctx && xctx->header_text) { + Tcl_SetResult(interp, xctx->header_text, TCL_VOLATILE); + } else { + Tcl_SetResult(interp, "", TCL_VOLATILE); + } + } break; case 'i': if(!strcmp(argv[2], "instances")) { @@ -2529,6 +2536,12 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg else if(!strcmp(argv[2], "format")) { my_strdup(1542, &xctx->format, argv[3]); } + else if(!strcmp(argv[2], "header_text")) { + if(!xctx->header_text || strcmp(xctx->header_text, argv[3])) { + set_modify(1); xctx->push_undo(); + my_strdup2(1660, &xctx->header_text, argv[3]); + } + } else if(!strcmp(argv[2], "hide_symbols")) { xctx->hide_symbols=atoi(argv[3]); } diff --git a/src/xinit.c b/src/xinit.c index 1237371c..e585f979 100644 --- a/src/xinit.c +++ b/src/xinit.c @@ -463,6 +463,7 @@ static void alloc_xschem_data(const char *top_path, const char *win_path) xctx->schsymbolprop=NULL; /* symbol property string */ xctx->schverilogprop=NULL;/* verilog */ xctx->version_string = NULL; + xctx->header_text = NULL; xctx->rectcolor= 4; /* this is the current layer when xschem started. */ xctx->currsch = 0; xctx->ui_state = 0; diff --git a/src/xschem.h b/src/xschem.h index de0c3d68..7816b6c5 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -788,6 +788,7 @@ typedef struct { char sch[CADMAXHIER][PATH_MAX]; int currsch; char *version_string; + char *header_text; /* header text (license info) placed in the 'v' record after xschem/file version */ char current_name[PATH_MAX]; char file_version[100]; char *sch_path[CADMAXHIER]; diff --git a/src/xschem.tcl b/src/xschem.tcl index 8dfa6b78..c9788363 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -5860,6 +5860,14 @@ proc build_widgets { {topwin {} } } { $topwin.menubar.prop.menu add command -label "Edit" -command "xschem edit_prop" -accelerator Q $topwin.menubar.prop.menu add command -label "Edit with editor" -command "xschem edit_vi_prop" -accelerator Shift+Q $topwin.menubar.prop.menu add command -label "View" -command "xschem view_prop" -accelerator Ctrl+Shift+Q + $topwin.menubar.prop.menu add command -label "Edit Header/License text" \ + -command { + set retval [xschem get header_text] + text_line {Header/License text:} 0 + if { $rcode ne {}} { + xschem set header_text $retval + } + } $topwin.menubar.prop.menu add command -background red -label "Edit file (danger!)" \ -command "xschem edit_file" -accelerator Alt+Q $topwin.menubar.sym.menu add radiobutton -label "Show Symbols" \ diff --git a/xschem_library/devices/isource_pwl.sym b/xschem_library/devices/isource_pwl.sym index 01028204..fb3155df 100644 --- a/xschem_library/devices/isource_pwl.sym +++ b/xschem_library/devices/isource_pwl.sym @@ -1,6 +1,7 @@ -v {xschem version=2.9.8 file_version=1.2} +v {xschem version=3.1.0 file_version=1.2 +} G {} -K {type=isource +K {type=isource_only_for_hspice format="@name @@p @@m pwl(1) @@cp @@cm @TABLE" template="name=G1 TABLE=\\"1 0 2 1m\\"" }