From 0070498eb4bf55989fe7e805b0aa5a00d7029a1b Mon Sep 17 00:00:00 2001 From: Stefan Frederik Date: Thu, 21 Oct 2021 00:00:54 +0200 Subject: [PATCH] avoid printing "**** end_element" in spice netlist if current instance is skipped (no format or spice_ignore set); spice_probe_vdiff.sym will print .save v(n1) v(n2) instead of .save v(n1,n2) since this is how ngspice saves nodes (no differential voltage is saved) --- src/spice.awk | 78 ++++++-------------- src/spice_netlist.c | 3 +- src/token.c | 5 +- src/xschem.h | 2 +- xschem_library/devices/spice_probe_vdiff.sym | 4 +- 5 files changed, 29 insertions(+), 63 deletions(-) diff --git a/src/spice.awk b/src/spice.awk index 26ddc1d4..44af2c1b 100755 --- a/src/spice.awk +++ b/src/spice.awk @@ -130,7 +130,7 @@ function sign(x) return x<0 ? -1 : x>0 ? 1 : 0 } -function process( i, iprefix) +function process( i,j, iprefix, saveinstr, savetype, saveanalysis) { if($0 ~/\*\*\*\* end_element/){ @@ -231,63 +231,29 @@ function process( i, iprefix) if($0 ~ /^D/ ) sub(/PERI[ \t]*=/,"PJ=") } - # Xyce - # .print tran v( ?1 DL[3],DL[2],DL[1],DL[0] , ?1 WL[3],WL{2],WL[1],WL[0] ) - # ............ .......... --> matches ?n and ?-n - if(tolower($1) ==".print" && $4 ~/^\?-?[0-9]+$/ && $7 ~/^\?-?[0-9]+$/ && NF==9) { - num1=split($5,name,",") - num2=split($8,name2,",") + ## .save tran v(?1 GB ) v(?1 SB ) + if(tolower($1) ~ /^\.(save|print)$/) { + $0 = tolower($0) + saveinstr = $1 + if($2 ~/^(dc|ac|tran|op)$/) saveanalysis=$2 + else saveanalysis="" + $1="" + if(saveanalysis !="") $2="" + $0 = $0 # reparse line for field splitting - num = num1>num2? num1: num2 - for(i=1;i<=num;i++) { - print $1 " " $2 " " $3 name[(i-1)%num1+1] "," name2[(i-1)%num2+1] $9 - } - - # Ngspice - # .save v( ?1 DL[3],DL[2],DL[1],DL[0] , ?1 WL[3],WL{2],WL[1],WL[0] ) - # ............ .......... --> matches ?n and ?-n - } else if(tolower($1) ==".save" && $3 ~/^\?-?[0-9]+$/ && $6 ~/^\?-?[0-9]+$/ && NF==8) { - num1=split($4,name,",") - num2=split($7,name2,",") - - num = num1>num2? num1: num2 - for(i=1;i<=num;i++) { - print $1 " " $2 name[(i-1)%num1+1] "," name2[(i-1)%num2+1] $8 - } - - # Xyce - # .print tran v( ?1 LDY1_B[1],LDY1_B[0] ) - # ............ --> matches ?n and ?-n - } else if(tolower($1) ==".print" && $4 ~/^\?-?[0-9]+$/ && NF==6) { - num=split($5,name,",") - for(i=1;i<=num;i++) { - print $1 " " $2 " " $3 name[i] $6 - } - - # Ngspice - # .save v( ?1 LDY1_B[1],LDY1_B[0] ) - # ............ --> matches ?n and ?-n - } else if(tolower($1) ==".save" && $3 ~/^\?-?[0-9]+$/ && NF==5) { - num=split($4,name,",") - for(i=1;i<=num;i++) { - print $1 " " $2 name[i] $5 - } - - # .save i( v1[15],v1[14],v1[13],v1[12],v1[11],v1[10],v1[9],v1[8],v1[7],v1[6],v1[5],v1[4],v1[3],v1[2],v1[1],v1[0] ) - } else if(tolower($0) ~ /^[ \t]*\.(print|save) +.* +[ivx] *\(.*\)/) { - num=$0 - sub(/.*\( */,"",num) - sub(/ *\).*/,"",num) - sub(/^\?[0-9]+/,"", num) # .print tran file=test1.raw format=raw v(?1 C2) <-- remove ?1 - gsub(/ */, "", num) - num=split(num,name,",") - num1 = $0 - sub(/^.*save */,"",num1) - sub(/^.*print */,"",num1) - sub(/\(.*/,"(",num1) - for(i=1;i<=num;i++) { - print $1 " " num1 name[i] ")" + gsub(/ *\?-?[0-9]+ */, "") + gsub(/\( */, "(") + gsub(/ *\)/, ")") + for(i=1; i<=NF; i++) { + savetype=$i; sub(/\(.*/,"", savetype) # v(...) --> v + sub(/^.*\(/,"", $i) + sub(/\).*/,"", $i) + num = split($i, name, ",") + for(j=1; j<= num; j++) { + print saveinstr " " saveanalysis " " savetype "(" name[j] ")" + } } + } else if( $1 ~ /^\*\.(ipin|opin|iopin)/ ) { num=split($2,name,",") for(i=1;i<=num;i++) print $1 " " name[i] diff --git a/src/spice_netlist.c b/src/spice_netlist.c index 5b24b3bd..2f7f75f4 100644 --- a/src/spice_netlist.c +++ b/src/spice_netlist.c @@ -532,8 +532,7 @@ void spice_netlist(FILE *fd, int spice_stop ) fprintf(fd,"**** end user architecture code\n"); } else { const char *m; - print_spice_element(fd, i) ; /* this is the element line */ - fprintf(fd, "**** end_element\n"); + if(print_spice_element(fd, i)) fprintf(fd, "**** end_element\n"); /* hash device_model attribute if any */ m = get_tok_value(xctx->inst[i].prop_ptr, "device_model", 0); if(m[0]) str_hash_lookup(model_table, model_name(m), m, XINSERT); diff --git a/src/token.c b/src/token.c index db9d458a..368c84fa 100644 --- a/src/token.c +++ b/src/token.c @@ -1559,7 +1559,7 @@ void print_spice_subckt(FILE *fd, int symbol) my_free(1014, &token); } -void print_spice_element(FILE *fd, int inst) +int print_spice_element(FILE *fd, int inst) { int i=0, multip, tmp; const char *str_ptr=NULL; @@ -1594,7 +1594,7 @@ void print_spice_element(FILE *fd, int inst) my_free(1016, &format); my_free(1017, &name); my_free(1193, &result); - return; /* do no netlist unwanted insts(no format) */ + return 0; /* do no netlist unwanted insts(no format) */ } no_of_pins= (xctx->inst[inst].ptr+ xctx->sym)->rects[PINLAYER]; s=format; @@ -1848,6 +1848,7 @@ void print_spice_element(FILE *fd, int inst) my_free(1194, &result); my_free(298, &spiceprefixtag); my_free(455, &translatedvalue); + return 1; } void print_tedax_element(FILE *fd, int inst) diff --git a/src/xschem.h b/src/xschem.h index 2591a91f..7497ffae 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -1076,7 +1076,7 @@ extern int isonlydigit(const char *s); extern const char *translate(int inst, const char* s); extern const char* translate2(struct Lcc *lcc, int level, char* s); extern void print_tedax_element(FILE *fd, int inst); -extern void print_spice_element(FILE *fd, int inst); +extern int print_spice_element(FILE *fd, int inst); extern void print_spice_subckt(FILE *fd, int symbol); extern void print_tedax_subckt(FILE *fd, int symbol); extern void print_vhdl_element(FILE *fd, int inst); diff --git a/xschem_library/devices/spice_probe_vdiff.sym b/xschem_library/devices/spice_probe_vdiff.sym index d6faa2ed..980afc18 100644 --- a/xschem_library/devices/spice_probe_vdiff.sym +++ b/xschem_library/devices/spice_probe_vdiff.sym @@ -1,7 +1,7 @@ -v {xschem version=2.9.9 file_version=1.2 } +v {xschem version=3.0.0 file_version=1.2 } G {} K {type=differential_probe -format=".save v( @@p , @@m )" +format=".save v(@@p\\\\) v(@@m\\\\)" template="name=p1"} V {} S {}