add command `xschem raw table_read table_file` to read an ascii table file without closing other loaded raw files
This commit is contained in:
parent
8986b7e0b8
commit
446c0d687a
34
src/save.c
34
src/save.c
|
|
@ -883,6 +883,7 @@ int raw_read(const char *f, Raw **rawptr, const char *type, double sweep1, doubl
|
||||||
}
|
}
|
||||||
|
|
||||||
/* what == 1: read another raw file and switch to it (make it the current one)
|
/* what == 1: read another raw file and switch to it (make it the current one)
|
||||||
|
* if type == table use table_read() to read an ascii table
|
||||||
* what == 2: switch raw file. If filename given switch to that one,
|
* what == 2: switch raw file. If filename given switch to that one,
|
||||||
* else if filename is an integer switch to that raw file index,
|
* else if filename is an integer switch to that raw file index,
|
||||||
* else switch to next
|
* else switch to next
|
||||||
|
|
@ -904,8 +905,39 @@ int extra_rawfile(int what, const char *file, const char *type, double sweep1, d
|
||||||
xctx->extra_raw_arr[xctx->extra_raw_n] = xctx->raw;
|
xctx->extra_raw_arr[xctx->extra_raw_n] = xctx->raw;
|
||||||
xctx->extra_raw_n++;
|
xctx->extra_raw_n++;
|
||||||
}
|
}
|
||||||
|
/* **************** table_read ************* */
|
||||||
|
if(what == 1 && xctx->extra_raw_n < MAX_RAW_N && file && !strcmp(type, "table")) {
|
||||||
|
tclvareval("subst {", file, "}", NULL);
|
||||||
|
my_strncpy(f, tclresult(), S(f));
|
||||||
|
for(i = 0; i < xctx->extra_raw_n; i++) {
|
||||||
|
if( !strcmp(xctx->extra_raw_arr[i]->rawfile, f)) break;
|
||||||
|
}
|
||||||
|
if(i >= xctx->extra_raw_n) { /* file not already loaded: read it and switch to it */
|
||||||
|
int read_ret = 0;
|
||||||
|
Raw *save;
|
||||||
|
save = xctx->raw;
|
||||||
|
xctx->raw = NULL;
|
||||||
|
read_ret = table_read(f);
|
||||||
|
my_strdup(_ALLOC_ID_, &xctx->raw->sim_type, type);
|
||||||
|
if(read_ret) {
|
||||||
|
xctx->extra_raw_arr[xctx->extra_raw_n] = xctx->raw;
|
||||||
|
xctx->extra_prev_idx = xctx->extra_idx;
|
||||||
|
xctx->extra_idx = xctx->extra_raw_n;
|
||||||
|
xctx->extra_raw_n++;
|
||||||
|
} else {
|
||||||
|
ret = 0; /* not found so did not switch */
|
||||||
|
dbg(0, "extra_rawfile() read: %s not found or no %s analysis\n", f, type);
|
||||||
|
xctx->raw = save; /* restore */
|
||||||
|
xctx->extra_prev_idx = xctx->extra_idx;
|
||||||
|
}
|
||||||
|
} else { /* file found: switch to it */
|
||||||
|
dbg(1, "extra_rawfile() %d read: found: switch to it\n", i);
|
||||||
|
xctx->extra_prev_idx = xctx->extra_idx;
|
||||||
|
xctx->extra_idx = i;
|
||||||
|
xctx->raw = xctx->extra_raw_arr[xctx->extra_idx];
|
||||||
|
}
|
||||||
/* **************** read ************* */
|
/* **************** read ************* */
|
||||||
if(what == 1 && xctx->extra_raw_n < MAX_RAW_N && file && type) {
|
} else if(what == 1 && xctx->extra_raw_n < MAX_RAW_N && file && type) {
|
||||||
tclvareval("subst {", file, "}", NULL);
|
tclvareval("subst {", file, "}", NULL);
|
||||||
my_strncpy(f, tclresult(), S(f));
|
my_strncpy(f, tclresult(), S(f));
|
||||||
if(!my_strcasecmp(type, "spectrum")) type = "ac";
|
if(!my_strcasecmp(type, "spectrum")) type = "ac";
|
||||||
|
|
|
||||||
|
|
@ -3418,7 +3418,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
break;
|
break;
|
||||||
case 'r': /*----------------------------------------------*/
|
case 'r': /*----------------------------------------------*/
|
||||||
/* raw what [rawfile type] [sweep1 sweep2]
|
/* raw what [rawfile type] [sweep1 sweep2]
|
||||||
* what = read | clear | info | switch | switch_back
|
* what = read | clear | info | switch | switch_back | table_read
|
||||||
* Load / clear / switch additional raw files
|
* Load / clear / switch additional raw files
|
||||||
* if sweep1, sweep2 interval is given in 'read' subcommand load only the interval
|
* if sweep1, sweep2 interval is given in 'read' subcommand load only the interval
|
||||||
* sweep1 <= sweep_var < sweep2 */
|
* sweep1 <= sweep_var < sweep2 */
|
||||||
|
|
@ -3428,7 +3428,10 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
int err = 0;
|
int err = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
|
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
|
||||||
if(argc > 3 && !strcmp(argv[2], "read")) {
|
if(argc > 3 && !strcmp(argv[2], "table_read")) {
|
||||||
|
ret = extra_rawfile(1, argv[3], "table", sweep1, sweep2);
|
||||||
|
Tcl_SetResult(interp, my_itoa(ret), TCL_VOLATILE);
|
||||||
|
} else if(argc > 3 && !strcmp(argv[2], "read")) {
|
||||||
if(argc > 6) {
|
if(argc > 6) {
|
||||||
sweep1 = atof_spice(argv[5]);
|
sweep1 = atof_spice(argv[5]);
|
||||||
sweep2 = atof_spice(argv[6]);
|
sweep2 = atof_spice(argv[6]);
|
||||||
|
|
|
||||||
|
|
@ -51,14 +51,14 @@ proc inutile_line {txtlabel} {
|
||||||
}
|
}
|
||||||
|
|
||||||
proc inutile_write_data {w f} {
|
proc inutile_write_data {w f} {
|
||||||
set fid [open $f "w"]
|
set fid [open $f w]
|
||||||
set t [$w get 0.0 {end - 1 chars}]
|
set t [$w get 0.0 {end - 1 chars}]
|
||||||
puts -nonewline $fid $t
|
puts -nonewline $fid $t
|
||||||
close $fid
|
close $fid
|
||||||
}
|
}
|
||||||
|
|
||||||
proc inutile_read_data {w f} {
|
proc inutile_read_data {w f} {
|
||||||
set fid [open $f "r"]
|
set fid [open $f r]
|
||||||
set t [read $fid]
|
set t [read $fid]
|
||||||
$w delete 0.0 end
|
$w delete 0.0 end
|
||||||
$w insert 0.0 $t
|
$w insert 0.0 $t
|
||||||
|
|
@ -66,7 +66,7 @@ proc inutile_read_data {w f} {
|
||||||
}
|
}
|
||||||
|
|
||||||
proc inutile_template {w f} {
|
proc inutile_template {w f} {
|
||||||
set fid [open $f "r"]
|
set fid [open $f r]
|
||||||
set t [read $fid]
|
set t [read $fid]
|
||||||
$w insert 0.0 $t
|
$w insert 0.0 $t
|
||||||
close $fid
|
close $fid
|
||||||
|
|
@ -2409,7 +2409,11 @@ proc graph_fill_listbox {} {
|
||||||
set sim_type [uplevel #0 {subst [xschem getprop rect 2 $graph_selected sim_type 2]}]
|
set sim_type [uplevel #0 {subst [xschem getprop rect 2 $graph_selected sim_type 2]}]
|
||||||
# puts "graph_fill_listbox: $rawfile $sim_type"
|
# puts "graph_fill_listbox: $rawfile $sim_type"
|
||||||
if {$rawfile ne {}} {
|
if {$rawfile ne {}} {
|
||||||
set res [xschem raw read $rawfile $sim_type]
|
if {$sim_type eq {table}} {
|
||||||
|
set res [xschem raw table_read $rawfile $sim_type]
|
||||||
|
} else {
|
||||||
|
set res [xschem raw read $rawfile $sim_type]
|
||||||
|
}
|
||||||
if {$res} {
|
if {$res} {
|
||||||
set retval [graph_get_signal_list [xschem raw_query list] $retval]
|
set retval [graph_get_signal_list [xschem raw_query list] $retval]
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -2535,7 +2539,7 @@ proc graph_edit_properties {n} {
|
||||||
# center right frame
|
# center right frame
|
||||||
label .graphdialog.center.right.lab1 -text { Signals in graph }
|
label .graphdialog.center.right.lab1 -text { Signals in graph }
|
||||||
if { [info tclversion] > 8.4} {
|
if { [info tclversion] > 8.4} {
|
||||||
ttk::combobox .graphdialog.center.right.list -values {dc ac tran op sp spectrum noise} -width 4
|
ttk::combobox .graphdialog.center.right.list -values {dc ac tran op sp spectrum noise table} -width 4
|
||||||
} else {
|
} else {
|
||||||
entry .graphdialog.center.right.list -width 4
|
entry .graphdialog.center.right.list -width 4
|
||||||
}
|
}
|
||||||
|
|
@ -3904,7 +3908,7 @@ proc create_pins {} {
|
||||||
# viewdata $retval
|
# viewdata $retval
|
||||||
set pcnt 0
|
set pcnt 0
|
||||||
set y 0
|
set y 0
|
||||||
set fd [open $USER_CONF_DIR/.clipboard.sch "w"]
|
set fd [open $USER_CONF_DIR/.clipboard.sch w]
|
||||||
foreach i $lines {
|
foreach i $lines {
|
||||||
puts $fd "C \{${dirprefix}[lindex $i 1].sym\} 0 [set y [expr {$y-20}]] \
|
puts $fd "C \{${dirprefix}[lindex $i 1].sym\} 0 [set y [expr {$y-20}]] \
|
||||||
0 0 \{ name=p[incr pcnt] lab=[lindex $i 0] \}"
|
0 0 \{ name=p[incr pcnt] lab=[lindex $i 0] \}"
|
||||||
|
|
@ -3941,7 +3945,7 @@ proc schpins_to_sympins {} {
|
||||||
xschem copy
|
xschem copy
|
||||||
set clipboard [read_data_nonewline $USER_CONF_DIR/.clipboard.sch]
|
set clipboard [read_data_nonewline $USER_CONF_DIR/.clipboard.sch]
|
||||||
set lines [split $clipboard \n]
|
set lines [split $clipboard \n]
|
||||||
set fd [open $USER_CONF_DIR/.clipboard.sch "w"]
|
set fd [open $USER_CONF_DIR/.clipboard.sch w]
|
||||||
foreach i $lines {
|
foreach i $lines {
|
||||||
set ii [split [regexp -all -inline {\S+} $i]]
|
set ii [split [regexp -all -inline {\S+} $i]]
|
||||||
if {[regexp {^C \{.*(i|o|io)pin} $i ]} {
|
if {[regexp {^C \{.*(i|o|io)pin} $i ]} {
|
||||||
|
|
@ -4011,7 +4015,7 @@ proc add_lab_no_prefix {} {
|
||||||
# viewdata $retval
|
# viewdata $retval
|
||||||
set pcnt 0
|
set pcnt 0
|
||||||
set y 0
|
set y 0
|
||||||
set fd [open $USER_CONF_DIR/.clipboard.sch "w"]
|
set fd [open $USER_CONF_DIR/.clipboard.sch w]
|
||||||
foreach i $lines {
|
foreach i $lines {
|
||||||
puts $fd "C \{${dirprefix}lab_pin.sym\} 0 [set y [expr {$y+20}]] \
|
puts $fd "C \{${dirprefix}lab_pin.sym\} 0 [set y [expr {$y+20}]] \
|
||||||
0 0 \{ name=p[incr pcnt] verilog_type=wire lab=[lindex $i 0] \}"
|
0 0 \{ name=p[incr pcnt] verilog_type=wire lab=[lindex $i 0] \}"
|
||||||
|
|
@ -4033,7 +4037,7 @@ proc add_lab_prefix {} {
|
||||||
# viewdata $retval
|
# viewdata $retval
|
||||||
set pcnt 0
|
set pcnt 0
|
||||||
set y 0
|
set y 0
|
||||||
set fd [open $USER_CONF_DIR/.clipboard.sch "w"]
|
set fd [open $USER_CONF_DIR/.clipboard.sch w]
|
||||||
foreach i $lines {
|
foreach i $lines {
|
||||||
puts $fd "C \{${dirprefix}lab_pin.sym\} 0 [set y [expr {$y+20}]] \
|
puts $fd "C \{${dirprefix}lab_pin.sym\} 0 [set y [expr {$y+20}]] \
|
||||||
0 0 \{ name=p[incr pcnt] verilog_type=reg lab=i[lindex $i 0] \}"
|
0 0 \{ name=p[incr pcnt] verilog_type=reg lab=i[lindex $i 0] \}"
|
||||||
|
|
@ -5077,21 +5081,21 @@ proc edit_prop {txtlabel} {
|
||||||
}
|
}
|
||||||
|
|
||||||
proc read_data_nonewline {f} {
|
proc read_data_nonewline {f} {
|
||||||
set fid [open $f "r"]
|
set fid [open $f r]
|
||||||
set data [read -nonewline $fid]
|
set data [read -nonewline $fid]
|
||||||
close $fid
|
close $fid
|
||||||
return $data
|
return $data
|
||||||
}
|
}
|
||||||
|
|
||||||
proc read_data {f} {
|
proc read_data {f} {
|
||||||
set fid [open $f "r"]
|
set fid [open $f r]
|
||||||
set data [read $fid]
|
set data [read $fid]
|
||||||
close $fid
|
close $fid
|
||||||
return $data
|
return $data
|
||||||
}
|
}
|
||||||
|
|
||||||
proc read_data_window {w f} {
|
proc read_data_window {w f} {
|
||||||
set fid [open $f "r"]
|
set fid [open $f r]
|
||||||
set t [read $fid]
|
set t [read $fid]
|
||||||
# $w delete 0.0 end
|
# $w delete 0.0 end
|
||||||
## 20171103 insert text at cursor position instead of at beginning (insert index tag)
|
## 20171103 insert text at cursor position instead of at beginning (insert index tag)
|
||||||
|
|
@ -5100,7 +5104,7 @@ proc read_data_window {w f} {
|
||||||
}
|
}
|
||||||
|
|
||||||
proc write_data {data f} {
|
proc write_data {data f} {
|
||||||
set fid [open $f "w"]
|
set fid [open $f w]
|
||||||
puts -nonewline $fid $data
|
puts -nonewline $fid $data
|
||||||
close $fid
|
close $fid
|
||||||
return {}
|
return {}
|
||||||
|
|
@ -5404,7 +5408,7 @@ proc textwindow {filename {ro {}}} {
|
||||||
if { $ro eq {} } {
|
if { $ro eq {} } {
|
||||||
button $textwindow_w.buttons.save -text "Save" -command \
|
button $textwindow_w.buttons.save -text "Save" -command \
|
||||||
{
|
{
|
||||||
set textwindow_fileid [open $textwindow_filename "w"]
|
set textwindow_fileid [open $textwindow_filename w]
|
||||||
puts -nonewline $textwindow_fileid [$textwindow_w.text get 1.0 {end - 1 chars}]
|
puts -nonewline $textwindow_fileid [$textwindow_w.text get 1.0 {end - 1 chars}]
|
||||||
close $textwindow_fileid
|
close $textwindow_fileid
|
||||||
destroy $textwindow_w
|
destroy $textwindow_w
|
||||||
|
|
@ -5420,7 +5424,7 @@ proc textwindow {filename {ro {}}} {
|
||||||
pack $textwindow_w.text -expand yes -fill both
|
pack $textwindow_w.text -expand yes -fill both
|
||||||
pack $textwindow_w.xscroll -side bottom -fill x
|
pack $textwindow_w.xscroll -side bottom -fill x
|
||||||
bind $textwindow_w <Escape> "$textwindow_w.buttons.dismiss invoke"
|
bind $textwindow_w <Escape> "$textwindow_w.buttons.dismiss invoke"
|
||||||
set textwindow_fileid [open $filename "r"]
|
set textwindow_fileid [open $filename r]
|
||||||
|
|
||||||
# 20171103 insert at insertion cursor(insert tag) instead of 0.0
|
# 20171103 insert at insertion cursor(insert tag) instead of 0.0
|
||||||
$textwindow_w.text insert insert [read $textwindow_fileid]
|
$textwindow_w.text insert insert [read $textwindow_fileid]
|
||||||
|
|
@ -5458,7 +5462,7 @@ proc viewdata {data {ro {}} {win .view}} {
|
||||||
set viewdata_filename [tk_getSaveFile -initialdir [pwd] ]
|
set viewdata_filename [tk_getSaveFile -initialdir [pwd] ]
|
||||||
}
|
}
|
||||||
if { $viewdata_filename != "" } {
|
if { $viewdata_filename != "" } {
|
||||||
set viewdata_fileid [open $viewdata_filename "w"]
|
set viewdata_fileid [open $viewdata_filename w]
|
||||||
puts -nonewline $viewdata_fileid [$viewdata_w.text get 1.0 {end - 1 chars}]
|
puts -nonewline $viewdata_fileid [$viewdata_w.text get 1.0 {end - 1 chars}]
|
||||||
close $viewdata_fileid
|
close $viewdata_fileid
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue