change_elem_order(): allow to change oder of text elements; add tcl tabulate procedure for pretty encapsulating tabular text into a nice ascii table frame.
This commit is contained in:
parent
236f4967a9
commit
6a6881ff47
|
|
@ -1552,6 +1552,7 @@ void change_elem_order(int n)
|
||||||
xInstance tmpinst;
|
xInstance tmpinst;
|
||||||
xRect tmpbox;
|
xRect tmpbox;
|
||||||
xWire tmpwire;
|
xWire tmpwire;
|
||||||
|
xText tmptext;
|
||||||
char tmp_txt[50]; /* overflow safe */
|
char tmp_txt[50]; /* overflow safe */
|
||||||
int c, new_n, modified = 0;
|
int c, new_n, modified = 0;
|
||||||
|
|
||||||
|
|
@ -1598,7 +1599,7 @@ void change_elem_order(int n)
|
||||||
tmpbox=xctx->rect[c][new_n];
|
tmpbox=xctx->rect[c][new_n];
|
||||||
xctx->rect[c][new_n]=xctx->rect[c][xctx->sel_array[0].n];
|
xctx->rect[c][new_n]=xctx->rect[c][xctx->sel_array[0].n];
|
||||||
xctx->rect[c][xctx->sel_array[0].n]=tmpbox;
|
xctx->rect[c][xctx->sel_array[0].n]=tmpbox;
|
||||||
dbg(1, "change_elem_order(): selected element %d\n", xctx->sel_array[0].n);
|
dbg(1, "change_elem_order(): selected rect %d\n", xctx->sel_array[0].n);
|
||||||
if(c == GRIDLAYER) {
|
if(c == GRIDLAYER) {
|
||||||
if(xctx->graph_lastsel == new_n) xctx->graph_lastsel = xctx->sel_array[0].n;
|
if(xctx->graph_lastsel == new_n) xctx->graph_lastsel = xctx->sel_array[0].n;
|
||||||
else if(xctx->graph_lastsel == xctx->sel_array[0].n) xctx->graph_lastsel = new_n;
|
else if(xctx->graph_lastsel == xctx->sel_array[0].n) xctx->graph_lastsel = new_n;
|
||||||
|
|
@ -1610,7 +1611,15 @@ void change_elem_order(int n)
|
||||||
tmpwire=xctx->wire[new_n];
|
tmpwire=xctx->wire[new_n];
|
||||||
xctx->wire[new_n]=xctx->wire[xctx->sel_array[0].n];
|
xctx->wire[new_n]=xctx->wire[xctx->sel_array[0].n];
|
||||||
xctx->wire[xctx->sel_array[0].n]=tmpwire;
|
xctx->wire[xctx->sel_array[0].n]=tmpwire;
|
||||||
dbg(1, "change_elem_order(): selected element %d\n", xctx->sel_array[0].n);
|
dbg(1, "change_elem_order(): selected wire %d\n", xctx->sel_array[0].n);
|
||||||
|
}
|
||||||
|
else if(xctx->sel_array[0].type==xTEXT)
|
||||||
|
{
|
||||||
|
if(new_n>=xctx->texts) new_n=xctx->texts-1;
|
||||||
|
tmptext=xctx->text[new_n];
|
||||||
|
xctx->text[new_n]=xctx->text[xctx->sel_array[0].n];
|
||||||
|
xctx->text[xctx->sel_array[0].n]=tmptext;
|
||||||
|
dbg(1, "change_elem_order(): selected text %d\n", xctx->sel_array[0].n);
|
||||||
}
|
}
|
||||||
xctx->need_reb_sel_arr = 1;
|
xctx->need_reb_sel_arr = 1;
|
||||||
if(modified) set_modify(1);
|
if(modified) set_modify(1);
|
||||||
|
|
|
||||||
117
src/xschem.tcl
117
src/xschem.tcl
|
|
@ -656,6 +656,123 @@ proc ev0 {args} {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# wraps provided table formatted text into a nice looking bordered table
|
||||||
|
proc tabulate {text} {
|
||||||
|
# define table characters
|
||||||
|
set top {┌ ─ ┬ ┐}
|
||||||
|
set row {│ { } │ │}
|
||||||
|
set mid {├ ─ ┼ ┤}
|
||||||
|
set head {╞ ═ ╪ ╡}
|
||||||
|
set bot {└ ─ ┴ ┘}
|
||||||
|
|
||||||
|
set maxlen 0 ;# max column width
|
||||||
|
set maxcols 0 ;# max number of columns
|
||||||
|
set nlines 0 ;# number of data lines
|
||||||
|
set chopped_text {}
|
||||||
|
set found_data 0
|
||||||
|
foreach line [split $text \n] {
|
||||||
|
|
||||||
|
# skip completely empty lines
|
||||||
|
if {[regexp {^$} $line]} { continue}
|
||||||
|
# skip leading lines with no data (only separators)
|
||||||
|
if {!$found_data && [regexp {^[\t ,]*$} $line]} {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
set found_data 1
|
||||||
|
|
||||||
|
# cleanup leading and trailing runs of separators
|
||||||
|
# regsub {^[\t ,]+} $line {} line
|
||||||
|
# regsub {[\t ,]+$} $line {} line
|
||||||
|
|
||||||
|
# change separators to { }
|
||||||
|
regsub -all {[\t ,]} $line { } line
|
||||||
|
|
||||||
|
# transform resulting line into a proper list
|
||||||
|
set line [split $line { }]
|
||||||
|
incr nlines
|
||||||
|
set ncols 0
|
||||||
|
# calculate max field width and number of columns
|
||||||
|
foreach field $line {
|
||||||
|
incr ncols
|
||||||
|
if {$ncols > $maxcols} {set maxcols $ncols}
|
||||||
|
set len [string length $field]
|
||||||
|
if {$len > $maxlen} { set maxlen $len}
|
||||||
|
}
|
||||||
|
if { $chopped_text ne {}} {append chopped_text \n}
|
||||||
|
append chopped_text $line
|
||||||
|
}
|
||||||
|
|
||||||
|
set table {}
|
||||||
|
set l 0
|
||||||
|
foreach line [split $chopped_text \n] {
|
||||||
|
incr l
|
||||||
|
|
||||||
|
puts "$l $nlines"
|
||||||
|
# top table border
|
||||||
|
set rowsep {}
|
||||||
|
if {$l == 1} {
|
||||||
|
append rowsep [lindex $top 0]
|
||||||
|
set c 0
|
||||||
|
for {set i 0} {$i < $maxcols} { incr i} {
|
||||||
|
set field [lindex $line $i]
|
||||||
|
incr c
|
||||||
|
append rowsep [string repeat [lindex $top 1] $maxlen]
|
||||||
|
if { $c == $ncols} {
|
||||||
|
append rowsep [lindex $top 3]
|
||||||
|
} else {
|
||||||
|
append rowsep [lindex $top 2]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
append table $rowsep \n
|
||||||
|
}
|
||||||
|
|
||||||
|
set rowsep {}
|
||||||
|
append table [lindex $row 0]
|
||||||
|
if { $l == $nlines} {
|
||||||
|
append rowsep [lindex $bot 0]
|
||||||
|
} elseif {$l == 1} {
|
||||||
|
append rowsep [lindex $head 0]
|
||||||
|
} else {
|
||||||
|
append rowsep [lindex $mid 0]
|
||||||
|
}
|
||||||
|
set c 0
|
||||||
|
for {set i 0} {$i < $maxcols} { incr i} {
|
||||||
|
set field [lindex $line $i]
|
||||||
|
incr c
|
||||||
|
set pad [expr {$maxlen - [string length $field]}]
|
||||||
|
append table $field [string repeat { } $pad]
|
||||||
|
if { $l == $nlines} {
|
||||||
|
append rowsep [string repeat [lindex $bot 1] $maxlen]
|
||||||
|
} elseif {$l == 1} {
|
||||||
|
append rowsep [string repeat [lindex $head 1] $maxlen]
|
||||||
|
} else {
|
||||||
|
append rowsep [string repeat [lindex $mid 1] $maxlen]
|
||||||
|
}
|
||||||
|
if { $c == $ncols} {
|
||||||
|
append table [lindex $row 3]
|
||||||
|
if { $l == $nlines} {
|
||||||
|
append rowsep [lindex $bot 3]
|
||||||
|
} elseif {$l == 1} {
|
||||||
|
append rowsep [lindex $head 3]
|
||||||
|
} else {
|
||||||
|
append rowsep [lindex $mid 3]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
append table [lindex $row 2]
|
||||||
|
if { $l == $nlines} {
|
||||||
|
append rowsep [lindex $bot 2]
|
||||||
|
} elseif { $l == 1} {
|
||||||
|
append rowsep [lindex $head 2]
|
||||||
|
} else {
|
||||||
|
append rowsep [lindex $mid 2]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
append table \n $rowsep \n
|
||||||
|
}
|
||||||
|
return $table
|
||||||
|
}
|
||||||
|
|
||||||
# get pin ordering from included subcircuit
|
# get pin ordering from included subcircuit
|
||||||
# return empty string if not found.
|
# return empty string if not found.
|
||||||
proc has_included_subcircuit {symname spice_sym_def} {
|
proc has_included_subcircuit {symname spice_sym_def} {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue