more Xyce integration, transform .save in .print tran, transform x1.x2.node to X1:X2:NODE in Xyce lookups, more checks for malformed raw files

This commit is contained in:
Stefan Frederik 2022-09-09 18:57:34 +02:00
parent 907315191d
commit 193cf397bd
5 changed files with 202 additions and 99 deletions

View File

@ -300,7 +300,7 @@ static int read_dataset(FILE *fd)
int variables = 0, i, done_points = 0; int variables = 0, i, done_points = 0;
char line[PATH_MAX], varname[PATH_MAX]; char line[PATH_MAX], varname[PATH_MAX];
char *ptr; char *ptr;
int done_header = 0; int n = 0, done_header = 0;
int exit_status = 0; int exit_status = 0;
xctx->graph_sim_type = 0; xctx->graph_sim_type = 0;
@ -318,8 +318,8 @@ static int read_dataset(FILE *fd)
int npoints = xctx->graph_npoints[xctx->graph_datasets]; int npoints = xctx->graph_npoints[xctx->graph_datasets];
if(xctx->graph_sim_type) { if(xctx->graph_sim_type) {
done_header = 1; done_header = 1;
read_binary_block(fd);
dbg(1, "read_dataset(): read binary block, nvars=%d npoints=%d\n", xctx->graph_nvars, npoints); dbg(1, "read_dataset(): read binary block, nvars=%d npoints=%d\n", xctx->graph_nvars, npoints);
read_binary_block(fd);
xctx->graph_datasets++; xctx->graph_datasets++;
exit_status = 1; exit_status = 1;
} else { } else {
@ -356,7 +356,11 @@ static int read_dataset(FILE *fd)
else if(!strncmp(line, "No. of Data Rows :", 18)) { else if(!strncmp(line, "No. of Data Rows :", 18)) {
/* array of number of points of datasets (they are of varialbe length) */ /* array of number of points of datasets (they are of varialbe length) */
my_realloc(1414, &xctx->graph_npoints, (xctx->graph_datasets+1) * sizeof(int)); my_realloc(1414, &xctx->graph_npoints, (xctx->graph_datasets+1) * sizeof(int));
sscanf(line, "No. of Data Rows : %d", &xctx->graph_npoints[xctx->graph_datasets]); n = sscanf(line, "No. of Data Rows : %d", &xctx->graph_npoints[xctx->graph_datasets]);
if(n < 1) {
dbg(0, "read_dataset(): WAARNING: malformed raw file, aborting\n");
return 1;
}
/* multi-point OP is equivalent to a DC sweep. Change xctx->graph_sim_type */ /* multi-point OP is equivalent to a DC sweep. Change xctx->graph_sim_type */
if(xctx->graph_npoints[xctx->graph_datasets] > 1 && xctx->graph_sim_type == 4 ) { if(xctx->graph_npoints[xctx->graph_datasets] > 1 && xctx->graph_sim_type == 4 ) {
xctx->graph_sim_type = 2; xctx->graph_sim_type = 2;
@ -365,13 +369,21 @@ static int read_dataset(FILE *fd)
done_points = 1; done_points = 1;
} }
else if(!strncmp(line, "No. Variables:", 14)) { else if(!strncmp(line, "No. Variables:", 14)) {
sscanf(line, "No. Variables: %d", &xctx->graph_nvars); n = sscanf(line, "No. Variables: %d", &xctx->graph_nvars);
if(n < 1) {
dbg(0, "read_dataset(): WAARNING: malformed raw file, aborting\n");
return 1;
}
if(xctx->graph_sim_type == 3) xctx->graph_nvars <<= 1; /* mag and phase */ if(xctx->graph_sim_type == 3) xctx->graph_nvars <<= 1; /* mag and phase */
} }
else if(!done_points && !strncmp(line, "No. Points:", 11)) { else if(!done_points && !strncmp(line, "No. Points:", 11)) {
my_realloc(1415, &xctx->graph_npoints, (xctx->graph_datasets+1) * sizeof(int)); my_realloc(1415, &xctx->graph_npoints, (xctx->graph_datasets+1) * sizeof(int));
sscanf(line, "No. Points: %d", &xctx->graph_npoints[xctx->graph_datasets]); n = sscanf(line, "No. Points: %d", &xctx->graph_npoints[xctx->graph_datasets]);
if(n < 1) {
dbg(0, "read_dataset(): WAARNING: malformed raw file, aborting\n");
return 1;
}
/* multi-point OP is equivalent to a DC sweep. Change xctx->graph_sim_type */ /* multi-point OP is equivalent to a DC sweep. Change xctx->graph_sim_type */
if(xctx->graph_npoints[xctx->graph_datasets] > 1 && xctx->graph_sim_type == 4 ) { if(xctx->graph_npoints[xctx->graph_datasets] > 1 && xctx->graph_sim_type == 4 ) {
xctx->graph_sim_type = 2; xctx->graph_sim_type = 2;
@ -380,7 +392,11 @@ static int read_dataset(FILE *fd)
if(!done_header && variables) { if(!done_header && variables) {
/* get the list of lines with index and node name */ /* get the list of lines with index and node name */
if(!xctx->graph_names) xctx->graph_names = my_calloc(426, xctx->graph_nvars, sizeof(char *)); if(!xctx->graph_names) xctx->graph_names = my_calloc(426, xctx->graph_nvars, sizeof(char *));
sscanf(line, "%d %s", &i, varname); /* read index and name of saved waveform */ n = sscanf(line, "%d %s", &i, varname); /* read index and name of saved waveform */
if(n < 2) {
dbg(0, "read_dataset(): WAARNING: malformed raw file, aborting\n");
return 1;
}
if(xctx->graph_sim_type == 3) { /* AC */ if(xctx->graph_sim_type == 3) { /* AC */
my_strcat(415, &xctx->graph_names[i << 1], varname); my_strcat(415, &xctx->graph_names[i << 1], varname);
int_hash_lookup(xctx->graph_raw_table, xctx->graph_names[i << 1], (i << 1), XINSERT_NOREPLACE); int_hash_lookup(xctx->graph_raw_table, xctx->graph_names[i << 1], (i << 1), XINSERT_NOREPLACE);
@ -522,23 +538,38 @@ int read_rawfile(const char *f)
/* given a node XXyy try XXyy , xxyy, XXYY, v(XXyy), v(xxyy), V(XXYY) */ /* given a node XXyy try XXyy , xxyy, XXYY, v(XXyy), v(xxyy), V(XXYY) */
int get_raw_index(const char *node) int get_raw_index(const char *node)
{ {
int simtype;
char inode[512];
char vnode[512]; char vnode[512];
char lnode[512]; char lnode[512];
char unode[512]; char unode[512];
Int_hashentry *entry; Int_hashentry *entry;
dbg(1, "get_raw_index(): node=%s, node=%s\n", node, node);
dbg(1, "get_raw_index(): node=%s\n", node);
if(xctx->graph_values) { if(xctx->graph_values) {
entry = int_hash_lookup(xctx->graph_raw_table, node, 0, XLOOKUP); tcleval("sim_is_xyce");
simtype = atoi( tclresult() );
my_strncpy(inode, node, S(lnode));
if(simtype) { /* Xyce */
char *ptr = inode;
while(*ptr) {
if(*ptr == '.') *ptr = ':';
ptr++;
}
}
entry = int_hash_lookup(xctx->graph_raw_table, inode, 0, XLOOKUP);
if(!entry) { if(!entry) {
my_strncpy(lnode, node, S(lnode)); my_strncpy(lnode, inode, S(lnode));
strtolower(lnode); strtolower(lnode);
entry = int_hash_lookup(xctx->graph_raw_table, lnode, 0, XLOOKUP); entry = int_hash_lookup(xctx->graph_raw_table, lnode, 0, XLOOKUP);
if(!entry) { if(!entry) {
my_strncpy(unode, node, S(lnode)); my_strncpy(unode, inode, S(lnode));
strtoupper(lnode); strtoupper(lnode);
entry = int_hash_lookup(xctx->graph_raw_table, lnode, 0, XLOOKUP); entry = int_hash_lookup(xctx->graph_raw_table, lnode, 0, XLOOKUP);
if(!entry) { if(!entry) {
my_snprintf(vnode, S(vnode), "v(%s)", node); my_snprintf(vnode, S(vnode), "v(%s)", inode);
entry = int_hash_lookup(xctx->graph_raw_table, vnode, 0, XLOOKUP); entry = int_hash_lookup(xctx->graph_raw_table, vnode, 0, XLOOKUP);
if(!entry) { if(!entry) {
my_strncpy(lnode, vnode, S(lnode)); my_strncpy(lnode, vnode, S(lnode));

View File

@ -2771,7 +2771,6 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
cmd_found = 1; cmd_found = 1;
if( set_netlist_dir(0, NULL) ) { if( set_netlist_dir(0, NULL) ) {
tcleval("simulate"); tcleval("simulate");
Tcl_ResetResult(interp);
} }
} }

View File

@ -71,7 +71,7 @@ END{
if(tolower($0) ~/^[ \t]*\.save[ \t]+.*\?[0-9]+/) { # .save file=test1.raw format=raw v( ?1 C2 ) if(tolower($0) ~/^[ \t]*\.save[ \t]+.*\?[0-9]+/) { # .save file=test1.raw format=raw v( ?1 C2 )
$1 = "" $1 = ""
if(tolower($2) == "tran") $2 = "" if(tolower($2) == "tran") $2 = ""
$0 = ".print tran" $0 $0 = ".print tran " $0
} }
gsub(/ [mM] *= *1 *$/,"") # xyce does not like m=# fields (multiplicity) removing m=1 is no an issue anyway gsub(/ [mM] *= *1 *$/,"") # xyce does not like m=# fields (multiplicity) removing m=1 is no an issue anyway
} }
@ -239,7 +239,12 @@ function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
if(tolower($1) ~ /^\.(save|print)$/ && $0 ~/\?[0-9]/) { if(tolower($1) ~ /^\.(save|print)$/ && $0 ~/\?[0-9]/) {
$0 = tolower($0) $0 = tolower($0)
saveinstr = $1 saveinstr = $1
if($2 ~/^(dc|ac|tran|op)$/) saveanalysis=$2
attr=""
if($0 !~/format=/ && xyce==1) {
attr=" format=raw "
}
if($2 ~/^(dc|ac|tran|op|sens|hb|es|pce|noise|homotopy)$/) saveanalysis=$2
else saveanalysis="" else saveanalysis=""
$1="" $1=""
if(saveanalysis !="") $2="" if(saveanalysis !="") $2=""
@ -254,7 +259,7 @@ function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
sub(/\).*/,"", $i) sub(/\).*/,"", $i)
num = split($i, name, ",") num = split($i, name, ",")
for(j=1; j<= num; j++) { for(j=1; j<= num; j++) {
print saveinstr " " saveanalysis " " savetype "(" name[j] ")" print saveinstr " " saveanalysis attr savetype "(" name[j] ")"
} }
} }

View File

@ -236,23 +236,23 @@ proc execute_fileevent {id} {
set details [dict get $options -errorcode] set details [dict get $options -errorcode]
if {[lindex $details 0] eq "CHILDSTATUS"} { if {[lindex $details 0] eq "CHILDSTATUS"} {
set status [lindex $details 2] set status [lindex $details 2]
viewdata "Failed: $execute(cmd,$id)\nstderr:\n$err\ndata:\n$execute(data,$id)" ro viewdata "Failed: $execute(cmd,$id)\nstderr:\n$err\ndata:\n$execute(data,$id)"
} else { } else {
set status 1 set status 1
if {$execute(status,$id) } { if {$execute(status,$id) } {
viewdata "Completed: $execute(cmd,$id)\nstderr:\n$err\ndata:\n$execute(data,$id)" ro viewdata "Completed: $execute(cmd,$id)\nstderr:\n$err\ndata:\n$execute(data,$id)"
} }
} }
} else { } else {
set status 1 set status 1
if {$execute(status,$id) } { if {$execute(status,$id) } {
viewdata "Completed: $execute(cmd,$id)\nstderr:\n$err\ndata:\n$execute(data,$id)" ro viewdata "Completed: $execute(cmd,$id)\nstderr:\n$err\ndata:\n$execute(data,$id)"
} }
} }
} }
if {$status == 0} { if {$status == 0} {
if {$execute(status,$id) } { if {$execute(status,$id) } {
viewdata "Completed: $execute(cmd,$id)\ndata:\n$execute(data,$id)" ro viewdata "Completed: $execute(cmd,$id)\ndata:\n$execute(data,$id)"
} }
} }
} else { } else {
@ -737,12 +737,12 @@ proc set_sim_defaults {{reset {}}} {
set_ne sim(spice,1,fg) 0 set_ne sim(spice,1,fg) 0
set_ne sim(spice,1,st) 1 set_ne sim(spice,1,st) 1
set_ne sim(spice,2,cmd) {Xyce "$N" -r "$n.raw"} set_ne sim(spice,2,cmd) {Xyce "$N"}
set sim(spice,2,name) {Xyce batch} set sim(spice,2,name) {Xyce batch}
set_ne sim(spice,2,fg) 0 set_ne sim(spice,2,fg) 0
set_ne sim(spice,2,st) 1 set_ne sim(spice,2,st) 1
set_ne sim(spice,3,cmd) {mpirun /path/to/parallel/Xyce "$N" -r "$n.raw"} set_ne sim(spice,3,cmd) {mpirun /path/to/parallel/Xyce "$N"}
set sim(spice,3,name) {Xyce parallel batch} set sim(spice,3,name) {Xyce parallel batch}
set_ne sim(spice,3,fg) 0 set_ne sim(spice,3,fg) 0
set_ne sim(spice,3,st) 1 set_ne sim(spice,3,st) 1
@ -1188,7 +1188,7 @@ proc simulate {{callback {}}} {
if { ![info exists sim($tool,default)] } { if { ![info exists sim($tool,default)] } {
if { [info exists has_x] } {alert_ "Warning: simulator for $tool is not configured"} if { [info exists has_x] } {alert_ "Warning: simulator for $tool is not configured"}
puts "Warning: simulator for $tool is not configured" puts "Warning: simulator for $tool is not configured"
return return -1
} }
set def $sim($tool,default) set def $sim($tool,default)
set fg $sim($tool,$def,fg) set fg $sim($tool,$def,fg)
@ -1206,11 +1206,17 @@ proc simulate {{callback {}}} {
} }
#eval exec {cmd /V /C "cd $netlist_dir&&$cmd} #eval exec {cmd /V /C "cd $netlist_dir&&$cmd}
eval exec $cmd & eval exec $cmd &
return -1 ;# no execute ID on windows
} else { } else {
set execute(callback) $callback set execute(callback) $callback
$fg $st sh -c "cd $netlist_dir; $cmd" set id [$fg $st sh -c "cd $netlist_dir; $cmd"]
puts "Simulation started: execution ID: $id"
return $id
} }
} else {
return -1
} }
} }
proc gaw_echoline {} { proc gaw_echoline {} {
@ -1993,40 +1999,20 @@ proc get_shell { curpath } {
execute 0 sh -c "cd $curpath && $terminal" execute 0 sh -c "cd $curpath && $terminal"
} }
proc edit_netlist {schname } { proc edit_netlist {netlist } {
global netlist_dir debug_var global netlist_dir debug_var
global editor terminal OS global editor terminal OS
simuldir simuldir
set netlist_type [xschem get netlist_type] set netlist_type [xschem get netlist_type]
set tmpname [file rootname "$schname"]
if { [regexp vim $editor] } { set ftype "-c \":set filetype=$netlist_type\"" } else { set ftype {} } if { [regexp vim $editor] } { set ftype "-c \":set filetype=$netlist_type\"" } else { set ftype {} }
if { [select_netlist_dir 0] ne "" } { if { [select_netlist_dir 0] ne "" } {
# puts "edit_netlist: \"$editor $ftype ${schname}.v\" \"$netlist_dir\" bg" if {$OS == "Windows"} {
if { $netlist_type=="verilog" } { set cmd "$editor \"$netlist_dir/${netlist}\""
execute 0 sh -c "cd $netlist_dir && $editor $ftype \"${tmpname}.v\"" eval exec $cmd &
} elseif { $netlist_type=="spice" } { } else {
if {$OS == "Windows"} { execute 0 sh -c "cd $netlist_dir && $editor $ftype \"${netlist}\""
set cmd "$editor \"$netlist_dir/${tmpname}.spice\""
eval exec $cmd &
} else {
execute 0 sh -c "cd $netlist_dir && $editor $ftype \"${tmpname}.spice\""
}
} elseif { $netlist_type=="tedax" } {
if {$OS == "Windows"} {
set cmd "$editor \"$netlist_dir/${tmpname}.tdx\""
eval exec $cmd &
} else {
execute 0 sh -c "cd $netlist_dir && $editor $ftype \"${tmpname}.tdx\""
}
} elseif { $netlist_type=="vhdl" } {
if {$OS == "Windows"} {
set cmd "$editor \"$netlist_dir/${tmpname}.vhdl\""
eval exec $cmd &
} else {
execute 0 sh -c "cd $netlist_dir && $editor $ftype \"${tmpname}.vhdl\""
}
} }
} }
return {} return {}
@ -5365,7 +5351,7 @@ proc build_widgets { {topwin {} } } {
} }
} }
$topwin.menubar.simulation.menu add command -label {Edit Netlist} \ $topwin.menubar.simulation.menu add command -label {Edit Netlist} \
-command {edit_netlist [file tail [xschem get schname]]} -command {edit_netlist [xschem get netlist_name fallback]}
$topwin.menubar.simulation.menu add command -label {Send highlighted nets to viewer} \ $topwin.menubar.simulation.menu add command -label {Send highlighted nets to viewer} \
-command {xschem create_plot_cmd} -accelerator Shift+J -command {xschem create_plot_cmd} -accelerator Shift+J
$topwin.menubar.simulation.menu add checkbutton -label "Hide graphs if no spice data loaded" \ $topwin.menubar.simulation.menu add checkbutton -label "Hide graphs if no spice data loaded" \

File diff suppressed because one or more lines are too long