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)

This commit is contained in:
Stefan Frederik 2021-10-21 00:00:54 +02:00
parent 6223698b0b
commit 0070498eb4
5 changed files with 29 additions and 63 deletions

View File

@ -130,7 +130,7 @@ function sign(x)
return x<0 ? -1 : x>0 ? 1 : 0 return x<0 ? -1 : x>0 ? 1 : 0
} }
function process( i, iprefix) function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
{ {
if($0 ~/\*\*\*\* end_element/){ if($0 ~/\*\*\*\* end_element/){
@ -231,63 +231,29 @@ function process( i, iprefix)
if($0 ~ /^D/ ) sub(/PERI[ \t]*=/,"PJ=") if($0 ~ /^D/ ) sub(/PERI[ \t]*=/,"PJ=")
} }
# Xyce ## .save tran v(?1 GB ) v(?1 SB )
# .print tran v( ?1 DL[3],DL[2],DL[1],DL[0] , ?1 WL[3],WL{2],WL[1],WL[0] ) if(tolower($1) ~ /^\.(save|print)$/) {
# ............ .......... --> matches ?n and ?-n $0 = tolower($0)
if(tolower($1) ==".print" && $4 ~/^\?-?[0-9]+$/ && $7 ~/^\?-?[0-9]+$/ && NF==9) { saveinstr = $1
num1=split($5,name,",") if($2 ~/^(dc|ac|tran|op)$/) saveanalysis=$2
num2=split($8,name2,",") else saveanalysis=""
$1=""
if(saveanalysis !="") $2=""
$0 = $0 # reparse line for field splitting
num = num1>num2? num1: num2 gsub(/ *\?-?[0-9]+ */, "")
for(i=1;i<=num;i++) { gsub(/\( */, "(")
print $1 " " $2 " " $3 name[(i-1)%num1+1] "," name2[(i-1)%num2+1] $9 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] ")"
}
} }
# 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] ")"
}
} else if( $1 ~ /^\*\.(ipin|opin|iopin)/ ) { } else if( $1 ~ /^\*\.(ipin|opin|iopin)/ ) {
num=split($2,name,",") num=split($2,name,",")
for(i=1;i<=num;i++) print $1 " " name[i] for(i=1;i<=num;i++) print $1 " " name[i]

View File

@ -532,8 +532,7 @@ void spice_netlist(FILE *fd, int spice_stop )
fprintf(fd,"**** end user architecture code\n"); fprintf(fd,"**** end user architecture code\n");
} else { } else {
const char *m; const char *m;
print_spice_element(fd, i) ; /* this is the element line */ if(print_spice_element(fd, i)) fprintf(fd, "**** end_element\n");
fprintf(fd, "**** end_element\n");
/* hash device_model attribute if any */ /* hash device_model attribute if any */
m = get_tok_value(xctx->inst[i].prop_ptr, "device_model", 0); 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); if(m[0]) str_hash_lookup(model_table, model_name(m), m, XINSERT);

View File

@ -1559,7 +1559,7 @@ void print_spice_subckt(FILE *fd, int symbol)
my_free(1014, &token); 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; int i=0, multip, tmp;
const char *str_ptr=NULL; const char *str_ptr=NULL;
@ -1594,7 +1594,7 @@ void print_spice_element(FILE *fd, int inst)
my_free(1016, &format); my_free(1016, &format);
my_free(1017, &name); my_free(1017, &name);
my_free(1193, &result); 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]; no_of_pins= (xctx->inst[inst].ptr+ xctx->sym)->rects[PINLAYER];
s=format; s=format;
@ -1848,6 +1848,7 @@ void print_spice_element(FILE *fd, int inst)
my_free(1194, &result); my_free(1194, &result);
my_free(298, &spiceprefixtag); my_free(298, &spiceprefixtag);
my_free(455, &translatedvalue); my_free(455, &translatedvalue);
return 1;
} }
void print_tedax_element(FILE *fd, int inst) void print_tedax_element(FILE *fd, int inst)

View File

@ -1076,7 +1076,7 @@ extern int isonlydigit(const char *s);
extern const char *translate(int inst, const char* s); extern const char *translate(int inst, const char* s);
extern const char* translate2(struct Lcc *lcc, int level, 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_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_spice_subckt(FILE *fd, int symbol);
extern void print_tedax_subckt(FILE *fd, int symbol); extern void print_tedax_subckt(FILE *fd, int symbol);
extern void print_vhdl_element(FILE *fd, int inst); extern void print_vhdl_element(FILE *fd, int inst);

View File

@ -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 {} G {}
K {type=differential_probe K {type=differential_probe
format=".save v( @@p , @@m )" format=".save v(@@p\\\\) v(@@m\\\\)"
template="name=p1"} template="name=p1"}
V {} V {}
S {} S {}