implement xschem sch_pinlist command, improve xschem pinlist inst [attr], improve make_sym.awk (no trailing spaces in pin attributes)
This commit is contained in:
parent
c98f0afec5
commit
5e3445a80e
|
|
@ -766,9 +766,9 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
|
|||
0: eat non escaped quotes (")
|
||||
1: return unescaped quotes as part of the token value if they are present
|
||||
2: eat backslashes </pre>
|
||||
<li><kbd> load f [symbol|force|noundoreset|nofullzoom]</kbd></li><pre>
|
||||
<li><kbd> load f [symbol|gui|noundoreset|nofullzoom]</kbd></li><pre>
|
||||
Load a new file 'f'.
|
||||
'force': do not ask to save modified file or warn if opening an already
|
||||
'gui': ask to save modified file or warn if opening an already
|
||||
open file or opening a new(not existing) file.
|
||||
'noundoreset': do not reset the undo history
|
||||
'symbol': do not load symbols (used if loading a symbol instead of a schematic)
|
||||
|
|
@ -854,11 +854,17 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
|
|||
Debug command to test vector net syntax parser </pre>
|
||||
<li><kbd> paste [x y]</kbd></li><pre>
|
||||
Paste clipboard. If 'x y' not given user should complete placement in the GUI </pre>
|
||||
<li><kbd> pinlist inst</kbd></li><pre>
|
||||
<li><kbd> pinlist inst [attr]</kbd></li><pre>
|
||||
List all pins of instance 'inst'
|
||||
if no 'attr' is given return full attribute string,
|
||||
else return value for attribute 'attr'.
|
||||
Example: xschem pinlist x3 name
|
||||
--> {PLUS} {OUT} {MINUS}
|
||||
Example: xschem pinlist x3 dir
|
||||
--> {in} {out} {in}
|
||||
Example: xschem pinlist x3
|
||||
--> { {0} {name=PLUS dir=in } } { {1} {name=OUT dir=out } }
|
||||
{ {2} {name=MINUS dir=in } }</pre>
|
||||
--> { {0} {name=PLUS dir=in } } { {1} {name=OUT dir=out } }
|
||||
{ {2} {name=MINUS dir=in } }</pre>
|
||||
<li><kbd> place_symbol [sym_name] [prop]</kbd></li><pre>
|
||||
Start a GUI placement operation of specified 'sym_name' symbol.
|
||||
If 'sym_name' not given prompt user
|
||||
|
|
@ -957,6 +963,10 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
|
|||
symbol: save as symbol (*.sym)
|
||||
If not specified default to schematic (*.sch)
|
||||
Does not ask confirmation if file name given</pre>
|
||||
<li><kbd> sch_pinlist</kbd></li><pre>
|
||||
List a 2-item list of all pins and directions of current schematic
|
||||
Example: xschem sch_pinlist
|
||||
--> {PLUS} {in} {OUT} {out} {MINUS} {in} {VCC} {inout} {VSS} {inout}</pre>
|
||||
<li><kbd> schematic_in_new_window [new_process]</kbd></li><pre>
|
||||
When a symbol is selected edit corresponding schematic
|
||||
in a new tab/window if not already open.
|
||||
|
|
|
|||
|
|
@ -1815,7 +1815,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key,
|
|||
}
|
||||
if(key=='O' && (state == (ControlMask|ShiftMask)) ) /* load most recent tile */
|
||||
{
|
||||
tclvareval("xschem load [lindex $recentfile 0]", NULL);
|
||||
tclvareval("xschem load [lindex $recentfile 0] gui", NULL);
|
||||
break;
|
||||
}
|
||||
if(key=='O' && state == ShiftMask) /* toggle light/dark colorscheme 20171113 */
|
||||
|
|
@ -2498,7 +2498,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key,
|
|||
merge_file(2,".sch");
|
||||
break;
|
||||
case 9: /* load most recent file */
|
||||
tclvareval("xschem load [lindex $recentfile 0]", NULL);
|
||||
tclvareval("xschem load [lindex $recentfile 0] gui", NULL);
|
||||
break;
|
||||
case 10: /* edit attributes */
|
||||
edit_property(0);
|
||||
|
|
|
|||
|
|
@ -151,6 +151,8 @@ function rest_of_props()
|
|||
sub(/lab[ \t]*=[ \t]*[^ \t]+[ \t]?/, "")
|
||||
sub(/value[ \t]*=[ \t]*[^ \t]+[ \t]?/, "")
|
||||
sub(/name[ \t]*=[ \t]*[^ \t]+[ \t]?/, "")
|
||||
sub(/^[ \t]*/, " ") # always begin with a space separator
|
||||
sub(/[ \t]*$/, "") # remove trailing white space
|
||||
sub(/^[ \t]*$/, "")
|
||||
return $0
|
||||
}
|
||||
|
|
@ -259,8 +261,8 @@ function endfile(f) {
|
|||
if(dir=="generic")
|
||||
{
|
||||
printf "B 3 " (x-size) " " (y+num_i*space-size) " " (x+size) " " (y+num_i*space+size) \
|
||||
" {name=" label_pin[i] " generic_type=" sig_type " " >sym
|
||||
if(value !="") printf "value=" value " " >sym
|
||||
" {name=" label_pin[i] " generic_type=" sig_type >sym
|
||||
if(value !="") printf " value=" value >sym
|
||||
printf props_pin[i] > sym
|
||||
printf "}\n" >sym
|
||||
print "L 4 " x,y+num_i*space,x+lwidth, y+num_i*space,"{}" >sym
|
||||
|
|
@ -270,8 +272,8 @@ function endfile(f) {
|
|||
if(dir=="ipin")
|
||||
{
|
||||
printf "B 5 " (x-size) " " (y+num_i*space-size) " " (x+size) " " (y+num_i*space+size) \
|
||||
" {name=" label_pin[i] vhdt vert " dir=in " >sym
|
||||
if(value !="") printf "value=" value " " >sym
|
||||
" {name=" label_pin[i] vhdt vert " dir=in" >sym
|
||||
if(value !="") printf " value=" value >sym
|
||||
printf props_pin[i] > sym
|
||||
printf "}\n" >sym
|
||||
print "L 4 " x,y+num_i*space,x+lwidth, y+num_i*space,"{}" >sym
|
||||
|
|
@ -281,8 +283,8 @@ function endfile(f) {
|
|||
if(dir=="opin")
|
||||
{
|
||||
printf "B 5 " (-x-size) " " (y+num_o*space-size) " " (-x+size) " " (y+num_o*space+size) \
|
||||
" {name=" label_pin[i] vhdt vert " dir=out " >sym
|
||||
if(value !="") printf "value=" value " " >sym
|
||||
" {name=" label_pin[i] vhdt vert " dir=out" >sym
|
||||
if(value !="") printf " value=" value >sym
|
||||
printf props_pin[i] > sym
|
||||
printf "}\n" >sym
|
||||
print "L 4 " (-x-lwidth),(y+num_o*space),-x, (y+num_o*space),"{}" >sym
|
||||
|
|
@ -292,8 +294,8 @@ function endfile(f) {
|
|||
if(dir=="iopin")
|
||||
{
|
||||
printf "B 5 " (-x-size) " " (y+num_o*space-size) " " (-x+size) " " (y+num_o*space+size) \
|
||||
" {name=" label_pin[i] vhdt vert " dir=inout " >sym
|
||||
if(value !="") printf "value=" value " " >sym
|
||||
" {name=" label_pin[i] vhdt vert " dir=inout" >sym
|
||||
if(value !="") printf " value=" value >sym
|
||||
printf props_pin[i] > sym
|
||||
printf "}\n" >sym
|
||||
print "L 7 " (-x-lwidth),(y+num_o*space),-x, (y+num_o*space),"{}" >sym
|
||||
|
|
|
|||
|
|
@ -1816,9 +1816,9 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
|||
}
|
||||
}
|
||||
|
||||
/* load f [symbol|force|noundoreset|nofullzoom]
|
||||
/* load f [symbol|gui|noundoreset|nofullzoom]
|
||||
* Load a new file 'f'.
|
||||
* 'force': do not ask to save modified file or warn if opening an already
|
||||
* 'gui': ask to save modified file or warn if opening an already
|
||||
* open file or opening a new(not existing) file.
|
||||
* 'noundoreset': do not reset the undo history
|
||||
* 'symbol': do not load symbols (used if loading a symbol instead of a schematic)
|
||||
|
|
@ -1826,12 +1826,12 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
|||
*/
|
||||
else if(!strcmp(argv[1], "load") )
|
||||
{
|
||||
int load_symbols = 1, force = 0, undo_reset = 1, nofullzoom = 0;
|
||||
int load_symbols = 1, force = 1, undo_reset = 1, nofullzoom = 0;
|
||||
size_t i;
|
||||
if(argc > 3) {
|
||||
for(i = 3; i < argc; ++i) {
|
||||
if(!strcmp(argv[i], "symbol")) load_symbols = 0;
|
||||
if(!strcmp(argv[i], "force")) force = 1;
|
||||
if(!strcmp(argv[i], "gui")) force = 0;
|
||||
if(!strcmp(argv[i], "noundoreset")) undo_reset = 0;
|
||||
if(!strcmp(argv[i], "nofullzoom")) nofullzoom = 1;
|
||||
}
|
||||
|
|
@ -2240,11 +2240,17 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
|||
Tcl_ResetResult(interp);
|
||||
}
|
||||
|
||||
/* pinlist inst
|
||||
/* pinlist inst [attr]
|
||||
* List all pins of instance 'inst'
|
||||
* if no 'attr' is given return full attribute string,
|
||||
* else return value for attribute 'attr'.
|
||||
* Example: xschem pinlist x3 name
|
||||
* --> {PLUS} {OUT} {MINUS}
|
||||
* Example: xschem pinlist x3 dir
|
||||
* --> {in} {out} {in}
|
||||
* Example: xschem pinlist x3
|
||||
* --> { {0} {name=PLUS dir=in } } { {1} {name=OUT dir=out } }
|
||||
* { {2} {name=MINUS dir=in } }
|
||||
* --> { {0} {name=PLUS dir=in } } { {1} {name=OUT dir=out } }
|
||||
* { {2} {name=MINUS dir=in } }
|
||||
*/
|
||||
else if(!strcmp(argv[1], "pinlist"))
|
||||
{
|
||||
|
|
@ -2256,14 +2262,12 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
|||
}
|
||||
no_of_pins= (xctx->inst[i].ptr+ xctx->sym)->rects[PINLAYER];
|
||||
for(p=0;p<no_of_pins;p++) {
|
||||
char s[10];
|
||||
my_snprintf(s, S(s), "%d", p);
|
||||
if(argc == 4 && argv[3][0]) {
|
||||
Tcl_AppendResult(interp, "{ {", s, "} {",
|
||||
if(argc > 3 && argv[3][0]) {
|
||||
Tcl_AppendResult(interp, "{",
|
||||
get_tok_value((xctx->inst[i].ptr+ xctx->sym)->rect[PINLAYER][p].prop_ptr, argv[3], 0),
|
||||
"} } ", NULL);
|
||||
"} ", NULL);
|
||||
} else {
|
||||
Tcl_AppendResult(interp, "{ {", s, "} {",
|
||||
Tcl_AppendResult(interp, "{ {", my_itoa(p), "} {",
|
||||
(xctx->inst[i].ptr+ xctx->sym)->rect[PINLAYER][p].prop_ptr, "} } ", NULL);
|
||||
}
|
||||
}
|
||||
|
|
@ -2872,6 +2876,29 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
|||
else saveas(NULL, SCHEMATIC);
|
||||
}
|
||||
|
||||
/* sch_pinlist
|
||||
* List a 2-item list of all pins and directions of current schematic
|
||||
* Example: xschem sch_pinlist
|
||||
* --> {PLUS} {in} {OUT} {out} {MINUS} {in} {VCC} {inout} {VSS} {inout}
|
||||
*/
|
||||
else if(!strcmp(argv[1], "sch_pinlist"))
|
||||
{
|
||||
int i;
|
||||
char *dir = NULL;
|
||||
const char *lab;
|
||||
for(i = 0; i < xctx->instances; ++i) {
|
||||
if( !strcmp((xctx->inst[i].ptr + xctx->sym)->type, "ipin") ) dir="in";
|
||||
else if( !strcmp((xctx->inst[i].ptr + xctx->sym)->type, "opin") ) dir="out";
|
||||
else if( !strcmp((xctx->inst[i].ptr + xctx->sym)->type, "iopin") ) dir="inout";
|
||||
else dir = NULL;
|
||||
if(dir) {
|
||||
lab = get_tok_value(xctx->inst[i].prop_ptr, "lab", 0);
|
||||
Tcl_AppendResult(interp, "{", lab, "} {", dir, "} ", NULL);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* schematic_in_new_window [new_process]
|
||||
* When a symbol is selected edit corresponding schematic
|
||||
* in a new tab/window if not already open.
|
||||
|
|
|
|||
|
|
@ -735,11 +735,11 @@ proc setup_recent_menu { {in_new_window 0} { topwin {} } } {
|
|||
foreach i $recentfile {
|
||||
if {$in_new_window} {
|
||||
$topwin.menubar.file.menu.recent_new_window add command \
|
||||
-command "xschem load_new_window {$i}" \
|
||||
-command "xschem load_new_window {$i} gui" \
|
||||
-label [file tail $i]
|
||||
} else {
|
||||
$topwin.menubar.file.menu.recent add command \
|
||||
-command "xschem load {$i}" \
|
||||
-command "xschem load {$i} gui" \
|
||||
-label [file tail $i]
|
||||
}
|
||||
}
|
||||
|
|
@ -4697,7 +4697,7 @@ proc swap_compare_schematics {} {
|
|||
set sch2 [xschem get sch_to_compare]
|
||||
puts "swap_compare_schematics:\n sch1=$sch1\n sch2=$sch2"
|
||||
if {$sch2 ne {}} {
|
||||
xschem load $sch2 nofullzoom
|
||||
xschem load $sch2 nofullzoom gui
|
||||
set current [xschem get schname]
|
||||
# Use "file tail" to handle equality of
|
||||
# https://raw.githubusercon...tb_reram.sch and /tmp/xschem_web/tb_reram.sch
|
||||
|
|
@ -5706,7 +5706,7 @@ proc build_widgets { {topwin {} } } {
|
|||
$topwin.menubar.file.menu add command -label "Delete files" -command "xschem delete_files" -accelerator {Shift-D}
|
||||
|
||||
$topwin.menubar.file.menu add command -label "Open Most Recent" \
|
||||
-command {xschem load [lindex "$recentfile" 0]} -accelerator {Ctrl+Shift+O}
|
||||
-command {xschem load [lindex "$recentfile" 0] gui} -accelerator {Ctrl+Shift+O}
|
||||
$topwin.menubar.file.menu add command -label "Save" -command "xschem save" -accelerator {Ctrl+S}
|
||||
toolbar_add FileSave "xschem save" "Save File" $topwin
|
||||
$topwin.menubar.file.menu add command -label "Merge" -command "xschem merge" -accelerator {Shift+B}
|
||||
|
|
|
|||
Loading…
Reference in New Issue