Add Tcl linting and formatting with tclint/tclfmt

- Added .tclint.toml configuration file
- Formatted all Tcl files with tclfmt (except src/xschem.tcl which has parsing issues)
- Fixed all trailing whitespace and formatting issues
- Created GitHub workflow to run tclint and tclfmt on CI
- Excluded src/xschem.tcl from linting due to parser limitations
- Configured line-length to 180 characters to accommodate long Tcl command chains
- Disabled command-args and unbraced-expr rules (legacy code style)

Co-authored-by: nikosavola <7860886+nikosavola@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2025-12-08 13:21:25 +00:00
parent 01f43547a7
commit 5e5ad7f50c
31 changed files with 1855 additions and 1789 deletions

31
.github/workflows/tcl-lint.yaml vendored Normal file
View File

@ -0,0 +1,31 @@
name: Tcl Linting and Formatting
on: [push, pull_request]
jobs:
tcl-lint:
runs-on: ubuntu-latest
name: Tcl Code Quality
steps:
- name: Checkout source
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install tclint
run: pip install tclint
- name: Check Tcl formatting with tclfmt
run: |
# Check if all Tcl files are formatted correctly (excluding src/xschem.tcl)
tclfmt --check --exclude "src/xschem.tcl" .
- name: Run tclint on Tcl files
run: |
# Run tclint with the configuration file
# This will check all .tcl files except those excluded in .tclint.toml
find . -name "*.tcl" -type f ! -path "./src/xschem.tcl" -exec tclint -c .tclint.toml {} \;

20
.tclint.toml Normal file
View File

@ -0,0 +1,20 @@
# Tclint configuration for xschem
# https://github.com/nmoroze/tclint
# Exclude files that cause parsing errors or are too complex for tclint
exclude = [
"src/xschem.tcl", # Has parsing issues with bareword in expression
]
# Ignore certain rules that are too strict for this codebase
# command-args: Many eval and expr commands use dynamic arguments
# unbraced-expr: Legacy code style, would require extensive refactoring
ignore = [
"command-args",
"unbraced-expr",
]
[style]
# Extend the default line length to 180 characters
# Many lines in the codebase are long due to complex Tcl command chains and embedded strings
line-length = 180

View File

@ -8,8 +8,8 @@ set topwin [xschem get top_path]
## Add a "MyButton" button to toolbar_list
if {[lsearch -exact $toolbar_list MyButton] < 0} {
lappend toolbar_list MyButton
set MyButtonData {
lappend toolbar_list MyButton
set MyButtonData {
R0lGODlhGAAYAPcAACIiIiMjIyUlJSYmJicnJykpKSoqKisrKywsLDAwMDExMTIyMjMzMzQ0NDU1
NTY2Njc3Nzg4ODk5OTo6Oj09PT4+Pj8/P0FBQUJCQkNDQ0REREVFRUZGRklJSUxMTE1NTU5OTlFR
UVJSUlNTU1lZWVpaWltbW1xcXF1dXV5eXl9fX2FhYWNjY2RkZGZmZmdnZ2hoaGlpaWtra2xsbG1t
@ -33,15 +33,14 @@ if {[lsearch -exact $toolbar_list MyButton] < 0} {
Ow==
}
## Create an image object. Name should be img<name of button>
image create photo imgMyButton
imgMyButton put $MyButtonData
## Create an image object. Name should be img<name of button>
image create photo imgMyButton
imgMyButton put $MyButtonData
}
## Create the toolbar button
## constructor name tcl command tooltip topwindow
toolbar_add MyButton { puts SMILE! } "SMILE!" $topwin
toolbar_add MyButton { puts SMILE! } "SMILE!" $topwin
## Destroy and rebuild the toolbar, but see better option here under ...
# toolbar_hide
# toolbar_show

View File

@ -2,18 +2,17 @@
## Create a menu entry 'Test' before 'Netlist'. '$topwin.menubar' is xschem's main menu.
proc add_menu {} {
set topwin [xschem get top_path]
$topwin.menubar insert Netlist cascade -label Test -menu $topwin.menubar.test
menu $topwin.menubar.test -tearoff 0
set topwin [xschem get top_path]
$topwin.menubar insert Netlist cascade -label Test -menu $topwin.menubar.test
menu $topwin.menubar.test -tearoff 0
## Create a couple of entries
$topwin.menubar.test add command -label "Test entry 1" -command {
## Create a couple of entries
$topwin.menubar.test add command -label "Test entry 1" -command {
puts Hello
}
$topwin.menubar.test add command -label "Test entry 2" -command {
$topwin.menubar.test add command -label "Test entry 2" -command {
puts World
}
}
add_menu

View File

@ -1,19 +1,17 @@
# increments index of bussed label by $incr
proc change_index {incr} {
set sel [xschem selected_set]
foreach i $sel {
set mylabel [xschem getprop instance $i lab]
regsub {.*\[} $mylabel {} myindex
regsub {\].*} $myindex {} myindex
regsub {\[.*} $mylabel {} mybasename
if { [regexp {^[0-9][0-9]*$} $myindex] } {
set myindex [expr $myindex + $incr]
set mylabel "$mybasename\[$myindex\]"
xschem setprop instance $i lab $mylabel
set sel [xschem selected_set]
foreach i $sel {
set mylabel [xschem getprop instance $i lab]
regsub {.*\[} $mylabel {} myindex
regsub {\].*} $myindex {} myindex
regsub {\[.*} $mylabel {} mybasename
if {[regexp {^[0-9][0-9]*$} $myindex]} {
set myindex [expr $myindex + $incr]
set mylabel "$mybasename\[$myindex\]"
xschem setprop instance $i lab $mylabel
}
}
}
}
bind .drw + {change_index 1}

View File

@ -1,21 +1,21 @@
#
# File: create_graph.tcl
#
#
# This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -23,34 +23,33 @@
# procedure to create a graph in an empty xschem window and display waveforms
proc create_graph {title rawfile node {analysis tran} {color {4 5 6 7 8 9 10 11 12 13 14}}} {
# clear window if not already empty
xschem clear force
# clear window if not already empty
xschem clear force
# add title text
xschem text 30 -350 0 0 $title {} 0.5 1
# clear loaded raw file if any
xschem raw_clear
# set current layer to graph layer (grey, layer 2)
xschem set rectcolor 2
# create a 300x400 rectangle
xschem rect 0 -300 400 0
# make it a graph
xschem setprop rect 2 0 flags graph
# read a simulation raw file
xschem raw_read $rawfile $analysis
# add nodes to display
xschem setprop rect 2 0 node $node
# set node colors
xschem setprop rect 2 0 color $color
# set thinner graph line widths
xschem setprop rect 2 0 linewidth_mult 0.5
# make xschem display full the graph rectangle
xschem zoom_full
# full zoom graph data on x axis
xschem setprop rect 2 0 fullxzoom
# full zoom graph data on y axis
xschem setprop rect 2 0 fullyzoom
# clear modified flag so we can quit without xschem asking to save changed file.
xschem set_modify 0
# add title text
xschem text 30 -350 0 0 $title {} 0.5 1
# clear loaded raw file if any
xschem raw_clear
# set current layer to graph layer (grey, layer 2)
xschem set rectcolor 2
# create a 300x400 rectangle
xschem rect 0 -300 400 0
# make it a graph
xschem setprop rect 2 0 flags graph
# read a simulation raw file
xschem raw_read $rawfile $analysis
# add nodes to display
xschem setprop rect 2 0 node $node
# set node colors
xschem setprop rect 2 0 color $color
# set thinner graph line widths
xschem setprop rect 2 0 linewidth_mult 0.5
# make xschem display full the graph rectangle
xschem zoom_full
# full zoom graph data on x axis
xschem setprop rect 2 0 fullxzoom
# full zoom graph data on y axis
xschem setprop rect 2 0 fullyzoom
# clear modified flag so we can quit without xschem asking to save changed file.
xschem set_modify 0
}

View File

@ -1,27 +1,26 @@
proc gtkwave_getdata {sock} {
global gtkwave_server_getdata
if {[eof $sock] || [catch {gets $sock gtkwave_server_getdata(line,$sock)}]} {
close $sock
puts "Close $gtkwave_server_getdata(addr,$sock)"
unset gtkwave_server_getdata(addr,$sock)
unset gtkwave_server_getdata(line,$sock)
unset gtkwave_server_getdata(res,$sock)
} else {
puts "tcp--> $gtkwave_server_getdata(line,$sock)"
# gtkwave command must be executed at global scope...
uplevel #0 [list catch $gtkwave_server_getdata(line,$sock) gtkwave_server_getdata(res,$sock)]
puts $sock "$gtkwave_server_getdata(res,$sock)"
}
global gtkwave_server_getdata
if {[eof $sock] || [catch {gets $sock gtkwave_server_getdata(line,$sock)}]} {
close $sock
puts "Close $gtkwave_server_getdata(addr,$sock)"
unset gtkwave_server_getdata(addr,$sock)
unset gtkwave_server_getdata(line,$sock)
unset gtkwave_server_getdata(res,$sock)
} else {
puts "tcp--> $gtkwave_server_getdata(line,$sock)"
# gtkwave command must be executed at global scope...
uplevel #0 [list catch $gtkwave_server_getdata(line,$sock) gtkwave_server_getdata(res,$sock)]
puts $sock "$gtkwave_server_getdata(res,$sock)"
}
}
proc gtkwave_server {sock addr port} {
global gtkwave_server_getdata
puts "Accept $sock from $addr port $port"
fconfigure $sock -buffering line
set gtkwave_server_getdata(addr,$sock) [list $addr $port]
fileevent $sock readable [list gtkwave_getdata $sock]
global gtkwave_server_getdata
puts "Accept $sock from $addr port $port"
fconfigure $sock -buffering line
set gtkwave_server_getdata(addr,$sock) [list $addr $port]
fileevent $sock readable [list gtkwave_getdata $sock]
}
set gtkwave_port 2022
socket -server gtkwave_server $gtkwave_port

View File

@ -1,140 +1,140 @@
#
# File: hspice_backannotate.tcl
#
#
# This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
proc read_hspice_log {f} {
global current_probe voltage
set fd [open $f]
while {[gets $fd line] >= 0} {
regsub -all {\r} $line {} line
regsub {^ *\+} $line { + } line
if [regexp {\*\*\*\*\*\*.*operating point information} $line] {
global current_probe voltage
set fd [open $f]
while {[gets $fd line] >= 0} {
regsub -all {\r} $line {} line
regsub {^ *\+} $line { + } line
if [regexp {\*\*\*\*\*\*.*operating point information} $line] {
set vnodes 1
}
if [regexp {\*\*\*\*.*voltage sources} $line] {
if [regexp {\*\*\*\*.*voltage sources} $line] {
set vnodes 0
set vsources 1
}
if [regexp {total voltage source power} $line] {
if [regexp {total voltage source power} $line] {
set vsources 0
}
if { [lindex $line 0] == {element} && $vsources } {
set vsource_name $line
}
if { [lindex $line 0] == {current} && $vsources } {
for {set i 1} {$i < [llength $line]} { incr i } {
set vsource [lindex $vsource_name $i]
set current [lindex $line $i]
if {[regexp {^0:} $vsource]} {
if {[regsub {^.*:} $vsource {} vsource]} {
set current_probe($vsource) $current
puts "$vsource --> $current"
}
if {[lindex $line 0] == {element} && $vsources} {
set vsource_name $line
}
}
}
if { [lindex $line 0] == {+} && $vnodes} {
regsub -all {=} $line { = } line
for { set i 1} {$i < [llength $line]} { set i [expr $i+3]} {
set node [lindex $line $i]
set volt [lindex $line [expr $i+2]]
if {[regsub {^0:} $node {} node]} {
set voltage($node) $volt
puts "$node --> $volt"
if {[lindex $line 0] == {current} && $vsources} {
for {set i 1} {$i < [llength $line]} {incr i} {
set vsource [lindex $vsource_name $i]
set current [lindex $line $i]
if {[regexp {^0:} $vsource]} {
if {[regsub {^.*:} $vsource {} vsource]} {
set current_probe($vsource) $current
puts "$vsource --> $current"
}
}
}
}
if {[lindex $line 0] == {+} && $vnodes} {
regsub -all {=} $line { = } line
for {set i 1} {$i < [llength $line]} {set i [expr $i+3]} {
set node [lindex $line $i]
set volt [lindex $line [expr $i+2]]
if {[regsub {^0:} $node {} node]} {
set voltage($node) $volt
puts "$node --> $volt"
}
}
}
}
}
}
close $fd
close $fd
}
proc get_voltage { n } {
global voltage
if { abs($voltage([string tolower $n])) < 1e-3 } {
return [format %.4e $voltage([string tolower $n])]
} else {
return [format %.4g $voltage([string tolower $n])]
}
# return DELETE
proc get_voltage {n} {
global voltage
if {abs($voltage([string tolower $n])) < 1e-3} {
return [format %.4e $voltage([string tolower $n])]
} else {
return [format %.4g $voltage([string tolower $n])]
}
# return DELETE
}
proc get_diff_voltage { p m } {
global voltage
return [format %.4e [expr $voltage([string tolower $p]) - $voltage([string tolower $m]) ] ]
# return DELETE
proc get_diff_voltage {p m} {
global voltage
return [format %.4e [expr $voltage([string tolower $p]) - $voltage([string tolower $m])]]
# return DELETE
}
proc get_current { n } {
global current_probe
if {abs($current_probe([string tolower $n])) <1e-3} {
return [format %.4e $current_probe([string tolower $n])]
} else {
return [format %.4g $current_probe([string tolower $n])]
}
# return DELETE
proc get_current {n} {
global current_probe
if {abs($current_probe([string tolower $n])) < 1e-3} {
return [format %.4e $current_probe([string tolower $n])]
} else {
return [format %.4g $current_probe([string tolower $n])]
}
# return DELETE
}
proc annotate {} {
### disable screen redraw and undo when looping to speed up performance
### but save state on undo stack before doing backannotations.
xschem push_undo
xschem set no_undo 1
xschem set no_draw 1
read_hspice_log $::netlist_dir/hspice.out
set lastinst [xschem get instances]
for { set i 0 } { $i < $lastinst } {incr i } {
set name [xschem getprop instance $i name]
set type [xschem getprop instance $i cell::type]
if { $type == "probe"} {
set net [xschem instance_net $i p]
if {[catch {xschem setprop -fast instance $i voltage [get_voltage $net]} err]} {
puts "1 error : $err net: $net"
}
### disable screen redraw and undo when looping to speed up performance
### but save state on undo stack before doing backannotations.
xschem push_undo
xschem set no_undo 1
xschem set no_draw 1
read_hspice_log $::netlist_dir/hspice.out
set lastinst [xschem get instances]
for {set i 0} {$i < $lastinst} {incr i} {
set name [xschem getprop instance $i name]
set type [xschem getprop instance $i cell::type]
if {$type == "probe"} {
set net [xschem instance_net $i p]
if {[catch {xschem setprop -fast instance $i voltage [get_voltage $net]} err]} {
puts "1 error : $err net: $net"
}
}
if {$type == "current_probe"} {
if {[catch {xschem setprop -fast instance $i current [get_current $name]} err]} {
puts "2 error : $err"
}
}
if {$type == "differential_probe"} {
set netp [xschem instance_net $i p]
set netm [xschem instance_net $i m]
if {[catch {xschem setprop -fast instance $i voltage [get_diff_voltage $netp $netm]} err]} {
puts "3 error : $err"
}
}
# puts "$i $name $type"
}
if { $type == "current_probe"} {
if {[catch {xschem setprop -fast instance $i current [get_current $name]} err]} {
puts "2 error : $err"
}
}
if { $type == "differential_probe"} {
set netp [xschem instance_net $i p]
set netm [xschem instance_net $i m]
if {[catch {xschem setprop -fast instance $i voltage [get_diff_voltage $netp $netm]} err]} {
puts "3 error : $err"
}
}
# puts "$i $name $type"
}
# re-enable undo and draw
xschem set no_undo 0
xschem set no_draw 0
xschem redraw
### xschem setprop instructions have not altered circuit topology so
### in this case a connectivity rebuild is not needed.
# xschem rebuild_connectivity
#
#
# re-enable undo and draw
xschem set no_undo 0
xschem set no_draw 0
xschem redraw
### xschem setprop instructions have not altered circuit topology so
### in this case a connectivity rebuild is not needed.
# xschem rebuild_connectivity
#
#
}

View File

@ -35,82 +35,130 @@
# $b: mouse button: 1..9
################################################################################
proc mouse_buttons { b m } {
# filter out Cap-Lock, Num-Lock, and Undefined keys
set m [ expr { $m & ~(2+16+32) } ]
# puts "modifier state: $m"
switch $m {
# None
0 { switch $b {
8 { xschem zoom_full center }
9 { xschem unhilight_all } } }
# Shift
1 { switch $b {
8 { xschem set_modify 1; xschem save }
9 { } } }
# Cntl
4 { switch $b {
8 { }
9 { } } }
# Shift+Cntl
5 { switch $b {
8 { }
9 { } } }
# Alt
8 { switch $b {
8 { }
9 { } } }
# Shift+Alt
9 { switch $b {
8 { }
9 { } } }
# Cntl+Alt
12 { switch $b {
8 { }
9 { } } }
# Shift+Cntl+Alt
13 { switch $b {
8 { }
9 { } } }
# Winkey
64 { switch $b {
8 { }
9 { } } }
# Shift+Winkey
65 { switch $b {
8 { }
9 { } } }
# Cntl+Winkey
68 { switch $b {
8 { }
9 { } } }
# Shift+Cntl+Winkey
69 { switch $b {
8 { }
9 { } } }
# Alt+Winkey
72 { switch $b {
8 { }
9 { } } }
# Shift+Alt+Winkey
73 { switch $b {
8 { }
9 { } } }
# Cntl+Alt+Winkey
76 { switch $b {
8 { }
9 { } } }
# Shift+Cntl+Alt+Winkey
77 { switch $b {
8 { }
9 { } } }
}
proc mouse_buttons {b m} {
# filter out Cap-Lock, Num-Lock, and Undefined keys
set m [expr {$m & ~(2 + 16 + 32)}]
# puts "modifier state: $m"
switch $m {
# {None}
0 {
switch $b {
8 {xschem zoom_full center}
9 {xschem unhilight_all}
}
}
# {Shift}
1 {
switch $b {
8 {xschem set_modify 1; xschem save}
9 {}
}
}
# {Cntl}
4 {
switch $b {
8 {}
9 {}
}
}
# {Shift+Cntl}
5 {
switch $b {
8 {}
9 {}
}
}
# {Alt}
8 {
switch $b {
8 {}
9 {}
}
}
# {Shift+Alt}
9 {
switch $b {
8 {}
9 {}
}
}
# {Cntl+Alt}
12 {
switch $b {
8 {}
9 {}
}
}
# {Shift+Cntl+Alt}
13 {
switch $b {
8 {}
9 {}
}
}
# {Winkey}
64 {
switch $b {
8 {}
9 {}
}
}
# {Shift+Winkey}
65 {
switch $b {
8 {}
9 {}
}
}
# {Cntl+Winkey}
68 {
switch $b {
8 {}
9 {}
}
}
# {Shift+Cntl+Winkey}
69 {
switch $b {
8 {}
9 {}
}
}
# {Alt+Winkey}
72 {
switch $b {
8 {}
9 {}
}
}
# {Shift+Alt+Winkey}
73 {
switch $b {
8 {}
9 {}
}
}
# {Cntl+Alt+Winkey}
76 {
switch $b {
8 {}
9 {}
}
}
# {Shift+Cntl+Alt+Winkey}
77 {
switch $b {
8 {}
9 {}
}
}
}
}
# the global variable 'has_x' is provided by xschem. It is defined to '1'
# the global variable 'has_x' is provided by xschem. It is defined to '1'
# if graphics has been initialized.
if { [ info exists has_x ] } {
# puts "Loading ~/.xschem/mouse_bindings.tcl"
bind .drw <Any-Button> {+mouse_buttons %b %s}
if {[info exists has_x]} {
# puts "Loading ~/.xschem/mouse_bindings.tcl"
bind .drw <Any-Button> {+mouse_buttons %b %s}
}

View File

@ -1,96 +1,96 @@
#
# File: ngspice_backannotate.tcl
#
#
# This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
proc ngspice::read_raw_dataset {arr fp} {
upvar $arr var
upvar $arr var
unset -nocomplain var
set variables 0
while {[gets $fp line] >= 0} {
if {$line eq "Binary:"} break
if {[regexp {^No\. Variables:} $line]} {
set n_vars [lindex $line end]
}
if {[regexp {^No\. Points:} $line]} {
set n_points [lindex $line end]
unset -nocomplain var
set variables 0
while {[gets $fp line] >= 0} {
if {$line eq "Binary:"} {break}
if {[regexp {^No\. Variables:} $line]} {
set n_vars [lindex $line end]
}
if {[regexp {^No\. Points:} $line]} {
set n_points [lindex $line end]
}
if {$variables} {
set nodename [string tolower [lindex $line 1]]
regsub -all {:} $nodename {.} nodename
set var($nodename) {}
set idx([lindex $line 0]) $nodename
}
if {[regexp {^Variables:} $line]} {
set variables 1
}
}
if {$variables} {
set nodename [string tolower [lindex $line 1]]
regsub -all {:} $nodename {.} nodename
set var($nodename) {}
set idx([lindex $line 0]) $nodename
}
if {[regexp {^Variables:} $line]} {
set variables 1
}
}
if {$variables} {
if { $n_points == 1} {
set bindata [read $fp [expr {8 * $n_vars * $n_points}]]
binary scan $bindata d[expr {$n_vars * $n_points}] data
for {set p 0} {$p < $n_points} { incr p} {
for {set v 0} {$v < $n_vars} { incr v} {
lappend var($idx($v)) [lindex $data [expr {$p * $n_vars + $v}]]
# puts "-->|$idx($v)|$var($idx($v))|"
if {$n_points == 1} {
set bindata [read $fp [expr {8 * $n_vars * $n_points}]]
binary scan $bindata d[expr {$n_vars * $n_points}] data
for {set p 0} {$p < $n_points} {incr p} {
for {set v 0} {$v < $n_vars} {incr v} {
lappend var($idx($v)) [lindex $data [expr {$p * $n_vars + $v}]]
# puts "-->|$idx($v)|$var($idx($v))|"
}
}
}
}
set var(n\ vars) $n_vars
set var(n\ points) $n_points
}
set var(n\ vars) $n_vars
set var(n\ points) $n_points
}
}
proc ngspice::read_raw {{f {}}} {
upvar ngspice::ngspice_data arr
upvar ngspice::ngspice_data arr
if { $f eq {}} {
set rawfile "$::netlist_dir/[file rootname [file tail [xschem get schname 0]]].raw"
} else {
set rawfile $f
}
if { ![file exists $rawfile] } {
puts "no raw file found: $rawfile"
return
}
set fp [open $rawfile r]
fconfigure $fp -translation binary
set ngspice::op_point_read 0
## not needed: done in ngspice::read_ngspice_raw
# array unset ngspice::ngspice_data
while 1 {
ngspice::read_raw_dataset arr $fp
if { [info exists arr(n\ points)] } {
if { $arr(n\ points) == 1 } {
set ngspice::op_point_read 1; break
}
} else break;
}
close $fp
puts {Raw file read ...}
if { !$ngspice::op_point_read } {
puts "no operating point found!"
}
if {$f eq {}} {
set rawfile "$::netlist_dir/[file rootname [file tail [xschem get schname 0]]].raw"
} else {
set rawfile $f
}
if {![file exists $rawfile]} {
puts "no raw file found: $rawfile"
return
}
set fp [open $rawfile r]
fconfigure $fp -translation binary
set ngspice::op_point_read 0
## not needed: done in ngspice::read_ngspice_raw
# array unset ngspice::ngspice_data
while 1 {
ngspice::read_raw_dataset arr $fp
if {[info exists arr(n\ points)]} {
if {$arr(n\ points) == 1} {
set ngspice::op_point_read 1; break
}
} else {break}
}
close $fp
puts {Raw file read ...}
if {!$ngspice::op_point_read} {
puts "no operating point found!"
}
}
# if { [info exists ::has_x] } {bind .drw <Alt-a> {puts {Annotating...}; ngspice::annotate} }

View File

@ -1,4 +1,3 @@
# from a 'pinlist' file like the one below:
# vss 1
# vccsa 2
@ -9,27 +8,25 @@
#
# place pin symbols (like ipin.sym, opin.sym, iopin.sym,
# or devices/ipin.sym depending on your search path setting) in current schematic.
# Pins are placed at growing y coordinates (going down in xschem coordinate system)
# Pins are placed at growing y coordinates (going down in xschem coordinate system)
# parameters:
# filename: name for the file holding the list of pins.
# 2 columns are assumed: pin name and pin number
# 2 columns are assumed: pin name and pin number
# symname: name of the pin to place (ipin.sym, opin.sym, devices/ipin.sym, ...).
# x, y: coordinate for first pin
# spacing: vertical spacing between one pin and the following.
#
proc place_pins {filename symname {x 0} {y 0} {spacing 40}} {
set i 0
set fd [open $filename r]
set pinlist [read -nonewline $fd]
close $fd
foreach {name num} $pinlist {
puts "$name num"
# xschem instance sym_name x y rot flip [prop] [n]
xschem instance $symname $x $y 0 0 "name=p$num lab=$name" $i
incr i
incr y $spacing
}
xschem redraw
proc place_pins {filename symname {x 0} {y 0} {spacing 40}} {
set i 0
set fd [open $filename r]
set pinlist [read -nonewline $fd]
close $fd
foreach {name num} $pinlist {
puts "$name num"
# xschem instance sym_name x y rot flip [prop] [n]
xschem instance $symname $x $y 0 0 "name=p$num lab=$name" $i
incr i
incr y $spacing
}
xschem redraw
}

View File

@ -7,42 +7,40 @@
# LDPRECH 6
#
# place pin objects (squares on layer 5) and labels in the current symbol window.
# pins are placed at growing y coordinates (going down in xschem coordinate system)
# pins are placed at growing y coordinates (going down in xschem coordinate system)
# parameters:
# filename: name for the file holding the list of pins.
# 2 columns are assumed: pin name and pin number
# 2 columns are assumed: pin name and pin number
# dir: pin direction (in, out or inout)
# x, y: coordinate for first pin
# spacing: vertical spacing between one pin and the following.
#
proc place_sym_pins {filename dir {x 0} {y 0} {spacing 20}} {
set fd [open $filename r]
set pinlist [read -nonewline $fd]
if {$dir == {in} } {
set flip 0
set offset 25
set line_offset 20
} else {
set flip 1
set offset -25
set line_offset -20
}
close $fd
foreach {name num} $pinlist {
puts "$name num"
set x1 [expr {$x - 2.5}]
set x2 [expr {$x + 2.5}]
set y1 [expr {$y - 2.5}]
set y2 [expr {$y + 2.5}]
xschem set rectcolor 5 ;# symbol pin layer
xschem rect $x1 $y1 $x2 $y2 -1 "name=$name dir=$dir" 0
xschem set rectcolor 4 ;# symbol line color
xschem line $x $y [expr {$x + $line_offset}] $y {} 0
xschem text [expr {$x + $offset}] [expr {$y - 4}] 0 $flip $name {} 0.2 0
incr y $spacing
}
xschem set schsymbolprop "type=subcircuit\nformat=\"@name @pinlist @symname\"\ntemplate=\"name=X1\""
xschem redraw
proc place_sym_pins {filename dir {x 0} {y 0} {spacing 20}} {
set fd [open $filename r]
set pinlist [read -nonewline $fd]
if {$dir == {in}} {
set flip 0
set offset 25
set line_offset 20
} else {
set flip 1
set offset -25
set line_offset -20
}
close $fd
foreach {name num} $pinlist {
puts "$name num"
set x1 [expr {$x - 2.5}]
set x2 [expr {$x + 2.5}]
set y1 [expr {$y - 2.5}]
set y2 [expr {$y + 2.5}]
xschem set rectcolor 5 ;# symbol pin layer
xschem rect $x1 $y1 $x2 $y2 -1 "name=$name dir=$dir" 0
xschem set rectcolor 4 ;# symbol line color
xschem line $x $y [expr {$x + $line_offset}] $y {} 0
xschem text [expr {$x + $offset}] [expr {$y - 4}] 0 $flip $name {} 0.2 0
incr y $spacing
}
xschem set schsymbolprop "type=subcircuit\nformat=\"@name @pinlist @symname\"\ntemplate=\"name=X1\""
xschem redraw
}

View File

@ -1,28 +1,26 @@
#
# File: resources.tcl
#
#
# This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
##
## Tcl Resources for XSchem toolbars
##
@ -41,14 +39,14 @@
## # so we set white background and eliminate alpha channel (unsupported in gif).
## convert -background white -alpha remove -alpha off paste.png -transparent white gif:-|base64
##
## Following shell function (and call) converts a png base64 encoded to proper
## Following shell function (and call) converts a png base64 encoded to proper
## gif89a base64 encoded format:
## to_gif () {
## echo "image create photo $1 -data \""
## echo -n "$2" | base64 -d |convert -background white -alpha remove -alpha off - -transparent white gif:- |base64
## echo '"'
## }
##
##
## to_gif imgFileOpen "...."
##
@ -69,7 +67,7 @@
# # set light colorscheme, set transparent svg background
# # draw image inside the border in green color
# # set line with 40 disable change line width, redraw
# # move away the border, full zoom the image
# # move away the border, full zoom the image
# # export svg:
# xschem print svg 1.svg 400 400 0 0 100 100
# # edit svg, change .l4 layer from green to black (#000000)
@ -77,21 +75,19 @@
# gm convert -size 16x16 1.svg 1.png
# convert -background white -alpha remove -alpha off 1.png -transparent white 1.gif
# base64 1.gif
# # the output is the 16x16 image with transparent background, antialiasing
# # the output is the 16x16 image with transparent background, antialiasing
# # and base64 encoded
# #
# #
# #
## FILE
if { $dark_gui_colorscheme == 0 } {
image create photo ximgFileOpen
ximgFileOpen put "
if {$dark_gui_colorscheme == 0} {
image create photo ximgFileOpen
ximgFileOpen put "
R0lGODlhGAAYAPYAAAAAAAEBAQMDAwQEBAUFBQcHBwgICAkJCQsLCw0NDRISEhMTExcXFxkZGRwc
HB0dHR4eHiEhISYmJisrKywsLDAwMDExMTIyMjY2Njc3Nzk5OUREREVFRUZGRk5OTlRUVFlZWVpa
Wl1dXV5eXmBgYGhoaGlpaW1tbW5ubm9vb3BwcHl5eXp6en19fYGBgYKCgouLi5OTk5SUlJWVlZ2d
@ -105,8 +101,8 @@ KuHi4+Ti3ysLubbr7LoLEOrt8gAIEBcJ8/MIFx0L+fILOoBg8K8dAxAoIBRkBwFFiwgL10V4IUNC
RFsSZNigcJEUBRs6OHbEdEEHEQwjMWEgkqRDSgAdkjihgcKRzZs4b6Kg4WSSz58+AwEAOw==
"
image create photo ximgFileSave
ximgFileSave put "
image create photo ximgFileSave
ximgFileSave put "
R0lGODlhGAAYAPUAAAAAAAEBAQICAgMDAwQEBAUFBQcHBzExMT4+Pj8/P0FBQUNDQ0REREVFRUdH
R0hISElJSV9fX2BgYGFhYWJiYmVlZWdnZ2hoaGlpaW1tbW5ubm9vb3BwcHNzc3R0dJOTk6Ghoaam
pqqqqq2trbGxsbKysrOzs7a2trq6usHBwcLCwsPDw8TExMbGxsfHx8rKytXV1ebm5urq6uzs7O3t
@ -117,8 +113,8 @@ GrCdkwbCwp6lprLGycqxQrPKz8fN0NDMOs7TxtXX2Gza3Mne36XVa+JskUMkZeIGDSdETE5P8/T0
HiRpSvr7/ENBADs=
"
image create photo ximgFileReload
ximgFileReload put "
image create photo ximgFileReload
ximgFileReload put "
R0lGODlhGAAYAPYAAAAAAAEBAQICAgQEBAUFBQcHBwgICAsLCw0NDQ4ODg8PDxMTExQUFBoaGhsb
GxwcHB8fHyAgICEhIScnJysrKywsLDg4OD4+Pj8/P0BAQEFBQUJCQkZGRk9PT1VVVVZWVmFhYWdn
Z2hoaGlpaWtra2xsbHNzc4yMjJaWlpqamqSkpKWlpaqqqq2trbOzs7a2tri4uL6+vsHBwcPDw8TE
@ -132,10 +128,10 @@ Sz0l2BTNJIY3EyY+hiTmhj4nQofuwueFSEVK9O+SS/XB7kkCCAxDChQIEypUmAIDMGTOIjYjQCGB
xIvPKqhYRqCjx48gPRrQsELIjhsyUqpcyXLljiL+YsqcSXNRIAA7
"
## EDIT
## EDIT
image create photo ximgEditUndo
ximgEditUndo put "
image create photo ximgEditUndo
ximgEditUndo put "
R0lGODlhGAAYAPYAAAAAAAEBAQICAgMDAwUFBQcHBw0NDQ4ODg8PDxAQEBERERMTExQUFBUVFRcX
FxgYGBkZGRsbGxwcHB0dHR4eHiAgICIiIioqKiwsLENDQ0REREtLS1NTU1RUVFxcXGFhYWdnZ2ho
aGlpaWpqamxsbHJycnR0dHV1dXd3d3h4eHx8fICAgISEhIWFhYaGhoqKipCQkJGRkZSUlJWVlZqa
@ -149,8 +145,8 @@ mEIox7oFBgXJCShFhkIpra4ZODc0MyskGxUFEjTWhEYlILgaNWiKER4wPEDg0OMQlBIVREl60iJD
C3/XoqTYhChLlhsrhAjDFEXFC0VTfOwYaUiJkkVRgpEilAXjzJs4GQUCADs=
"
image create photo ximgEditRedo
ximgEditRedo put "
image create photo ximgEditRedo
ximgEditRedo put "
R0lGODlhGAAYAPYAAAAAAAEBAQICAgUFBQcHBw0NDQ4ODhAQEBERERISEhUVFRcXFxgYGBoaGhwc
HB0dHR4eHiAgICEhISMjIyoqKkNDQ0REREtLS1NTU1ZWVl1dXWBgYGdnZ2hoaGlpaWpqamtra2xs
bG1tbXJycnNzc3R0dHV1dXZ2dnd3d3h4eHt7e3x8fH9/f4KCgoODg4SEhIWFhYeHh4qKipCQkJGR
@ -164,8 +160,8 @@ BhxIpUYlBs0EBr+z6SNEpU83vhMXITE2Nzg5FsCaRIU9MkDQQIOHkieETjUooYqQlBYVYpA6xAHA
hBFOClkREgOHFWMJF5TgpHGHD4SJZLAgqRFJRkVKlCSSAtKTzZs4bwYCADs=
"
image create photo ximgEditCopy
ximgEditCopy put "
image create photo ximgEditCopy
ximgEditCopy put "
R0lGODlhGAAYAPYAAAAAAAcHBwoKCg4ODhAQEBERESUlJSsrKywsLC0tLS4uLi8vLzAwMDExMTMz
Mzg4ODk5OTo6OkBAQEFBQURERFJSUlNTU1RUVFVVVVpaWmFhYWRkZGVlZXd3d35+foGBgYODg4SE
hIWFhYaGhoiIiJWVlZaWlpmZmZ+fn6urq66urq+vr7S0tLW1tbm5ubu7u76+vr+/v8DAwMTExMzM
@ -180,8 +176,8 @@ Ax+oUPWg0WORDRugaOTIGIQCgAiKZBBKVBIABZLjygVhoS0myRYdWCjq4eEDxiA4W5AcSrQoo0AA
Ow==
"
image create photo ximgEditCut
ximgEditCut put "
image create photo ximgEditCut
ximgEditCut put "
R0lGODlhGAAYAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQsLCwwMDA0NDQ4ODhAQ
EBERERISEhMTExUVFRYWFhcXFxoaGhsbGx0dHR4eHh8fHyIiIiMjIyQkJCUlJScnJysrKywsLC0t
LS8vLzExMTMzMzU1NTY2Njg4ODk5OTo6Ojs7Ozw8PD4+Pj8/P0JCQkNDQ0REREVFRUhISExMTE5O
@ -205,8 +201,8 @@ gWFhFgALMz0ZRURSS7HwBmWUSNWBBTSkFVMMczRiE046iUTJIXnkEchQI5WkQwwLqESZSE9dlBFH
AIDwUUgNmeHED+VRxGJtI85oI0MBAQA7
"
image create photo ximgEditPaste
ximgEditPaste put "
image create photo ximgEditPaste
ximgEditPaste put "
R0lGODlhGAAYAPYAAAAAAAEBAQUFBQoKCgsLCw4ODg8PDxAQEBkZGRsbGx0dHR8fHyAgICEhISMj
IyYmJicnJy0tLS4uLi8vLzAwMDIyMjMzMzU1NTg4ODk5OUFBQUJCQkREREVFRUZGRkxMTE1NTVBQ
UFFRUVRUVFdXV1paWl1dXWpqanR0dHd3d3h4eHx8fH19fX5+foODg4iIiI2NjY+Pj5ycnJ6enqCg
@ -221,8 +217,8 @@ J3szKJwwlIRDAYcFxYF0J7ATBwAZgqhcuXLXuVTUjPm64C2mTF7IVPkI0eKFz58/VZAQ4q2o0aOp
AgEAOw==
"
image create photo ximgEditDelete
ximgEditDelete put "
image create photo ximgEditDelete
ximgEditDelete put "
R0lGODlhGAAYAPUAAAAAAAEBAQICAgMDAwYGBgcHBw0NDRAQEBQUFBUVFRkZGRoaGi4uLjAwMDEx
MTw8PD09PUBAQEZGRklJSVNTU1RUVFhYWICAgIGBgYuLi4+Pj5KSkpOTk5ubm6ioqKmpqaqqqra2
tre3t8PDw8bGxsfHx8zMzM3Nzdra2vHx8fLy8vPz8/T09Pb29vn5+fr6+vz8/P39/f7+/gAAAAAA
@ -232,8 +228,8 @@ FQYFEiRUSjIfDwMHFBYJAw8eYEsyHQwDnAMMHZdMYgecBhl7TiwaBqWnTjOZDZ2eoE2MjgkVFqQP
H6FHfX8GFIMUhoiKSG4Kh3N1d3moR2JkZkNoDGuLV1lbXV9Pv7DJr+Xm5+ivQQA7
"
image create photo ximgEditDuplicate
ximgEditDuplicate put "
image create photo ximgEditDuplicate
ximgEditDuplicate put "
R0lGODlhGAAYAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQsLCwwMDA0NDRERERIS
EhMTExQUFBkZGRoaGhwcHB0dHR4eHh8fHyIiIiQkJCcnJygoKCkpKSsrKywsLC4uLi8vLzMzMzQ0
NDY2Njk5OTs7Oz09PT4+Pj8/P0BAQEFBQUREREdHR0lJSUpKSktLS09PT1JSUlRUVFVVVVdXV1pa
@ -257,8 +253,8 @@ GMRjA77OJPUJhJxSHO03iGMDPRFgI+jlNFAiCA5UxYID6tcRQQoCcJ5MMADBw4cghsgDECUsqIYD
v6W4AEF13LBCCTDCiAIKMs5IYwku6EAQZIz16GOPhfwYEAA7
"
image create photo ximgEditMove
ximgEditMove put "
image create photo ximgEditMove
ximgEditMove put "
R0lGODlhGAAYAPYAAAAAAAEBAQICAgYGBgcHBwkJCQsLCxQUFBkZGRoaGhsbGx8fHyEhISIiIiMj
IyUlJTc3Nzs7Oz4+Pj8/P0VFRUdHR0lJSUtLS05OTlJSUmRkZGdnZ2lpaWpqanNzc3h4eH19fYqK
io2NjZCQkJiYmJmZmZycnJ+fn6GhoaampqqqqrS0tLi4uMLCwsPDw9TU1NbW1uDg4OPj4+Tk5OXl
@ -272,8 +268,8 @@ kUElLtbEGBUriEEiyczMGgoFFSk7xBLBwAMSJvb4wA4dDAXJcKCVQQUDADjwIEOgjVAQZ8iA4CDE
qHKCgnwgkQPjoCCePIoc6TEQADs=
"
image create photo ximgEditPushSch
ximgEditPushSch put "
image create photo ximgEditPushSch
ximgEditPushSch put "
R0lGODlhGAAYAPUAAAAAAAEBAQICAgYGBhAQEBMTExUVFRYWFhgYGBoaGhsbGxwcHB0dHSAgIC4u
LjExMTc3Nz4+PnR0dHh4eHx8fIODg4SEhIeHh4iIiIuLi5KSkpOTk5aWlpycnKCgoLCwsNzc3N7e
3t/f3+Dg4OLi4uTk5OXl5ebm5ufn5+np6ezs7PPz8/T09Pb29vr6+vz8/P39/f7+/gAAAAAAAAAA
@ -283,8 +279,8 @@ fStWQy0eDwsJA4EDCQsOHS1EMCEYBYFcBRUhh0QkGAubAAkXIUgwKBQNgQsTJKBGMCoTrmILEimz
R7UUCVwJu72qKRcHWgcVKMVKogkHGKlMRiEbG9TVeiuG29/g1UEAOw==
"
image create photo ximgEditPushSym
ximgEditPushSym put "
image create photo ximgEditPushSym
ximgEditPushSym put "
R0lGODlhGAAYAPUAAAAAAAUFBQoKCgwMDBISEhcXFxsbGx8fHyAgICcnJygoKCwsLDIyMjQ0NDg4
OD09PUNDQ01NTVJSUlVVVVtbW15eXmVlZWpqam1tbXJycoaGho+Pj5mZmZ2dnaqqqq+vr7e3t7i4
uLy8vMLCwsrKys/Pz9PT09jY2N3d3eLi4ujo6O7u7vLy8vf39/v7+wAAAAAAAAAAAAAAAAAAAAAA
@ -295,8 +291,8 @@ CAlvE18oAQAhTRQAGXS5DRYWF0PIGHQKZtEA01+GzRYYvghvEl8nxLMvZg9aK6ELRB8eHw8Aq6yS
JiMbBgABa00LolgIgKgyASAABBkwMQkCADs=
"
image create photo ximgEditPop
ximgEditPop put "
image create photo ximgEditPop
ximgEditPop put "
R0lGODlhGAAYAPUAAAAAAAEBAQICAgYGBhAQEBMTExUVFRYWFhgYGBoaGhsbGxwcHB0dHSAgIC4u
LjExMTc3Nz4+PnR0dHh4eHx8fIODg4SEhIeHh4iIiIuLi5KSkpOTk5aWlpycnKCgoLCwsNzc3N7e
3t/f3+Dg4OLi4uTk5OXl5ebm5ufn5+np6ezs7PPz8/T09Pb29vr6+vz8/P39/f7+/gAAAAAAAAAA
@ -306,13 +302,13 @@ DRNpSCMYDIODCF1GMCEYBoyMBF11Mi0eDwwIA5UAAwgIDx0rRDAtJSUjEKEQI6wtmakRoREua7eV
uVEuvIy+S8C4usTBg8NKxb3HzMl6y3YfGxzX2BsftV/d3t9LQQA7
"
## OPTION
## OPTION
## VIEW
## VIEW
image create photo ximgViewZoomIn
ximgViewZoomIn put "
image create photo ximgViewZoomIn
ximgViewZoomIn put "
R0lGODlhGAAYAPUAAAAAAAEBAQYGBggICBERERISEhMTExQUFBoaGjc3Nzg4OD4+PkFBQUJCQklJ
SUpKSktLS0xMTF5eXl9fX2BgYGxsbHd3d3l5eXp6enx8fIODg4SEhIWFhZGRkZKSkpOTk5SUlLu7
u7y8vL29vcDAwMHBwcLCws/Pz9DQ0NHR0dbW1tfX19ra2tvb29zc3N3d3eDg4O7u7u/v7/X19fb2
@ -324,8 +320,8 @@ mqepeBMzfKT3sfnWHFg1RAQuUwBBiRqyqJSaBDBgJJhUqQ8GQGsEETKE4YUSHSsw2HmlhkAGFmKU
3GDRIcLIOwcivOFDxcqGCRG2dPnSaUwOkiYlSqCw5JPKESNjggAAOw==
"
image create photo ximgViewZoomOut
ximgViewZoomOut put "
image create photo ximgViewZoomOut
ximgViewZoomOut put "
R0lGODlhGAAYAPUAAAAAAAEBAQYGBggICBERERISEhMTExQUFBoaGjc3Nz4+PkFBQUJCQklJSUpK
SktLS0xMTF5eXl9fX2BgYHd3d3l5eXp6enx8fIODg4SEhIWFhZGRkZKSkpOTk5SUlLu7u7y8vL29
vcDAwMHBwcLCws/Pz9DQ0NHR0dbW1tfX19ra2tvb29zc3N3d3eDg4O7u7u/v7/X19fb29vf39/r6
@ -336,8 +332,8 @@ vTU2LghqDCO1twC5Nr6+wMIAxKWnqa3UCrBqDbRVEqGCE2FCGYrdagecQyCn5AAQIESImd0EHjF9
FoChhC1KcxbxggQuqOCTpIaKDRDGrTkAwUOLR1SsZJAAYUuDCV/AjXnnBEq9jVSOGBkTBAA7
"
image create photo ximgViewZoomBox
ximgViewZoomBox put "
image create photo ximgViewZoomBox
ximgViewZoomBox put "
R0lGODlhGAAYAPYAAAAAAAEBAQICAgQEBAUFBQYGBgcHBwgICAoKCgsLCwwMDBYWFhcXFxoaGhsb
Gx0dHSMjIysrKzQ0NDY2NkBAQEFBQUJCQkNDQ0lJSUpKSk1NTVFRUVJSUlZWVldXV1tbW1xcXF5e
XmJiYmNjY2RkZGlpaWpqamtra3t7e4aGho+Pj5aWlpeXl5ubm6ampqurq66urq+vr7i4uLq6uru7
@ -352,8 +348,8 @@ DwcBWlA0SO6ixEFL3nG05HFivn0OeWA06a+hxZUbHZaM+fJjPpfxZubD4K2Ez59Af4bgpTFfCgi3
ktoaQKEGSB0pMFCgMOHC1KlVr1L4AEMgSESKwIZVlAjUoEAAOw==
"
image create photo ximgViewToggleColors
ximgViewToggleColors put "
image create photo ximgViewToggleColors
ximgViewToggleColors put "
R0lGODlhGAAYAPYAAAAAAAEBAQICAg8PDxERERISEhMTExQUFBUVFRYWFhkZGRsbGx4eHiUlJSYm
JicnJykpKSoqKj4+PkJCQkNDQ0RERE5OTk9PT1FRUVJSUlRUVFdXV1hYWFlZWVpaWltbW2JiYmNj
Y2RkZGdnZ2hoaGpqamtra2xsbG9vb3BwcHFxcXJycnNzc3R0dICAgIGBgYKCgo6Ojo+Pj5CQkJGR
@ -370,8 +366,8 @@ m5ak2bMkybpUuzZoVq2xuXb1EgQsQilCQ0oMQ5eqR9IxXmaVKEKIEkRMFjJwGhQmSREq9wY5ohAp
9T1DJaCkDgQAOw==
"
image create photo ximgViewRedraw
ximgViewRedraw put "
image create photo ximgViewRedraw
ximgViewRedraw put "
R0lGODlhGAAYAPYAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgkJCQoKCgsLCwwMDA8PDxAQEBERERMT
ExQUFBUVFRsbGxwcHB8fHyQkJCkpKSsrKy0tLS4uLjExMTQ0NDg4ODo6Ojs7Ozw8PD09PUREREVF
RUZGRkdHR0lJSUpKSkxMTE5OTk9PT1JSUlNTU1VVVVdXV1hYWF5eXl9fX2BgYGFhYWJiYmNjY2Rk
@ -386,16 +382,16 @@ kDOxjFEU0YSJCxEBdeU4KOBDky9Z0nGi0wYGOQE+4uSjtMXESx/D7NAxEuqXCSk5w6hCeAHGE2bD
pKSo8MHFjzEzTXVhwgQdnaimAgEAOw==
"
## PROPERTIES
## PROPERTIES
## LAYERS
## LAYERS
## TOOLS
## TOOLS
image create photo ximgToolInsertSymbol
ximgToolInsertSymbol put "
image create photo ximgToolInsertSymbol
ximgToolInsertSymbol put "
R0lGODlhGAAYAPUAAAAAAAYGBgkJCRcXFxoaGh0dHSAgICYmJiwsLDMzMzg4OEdHR0hISFFRUWtr
a2xsbHd3d3l5eYKCgoWFhYiIiJGRkZmZmZ6enqOjo6enp6qqqqysrLu7u7+/v8vLy83Nzdra2t3d
3enp6fPz8/f39wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -405,8 +401,8 @@ EFsQShdbDkYhWxFLBgADGhobQ40Aj0oJXpeOS3RdIRYWE59KkZOVBXmIWw9DnF0Ne31/QyQdHBhb
CnFwc1wVRx9oZwFqR1nGXGBKUFRUVk7U1dbX2EVBADs=
"
image create photo ximgToolInsertText
ximgToolInsertText put "
image create photo ximgToolInsertText
ximgToolInsertText put "
R0lGODlhGAAYAPUAAAAAAAMDAwQEBAgICBERERMTExUVFRYWFh8fHyAgICIiIjQ0NERERFVVVVZW
VlhYWGZmZnd3d3h4eH19fY2NjZSUlKCgoKqqqqurq7u7u729vcvLy83NzdDQ0NHR0dLS0t3d3eHh
4eLi4u3t7e7u7vLy8vX19fb29vz8/P39/f7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -416,8 +412,8 @@ GoUkaIiJZhQQjY6NEiVmHHxTZiULBJqbmgofiqChomQmDJynnAYSVZSVdQRVKhMNtLW2thejurtc
QQA7
"
image create photo ximgToolInsertWire
ximgToolInsertWire put "
image create photo ximgToolInsertWire
ximgToolInsertWire put "
R0lGODlhGAAYAPUAAAQEBA8PDzs7Ozw8PD09PUREREVFRU5OTk9PT1BQUGJiYmNjY2RkZGVlZWho
aGlpaXd3d3h4eHx8fH19fX5+foaGhoeHh5OTk5SUlJubm6WlpaampsHBwcnJycrKysvLy8/Pz9DQ
0NTU1NXV1dnZ2dra2ujo6O7u7u/v7/Hx8fLy8vz8/P39/f7+/gAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -427,15 +423,15 @@ GWN/QhwAAByHRImLjUOPjJEuk5WWipSRl5WdnJqVgYOFjXcCCQl8fnUlEQpxc4dmD0cMa4cpGF5g
Yo0hVVdZkU0ghpFHWkEAOw==
"
image create photo ximgToolInsertLine
ximgToolInsertLine put "
image create photo ximgToolInsertLine
ximgToolInsertLine put "
R0lGODlhGAAYAPMAAAQEBAcHByAgICEhIcHBwcLCwsjIyMnJyfLy8gAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAkALAAAAAAYABgAAAQ1MMlJq7046827/2AojmTZIQahrmxRGAhmDAFg33gwGDKN
/wAd74JiGVWvmGnJbDqf0Kg0EwEAOw==
"
image create photo ximgToolInsertRect
ximgToolInsertRect put "
image create photo ximgToolInsertRect
ximgToolInsertRect put "
R0lGODlhGAAYAPQAAAAAAAgICAkJCQsLCxsbG0BAQEFBQV5eXl9fX2BgYGFhYWlpaWpqapaWlp6e
np+fn8TExMXFxeTk5Pn5+fr6+v39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEA
ABYALAAAAAAYABgAAAWPoCVWVFlO56SaVCW+FnQUdG3bBwSLzgD8wGBw4NhZGoDBgcFsOg++hhFJ
@ -443,8 +439,8 @@ kBhhEgJAuqNar6LsdgqogsNaLsx7tojVL/b5TTbP0/UvmN4t6698a35tgXGDd2N9dnt4in9GhSJy
jImCi4CNlo87kUeHlHCSSUtOpVCVLz1Cq0BERjI3sTUKOjskJiorLCYuIiEAOw==
"
image create photo ximgToolInsertPolygon
ximgToolInsertPolygon put "
image create photo ximgToolInsertPolygon
ximgToolInsertPolygon put "
R0lGODlhGAAYAPUAAAEBAQUFBQoKCg8PDxMTExcXFxoaGh4eHiYmJiwsLDExMTY2Njk5OUBAQEpK
SlRUVFdXV1lZWV5eXmRkZGdnZ3d3d39/f4KCgoqKio6OjpCQkJmZmaampqqqqq6urrCwsLu7u76+
vsTExMnJyc7OztPT09nZ2eHh4ebm5ujo6Ozs7PPz8/j4+Pv7+wAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -455,8 +451,8 @@ vVmILhcAB0YHvr6tQyNRJS4dURgb0tPTyUQFABguhQ1rRBIADSRRHt5DnwJlxOZCKWDa7EKFAAOd
8cFRuvcu4wDN+8HgeQsCADs=
"
image create photo ximgToolInsertArc
ximgToolInsertArc put "
image create photo ximgToolInsertArc
ximgToolInsertArc put "
R0lGODlhGAAYAPUAAAMDAwQEBAwMDA8PDxYWFh8fHyEhISwsLDExMTk5OUREREVFRU9PT1dXV15e
XmBgYGZmZm5ubnR0dHd3d4GBgYSEhIqKio+Pj5ycnKKioqenp6qqqrm5ucnJydbW1tjY2Nzc3OHh
4ebm5ujo6Orq6vLy8vX19fn5+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -466,8 +462,8 @@ Jk4ACWyDSyYJTxOKVyFxAR6QTBlPDZZMgAAgm0obTxWgQyd5CKVDDE9WqhNPHaooogAbsxxPGLi6
sxpPt6oUsbMPTyWzGwEOs0tBADs=
"
image create photo ximgToolInsertCircle
ximgToolInsertCircle put "
image create photo ximgToolInsertCircle
ximgToolInsertCircle put "
R0lGODlhGAAYAPYAAAAAAAEBAQICAgYGBgcHBwgICAkJCQoKCgsLCwwMDBMTExQUFBUVFRkZGRoa
GhsbGxwcHB0dHR4eHh8fHykpKSoqKjQ0NDU1NTY2Njc3Nzw8PD09PT4+Pj8/P0pKSktLS0xMTFBQ
UFFRUVJSUlNTU2BgYGFhYWNjY2dnZ2hoaGlpaWpqam1tbW9vb3BwcHFxcXJycn19fX5+fn9/f4CA
@ -483,8 +479,8 @@ H+nLUISoPDI/jK2AZAQViUcT6YEgoCFJJG4LFIBzSqjcuX5QXBB49kPaJGo7IHa50CYp1wICvXIU
UaKkSI5ix5KNM6UhgSoNHz68iqWhRjh/XZKs0FBBEydPK5L0K3qox41FjR45DQQAOw==
"
image create photo ximgToolSearch
ximgToolSearch put "
image create photo ximgToolSearch
ximgToolSearch put "
R0lGODlhGAAYAPUAAAAAAAoKChISEhYWFhkZGSIiIicnJysrKy0tLTMzMzc3Nzg4OEBAQFFRUVdX
V1tbW11dXWNjY2RkZGpqamxsbHFxcXR0dLm5ub+/v8HBwcbGxsnJyc7Ozs/Pz+/v7/Hx8fj4+AAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -494,8 +490,8 @@ UQIADFFtCVFeB1ELg4WHeVUYR34AgEhxAAd0Ql1VeFEOVQeWQmxVBlshHghfYVcBE60fpVerAQAB
Eq0hGxQLBgsVUBK7ARG/SBHJvsxGEM/R0tTVRNO80NhC2gkg3UMPCR7iROHnR0EAOw==
"
image create photo ximgToolJoinTrim
ximgToolJoinTrim put "
image create photo ximgToolJoinTrim
ximgToolJoinTrim put "
R0lGODlhGAAYAPUAAAAAAAEBAQMDAwQEBAUFBQsLCw0NDQ4ODhAQEBERERMTExQUFBkZGRoaGh8f
HycnJykpKSoqKi4uLlRUVFdXV1hYWF9fX2NjY2RkZGVlZWhoaGlpaW9vb3BwcHJycnNzc3l5eXx8
fIqKio2NjZCQkJiYmJubm5+fn6amprm5ub6+vr+/v8TExMbGxsjIyMnJycvLy87Ozs/Pz9HR0dLS
@ -505,8 +501,8 @@ dX6AgRkzfn+BgQweiotCKBcblhkikZKbnJ2enjckFhmWFyicOCEPjQAbnTgceoGumzwzHqy0kjAX
BXizkjwsFAhxHh4OGZI6JxIACBczOCAjwbwQFTI6PTeaizAnK4W1POOLQQA7
"
image create photo ximgToolBreak
ximgToolBreak put "
image create photo ximgToolBreak
ximgToolBreak put "
R0lGODlhGAAYAPUAAAAAAAEBAQICAgMDAwoKCgsLCw8PDxAQEBERERMTExUVFRYWFicnJywsLDEx
MVFRUVJSUlNTU1RUVFZWVldXV1hYWFpaWlxcXF1dXWFhYWJiYmNjY2VlZWZmZmlpaXR0dHZ2dnl5
eZqamqKioqamprS0tLa2tre3t7q6uru7u7+/v8DAwMTExMXFxcbGxsfHx8jIyMnJycrKysvLy8zM
@ -516,18 +512,18 @@ LWEgf2gMESs5PScnbW4iKDpCOY1tOjmVXzqekZdCVyIzkSUlPTktEQwZLZxVHxSFF3gNIrBLHQcU
F3G8KrlKHmMFFy2RxFsDHTOYZcpbFKXJYwoVKM9VJBlRHSAn2pHj5EZBADs=
"
## SYMBOL
## SYMBOL
## HIGHLIGHT
## HIGHLIGHT
## SIMULATE
## SIMULATE
## HELP
## HELP
## ACTION BUTTONS
## ACTION BUTTONS
image create photo ximgSimulate
ximgSimulate put "
image create photo ximgSimulate
ximgSimulate put "
R0lGODlhGAAYAPUAAAAAAAEBAQQEBAkJCQ8PDxoaGhsbGx4eHi8vLzY2Njw8PD09PUVFRUxMTE1N
TVVVVV5eXnZ2dnp6ep2dnaCgoKGhoaioqL6+vsHBwcLCwtDQ0NHR0dbW1tfX19ra2tzc3OPj4+Tk
5OXl5ejo6Onp6e/v7/Hx8fj4+Pn5+fr6+vv7+/7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -537,8 +533,8 @@ FG1KgIFyBhF+SIiJAIslh3mBgxQfbo4HiQgSGJNLIJUAB3V3TWdpa4ZvXwdiZGZXWZpUUB6NXLu8
vb68QQA7
"
image create photo ximgNetlist
ximgNetlist put "
image create photo ximgNetlist
ximgNetlist put "
R0lGODlhGAAYAPUAAAAAAAUFBQcHBxERERISEiIiIiUlJSsrKzMzMzo6Oj8/P0tLS1JSUl5eXmBg
YHNzc3d3d3x8fIKCgoaGhoiIiI6OjpGRkZaWlpmZmZ6enqOjo6enp6ioqK6urrGxsbq6usHBwcXF
xcvLy9TU1NnZ2d3d3eXl5enp6e/v7/b29vn5+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -549,8 +545,8 @@ ZBWcEZOXkH6UCXlEfAANjytiJldWIshufX+AskZ6KykHcnMAIRDj5B6fYQAaCOvsEudLkWRZW3Zf
TCkZF4T6hBlN/wCNBAEAOw==
"
image create photo ximgWaves
ximgWaves put "
image create photo ximgWaves
ximgWaves put "
R0lGODlhGAAYAPUAAAEBAQUFBQsLCwwMDBISEhcXFxwcHCUlJTIyMj4+PktLS1FRUV1dXWNjY2Vl
ZXV1dXp6eoeHh4uLi5OTk5iYmJmZmaOjo6ioqKqqqru7u729vcPDw8fHx8nJyc/Pz9DQ0NXV1dvb
29zc3OLi4uXl5enp6e3t7fHx8fX19QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -560,13 +556,9 @@ JoUcaSRrAgAaWxV+EUOLbWkjlBiTaQ6SlGkoAW0bcGoQQwQRIqkiHyUpJB4iICEpKB0iIR5EUUUP
YQS/BGJiwGNyRAidyWnGQw0AChnR0tPRggSEhYUMAJtPKZmUCd7fygvjpyGqqR3jzO26Zu9DHgMQ
Hh33+fj6/PghygCTiRiASp3Bg+pIpHjwQZ5DJUEAADs=
"
} else {
image create photo ximgWaves
ximgWaves put "
image create photo ximgWaves
ximgWaves put "
R0lGODlhGAAYAPUAAAAAAAoKCg4ODhISEhYWFhoaGh0dHSMjIyQkJCoqKi8vLzAwMDY2Njg4ODw8
PEJCQkRERFVVVVxcXGZmZmxsbHR0dHh4eIWFhYqKipqampycnKKioq6urrS0tMHBwc3Nzdra2uPj
4+jo6O3t7fPz8/T09Pr6+v7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -577,8 +569,8 @@ Jm0OcGoXQyMWB6kHCgQABQsHCQgAAQwHCAtEUUUYYSO/I2JiwGNyRB+dyWnGQxonHRDR0tPRgiOE
hYUbJ5tPAJmUHt7fyhzjpwiqqQzjzO26Zu9DCyQXCwz3+fj6/PgIygCTHSCBSp3Bg+oKAMCgQJ5D
JUEAADs=
"
image create photo ximgViewZoomIn
ximgViewZoomIn put "
image create photo ximgViewZoomIn
ximgViewZoomIn put "
R0lGODlhGAAYAPUAAAAAAAEBAQQEBAoKChERER8fHyIiIiUlJSgoKC8vLzAwMD4+PkNDQ0RERGtr
a25ubnt7e3x8fIODg4WFhYiIiJOTk5+fn6CgoLOzs7a2tr29vcHBwcfHx8jIyOXl5evr6+7u7vf3
9/n5+f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -589,8 +581,8 @@ cpcCmY4QQwMWlZYCoqkXTwAKlCMiHRsbHRVfFRy2HYAjGAlCDBplHgVCq0PKBR5lGgtCC8Ujx1/K
12zNzwtssWW0thy5ABW1Gxy/wUIEqJWho3MXA3ee76vxZh+lQwyyoPg0cTJ1aE6HAgU6OIKEZ8Ie
M33+BJpg4AiCCXFSlQEhgVCbAw8wZJTzAYOaO0ikQLiA4UqWLSi9sFuyIEEkmTiRBAEAOw==
"
image create photo ximgToolInsertArc
ximgToolInsertArc put "
image create photo ximgToolInsertArc
ximgToolInsertArc put "
R0lGODlhGAAYAPUAAAAAAAYGBgoKCg0NDRcXFxkZGR4eHiMjIykpKTY2NkZGRlVVVVhYWF1dXWNj
Y3BwcHV1dXt7e35+foiIiJGRkZmZmZ+fn6GhoaioqLCwsLq6uru7u8bGxs7OztPT097e3uDg4Onp
6fDw8Pv7+/z8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -599,16 +591,16 @@ Z2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAAaHQIAQQDAcCoGhcsnUkJ6kkceyEDCvA6j2KZoQrktG
ZTKhZEBa0SMJBh8kIaim0G4HIKLnx1BvIzp6dH1XAk4kHGyDSwIcTxOKVwZxIwiQTA1PGJZMgCQH
m0oLTxGgQwF5HaVDGU9WqhNPCaoAoiQLswpPDri6swxPt6oSsbMWTwOzCyMXs0tBADs=
"
image create photo ximgSimulate
ximgSimulate put "
image create photo ximgSimulate
ximgSimulate put "
R0lGODlhGAAYAPQAAAAAAAEBAQUFBQ4ODhAQEBcXFxsbGxwcHCMjIyUlJSkpKS8vLz4+PkFBQVdX
V19fX2JiYoWFhYmJiaGhoaqqqrOzs7q6usPDw8nJydDQ0OHh4eTk5PDw8Pb29vv7+////yH5BAAA
AAAAIf8LSW1hZ2VNYWdpY2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAAVxICCOZGmeaKqubKsK
izK4ZnFVTiHQo6F5m0ljx/N9PhxMJEFsGTbHD5ACObie0aiSMVths8eO5cFUfcHHjaSLOqPVBDMU
LX4gmicjOBNhxFcHc0caVFZOGkdJS3hePxpCjCwGNzmRLDAJbDybnJ2enCEAOw==
"
image create photo ximgToolSearch
ximgToolSearch put "
image create photo ximgToolSearch
ximgToolSearch put "
R0lGODlhGAAYAPUAAAAAAAcHBw4ODhAQEDExMTY2Njk5OT4+PkBAQEZGRouLi46OjpOTk5WVlZub
m5ycnKKioqSkpKioqK6urr+/v8fHx8jIyMzMzNLS0tTU1NjY2N3d3ebm5unp6e3t7fX19f///wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -618,8 +610,8 @@ Z2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAAakQIBwSCwajwBDo7KpMArI42ACqlpBEkF0OMhYO5eO
Ql1VeFESVRmWQmxVGlsAAxhfYVcfDa0CpVerHyAfDq0ABQwVGhULUA67Hw+/SA/JvsxGEM/R0tTV
RNO80NhC2hcB3UMRFwPiROHnR0EAOw==
"
image create photo ximgEditUndo
ximgEditUndo put "
image create photo ximgEditUndo
ximgEditUndo put "
R0lGODlhGAAYAPUAAAAAAAICAgUFBQoKChISEhUVFRgYGB8fHyMjIyUlJSsrKy4uLjMzMzk5OT09
PUJCQklJSVFRUVpaWmFhYWVlZWpqam9vb3V1dXp6en9/f4ODg4eHh4iIiI2NjZOTk5eXl5iYmJ6e
nqOjo6ysrLS0tLu7u7y8vNXV1d/f3+Pj4+bm5urq6u/v7/Ly8vj4+Pz8/AAAAAAAAAAAAAAAAAAA
@ -629,8 +621,8 @@ Z2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAAaoQIBwSCwaj8ikcskUIhBNZAFTiRoLGdXHSjR0Ui8Q
eC4tLoUsHAmcG2xtJhITFBUZHiQoLikUkkQIHSptYkMDCA8WIiojDkcFHShhSAYYJhi4RAQbWkoT
GZtHBBoXSgMNEEkHf0oE5WNE0uns7UxBADs=
"
image create photo ximgEditPop
ximgEditPop put "
image create photo ximgEditPop
ximgEditPop put "
R0lGODlhGAAYAPUAAAAAAAICAgUFBQkJCQwMDBMTExYWFhsbGx8fHyEhIU9PT19fX2NjY2lpaWxs
bHR0dHd3d3h4eHx8fIODg4eHh4uLi8HBwcjIyM7Ozt/f3+Li4ufn5+rq6uzs7O/v7/n5+f///wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -639,8 +631,8 @@ Z2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAAaNQIBwSCwaj8ikkkggLJUIhyPxPCIeG06EWh0asCBQ
R3LoAgqTTTi8oRiqBUpmvdZU3krDZE5fZyhlSFcafX0bW0cJDxyFhR2IRAMLGBobH40gHxsbGAxO
kQcHCBeYFwihA0oWmBYCVauNrU8CsIWyS7Ssrri1fbdKubG7wL10v0oKDg3LzA4KZtDR0lVBADs=
"
image create photo ximgFileSave
ximgFileSave put "
image create photo ximgFileSave
ximgFileSave put "
R0lGODlhGAAYAPUAAAAAAAEBAQUFBQoKChMTExUVFRkZGSoqKjU1NTk5OT4+PkVFRUlJSU5OTlJS
UlVVVVlZWV5eXmxsbIuLi4yMjJGRkZaWlpiYmJ2dnaCgoLa2trq6ury8vMHBwc7Ozvj4+P///wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -650,8 +642,8 @@ Zbz5eCCE4sTrVRQPCoOi23EMiBb2xz0UcEAUCGwaC3h6fEICHYAIXV4Thl57RIogFQmOIBaRIJNE
ixQJbJqcHw2UEhcPDJmbQ3mSFQ0KCgsKCQgMFa2ckh+/v52jpK/DxseuQrDHzMTKzc3JAMvQw9LU
1WzX2cbb3KPSa99skEMNZd8fGwxETE5P8PHxEw1pSvf4+UNBADs=
"
image create photo ximgEditCopy
ximgEditCopy put "
image create photo ximgEditCopy
ximgEditCopy put "
R0lGODlhGAAYAPUAAAAAAAEBAQQEBAgICA0NDRMTExgYGCgoKDMzMzs7Oz8/P0FBQUZGRkpKSktL
S1RUVGZmZmlpaXd3d3l5eX5+foGBgYiIiJqamp6enqWlpaurq6ysrLu7u8XFxcfHx8zMzM7OztDQ
0NTU1Nra2u7u7u/v7/Hx8fX19fj4+P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -661,8 +653,8 @@ Z2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAAa+QAEqRSwaiwuAcqk0HJ/FCZNZIGYg2CyWQnxMl9VU
gpoAISkhiRCLeUsaKRuSqJZpYICvaJ+UoRclF4knJb6/viahIqSJUEdSShMgyQAYIxrR0tMgHQNo
aAQIBEsHB2AIBdgAHIdKCkRJ5Ckc46OlAA6a7+MOFg5KBBUU1/H34wADCmQSBAA7
"
image create photo ximgEditDelete
ximgEditDelete put "
image create photo ximgEditDelete
ximgEditDelete put "
R0lGODlhGAAYAPQAAAAAAAEBAQUFBQsLCw4ODiUlJTMzMzk5OTw8PEhISFZWVldXV2RkZGxsbHBw
cHR0dH5+fqenp6urq6ysrLa2trm5ub+/v8PDw8/Pz9HR0ebm5urq6u/v7/Ly8vj4+Pz8/CH5BAAA
AAAAIf8LSW1hZ2VNYWdpY2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAAWPICCOZGmeaKqubMsK
@ -670,8 +662,8 @@ KMwSRjGQQ2EQK9FkFgVJYcE0eCkCRPOhJEQJykcDQcYOFE9HgjhIOp7KQaZSXD6cSWTzuQhdjMxn
/skwXCIfZ955WFsDDh18fngADBh0dXcuZh8bEhF7bi9YWhNdE2BiZCdKGmFPAFFTVSo+QG8iRBlH
PTU3Izk7LZ0ktoa5uru8KCEAOw==
"
image create photo ximgToolInsertPolygon
ximgToolInsertPolygon put "
image create photo ximgToolInsertPolygon
ximgToolInsertPolygon put "
R0lGODlhGAAYAPUAAAAAAAQEBAcHBwwMDBMTExcXFxkZGR4eHiYmJiwsLDExMTY2Njs7O0FBQURE
RE9PT1FRUVVVVVlZWWZmZm9vb3FxcXV1dX19fYCAgIiIiJubm6GhoaampqioqLW1tb+/v8bGxsnJ
yc7OztPT09nZ2eHh4eXl5ejo6Ozs7PDw8PX19fr6+v7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -681,8 +673,8 @@ cdCJribRrRiAGEVLC0B6/UhFPQThvBrIZDNEe00GIFEoakOCTBxRIQdLUSBxTRosJEpLIlkaBkwS
LCsDTAV+USkVmEMEUQ9EDA6wDhQoWSQORYUaQxVgvVmIABcsJUYlvr6tQwtRCQARURYT0tPTyUQn
LBYAhR9rRBssHwpREN5DnyplxOZCBWDa7EKFLCmd8cFRuvcA4yzN+8HgeQsCADs=
"
image create photo ximgViewRedraw
ximgViewRedraw put "
image create photo ximgViewRedraw
ximgViewRedraw put "
R0lGODlhGAAYAPUAAAAAAAICAgUFBQoKCg0NDRISEhcXFxsbGx4eHiUlJSgoKC0tLTAwMDc3Nz8/
P0JCQkZGRktLS0xMTFFRUVZWVlpaWl9fX2FhYWdnZ25ubnd3d3h4eH5+foCAgISEhI+Pj5ubm5+f
n6Ghoaenp6qqqq2trbOzs7a2trm5ubu7u8LCwsfHx8vLy9LS0tbW1tvb2+Tk5Orq6u/v7/Dw8Pb2
@ -693,8 +685,8 @@ NjQlCmRbAhZznycPbwIUqH0pE6wNKTWfKxQDrAkkajY1LBWSUwILFRcQFCMzNCoXBWWDzCkREiIp
uW8dvjYqEQkMpFsDIZ82GeJlCybmGXhCFWB9Jg7vCGm/LSEQiW8OJS5UiMBw4J0QBRIkjDI4JAgA
Ow==
"
image create photo ximgFileOpen
ximgFileOpen put "
image create photo ximgFileOpen
ximgFileOpen put "
R0lGODlhGAAYAPUAAAAAAAEBAQcHBwgICA8PDxMTExcXFx8fHyYmJi4uLjY2Njk5OT8/P0NDQ0VF
RUpKSldXV2JiYmtra3R0dH19fYKCgoaGho+Pj5GRkZaWlp+fn6Kioqampqurq7Gxsbm5ucbGxsnJ
yc3NzdPT09nZ2d7e3uHh4ebm5ujo6Ozs7PLy8vT09Pr6+v///wAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -704,8 +696,8 @@ dgWSOBgLhlq9QAyEh45YzGK16njWSoMQJjx3eXV3V4OEIRBCAwgLCwqNjY8Kko6TCwldFhgYF52e
n6CemxYpdnOnqHcpJqapri0rJiIqr68rIh8pta4pHxwou6koHBgmwagmGBUlx6clFBIkzXMkEhAj
02IjEA3Y2VciDQkh31chCQYf5S0fBgIRGE7y8/TzGBECXvr7SUEAOw==
"
image create photo ximgToolJoinTrim
ximgToolJoinTrim put "
image create photo ximgToolJoinTrim
ximgToolJoinTrim put "
R0lGODlhGAAYAPUAAAAAAAICAgUFBScnJykpKS4uLjAwMDQ0NDs7O0BAQEZGRllZWWBgYGdnZ29v
b3JycnV1dYODg4aGho2NjZCQkJaWlpqampycnKCgoKenp6ioqNHR0dbW1tjY2ODg4Obm5uvr6+/v
7/Ly8vT09Pr6+v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -715,8 +707,8 @@ idPYEi0fy0RUEmkU5mGlRCK1L4e4vMQnUQp6e3wlFoCBAHODHxOGegsXFZEWEI2HlpeYmUkEDhgW
kRcLhwMRHYMlFZYDFHZ8qYcFE6evegcXI3SugQgaIW0TEx4WegIMGyUhFwUDEg+BthwZBkgElWYH
DAma20EAOw==
"
image create photo ximgViewToggleColors
ximgViewToggleColors put "
image create photo ximgViewToggleColors
ximgViewToggleColors put "
R0lGODlhGAAYAPUAAAAAAAICAgYGBg0NDQ4ODhERERQUFBsbGx0dHSEhISUlJSsrKy4uLjMzMzU1
NT09PUFBQUVFRUtLS09PT1JSUmNjY21tbXFxcX19fYuLi42NjZCQkJWVlZiYmJ2dnaSkpKenp6io
qK2trbGxsbu7u7y8vMHBwdXV1dnZ2eTk5Obm5urq6uzs7PDw8P7+/gAAAAAAAAAAAAAAAAAAAAAA
@ -728,8 +720,8 @@ FQUFCwwJHCUjaRgsEkPWrL1nIiRH4OLk5rq7LRgGEyElHAkMC9rRF7/Otcq2rRuXEyTeVJPHKpmo
JbNUgLh1rledWABKnboQDR0IBQ+JULKUIdMKTp4WjAwJwAGhOgQaJFrUACYkZULizLl4J88eLSF+
TowhAoFDIFFnJvwCICAOhwdEqODMOEIErCENHiDAKMRJiShcpRjhoABjEAA7
"
image create photo ximgEditDuplicate
ximgEditDuplicate put "
image create photo ximgEditDuplicate
ximgEditDuplicate put "
R0lGODlhGAAYAPUAAAAAAAEBAQQEBAkJCQ0NDRERERQUFBsbGx8fHyAgICUlJSoqKi8vLzIyMjU1
NTk5OT8/P0FBQUdHR0lJSVFRUVZWVl1dXWJiYmVlZWtra25ubnJycnd3d319fYCAgISEhIuLi42N
jZKSkpaWlpubm5+fn6KioqWlpaioqK2trbS0tLi4uL+/v8LCwsTExMvLy9HR0dfX19vb293d3eLi
@ -742,8 +734,8 @@ AAMA4BuTggIGGm9qkICAQEiGGWOIDNRxY8OAA6psiGhA5AGKkEPc6VgBAZWJlXc6wBQy8FAWQlQE
nGTYCWCknV1aMBDtWVPZkKE6RL5JIWKE1atYR4hoQfSBDX1gbxBRUGJFi7NnWbBIq3ZtCxUkiiCb
S5fugLpBAAA7
"
image create photo ximgToolBreak
ximgToolBreak put "
image create photo ximgToolBreak
ximgToolBreak put "
R0lGODlhGAAYAPQAAAAAAAMDAwQEBDMzMzQ0NDo6Oj8/P0BAQEVFRUhISEtLS1lZWWVlZYaGhomJ
iYuLi5aWlpmZmZ6enqOjo6enp6ioqKysrM7OztPT09jY2Onp6erq6u/v7/T09Pz8/P///yH5BAAA
AAAAIf8LSW1hZ2VNYWdpY2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAAWGICCOZGmeaKqaAtJA
@ -751,8 +743,8 @@ MBQta4lM26d/UF0SlB3PRxpEhD0igCDpIJWHCufToVQ2EeXiQqUUgA+lMWMxCAAKhXLJQIwE53V8
LZ8jGIR1GiAoWDISBUoPFV8TUxgMShEcFRNOjQdKEEIdE4KTQhEEcz6UOxV5a586GxQInSsLEjER
DwqpdLKzIiEAOw==
"
image create photo ximgNetlist
ximgNetlist put "
image create photo ximgNetlist
ximgNetlist put "
R0lGODlhGAAYAPUAAAAAAAYGBgkJCRAQEBYWFhoaGiIiIiYmJisrKzQ0NDo6Oj4+PkVFRU5OTlFR
UVdXV1xcXGFhYWZmZmlpaW5ubnFxcXd3d3l5eX19fYODg4iIiIyMjJ+fn6Ghoa2trbS0tMDAwMXF
xczMzNTU1Nra2t3d3e3t7fj4+Pr6+v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -762,8 +754,8 @@ GIkiBjyKojhZHhJSqAdRS/GaPsK28J1KXYZiBxKDgwx5DVAPEX19HAEAWmyMk30oIANiCBabnAsA
KJSUKCQQKRMlqKkbn6GTKCYTY0egKLW1jKMGa2QVnBmTl5B+lCF5RHwpHY8AYgVXVgnGbn1/gLJG
egACI3JzKQoa4eINn2EpECLp6hjlS5FkWVt2X0wCEROE+IQRTf3+RkEAADs=
"
image create photo ximgFileReload
ximgFileReload put "
image create photo ximgFileReload
ximgFileReload put "
R0lGODlhGAAYAPUAAAAAAAICAgYGBggICA0NDRISEhQUFBsbGyEhISQkJCoqKiwsLDExMTMzMzg4
OD4+PkFBQUdHR0lJSUxMTFJSUlVVVVpaWltbW2VlZWlpaXNzc4yMjJOTk5SUlJ6enqqqqrCwsLm5
ub6+vsDAwMfHx9PT09TU1NjY2N/f3+Pj4+Xl5evr6+zs7PHx8ff39/r6+v///wAAAAAAAAAAAAAA
@ -773,8 +765,8 @@ Z2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAAavQIBwSCwaj8ikcskkEhiCJnLhcQyUA8Nhyz0YKK0Q
DAAJHJgmjR1GDicbCEYdpkYIGgVHroKnRQIESLWBt1K8gL5NwH8jGBnIycrKGCOAiI7RjS8mLdLX
jyUXiy/d3t/g3i4iFwULDg/p6uvs6wu6UvHy8/TxQQA7
"
image create photo ximgEditRedo
ximgEditRedo put "
image create photo ximgEditRedo
ximgEditRedo put "
R0lGODlhGAAYAPUAAAAAAAEBAQUFBQoKChISEhoaGh8fHyIiIiQkJCkpKSwsLDQ0NDk5OT4+PkJC
QkpKSlNTU1paWmFhYWVlZWtra25ubnV1dXh4eH19fYCAgIeHh4uLi42NjZOTk5eXl5iYmKKioqmp
qbS0tLu7u7y8vNXV1dzc3OHh4eXl5ejo6O/v7/Hx8fj4+P///wAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -784,16 +776,16 @@ d+j9eg7NwqOy6ZRacFRHoTxANqQTC85vqTwLRwIJGG99hy0rIHREAgohKoiSJhgCRAmQkogrH2hD
CBsriCwre3CkHAlEAxN6JiIdFxQTEhEjfFmqRA0hJyAVDgYDRGUoG55DAhgkF2JXLSYcW0UKFxJK
Hikb00UPDMNJFhncRQfkRwZVSJZj7e7v7kEAOw==
"
image create photo ximgToolInsertText
ximgToolInsertText put "
image create photo ximgToolInsertText
ximgToolInsertText put "
R0lGODlhGAAYAPQAAAAAAAEBAQoKCg0NDRERER0dHSIiIi0tLTIyMkJCQkRERFVVVV9fX2tra3Jy
coKCgoeHh4iIiJmZmaenp6qqqru7u8vLy93d3eDg4Orq6u7u7vv7+////wAAAAAAAAAAACH5BAAA
AAAAIf8LSW1hZ2VNYWdpY2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAAVrICCOREkMwqiuKnFx
cNywtHjE+FTXTOT7j8JuSCwad4eFcslcCmmGDW6Ky9QKUioVsysovuBwYkw4ms9Fh2TNXkMGRYRW
VhxYNPg8/nJA+/+AQwIVeoV6GRA0cnNUGjUPFJGSk5MLgZeYOyEAOw==
"
image create photo ximgEditCut
ximgEditCut put "
image create photo ximgEditCut
ximgEditCut put "
R0lGODlhGAAYAPUAAAAAAAEBAQQEBAsLCw8PDxAQEBUVFRkZGR8fHyIiIiUlJSoqKi4uLjMzMzU1
NTo6Ojw8PERERElJSUxMTFRUVFVVVVpaWl1dXWJiYmRkZGpqamxsbHJycnV1dXp6en5+foeHh4uL
i46OjpKSkpaWlpubm56enqKioqampqioqK2trbGxsbe3t7q6ury8vMHBwcTExMnJyc7OztPT09TU
@ -805,8 +797,8 @@ IiwZk0YDCRAKfA5yWTEaCAhoRwIID+EAD+Q+PTgnDerLITDP0Sc5Pjtw7EjlYluRBSJy8OBVxpiM
DhZK3Jg3Ixk+UTZGYPgwI9WqAgAYfJAhi9aBRz0kUbKEaYiBCy86+XgxoY8PEoEGvXhQRECiNBo4
VoBi08LBgDhz6vQ0wIABAj4AwPAQ02KHmTRCqsDI4mMGF6xCmIQwodEW2CH4zqo1EgQAOw==
"
image create photo ximgEditMove
ximgEditMove put "
image create photo ximgEditMove
ximgEditMove put "
R0lGODlhGAAYAPUAAAAAAAICAgYGBgoKCgwMDBERERcXFxsbGxwcHCkpKTw8PEdHR0tLS1VVVVlZ
WV5eXmNjY2ZmZmdnZ29vb3JycnV1dYKCgoeHh4yMjJWVlZubm62trbGxsbS0tLi4uMHBwcTExMjI
yNra2tzc3OTk5Ovr6/b29vn5+f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -816,8 +808,8 @@ ZYQykc7odGlzzJBR8Lg8/hEYHx/TfA+vGwUNHWYaGYWGhhoUSQsdHHZVRgoRVQSPRAIEVREKkH8c
HgxJFISHhxokJh4OA38ffHsnHxCtr3sjGUcbJWm8JCcoIxgIYV7FBwghIxVgnUMXEQXNRFvS1dbS
QQA7
"
image create photo ximgViewZoomBox
ximgViewZoomBox put "
image create photo ximgViewZoomBox
ximgViewZoomBox put "
R0lGODlhGAAYAPUAAAAAAAEBAQYGBgsLCwwMDBISEhUVFRsbGx0dHSMjIyoqKjExMTc3Nzg4OEFB
QUVFRUdHR1FRUVRUVFlZWWRkZGlpaXBwcHl5eYSEhJaWlpubm5ycnKGhoaSkpKmpqa6urrKysra2
try8vL+/v8nJycvLy9TU1Nzc3OLi4uTk5Onp6fPz8/X19fv7+/7+/gAAAAAAAAAAAAAAAAAAAAAA
@ -828,8 +820,8 @@ LhlUQgMPHyosJBYHQo6hogAEDBITDwhHaa6vAgoLl0etr0IFGyEPQwLAwQcoLhXHya8HKS4Uz6DB
ANLNRNCi2s6318EI0+B83VTf1rne5evY6r/i0e5HIZwZ+fr7+hx51UcunKBDcE6LEQ6IJLgQYsQI
Eg4jQow4okMEX0SSKNG4UWORIAA7
"
image create photo ximgToolInsertSymbol
ximgToolInsertSymbol put "
image create photo ximgToolInsertSymbol
ximgToolInsertSymbol put "
R0lGODlhGAAYAPUAAAAAAAgICAwMDBYWFiIiIiUlJTIyMjQ0NEBAQERERFNTU1VVVVhYWFxcXGFh
YWZmZm5ubnd3d3p6en19fYaGhoiIiJOTk5SUlK6urre3t7i4uMfHx8zMzNPT09nZ2d/f3+Li4uXl
5ejo6Pb29vn5+f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -839,16 +831,16 @@ wGBgeM/cSXHj9VTe8Eqmw40QQ15NUjEqjQpDBRERFVsVSg5bF0YEWxRLHyUiCwsKQ40lj0ocXpeO
S3RdBA8PEp9KkZOVIHmIWxZDnF0Ye31/QwEICQ1bG3Fwc1wQRwZoZyRqR1nGXGBKUFRUVk7U1dbX
2EVBADs=
"
image create photo ximgToolInsertWire
ximgToolInsertWire put "
image create photo ximgToolInsertWire
ximgToolInsertWire put "
R0lGODlhGAAYAPQAAAAAAAEBAQ4ODhERERcXFyUlJSoqKi8vLzAwMDY2Nj4+PllZWWRkZGtra2xs
bHh4eIODg4eHh5aWlpubm52dna+vr7Gxsbu7u8PDw8TExPDw8Pv7+wAAAAAAAAAAAAAAACH5BAAA
AAAAIf8LSW1hZ2VNYWdpY2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAAV0ICCOZGmeppAkAuqK
CDRN0PGegnM9z9W0N5IhMhFJIoYgqSAjEGgFJWmBsVgwCylpwNBoGECtSLHZKMQkshk9Up/ZADc8
Xn6z5XD8vQ7nesFsCxkVFVhoBREUTlBiQxIiE0hiAg07PT9oBzI0NmwqCGFzNyEAOw==
"
image create photo ximgEditPushSch
ximgEditPushSch put "
image create photo ximgEditPushSch
ximgEditPushSch put "
R0lGODlhGAAYAPQAAAAAAAICAgUFBQkJCQwMDBMTExYWFhgYGB0dHSEhIU9PT19fX2NjY2lpaWxs
bHd3d3h4eHx8fIODg4eHh4uLi8HBwcjIyM7OztHR0d/f3+Pj4+Xl5enp6ezs7Pn5+f///yH5BAAA
AAAAIf8LSW1hZ2VNYWdpY2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAAWLICCOZGmeaKquLKA4
@ -856,16 +848,16 @@ TSw7SitUX67nlcDeu13vhwvyfCug8TNMFo1NlRKKlD6DURPhcEBYlh9LgksoDRYXzcYD9mw0GMag
lHh0wLtOJHFCPDR4HxsQfCgHEhlgGhMIKwUTiUEaFAYtBRIbOxuULSIGEBw5HBEHnSN+GxwPhaYi
CQ4OrK0iBGWzt7gkIQA7
"
image create photo ximgToolInsertRect
ximgToolInsertRect put "
image create photo ximgToolInsertRect
ximgToolInsertRect put "
R0lGODlhGAAYAPMAAAAAAAICAgUFBQYGBhsbGzs7O2FhYWlpaZWVlZ6enqGhob+/v+Tk5PT09P//
/wAAACH5BAAAAAAAIf8LSW1hZ2VNYWdpY2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAASAEEgg
qr1YzF3U+mAYKsUmGY2jrizbGCZwOI2C3HiupEc8M4TYhsBw9Ey/oFBCNPocwCWzeNwkpYBmdXKV
ap9RLxWsXH6R0LLwbE1j2Vy32IkOm8d1dQwu6d7pbXZreIF6Jnwycn9bfTQ2OZA7gBMoLZYrLzEd
IpwgCSUxGaIWGxEAOw==
"
image create photo ximgEditPaste
ximgEditPaste put "
image create photo ximgEditPaste
ximgEditPaste put "
R0lGODlhGAAYAPUAAAAAAAICAgoKCg8PDxERERQUFB8fHyIiIiQkJCwsLDExMTQ0NEREREpKSlNT
U1VVVVxcXF9fX2FhYXJycnd3d3x8fIGBgYeHh4uLi5WVlaKioqWlpaioqK+vr7Kysru7u729vcbG
xsrKys/Pz9HR0dnZ2d/f3+Li4uTk5O/v7/Hx8fT09Pr6+v///wAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -875,14 +867,14 @@ xFKwgrtoKOECebjfb4hFYExQGtBScs/nh7RUUCd9hEkkRhtEUCAtIwyPkJAmLRxGBAwHiy0gaQAk
lJ2MnGmflQAOHxaao2ilRh6BT6KdrgAYjau0oEYDUbOku2i/rbsVKR9GBSYsm7qmsCtGC3usXbUS
IxlGAh8qzcCmwt/E4V0fLSEH6uvreuVRk4V9Ip3x8nuHaQkdFhT+//8ucDDQqaDBg2iCAAA7
"
image create photo ximgToolInsertLine
ximgToolInsertLine put "
image create photo ximgToolInsertLine
ximgToolInsertLine put "
R0lGODlhGAAYAPIAAAAAAA0NDTc3Nz09PT4+Pt7e3vj4+Pv7+yH5BAAAAAAAIf8LSW1hZ2VNYWdp
Y2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAYABgAAAMtCLrc/jDKSau9OOvNew0CIY6kKASQUBxs67KF
kK5vHUNgqROn5//AoHBILEoSADs=
"
image create photo ximgToolInsertCircle
ximgToolInsertCircle put "
image create photo ximgToolInsertCircle
ximgToolInsertCircle put "
R0lGODlhGAAYAPUAAAAAAAEBAQUFBQkJCQ4ODhISEiEhISYmJi8vLz4+PkBAQEdHR0tLS0xMTFJS
UlZWVlhYWGtra2xsbHx8fH5+foKCgo+Pj5KSkpWVlZiYmJycnKysrLOzs7S0tMPDw8jIyNXV1dbW
1uLi4uTk5Ovr6+zs7PPz8/b29vj4+P7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -894,8 +886,8 @@ SSMcCdVECh0jFhba3N1CCR0iS9IN5qQe2BBXEu4Azc+8vsDdBRnFTrI+tOvmIBCGJwzKbHASjBUH
FB4WWKpAosSmYJ9CqTpgAYUiB42gPOJgx0KlIXRIoMAjoYECBQ0kABJEKMwYDybOeOjQgY0bGQ8U
OHUasACDFSxauGBYUGvVsSRLmjQVEgQAOw==
"
image create photo ximgEditPushSym
ximgEditPushSym put "
image create photo ximgEditPushSym
ximgEditPushSym put "
R0lGODlhGAAYAPUAAAAAAAQEBAgICA0NDRERERcXFx0dHSIiIicnJywsLDAwMDU1NT09PUNDQ0dH
R0hISFBQUFVVVWJiYmZmZnBwcHl5eY2NjZKSkpWVlZqamqGhoaSkpKqqqq2trbKysry8vMLCwsfH
x8vLy83NzdPT09fX19jY2N/f3+Dg4OTk5Ojo6O3t7fPz8/X19fr6+v///wAAAAAAAAAAAAAAAAAA
@ -905,8 +897,8 @@ KHTCvsQh08Iq6LDM2NPkC6io4OcEXegwYV0fBHtDBiJRKxmDTAIeKBKKCAeSkwsHCAV0HnhYKhgH
ViObZi1eQxITE4Yak6wIChJ+LktDZiFaAyFnAUMmJyZvHF8HLi8OTRsvFnS5IhkZGEPIF3QlZtEv
01+GzRkXvidvHV8IxLMAZiBaBKEkRBARECAvq6ySCQwUKS8ua00kolhWPKjCAeCLExYwMQkCADs=
"
image create photo ximgViewZoomOut
ximgViewZoomOut put "
image create photo ximgViewZoomOut
ximgViewZoomOut put "
R0lGODlhGAAYAPUAAAAAAAICAgQEBAoKChAQEB8fHyIiIiUlJSgoKC8vLz4+PkNDQ0RERGtra25u
bnt7e3x8fIODg4WFhYiIiJ+fn6CgoLOzs7a2tr29vcHBwcjIyOXl5evr6+7u7vf39/n5+f///wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

View File

@ -1,193 +1,190 @@
#!/bin/sh
# File: utile.tcl
#
#
# This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation.
# Copyright (C) 1998-2023 Stefan Frederik Schippers
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# the next line restarts using wish \
exec wish "$0" "$@"
proc text_window {w filename} {
catch {destroy $w}
toplevel $w
wm title $w "(IN)UTILE ALIAS FILE"
wm iconname $w "ALIAS"
frame $w.buttons
pack $w.buttons -side bottom -fill x -pady 2m
button $w.buttons.dismiss -text Dismiss -command "destroy $w"
button $w.buttons.code -text "See Code" -command "showCode $w"
pack $w.buttons.dismiss $w.buttons.code -side left -expand 1
text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 \
-height 30
scrollbar $w.scroll -command "$w.text yview"
pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both
set fileid [open $filename "r"]
$w.text insert 0.0 [read $fileid]
close $fileid
}
catch {destroy $w}
toplevel $w
wm title $w "(IN)UTILE ALIAS FILE"
wm iconname $w "ALIAS"
proc entry_line {txtlabel} {
global entry1
toplevel .ent2 -class Dialog
set X [expr [winfo pointerx .ent2] - 60]
set Y [expr [winfo pointery .ent2] - 35]
wm geometry .ent2 "+$X+$Y"
label .ent2.l1 -text $txtlabel
entry .ent2.e1 -width 40
.ent2.e1 delete 0 end
.ent2.e1 insert 0 $entry1
button .ent2.b1 -text "OK" -command \
{
set entry1 [.ent2.e1 get ]
destroy .ent2
}
bind .ent2 <Return> {
set entry1 [.ent2.e1 get ]
destroy .ent2
}
pack .ent2.l1 -side top -fill x
pack .ent2.e1 -side top -fill both -expand yes
pack .ent2.b1 -side top -fill x
grab set .ent2
focus .ent2.e1
tkwait window .ent2
return $entry1
frame $w.buttons
pack $w.buttons -side bottom -fill x -pady 2m
button $w.buttons.dismiss -text Dismiss -command "destroy $w"
button $w.buttons.code -text "See Code" -command "showCode $w"
pack $w.buttons.dismiss $w.buttons.code -side left -expand 1
text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 \
-height 30
scrollbar $w.scroll -command "$w.text yview"
pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both
set fileid [open $filename "r"]
$w.text insert 0.0 [read $fileid]
close $fileid
}
proc entry_line {txtlabel} {
global entry1
toplevel .ent2 -class Dialog
set X [expr [winfo pointerx .ent2] - 60]
set Y [expr [winfo pointery .ent2] - 35]
wm geometry .ent2 "+$X+$Y"
label .ent2.l1 -text $txtlabel
entry .ent2.e1 -width 40
.ent2.e1 delete 0 end
.ent2.e1 insert 0 $entry1
button .ent2.b1 -text "OK" -command \
{
set entry1 [.ent2.e1 get ]
destroy .ent2
}
bind .ent2 <Return> {
set entry1 [.ent2.e1 get ]
destroy .ent2
}
pack .ent2.l1 -side top -fill x
pack .ent2.e1 -side top -fill both -expand yes
pack .ent2.b1 -side top -fill x
grab set .ent2
focus .ent2.e1
tkwait window .ent2
return $entry1
}
proc write_data {w f} {
set fid [open $f "w"]
set t [$w get 0.0 {end - 1 chars}]
puts -nonewline $fid $t
close $fid
set fid [open $f "w"]
set t [$w get 0.0 {end - 1 chars}]
puts -nonewline $fid $t
close $fid
}
proc read_data {w f} {
set fid [open $f "r"]
set t [read $fid]
$w delete 0.0 end
$w insert 0.0 $t
close $fid
set fid [open $f "r"]
set t [read $fid]
$w delete 0.0 end
$w insert 0.0 $t
close $fid
}
proc template {w f} {
set fid [open $f "r"]
set t [read $fid]
$w insert 0.0 $t
close $fid
set fid [open $f "r"]
set t [read $fid]
$w insert 0.0 $t
close $fid
}
proc new_window {w filename} {
catch {destroy $w}
toplevel $w
wm title $w "(IN)UTILE NEW WINDOW"
wm iconname $w "STIM.WIND"
set fileid [open $filename "RDONLY CREAT"]
set testo [read $fileid]
close $fileid
frame $w.buttons
pack $w.buttons -side bottom -fill x -pady 2m
text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 \
-height 30
$w.text insert 0.0 $testo
scrollbar $w.scroll -command "$w.text yview"
button $w.buttons.translate -text Translate -command "write_data $w.text $filename; \
catch {destroy $w}
toplevel $w
wm title $w "(IN)UTILE NEW WINDOW"
wm iconname $w "STIM.WIND"
set fileid [open $filename "RDONLY CREAT"]
set testo [read $fileid]
close $fileid
frame $w.buttons
pack $w.buttons -side bottom -fill x -pady 2m
text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 \
-height 30
$w.text insert 0.0 $testo
scrollbar $w.scroll -command "$w.text yview"
button $w.buttons.translate -text Translate -command "write_data $w.text $filename; \
translate $filename ; get_time"
button $w.buttons.dismiss -text Dismiss -command "destroy $w"
pack $w.buttons.dismiss $w.buttons.translate -side left -expand 1
pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both
}
proc get_time {} {
set fileid [open "inutile.simulationtime" "RDONLY"]
.buttons.time delete 0 end
.buttons.time insert 0 [read -nonewline $fileid]
close $fileid
file delete "inutile.simulationtime"
}
proc alias_window {w filename} {
catch {destroy $w}
toplevel $w
wm title $w "(IN)UTILE ALIAS FILE: $filename"
wm iconname $w "ALIAS"
button $w.buttons.dismiss -text Dismiss -command "destroy $w"
pack $w.buttons.dismiss $w.buttons.translate -side left -expand 1
set fileid [open $filename "RDONLY CREAT"]
set testo [read $fileid]
close $fileid
frame $w.buttons
pack $w.buttons -side bottom -fill x -pady 2m
text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 \
-height 30
scrollbar $w.scroll -command "$w.text yview"
button $w.buttons.dismiss -text Dismiss -command "destroy $w"
button $w.buttons.save -text Save -command "write_data $w.text $filename"
button $w.buttons.load -text Reload -command "read_data $w.text $filename"
pack $w.buttons.dismiss $w.buttons.save $w.buttons.load -side left -expand 1
pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both
$w.text insert 0.0 $testo
}
pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both
}
proc get_time {} {
set fileid [open "inutile.simulationtime" "RDONLY"]
.buttons.time delete 0 end
.buttons.time insert 0 [read -nonewline $fileid]
close $fileid
file delete "inutile.simulationtime"
}
proc alias_window {w filename} {
catch {destroy $w}
toplevel $w
wm title $w "(IN)UTILE ALIAS FILE: $filename"
wm iconname $w "ALIAS"
set fileid [open $filename "RDONLY CREAT"]
set testo [read $fileid]
close $fileid
frame $w.buttons
pack $w.buttons -side bottom -fill x -pady 2m
text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 \
-height 30
scrollbar $w.scroll -command "$w.text yview"
button $w.buttons.dismiss -text Dismiss -command "destroy $w"
button $w.buttons.save -text Save -command "write_data $w.text $filename"
button $w.buttons.load -text Reload -command "read_data $w.text $filename"
pack $w.buttons.dismiss $w.buttons.save $w.buttons.load -side left -expand 1
pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both
$w.text insert 0.0 $testo
}
proc help_window {w filename} {
catch {destroy $w}
toplevel $w
wm title $w "(IN)UTILE ALIAS FILE"
wm iconname $w "ALIAS"
frame $w.buttons
pack $w.buttons -side bottom -fill x -pady 2m
button $w.buttons.dismiss -text Dismiss -command "destroy $w"
button $w.buttons.save -text Save -command "write_data $w.text $filename"
pack $w.buttons.dismiss $w.buttons.save -side left -expand 1
text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 \
-height 30 -width 90
scrollbar $w.scroll -command "$w.text yview"
pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both
set fileid [open $filename "RDONLY CREAT"]
$w.text insert 0.0 [read $fileid]
close $fileid
}
catch {destroy $w}
toplevel $w
wm title $w "(IN)UTILE ALIAS FILE"
wm iconname $w "ALIAS"
frame $w.buttons
pack $w.buttons -side bottom -fill x -pady 2m
button $w.buttons.dismiss -text Dismiss -command "destroy $w"
button $w.buttons.save -text Save -command "write_data $w.text $filename"
pack $w.buttons.dismiss $w.buttons.save -side left -expand 1
text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 \
-height 30 -width 90
scrollbar $w.scroll -command "$w.text yview"
pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both
set fileid [open $filename "RDONLY CREAT"]
$w.text insert 0.0 [read $fileid]
close $fileid
}
proc translate {f} {
global tcl_platform
set OS [lindex $tcl_platform(os) 0]
if {$OS == "Windows"} {
eval exec "utile.bat $f"
} else {
eval exec "utile $f"
}
global tcl_platform
set OS [lindex $tcl_platform(os) 0]
if {$OS == "Windows"} {
eval exec "utile.bat $f"
} else {
eval exec "utile $f"
}
}
@ -195,50 +192,50 @@ wm title . "(IN)UTILE (Stefan Schippers, sschippe)"
wm iconname . "(IN)UTILE"
set filename [lindex $argv 0]
if { ![string compare $filename ""] } then {
wm withdraw .
tk_messageBox -type ok -message "Please give a file name as argument"
exit
if {![string compare $filename ""]} then {
wm withdraw .
tk_messageBox -type ok -message "Please give a file name as argument"
exit
}
set entry1 {}
frame .buttons
pack .buttons -side bottom -fill x -pady 2m
button .buttons.translate -text Translate -command " \
button .buttons.translate -text Translate -command " \
write_data .text $filename; translate $filename ; get_time "
button .buttons.dismiss -text Dismiss -command "destroy ."
button .buttons.code -text "Help" -command {help_window .help $env(UTILE3_PATH)/utile.txt}
text .text -relief sunken -bd 2 -yscrollcommand ".scroll set" -setgrid 1 \
-height 30
-height 30
scrollbar .scroll -command ".text yview"
button .buttons.save -text Save -command {
set entry1 $filename;set filename [entry_line {Filename}]
write_data .text $filename
write_data .text $filename
}
button .buttons.load -text Reload -command {
set entry1 $filename;set filename [entry_line {Filename}]
read_data .text $filename
read_data .text $filename
}
button .buttons.send -text "Template" -command {
if { ![string compare [.text get 0.0 {end - 1 chars}] ""] } then {
template .text $env(UTILE3_PATH)/template.stimuli
template .text $env(UTILE3_PATH)/template.stimuli
}
}
label .buttons.timelab -text "time:"
entry .buttons.time -width 11
entry .buttons.time -width 11
button .buttons.new -text new_window -command "new_window .new_win new_window_stimuli"
pack .buttons.dismiss .buttons.code \
.buttons.load .buttons.save .buttons.translate \
.buttons.send .buttons.new .buttons.timelab .buttons.time -side left -expand 1
.buttons.load .buttons.save .buttons.translate \
.buttons.send .buttons.new .buttons.timelab .buttons.time -side left -expand 1
pack .scroll -side right -fill y
pack .text -expand yes -fill both
# 20140408
if { [file exists $filename] } {
set fileid [open $filename "RDONLY"]
.text insert 0.0 [read $fileid]
close $fileid
if {[file exists $filename]} {
set fileid [open $filename "RDONLY"]
.text insert 0.0 [read $fileid]
close $fileid
}
@ -247,11 +244,8 @@ regsub {\..*$} $tmp {} lines
for {set i 1} {$i <= $lines} {incr i} {
set tmp [.text get $i.0 "$i.0 lineend"]
if [regexp {^(include)|(\.include)} $tmp ] {
alias_window .tw$i [lindex $tmp 1]
set tmp [.text get $i.0 "$i.0 lineend"]
if [regexp {^(include)|(\.include)} $tmp] {
alias_window .tw$i [lindex $tmp 1]
}
}
}

View File

@ -1,21 +1,21 @@
#
# File: create_save.tcl
#
#
# This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation.
# Copyright (C) 1998-2022 Stefan Frederik Schippers
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -29,38 +29,38 @@ file delete -force $testname/results
file mkdir $testname/results
proc create_save {} {
global testname pathlist xschem_cmd num_fatals
set results_dir ${testname}/results
if {[file exists ${testname}/tests]} {
set ff [lsort [glob -directory ${testname}/tests -tails \{.*,*\}]]
foreach f $ff {
if {$f eq {..} || $f eq {.}} {continue}
if {[regexp {\.(tcl)$} $f ]} {
set fn_sch [regsub {tcl$} $f {sch}]
set a [catch "open \"$results_dir/$fn_sch\" w" fd]
if {!$a} {
puts $fd "v {xschem version=2.9.5 file_version=1.1}"
puts $fd "G {}"
puts $fd "V {}"
puts $fd "S {}"
puts $fd "E {}"
close $fd
set filename [regsub {\.tcl$} $f {}]
set output ${filename}_debug.txt
if {[catch {eval exec {$xschem_cmd ${results_dir}/$fn_sch --pipe -d 1 --script ${testname}/tests/${f} 2> ${results_dir}/$output}} msg]} {
puts "FATAL: $msg"
incr num_fatals
} else {
lappend pathlist $output
lappend pathlist "${filename}.sch"
cleanup_debug_file ${results_dir}/$output
cleanup_debug_file ${results_dir}/$fn_sch
}
global testname pathlist xschem_cmd num_fatals
set results_dir ${testname}/results
if {[file exists ${testname}/tests]} {
set ff [lsort [glob -directory ${testname}/tests -tails \{.*,*\}]]
foreach f $ff {
if {$f eq {..} || $f eq {.}} {continue}
if {[regexp {\.(tcl)$} $f]} {
set fn_sch [regsub {tcl$} $f {sch}]
set a [catch "open \"$results_dir/$fn_sch\" w" fd]
if {!$a} {
puts $fd "v {xschem version=2.9.5 file_version=1.1}"
puts $fd "G {}"
puts $fd "V {}"
puts $fd "S {}"
puts $fd "E {}"
close $fd
set filename [regsub {\.tcl$} $f {}]
set output ${filename}_debug.txt
if {[catch {eval exec {$xschem_cmd ${results_dir}/$fn_sch --pipe -d 1 --script ${testname}/tests/${f} 2> ${results_dir}/$output}} msg]} {
puts "FATAL: $msg"
incr num_fatals
} else {
lappend pathlist $output
lappend pathlist "${filename}.sch"
cleanup_debug_file ${results_dir}/$output
cleanup_debug_file ${results_dir}/$fn_sch
}
}
}
}
}
}
}
}
create_save
print_results $testname $pathlist $num_fatals
print_results $testname $pathlist $num_fatals

View File

@ -1,11 +1,11 @@
xschem line 910 -560 960 -540
xschem line 880 -680 1200 -680
xschem line 900 -540 950 -560
xschem line 900 -550 950 -530
xschem line 910 -530 960 -550
xschem rect 940 -510 960 -450
xschem rect 900 -490 970 -470
xschem rect 910 -510 930 -450
xschem line 910 -560 960 -540
xschem line 880 -680 1200 -680
xschem line 900 -540 950 -560
xschem line 900 -550 950 -530
xschem line 910 -530 960 -550
xschem rect 940 -510 960 -450
xschem rect 900 -490 970 -470
xschem rect 910 -510 930 -450
xschem wire 870 -300 990 -300 {lab=#net1}
xschem wire 910 -340 910 -250 {lab=#net2}
xschem wire 910 -270 970 -270 {lab=#net2}
@ -31,4 +31,4 @@ xschem instance ../xschem_library/devices/bus_connect.sym 500 -530 0 0 {name=l3
xschem instance ../xschem_library/devices/bus_connect_nolab.sym 400 -530 0 0 {name=r1}
xschem instance ../xschem_library/devices/lab_pin.sym 410 -600 3 1 {name=l4 sig_type=std_logic lab=BUS[2]}
xschem save
xschem exit closewindow
xschem exit closewindow

View File

@ -4,25 +4,25 @@ xschem delete
xschem set rectcolor 20
xschem rect 350 -550 940 -290
xschem wire 310 -330 380 -330 {lab=INPUT_B}
xschem wire 310 -370 380 -370 {lab=INPUT_A}
xschem wire 760 -420 830 -420 {lab=B}
xschem wire 760 -460 830 -460 {lab=A}
xschem wire 480 -350 520 -350 {lab=B}
xschem wire 930 -440 970 -440 {lab=OUTPUT_Y}
xschem wire 310 -440 380 -440 {lab=INPUT_F}
xschem wire 310 -480 380 -480 {lab=INPUT_E}
xschem wire 480 -460 520 -460 {lab=A}
xschem wire 550 -190 670 -190 {lab=VCCFILT}
xschem wire 590 -130 590 -110 {lab=ANALOG_GND}
xschem wire 790 -190 940 -190 {lab=VCC5}
xschem wire 890 -130 890 -110 {lab=ANALOG_GND}
xschem wire 730 -110 890 -110 {lab=ANALOG_GND}
xschem wire 730 -160 730 -110 {lab=ANALOG_GND}
xschem wire 590 -110 730 -110 {lab=ANALOG_GND}
xschem wire 520 -460 760 -460 {lab=A}
xschem wire 580 -420 760 -420 {lab=B}
xschem wire 580 -420 580 -350 {lab=B}
xschem wire 520 -350 580 -350 {lab=B}
xschem wire 310 -370 380 -370 {lab=INPUT_A}
xschem wire 760 -420 830 -420 {lab=B}
xschem wire 760 -460 830 -460 {lab=A}
xschem wire 480 -350 520 -350 {lab=B}
xschem wire 930 -440 970 -440 {lab=OUTPUT_Y}
xschem wire 310 -440 380 -440 {lab=INPUT_F}
xschem wire 310 -480 380 -480 {lab=INPUT_E}
xschem wire 480 -460 520 -460 {lab=A}
xschem wire 550 -190 670 -190 {lab=VCCFILT}
xschem wire 590 -130 590 -110 {lab=ANALOG_GND}
xschem wire 790 -190 940 -190 {lab=VCC5}
xschem wire 890 -130 890 -110 {lab=ANALOG_GND}
xschem wire 730 -110 890 -110 {lab=ANALOG_GND}
xschem wire 730 -160 730 -110 {lab=ANALOG_GND}
xschem wire 590 -110 730 -110 {lab=ANALOG_GND}
xschem wire 520 -460 760 -460 {lab=A}
xschem wire 580 -420 760 -420 {lab=B}
xschem wire 580 -420 580 -350 {lab=B}
xschem wire 520 -350 580 -350 {lab=B}
xschem instance ../xschem_library/pcb/74ls00.sym 420 -350 0 0 {name=U1:2 risedel=100 falldel=200}
xschem instance ../xschem_library/pcb/74ls00.sym 870 -440 0 0 {name=U1:1 risedel=100 falldel=200}
xschem instance ../xschem_library/devices/lab_pin.sym 970 -440 0 1 {name=p0 lab=OUTPUT_Y}
@ -76,4 +76,4 @@ xschem instance ../xschem_library/devices/lab_pin.sym 40 -350 0 1 {name=l5 lab=I
xschem instance ../xschem_library/devices/lab_pin.sym 40 -410 0 1 {name=l6 lab=INPUT_E verilog_type=reg}
xschem instance ../xschem_library/devices/lab_pin.sym 40 -390 0 1 {name=l7 lab=INPUT_F verilog_type=reg}
xschem save
xschem exit closewindow
xschem exit closewindow

View File

@ -37,20 +37,20 @@ vvss vss 0 dc 0
* .tran 5u 7m uic
** models are generally not free: you must download
** SPICE models for active devices and put them into the below
** SPICE models for active devices and put them into the below
** referenced file in netlist/simulation directory.
.include \\"models_pcb_voltage_protection.txt\\"
.dc VVCC 0 8 0.004
.save all
"}
xschem instance ../xschem_library/devices/pnp.sym 580 -390 0 0 {name=Q6
model=BC857
device=BC857
xschem instance ../xschem_library/devices/pnp.sym 580 -390 0 0 {name=Q6
model=BC857
device=BC857
footprint=SOT23
url="https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwijlfagu4zfAhUN0xoKHTPBAb0QFjAAegQIAhAC&url=http%3A%2F%2Fwww.onsemi.com%2Fpub%2FCollateral%2FPN2907-D.PDF&usg=AOvVaw2wgr87fGZgGfBRhXzHGwZM"}
xschem instance ../xschem_library/devices/zener.sym 330 -190 2 0 {name=x3
model=BZX5V1
device=BZX5V1
model=BZX5V1
device=BZX5V1
footprint=acy(300)
xxxspiceprefix="#D#"}
xschem instance ../xschem_library/devices/gnd.sym 330 -130 0 0 {name=l13 lab=VSS}
@ -61,9 +61,9 @@ xschem instance ../xschem_library/devices/res.sym 600 -190 0 0 {name=R5 m=1 valu
xschem instance ../xschem_library/devices/gnd.sym 600 -130 0 0 {name=l16 lab=VSS}
xschem instance ../xschem_library/devices/lab_wire.sym 360 -390 0 0 {name=l0 lab=B}
xschem instance ../xschem_library/devices/res.sym 330 -340 0 0 {name=R2 m=1 value=510 footprint=1206 device=resistor}
xschem instance ../xschem_library/devices/pmos.sym 750 -360 0 0 {name=M2
model=IRLML6402
device=IRLML6402
xschem instance ../xschem_library/devices/pmos.sym 750 -360 0 0 {name=M2
model=IRLML6402
device=IRLML6402
footprint=SOT23
spiceprefix=X
m=1
@ -72,14 +72,14 @@ xschem instance ../xschem_library/devices/led.sym 650 -290 0 0 {name=x1 model=D1
xschem instance ../xschem_library/devices/lab_pin.sym 170 -340 0 1 {name=p6 lab=VOUT}
xschem instance ../xschem_library/devices/lab_pin.sym 170 -360 0 1 {name=p7 lab=VSS}
xschem instance ../xschem_library/devices/lab_pin.sym 170 -380 0 1 {name=p8 lab=VCC}
xschem instance ../xschem_library/devices/zener.sym 250 -190 2 0 {name=x4
model=BZX5V1
xschem instance ../xschem_library/devices/zener.sym 250 -190 2 0 {name=x4
model=BZX5V1
device=BZX5V1
area=1
footprint=minimelf
area=1
footprint=minimelf
spice_ignore=true}
xschem instance ../xschem_library/devices/gnd.sym 250 -130 0 0 {name=l1 lab=VSS}
xschem instance ../xschem_library/devices/res.sym 550 -290 0 0 {name=R1 m=1 value=47K footprint=1206 device=resistor}
xschem instance ../xschem_library/devices/lab_wire.sym 330 -260 0 0 {name=l3 lab=Z}
xschem save
xschem exit closewindow
xschem exit closewindow

View File

@ -1,33 +1,33 @@
xschem set rectcolor 3
xschem line 850 -270 850 -60
xschem line 1050 -270 1050 -60
xschem line 1250 -270 1250 -60
xschem line 850 -270 850 -60
xschem line 1050 -270 1050 -60
xschem line 1250 -270 1250 -60
xschem set rectcolor 8
xschem line 820 -220 850 -220
xschem line 850 -220 850 -180
xschem line 850 -180 950 -180
xschem line 950 -220 950 -180
xschem line 950 -220 1050 -220
xschem line 1050 -220 1050 -180
xschem line 1050 -180 1150 -180
xschem line 1150 -220 1150 -180
xschem line 1150 -220 1250 -220
xschem line 1250 -220 1250 -180
xschem line 1250 -180 1300 -180
xschem line 950 -160 950 -120
xschem line 950 -160 980 -160
xschem line 980 -160 980 -120
xschem line 980 -120 1150 -120
xschem line 1150 -160 1150 -120
xschem line 1150 -160 1180 -160
xschem line 1180 -160 1180 -120
xschem line 1180 -120 1300 -120
xschem line 820 -120 950 -120
xschem line 820 -220 850 -220
xschem line 850 -220 850 -180
xschem line 850 -180 950 -180
xschem line 950 -220 950 -180
xschem line 950 -220 1050 -220
xschem line 1050 -220 1050 -180
xschem line 1050 -180 1150 -180
xschem line 1150 -220 1150 -180
xschem line 1150 -220 1250 -220
xschem line 1250 -220 1250 -180
xschem line 1250 -180 1300 -180
xschem line 950 -160 950 -120
xschem line 950 -160 980 -160
xschem line 980 -160 980 -120
xschem line 980 -120 1150 -120
xschem line 1150 -160 1150 -120
xschem line 1150 -160 1180 -160
xschem line 1180 -160 1180 -120
xschem line 1180 -120 1300 -120
xschem line 820 -120 950 -120
xschem set rectcolor 7
xschem rect 950 -250 980 -80
xschem rect 1150 -250 1180 -80
xschem rect 950 -250 980 -80
xschem rect 1150 -250 1180 -80
xschem set rectcolor 21
xschem rect 10 -970 240 -750
xschem rect 10 -970 240 -750
xschem wire 150 -580 150 -560 {lab=vss}
xschem wire 150 -420 150 -400 {lab=vss}
xschem wire 10 -270 10 -250 {lab=vss}
@ -53,7 +53,7 @@ vvss vss 0 0
*.dc vvcc 0 2 0.1
.tran 0.2n 480n uic
** download models from here:
** download models from here:
** http://www.amarketplaceofideas.com/wp-content/uploads/2014/11/180nm-V1.7z
** and save to 'models_rom8k.txt' in simulation directory
.include models_rom8k.txt
@ -215,4 +215,4 @@ xschem instance ../xschem_library/devices/spice_probe.sym 1670 -740 0 0 {name=p4
xschem instance ../xschem_library/devices/lab_pin.sym 1670 -790 0 0 {name=l4 lab=LDBL[0,16,32,1,17,33,2,18,34]}
xschem instance ../xschem_library/devices/spice_probe.sym 1670 -790 0 0 {name=p91 analysis=tran}
xschem save
xschem exit closewindow
xschem exit closewindow

View File

@ -1,17 +1,17 @@
xschem instance ../xschem_library/devices/nmos.sym 30 20 0 0 {name=MN1}
xschem instance ../xschem_library/devices/pmos.sym 30 -70 0 0 {name=MP1}
xschem instance ../xschem_library/devices/vdd.sym 50 -130 0 0 {name=VDD}
xschem instance ../xschem_library/devices/gnd.sym 50 80 0 0 {name=GND}
xschem instance ../xschem_library/devices/ipin.sym -40 -70 0 0 {lab=in}
xschem instance ../xschem_library/devices/opin.sym 110 -20 0 0 {lab=out}
xschem wire 50 -40 50 -10
xschem wire 50 -20 110 -20
xschem wire 50 -130 50 -100
xschem wire 50 50 50 80
xschem wire -50 -70 10 -70
xschem wire -10 20 10 20
xschem wire -10 -70 -10 20
xschem select_all
xschem hilight
xschem save
xschem exit closewindow
xschem instance ../xschem_library/devices/nmos.sym 30 20 0 0 {name=MN1}
xschem instance ../xschem_library/devices/pmos.sym 30 -70 0 0 {name=MP1}
xschem instance ../xschem_library/devices/vdd.sym 50 -130 0 0 {name=VDD}
xschem instance ../xschem_library/devices/gnd.sym 50 80 0 0 {name=GND}
xschem instance ../xschem_library/devices/ipin.sym -40 -70 0 0 {lab=in}
xschem instance ../xschem_library/devices/opin.sym 110 -20 0 0 {lab=out}
xschem wire 50 -40 50 -10
xschem wire 50 -20 110 -20
xschem wire 50 -130 50 -100
xschem wire 50 50 50 80
xschem wire -50 -70 10 -70
xschem wire -10 20 10 20
xschem wire -10 -70 -10 20
xschem select_all
xschem hilight
xschem save
xschem exit closewindow

View File

@ -1,21 +1,21 @@
#
# File: netlisting.tcl
#
#
# This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation.
# Copyright (C) 1998-2022 Stefan Frederik Schippers
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -26,7 +26,7 @@ set pathlist {}
set num_fatals 0
if {![file exists $testname]} {
file mkdir $testname
file mkdir $testname
}
file delete -force $testname/results
@ -35,83 +35,83 @@ file mkdir $testname/results
set xschem_library_path "../xschem_library"
proc netlisting {dir fn} {
global xschem_library_path testname pathlist xschem_cmd
if { [regexp {\.sch$} $fn ] } {
puts "Testing ($testname) $dir/$fn"
set output_dir $dir
regsub -all $xschem_library_path $output_dir {} output_dir
regsub {^/} $output_dir {} output_dir
# Spice Netlist
run_xschem_netlist vhdl $output_dir $dir $fn
run_xschem_netlist v $output_dir $dir $fn
run_xschem_netlist tdx $output_dir $dir $fn
run_xschem_netlist spice $output_dir $dir $fn
}
global xschem_library_path testname pathlist xschem_cmd
if {[regexp {\.sch$} $fn]} {
puts "Testing ($testname) $dir/$fn"
set output_dir $dir
regsub -all $xschem_library_path $output_dir {} output_dir
regsub {^/} $output_dir {} output_dir
# Spice Netlist
run_xschem_netlist vhdl $output_dir $dir $fn
run_xschem_netlist v $output_dir $dir $fn
run_xschem_netlist tdx $output_dir $dir $fn
run_xschem_netlist spice $output_dir $dir $fn
}
}
proc netlisting_dir {dir} {
set ff [lsort [glob -directory $dir -tails \{.*,*\}]]
foreach f $ff {
if {$f eq {..} || $f eq {.}} {
continue
set ff [lsort [glob -directory $dir -tails \{.*,*\}]]
foreach f $ff {
if {$f eq {..} || $f eq {.}} {
continue
}
set fpath "$dir/$f"
if {[file isdirectory $fpath]} {
netlisting_dir $fpath
} else {
netlisting $dir $f
}
}
set fpath "$dir/$f"
if {[file isdirectory $fpath]} {
netlisting_dir $fpath
} else {
netlisting $dir $f
}
}
}
proc run_xschem_netlist {type output_dir dir fn} {
global testname pathlist xschem_cmd num_fatals
set cwd [pwd]
set fn_debug [join [list $output_dir , [regsub {\.} $fn {_}] "_${type}_debug.txt"] ""]
regsub {./} $fn_debug {_} fn_debug
set sch_name [regsub {\.sch} $fn {}]
set fn_netlist [join [list $sch_name "." $type] ""]
set output [join [list $cwd / $testname / results / $fn_debug] ""]
set netlist_output_dir [join [list $cwd / $testname / results ] ""]
puts "Output: $fn_debug"
set opt s
if {$type eq "vhdl"} {set opt V}
if {$type eq "v"} {set opt w}
if {$type eq "tdx"} {set opt t}
set netlist_failed 0 ;# not used here but might be used in the future.
set general_failure 0
cd $dir
set catch_status [catch {eval exec {$xschem_cmd $fn -q -x -r -$opt -o $netlist_output_dir -n 2> $output}} msg opt]
cd $cwd
if {$catch_status} {
set error_code [dict get $opt -errorcode]
# in case of child process error $error_code will be {CHILDSTATUS 11731 10}, second item is processID,
# 3rd item is child process exit code. In case of netlisting error xschem exit code is 10
if {[regexp {^CHILDSTATUS.* 10$} $error_code]} {
set netlist_failed 1
} elseif {$error_code ne {NONE}} {
set general_failure 1
global testname pathlist xschem_cmd num_fatals
set cwd [pwd]
set fn_debug [join [list $output_dir , [regsub {\.} $fn {_}] "_${type}_debug.txt"] ""]
regsub {./} $fn_debug {_} fn_debug
set sch_name [regsub {\.sch} $fn {}]
set fn_netlist [join [list $sch_name "." $type] ""]
set output [join [list $cwd / $testname / results / $fn_debug] ""]
set netlist_output_dir [join [list $cwd / $testname / results] ""]
puts "Output: $fn_debug"
set opt s
if {$type eq "vhdl"} {set opt V}
if {$type eq "v"} {set opt w}
if {$type eq "tdx"} {set opt t}
set netlist_failed 0 ;# not used here but might be used in the future.
set general_failure 0
cd $dir
set catch_status [catch {eval exec {$xschem_cmd $fn -q -x -r -$opt -o $netlist_output_dir -n 2> $output}} msg opt]
cd $cwd
if {$catch_status} {
set error_code [dict get $opt -errorcode]
# in case of child process error $error_code will be {CHILDSTATUS 11731 10}, second item is processID,
# 3rd item is child process exit code. In case of netlisting error xschem exit code is 10
if {[regexp {^CHILDSTATUS.* 10$} $error_code]} {
set netlist_failed 1
} elseif {$error_code ne {NONE}} {
set general_failure 1
}
}
if {$general_failure} {
puts "FATAL: $xschem_cmd $fn -q -x -r -$opt -o $netlist_output_dir -n 2> $output : $msg"
incr num_fatals
} else {
lappend pathlist $fn_debug
lappend pathlist $fn_netlist
cleanup_debug_file $output
}
}
if {$general_failure} {
puts "FATAL: $xschem_cmd $fn -q -x -r -$opt -o $netlist_output_dir -n 2> $output : $msg"
incr num_fatals
} else {
lappend pathlist $fn_debug
lappend pathlist $fn_netlist
cleanup_debug_file $output
}
}
netlisting_dir $xschem_library_path
# Intermediate netlisting name (.*) will keep changing, so delete them for easier diff
set ff [glob -directory "$testname/results" \{.*\}]
foreach f $ff {
if {$f eq "$testname/results/.." || $f eq "$testname/results/."} {
continue
}
file delete $f
if {$f eq "$testname/results/.." || $f eq "$testname/results/."} {
continue
}
file delete $f
}
print_results $testname $pathlist $num_fatals

View File

@ -1,21 +1,21 @@
#
# File: open_close.tcl
#
#
# This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation.
# Copyright (C) 1998-2022 Stefan Frederik Schippers
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -26,7 +26,7 @@ set pathlist {}
set num_fatals 0
if {![file exists $testname]} {
file mkdir $testname
file mkdir $testname
}
file delete -force $testname/results
@ -35,45 +35,45 @@ file mkdir $testname/results
set xschem_library_path "../xschem_library"
proc open_close {dir fn} {
global xschem_library_path testname pathlist xschem_cmd
set fpath "$dir/$fn"
if { [regexp {\.(sym|sch)$} $fn ] } {
puts "Testing (open_close) $fpath"
set output_dir $dir
regsub -all $xschem_library_path $output_dir {} output_dir
regsub {^/} $output_dir {} output_dir
regsub {/} $output_dir {,} output_dir
set fn_debug [join [list $output_dir , [regsub {\.} $fn {_}] "_debug.txt"] ""]
set output [join [list $testname / results / $fn_debug] ""]
puts "Output: $fn_debug"
set cwd [pwd]
cd $dir
set catch_status [catch {eval exec {$xschem_cmd $fn -q -x -r -d 1 2> $cwd/$output}} msg]
cd $cwd
if {$catch_status} {
puts "FATAL: $xschem_cmd $fn -q -x -r -d 1 2> $cwd/$output : $msg"
incr num_fatals
} else {
lappend pathlist $fn_debug
cleanup_debug_file $output
global xschem_library_path testname pathlist xschem_cmd
set fpath "$dir/$fn"
if {[regexp {\.(sym|sch)$} $fn]} {
puts "Testing (open_close) $fpath"
set output_dir $dir
regsub -all $xschem_library_path $output_dir {} output_dir
regsub {^/} $output_dir {} output_dir
regsub {/} $output_dir {,} output_dir
set fn_debug [join [list $output_dir , [regsub {\.} $fn {_}] "_debug.txt"] ""]
set output [join [list $testname / results / $fn_debug] ""]
puts "Output: $fn_debug"
set cwd [pwd]
cd $dir
set catch_status [catch {eval exec {$xschem_cmd $fn -q -x -r -d 1 2> $cwd/$output}} msg]
cd $cwd
if {$catch_status} {
puts "FATAL: $xschem_cmd $fn -q -x -r -d 1 2> $cwd/$output : $msg"
incr num_fatals
} else {
lappend pathlist $fn_debug
cleanup_debug_file $output
}
}
}
}
proc open_close_dir {dir} {
set ff [lsort [glob -directory $dir -tails \{.*,*\}]]
foreach f $ff {
if {$f eq {..} || $f eq {.}} {
continue
set ff [lsort [glob -directory $dir -tails \{.*,*\}]]
foreach f $ff {
if {$f eq {..} || $f eq {.}} {
continue
}
set fpath "$dir/$f"
if {[file isdirectory $fpath]} {
open_close_dir $fpath
} else {
open_close $dir $f
}
}
set fpath "$dir/$f"
if {[file isdirectory $fpath]} {
open_close_dir $fpath
} else {
open_close $dir $f
}
}
}
open_close_dir $xschem_library_path
print_results $testname $pathlist $num_fatals
print_results $testname $pathlist $num_fatals

View File

@ -1,21 +1,21 @@
#
# File: run_regression.tcl
#
#
# This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation.
# Copyright (C) 1998-2023 Stefan Frederik Schippers
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -24,16 +24,16 @@ set tcases [list "create_save" "open_close" "netlisting"]
set log_fn "results.log"
proc summarize_all {fn fd} {
puts $fd "$fn"
set b [catch "open \"$fn\" r" fdread]
set num_fail 0
if (!$b) {
puts $fd "$fn"
set b [catch "open \"$fn\" r" fdread]
set num_fail 0
if (!$b) {
while {[gets $fdread line] >=0} {
if { [regexp {[FAIL]$} $line] || [regexp {[GOLD\?]$} $line] || [regexp {^[FATAL]} $line]} {
puts $fd $line
if { [regexp {[FAIL]$} $line] || [regexp {[GOLD\?]$} $line] || [regexp {^[FATAL]} $line]} {
puts $fd $line
incr num_fail
}
}
}
}
puts $fd "Total num fail: $num_fail"
close $fdread
} else {
@ -43,17 +43,17 @@ proc summarize_all {fn fd} {
set a [catch "open \"$log_fn\" w" fd]
if {!$a} {
foreach tc $tcases {
puts "Start source ${tc}.tcl"
if {[catch {eval exec {tclsh ${tc}.tcl} > ${tc}_output.txt} msg]} {
puts "Something seems to have gone wrong with $tc, but we will ignore it: $msg"
foreach tc $tcases {
puts "Start source ${tc}.tcl"
if {[catch {eval exec {tclsh ${tc}.tcl} > ${tc}_output.txt} msg]} {
puts "Something seems to have gone wrong with $tc, but we will ignore it: $msg"
}
summarize_all ${tc}.log $fd
puts "Finish source ${tc}.tcl"
}
summarize_all ${tc}.log $fd
puts "Finish source ${tc}.tcl"
}
close $fd
close $fd
} else {
puts "Couldn't open $log_fn to write. Investigate please."
puts "Couldn't open $log_fn to write. Investigate please."
}
source test_utility.tcl

View File

@ -1,21 +1,21 @@
#
# File: xschem_test_utility.tcl
#
#
# This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation.
# Copyright (C) 1998-2022 Stefan Frederik Schippers
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -25,59 +25,58 @@ set xschem_cmd "xschem"
# From Glenn Jackman (Stack Overflow answer)
proc comp_file {file1 file2} {
# optimization: check file size first
set equal 0
if {[file size $file1] == [file size $file2]} {
set fh1 [open $file1 r]
set fh2 [open $file2 r]
set equal [string equal [read $fh1] [read $fh2]]
close $fh1
close $fh2
}
return $equal
# optimization: check file size first
set equal 0
if {[file size $file1] == [file size $file2]} {
set fh1 [open $file1 r]
set fh2 [open $file2 r]
set equal [string equal [read $fh1] [read $fh2]]
close $fh1
close $fh2
}
return $equal
}
proc print_results {testname pathlist num_fatals} {
if {[file exists ${testname}/gold]} {
set a [catch "open \"$testname.log\" w" fd]
if {$a} {
puts "Couldn't open $f"
} else {
set i 0
set num_fail 0
set num_gold 0
foreach f $pathlist {
incr i
if {![file exists $testname/gold/$f]} {
puts $fd "$i. $f: GOLD?"
incr num_gold
continue
}
if {![file exists $testname/results/$f]} {
puts $fd "$i. $f: RESULT?"
continue
}
if ([comp_file $testname/gold/$f $testname/results/$f]) {
if {[file exists ${testname}/gold]} {
set a [catch "open \"$testname.log\" w" fd]
if {$a} {
puts "Couldn't open $f"
} else {
set i 0
set num_fail 0
set num_gold 0
foreach f $pathlist {
incr i
if {![file exists $testname/gold/$f]} {
puts $fd "$i. $f: GOLD?"
incr num_gold
continue
}
if {![file exists $testname/results/$f]} {
puts $fd "$i. $f: RESULT?"
continue
}
if ([comp_file $testname/gold/$f $testname/results/$f]) {
puts $fd "$i. $f: PASS"
} else {
puts $fd "$i. $f: FAIL"
puts $fd "$i. $f: FAIL"
incr num_fail
}
}
puts $fd "Summary:"
puts $fd "Num failed: $num_fail Num missing gold: $num_gold Num passed: [expr $i-$num_fail-$num_gold]"
if {$num_fatals} {
puts $fd "FATAL: $num_fatals. Please search for FATAL in its output file for more detail"
}
close $fd
}
puts $fd "Summary:"
puts $fd "Num failed: $num_fail Num missing gold: $num_gold Num passed: [expr $i-$num_fail-$num_gold]"
if {$num_fatals} {
puts $fd "FATAL: $num_fatals. Please search for FATAL in its output file for more detail"
}
close $fd
}
} else {
puts "No gold folder. Set results as gold please."
}
} else {
puts "No gold folder. Set results as gold please."
}
}
# Edit lines that change each time regression is ran
proc cleanup_debug_file {output} {
eval exec {awk -f cleanup_debug_file.awk $output}
eval exec {awk -f cleanup_debug_file.awk $output}
}

View File

@ -13,128 +13,128 @@
## optionally with logging to catch memory leaks:
# xschem -d 3 -l log --script /path/to/xschemtest.tcl
## and then running: xschemtest
## running this test with different xschem versions with profiling enabled (-pg)
## running this test with different xschem versions with profiling enabled (-pg)
## allows to see differences in number of function calls / time spent.
## move schematic and redraw in a loop.
proc draw_test {{filelist {-}} {hide_graphs 0}} {
global show_pin_net_names hide_empty_graphs
set hide_empty_graphs $hide_graphs
set show_pin_net_names 1
foreach f $filelist {
if { $f ne {-}} {
xschem load [abs_sym_path $f]
global show_pin_net_names hide_empty_graphs
set hide_empty_graphs $hide_graphs
set show_pin_net_names 1
foreach f $filelist {
if {$f ne {-}} {
xschem load [abs_sym_path $f]
}
xschem search regex 1 lab . ;# select all nets
xschem hilight ;# hilight all selected nets and labels
xschem unselect_all
set increment 5.0
set n 30.0
set a [time {
for {set i 0} {$i < $n} {incr i} {
set x [xschem get xorigin]
set y [xschem get yorigin]
set x [expr {$x + $increment}]
set y [expr {$y + $increment}]
xschem origin $x $y
xschem redraw
}
}]
set a [lindex $a 0]
set fps [expr {$n / $a * 1e6}] ;# calculate drawing frames per second
puts "$f: draw speed: $fps fps"
}
xschem search regex 1 lab . ;# select all nets
xschem hilight ;# hilight all selected nets and labels
xschem unselect_all
set increment 5.0
set n 30.0
set a [time {
for { set i 0 } { $i < $n } { incr i} {
set x [xschem get xorigin]
set y [xschem get yorigin]
set x [expr {$x +$increment}]
set y [expr {$y +$increment}]
xschem origin $x $y
xschem redraw
}
}]
set a [lindex $a 0]
set fps [expr {$n / $a * 1e6} ] ;# calculate drawing frames per second
puts "$f: draw speed: $fps fps"
}
set show_pin_net_names 0
set show_pin_net_names 0
}
proc test_windows { {tabs 0} {destroy 1} } {
global tabbed_interface
proc test_windows {{tabs 0} {destroy 1}} {
global tabbed_interface
xschem clear force
set tabbed_interface $tabs
setup_tabbed_interface
xschem load [abs_sym_path testbench.sch]
xschem load_new_window [abs_sym_path poweramp.sch]
xschem load_new_window [abs_sym_path mos_power_ampli.sch]
xschem load_new_window [abs_sym_path rom8k.sch]
xschem load_new_window [abs_sym_path autozero_comp.sch]
xschem load_new_window [abs_sym_path LCC_instances.sch]
xschem load_new_window [abs_sym_path simulate_ff.sch]
xschem load_new_window [abs_sym_path led_driver.sch]
xschem load_new_window [abs_sym_path solar_panel.sch]
update
if {[xschem new_schematic ntabs] == 8} {set res OK} else {set res FAIL}
if {$tabs} {
puts "test tabbed windows: $res"
} else {
puts "test multiple windows: $res"
}
if {$destroy} {
after 2000
xschem new_schematic destroy_all
xschem clear force
}
set tabbed_interface $tabs
setup_tabbed_interface
xschem load [abs_sym_path testbench.sch]
xschem load_new_window [abs_sym_path poweramp.sch]
xschem load_new_window [abs_sym_path mos_power_ampli.sch]
xschem load_new_window [abs_sym_path rom8k.sch]
xschem load_new_window [abs_sym_path autozero_comp.sch]
xschem load_new_window [abs_sym_path LCC_instances.sch]
xschem load_new_window [abs_sym_path simulate_ff.sch]
xschem load_new_window [abs_sym_path led_driver.sch]
xschem load_new_window [abs_sym_path solar_panel.sch]
update
if {[xschem new_schematic ntabs] == 8} {set res OK} else {set res FAIL}
if {$tabs} {
puts "test tabbed windows: $res"
} else {
puts "test multiple windows: $res"
}
if {$destroy} {
after 2000
xschem new_schematic destroy_all
xschem clear force
}
}
## select all loaded schematic and paste 32 times in different places,
## check if number of elements after paste matches.
proc copy_paste_test {{f mos_power_ampli.sch}} {
xschem load [abs_sym_path $f]
xschem zoom_box -18000 -18000 18000 18000
xschem select_all
set n [xschem get lastsel]
xschem copy
for { set i 3000 } {$i < 12001} { set i [expr {$i + 3000}]} {
xschem paste 0 $i
xschem paste 0 -$i
xschem paste $i 0
xschem paste -$i 0
xschem paste $i $i
xschem paste $i -$i
xschem paste -$i $i
xschem paste -$i -$i
}
update
xschem select_all
set m [xschem get lastsel]
if { $m == $n * 33 } {
puts "Copy / paste 32 additional circuits: $m elements == $n * 33. OK"
} else {
puts "Copy / paste 32 additional circuits: $m elements != $n * 33. FAIL"
}
xschem unselect_all
xschem clear force
xschem load [abs_sym_path $f]
xschem zoom_box -18000 -18000 18000 18000
xschem select_all
set n [xschem get lastsel]
xschem copy
for {set i 3000} {$i < 12001} {set i [expr {$i + 3000}]} {
xschem paste 0 $i
xschem paste 0 -$i
xschem paste $i 0
xschem paste -$i 0
xschem paste $i $i
xschem paste $i -$i
xschem paste -$i $i
xschem paste -$i -$i
}
update
xschem select_all
set m [xschem get lastsel]
if {$m == $n * 33} {
puts "Copy / paste 32 additional circuits: $m elements == $n * 33. OK"
} else {
puts "Copy / paste 32 additional circuits: $m elements != $n * 33. FAIL"
}
xschem unselect_all
xschem clear force
}
## draw a grid of long vertical wires and small horizontal wire segments
## after a trim wire operation vertical wires are cut at intersection points.
proc draw_trim_wiregrid {} {
xschem unhilight_all
xschem clear force
xschem set no_undo 1
for {set i 0} {$i < 129} {incr i} {
set x [expr {$i * 40.0}]
set y [expr {128.0*40}]
xschem wire $x 0 $x $y
}
for {set i 0} {$i < 129} {incr i} {
for {set j 0} {$j < 128} {incr j} {
set x1 [expr {$j * 40}]
set x2 [expr {$j * 40 + 40}]
set y [expr {$i * 40}]
xschem wire $x1 $y $x2 $y
xschem unhilight_all
xschem clear force
xschem set no_undo 1
for {set i 0} {$i < 129} {incr i} {
set x [expr {$i * 40.0}]
set y [expr {128.0 * 40}]
xschem wire $x 0 $x $y
}
}
xschem set no_undo 0
xschem zoom_full
update ;# so updated window will be visible.
xschem trim_wires ;# will also draw result
update
xschem select_all
set n [xschem get lastsel]
xschem unselect_all
## if all wires trimmed correctly we should have 129*128*2 = 33024 segments.
if {$n == 33024} { puts "Trim wire test: $n segments, OK"} else { puts "Trim wire test FAIL"}
xschem clear force
for {set i 0} {$i < 129} {incr i} {
for {set j 0} {$j < 128} {incr j} {
set x1 [expr {$j * 40}]
set x2 [expr {$j * 40 + 40}]
set y [expr {$i * 40}]
xschem wire $x1 $y $x2 $y
}
}
xschem set no_undo 0
xschem zoom_full
update ;# so updated window will be visible.
xschem trim_wires ;# will also draw result
update
xschem select_all
set n [xschem get lastsel]
xschem unselect_all
## if all wires trimmed correctly we should have 129*128*2 = 33024 segments.
if {$n == 33024} {puts "Trim wire test: $n segments, OK"} else {puts "Trim wire test FAIL"}
xschem clear force
}
@ -142,54 +142,54 @@ proc draw_trim_wiregrid {} {
## so we simply check if existing and size > 0.
## view parameter allows to view print file (works on linux)
proc print_test {{view 0}} {
global OS
foreach {f t} {
global OS
foreach {f t} {
autozero_comp.sch png
mos_power_ampli.sch svg
simulate_ff.sch pdf
} {
set filepath [abs_sym_path $f]
set printfile [file rootname $f].$t
xschem load $filepath
puts "Printing: $printfile in $t format"
xschem print $t $printfile
if {$view && $OS ne {Windows}} {
execute 0 xdg-open $printfile
alert_ "Opening print file. Check if $printfile print file looks fine"
set filepath [abs_sym_path $f]
set printfile [file rootname $f].$t
xschem load $filepath
puts "Printing: $printfile in $t format"
xschem print $t $printfile
if {$view && $OS ne {Windows}} {
execute 0 xdg-open $printfile
alert_ "Opening print file. Check if $printfile print file looks fine"
}
if {[file exists $printfile] && [file size $printfile] > 0} {
puts "Print file $printfile exists. [file size $printfile] bytes. OK"
} else {
puts "Print file $printfile not existing or empty. FAIL"
}
file delete $printfile
}
if {[file exists $printfile] && [file size $printfile] > 0} {
puts "Print file $printfile exists. [file size $printfile] bytes. OK"
} else {
puts "Print file $printfile not existing or empty. FAIL"
}
file delete $printfile
}
xschem clear force
xschem clear force
}
## test xschem's own simulation engine
## there is no built in testing, just see if it works.
proc test_xschem_simulation {{f simulate_ff.sch}} {
global tclstop OS
xschem load [abs_sym_path $f]
## search element with tclcommand attribute
if {$OS ne {Windows}} {
xschem search regex 1 tclcommand {}
} else {
xschem search exact 1 name h3
}
## join transform a list element {foo} into a plain string foo
set instname [join [xschem selected_set]]
## run tcl testbench
eval [xschem getprop instance $instname tclcommand]
puts "Xschem simulation test done. OK"
global tclstop OS
xschem load [abs_sym_path $f]
## search element with tclcommand attribute
if {$OS ne {Windows}} {
xschem search regex 1 tclcommand {}
} else {
xschem search exact 1 name h3
}
## join transform a list element {foo} into a plain string foo
set instname [join [xschem selected_set]]
## run tcl testbench
eval [xschem getprop instance $instname tclcommand]
puts "Xschem simulation test done. OK"
}
## netlist some files in various formats and check netlist with known gold hashes
## hashes should be calculated in same way on windows and linux.
proc netlist_test {} {
global netlist_dir
foreach {f t h} {
global netlist_dir
foreach {f t h} {
rom8k.sch spice 1420163769
greycnt.sch verilog 1945914565
autozero_comp.sch spice 1472671699
@ -206,41 +206,41 @@ proc netlist_test {} {
test_symbolgen.sch spice 4216484684
test_mosgen.sch spice 2380524013
} {
xschem set netlist_type $t
xschem load [abs_sym_path $f]
if {$t eq {verilog}} { set t v}
if {$t eq {tedax}} { set t tdx}
set netlist_file $netlist_dir/[file rootname $f].$t
file delete $netlist_file
xschem netlist
## check netlist hashes, compare with gold hashes
set netlist_hash [xschem hash_file $netlist_file 1]
if { $netlist_hash == $h } {
puts "$f netlist check OK"
} else {
puts "$f netlist check, expected hash: ${h}, calculated hash: ${netlist_hash}, FAIL"
xschem set netlist_type $t
xschem load [abs_sym_path $f]
if {$t eq {verilog}} {set t v}
if {$t eq {tedax}} {set t tdx}
set netlist_file $netlist_dir/[file rootname $f].$t
file delete $netlist_file
xschem netlist
## check netlist hashes, compare with gold hashes
set netlist_hash [xschem hash_file $netlist_file 1]
if {$netlist_hash == $h} {
puts "$f netlist check OK"
} else {
puts "$f netlist check, expected hash: ${h}, calculated hash: ${netlist_hash}, FAIL"
}
}
}
}
proc xschemtest {{view 0}} {
set t [time {
## make sure ERC window will not pop up above schematic while doing tests
wm deiconify .infotext
lower .infotext
set t [time {
## make sure ERC window will not pop up above schematic while doing tests
wm deiconify .infotext
lower .infotext
netlist_test
print_test $view
draw_test [list 0_examples_top.sch rom8k.sch greycnt.sch autozero_comp.sch \
loading.sch mos_power_ampli.sch LCC_instances.sch simulate_ff.sch]
netlist_test
print_test $view
draw_test [list 0_examples_top.sch rom8k.sch greycnt.sch autozero_comp.sch \
loading.sch mos_power_ampli.sch LCC_instances.sch simulate_ff.sch]
copy_paste_test mos_power_ampli.sch
draw_trim_wiregrid
test_xschem_simulation simulate_ff.sch
test_windows 0 ;# windows
test_windows 1 ;# tabs
}]
puts "Test time: [lindex $t 0] microseconds"
copy_paste_test mos_power_ampli.sch
draw_trim_wiregrid
test_xschem_simulation simulate_ff.sch
test_windows 0 ;# windows
test_windows 1 ;# tabs
}]
puts "Test time: [lindex $t 0] microseconds"
}
## this is the test to run from xschem console after sourcing this file

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,7 @@ exec tclsh "$0" "$@"
set model [lindex $argv 0]
if {$model eq {nfet_g5v0d10v5}} {
puts {
puts {
v {xschem version=3.1.0 file_version=1.2}
G {}
@ -13,16 +13,16 @@ K {type=nmos
lvs_format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W nf=@nf m=@mult"
format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W
+ nf=@nf ad=@ad as=@as pd=@pd ps=@ps
+ nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd
+ nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd
+ mult=@mult m=@mult"
template="name=M1
L=0.5
W=1
nf=1
mult=1
ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\"
ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\"
pd=\\"'2*int((nf+1)/2) * (W/nf + 0.29)'\\"
as=\\"'int((nf+2)/2) * W/nf * 0.29'\\"
as=\\"'int((nf+2)/2) * W/nf * 0.29'\\"
ps=\\"'2*int((nf+2)/2) * (W/nf + 0.29)'\\"
nrd=\\"'0.29 / W'\\" nrs=\\"'0.29 / W'\\"
sa=0 sb=0 sd=0
@ -59,22 +59,22 @@ T {tcleval(id=[to_eng [ngspice::get_node [subst -nocommand \{i(\\@m.$\{path\}@sp
hide=true}
}
} elseif {$model eq {pfet_g5v0d10v5}} {
puts {v {xschem version=3.1.0 file_version=1.2}
puts {v {xschem version=3.1.0 file_version=1.2}
G {}
K {type=pmos
lvs_format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W nf=@nf m=@mult"
format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W
+ nf=@nf ad=@ad as=@as pd=@pd ps=@ps
+ nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd
+ nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd
+ mult=@mult m=@mult"
template="name=M1
L=0.5
W=1
nf=1
mult=1
ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\"
ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\"
pd=\\"'2*int((nf+1)/2) * (W/nf + 0.29)'\\"
as=\\"'int((nf+2)/2) * W/nf * 0.29'\\"
as=\\"'int((nf+2)/2) * W/nf * 0.29'\\"
ps=\\"'2*int((nf+2)/2) * (W/nf + 0.29)'\\"
nrd=\\"'0.29 / W'\\" nrs=\\"'0.29 / W'\\"
sa=0 sb=0 sd=0
@ -112,22 +112,22 @@ T {tcleval(id=[to_eng [ngspice::get_node [subst -nocommand \{i(\\@m.$\{path\}@sp
hide=true}
}
} elseif {$model eq {pfet_01v8}} {
puts {v {xschem version=3.1.0 file_version=1.2}
puts {v {xschem version=3.1.0 file_version=1.2}
G {}
K {type=pmos
lvs_format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W nf=@nf m=@mult"
format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W
+ nf=@nf ad=@ad as=@as pd=@pd ps=@ps
+ nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd
+ nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd
+ mult=@mult m=@mult"
template="name=M1
L=0.15
W=1
nf=1
mult=1
ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\"
ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\"
pd=\\"'2*int((nf+1)/2) * (W/nf + 0.29)'\\"
as=\\"'int((nf+2)/2) * W/nf * 0.29'\\"
as=\\"'int((nf+2)/2) * W/nf * 0.29'\\"
ps=\\"'2*int((nf+2)/2) * (W/nf + 0.29)'\\"
nrd=\\"'0.29 / W'\\" nrs=\\"'0.29 / W'\\"
sa=0 sb=0 sd=0
@ -164,25 +164,23 @@ hide=true}
T {tcleval(id=[to_eng [ngspice::get_node [subst -nocommand \{i(\\@m.$\{path\}@spiceprefix@name\\.msky130_fd_pr__@model\\[id])\}]]] )} 32.5 -30 0 0 0.15 0.15 {layer=15
hide=true}
}
} else { ;# default: nfet_01v8
puts {v {xschem version=3.1.0 file_version=1.2 }
} else { # default: nfet_01v8
puts {v {xschem version=3.1.0 file_version=1.2 }
G {}
K {type=nmos
lvs_format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W nf=@nf m=@mult"
format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W
+ nf=@nf ad=@ad as=@as pd=@pd ps=@ps
+ nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd
+ nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd
+ mult=@mult m=@mult"
template="name=M1
L=0.15
W=1
nf=1
nf=1
mult=1
ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\"
ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\"
pd=\\"'2*int((nf+1)/2) * (W/nf + 0.29)'\\"
as=\\"'int((nf+2)/2) * W/nf * 0.29'\\"
as=\\"'int((nf+2)/2) * W/nf * 0.29'\\"
ps=\\"'2*int((nf+2)/2) * (W/nf + 0.29)'\\"
nrd=\\"'0.29 / W'\\" nrs=\\"'0.29 / W'\\"
sa=0 sb=0 sd=0

View File

@ -2,34 +2,34 @@
# the next line restarts using wish \
exec tclsh "$0" "$@"
proc from_eng {i} {
set n 1
set str {k }
if {[scan $i "%g%s" n str] < 2} { set str {}}
set str [string tolower $str]
if { [regexp {^meg} $str] } { set str {meg} } else {
set suffix [string index $str 0]
}
set mult [switch $suffix {
a { expr {1e-18}}
f { expr {1e-15}}
p { expr {1e-12}}
n { expr { 1e-9}}
u { expr {1e-6}}
m { expr {1e-3}}
k { expr {1e3}}
meg { expr {1e6}}
g { expr {1e9}}
t { expr {1e12}}
default { expr {1.0}}
}]
return [expr {$n * $mult}]
}
set n 1
set str {k }
if {[scan $i "%g%s" n str] < 2} {set str {}}
set str [string tolower $str]
if {[regexp {^meg} $str]} {set str {meg}} else {
set suffix [string index $str 0]
}
set mult [switch $suffix {
a {expr {1e-18}}
f {expr {1e-15}}
p {expr {1e-12}}
n {expr {1e-9}}
u {expr {1e-6}}
m {expr {1e-3}}
k {expr {1e3}}
meg {expr {1e6}}
g {expr {1e9}}
t {expr {1e12}}
default {expr {1.0}}
}]
return [expr {$n * $mult}]
}
set arg1 [lindex $argv 0]
if {$arg1 eq {}} { puts stderr "empty arg"; set arg1 1K}
if {$arg1 eq {}} {puts stderr "empty arg"; set arg1 1K}
if {[from_eng $arg1] > 0.1} {
puts stderr "res value=|$arg1|"
puts "v {xschem version=3.4.0 file_version=1.2
puts stderr "res value=|$arg1|"
puts "v {xschem version=3.4.0 file_version=1.2
}
G {}
K {type=resistor
@ -61,8 +61,7 @@ T {@#1:net_name} 10 20 0 0 0.15 0.15 {layer=15}
T {m=@m} -15 1.25 0 1 0.2 0.2 {}
T {@spice_get_current} 12.5 -16.25 0 0 0.2 0.2 {layer=15}"
} else {
puts "v {xschem version=3.4.0 file_version=1.2
puts "v {xschem version=3.4.0 file_version=1.2
}
G {}
K {type=show_label

View File

@ -3,8 +3,8 @@
exec tclsh "$0" "$@"
set arg1 [lindex $argv 0]
if { $arg1 eq {inv}} {
puts {v {xschem version=3.1.0 file_version=1.2}
if {$arg1 eq {inv}} {
puts {v {xschem version=3.1.0 file_version=1.2}
G {
y <= not a after 0.1 ns ;}
K {}
@ -31,7 +31,7 @@ C {lab_pin.sym} 190 -130 0 0 {name=p3 lab=0}
C {n.sym} 170 -180 0 0 {name=m1 model=cmosn w=wn l=lln m=1}
}
} else {
puts {v {xschem version=3.1.0 file_version=1.2}
puts {v {xschem version=3.1.0 file_version=1.2}
G {
y <= not a after 0.1 ns ;}
K {}

View File

@ -5,8 +5,8 @@ exec tclsh "$0" "$@"
set arg1 [lindex $argv 0]
set rout [lindex $argv 1]
# puts stderr "arg1=|$arg1| $rout=|$rout|"
if { $arg1 eq {inv}} {
puts "v {xschem version=3.1.0 file_version=1.2}
if {$arg1 eq {inv}} {
puts "v {xschem version=3.1.0 file_version=1.2}
K {type=subcircuit
xvhdl_primitive=true
xverilog_primitive=true
@ -29,7 +29,7 @@ T {y} 7.5 -6.5 0 1 0.2 0.2 {}
T {a} -17.5 -6.5 0 0 0.2 0.2 {}
"
} else {
puts "v {xschem version=3.1.0 file_version=1.2}
puts "v {xschem version=3.1.0 file_version=1.2}
K {type=subcircuit
xvhdl_primitive=true
xverilog_primitive=true

View File

@ -19,13 +19,12 @@ E {}
B 5 -2.5 -2.5 2.5 2.5 {name=P dir=inout }"
if {[regexp -nocase {^(VCC|VDD|VPP)$} $arg1]} {
puts "L 4 -20 -40 20 -40 {}
puts "L 4 -20 -40 20 -40 {}
L 4 0 -40 0 0 {}
T {@#0:net_name} 5 -13.75 0 0 0.15 0.15 {layer=15}
T {@lab} -15 -53.75 0 0 0.2 0.2 {}"
} else {
puts "P 4 7 0 0 0 20 -10 20 0 40 10 20 0 20 0 0 {fill=true}
puts "P 4 7 0 0 0 20 -10 20 0 40 10 20 0 20 0 0 {fill=true}
T {@#0:net_name} 5 10 0 0 0.15 0.15 {layer=15}
T {@lab} -15 45 0 0 0.2 0.2 {}"
}