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:
parent
6223698b0b
commit
0070498eb4
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 {}
|
||||
|
|
|
|||
Loading…
Reference in New Issue