From 6f907b54306fe3c3e5d85c565603189c2c0804ff Mon Sep 17 00:00:00 2001 From: Stefan Frederik Date: Wed, 21 Sep 2022 18:38:53 +0200 Subject: [PATCH] updated test schematics to use new xschem annotate_op instead of ngspice::annotate --- src/ngspice_backannotate.tcl | 195 ++++++------------ xschem_library/devices/lab_wire.sym | 2 +- xschem_library/devices/spice_probe_vdiff.sym | 20 +- xschem_library/examples/cmos_example.sch | 2 +- xschem_library/examples/mos_power_ampli.sch | 4 +- .../examples/test_extracted_netlist.sch | 5 +- 6 files changed, 81 insertions(+), 147 deletions(-) diff --git a/src/ngspice_backannotate.tcl b/src/ngspice_backannotate.tcl index 5e5a7001..2964a571 100644 --- a/src/ngspice_backannotate.tcl +++ b/src/ngspice_backannotate.tcl @@ -24,9 +24,10 @@ namespace eval ngspice { # Create a variable inside the namespace variable ngspice_data + variable op_point_read } -proc ngspice::read_ngspice_raw {arr fp} { +proc ngspice::read_raw_dataset {arr fp} { upvar $arr var unset -nocomplain var @@ -66,50 +67,38 @@ proc ngspice::read_ngspice_raw {arr fp} { } } -proc ngspice::get_voltage_probe {arr n } { - upvar $arr var - set m "v($n)" - if { ! [info exists var([string tolower $m])] } { - set m $n - } - if { abs($var([string tolower $m])) < 1e-3 } { - return [format %.4e $var([string tolower $m])] - } else { - return [format %.4g $var([string tolower $m])] - } - # return DELETE -} +proc ngspice::read_raw {{f {}}} { + upvar ngspice::ngspice_data arr -proc ngspice::get_diff_probe {arr p m } { - upvar $arr var - set pp "v($p)" - set mm "v($m)" - if { ! [info exists var([string tolower $pp])] } { - set pp $p - } - if { ! [info exists var([string tolower $mm])] } { - set mm $m - } - return [format %.4g [expr {$var([string tolower $pp]) - $var([string tolower $mm])} ] ] - # return DELETE -} - -proc ngspice::get_curr_probe {arr n } { - upvar $arr var - if { [xschem get currsch] > 0 } { - set n "i(v.$n)" + if { $f eq {}} { + set rawfile "$::netlist_dir/[file rootname [file tail [xschem get schname 0]]].raw" } else { - set n "i($n)" + set rawfile $f } - if {abs($var([string tolower $n])) <1e-3} { - return [format %.4e $var([string tolower $n])] - } else { - return [format %.4g $var([string tolower $n])] + 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!" } - # return DELETE } - proc ngspice::get_current {n} { global path graph_raw_level set path [string range [xschem get sch_path] 1 end] @@ -148,6 +137,46 @@ proc ngspice::get_current {n} { return $res } +proc ngspice::get_diff_voltage {n m} { + global path graph_raw_level + set path [string range [xschem get sch_path] 1 end] + # skip hierarchy components above the level where raw file has been loaded. + # node path names to look up in raw file begin from there. + set skip 0 + while { $skip < $graph_raw_level } { + regsub {^[^.]*\.} $path {} path + incr skip + } + set n [string tolower $n] + set m [string tolower $m] + set nn $path$n + set mm $path$m + set errn [catch {set ngspice::ngspice_data($nn)} resn] + if {$errn} { + set nn v(${path}${n}) + set errn [catch {set ngspice::ngspice_data($nn)} resn] + } + set errm [catch {set ngspice::ngspice_data($mm)} resm] + if {$errm} { + set mm v(${path}${m}) + set errm [catch {set ngspice::ngspice_data($mm)} resm] + } + if { $errn || $errm} { + set res {?} + } else { + set res [expr {$resn - $resm}] + if { abs($res) <1e-5} { + set res 0 + } elseif { abs($res) <1e-3 && $res != 0.0} { + set res [ format %.4e $res ] + } else { + set res [ format %.4g $res ] + } + } + return $res +} + + proc ngspice::get_voltage {n} { global path graph_raw_level set path [string range [xschem get sch_path] 1 end] @@ -207,92 +236,4 @@ proc ngspice::get_node {n} { return $res } -proc ngspice::resetdata {} { - array unset ngspice::ngspice_data -} - -proc ngspice::annotate {{f {}} {read_file 1}} { - upvar ngspice::ngspice_data arr - - - if { $read_file == 1} { - 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 op_point_read 0 - ## not needed: done in ngspice::read_ngspice_raw - # array unset ngspice::ngspice_data - while 1 { - ngspice::read_ngspice_raw arr $fp - if { [info exists arr(n\ points)] } { - if { $arr(n\ points) == 1 } { - set op_point_read 1; break - } - } else break; - } - close $fp - puts {Raw file read ...} - } else { - set op_point_read 1 - } - - - if { $op_point_read } { - ### disable screen redraw and undo when looping to speed up performance - ### but save state on undo stack before doing backannotations. - - if {0} { - xschem push_undo - xschem set no_undo 1 - xschem set no_draw 1 - set lastinst [xschem get instances] - set path [string range [xschem get sch_path] 1 end] - 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 eq {probe} } { - set net $path[xschem instance_net $i p] - if {[catch {xschem setprop instance $i voltage [ngspice::get_voltage_probe arr $net] fast} err]} { - puts "Warning 1: ${err}, net: $net" - } - } - if { $type eq {current_probe} } { - if {[catch {xschem setprop instance $i current [ngspice::get_curr_probe arr $path$name] fast} err]} { - puts "Warning 2: $err" - } - } - if { $type eq {differential_probe} } { - set netp $path[xschem instance_net $i p] - set netm $path[xschem instance_net $i m] - if {[catch {xschem setprop instance $i voltage [ngspice::get_diff_probe arr $netp $netm] fast} err]} { - puts "Warning 3: $err" - } - } - # puts "$i $name $type" - } - - # re-enable undo and draw - xschem set no_undo 0 - xschem set no_draw 0 - - ### xschem setprop instructions have not altered circuit topology so - ### in this case a connectivity rebuild is not needed. - # xschem rebuild_connectivity - # - # - } ;# if {0} - xschem redraw - } else { - puts "no operating point found!" - } -} - # if { [info exists ::has_x] } {bind .drw {puts {Annotating...}; ngspice::annotate} } diff --git a/xschem_library/devices/lab_wire.sym b/xschem_library/devices/lab_wire.sym index ed6a600c..c34c1528 100644 --- a/xschem_library/devices/lab_wire.sym +++ b/xschem_library/devices/lab_wire.sym @@ -9,4 +9,4 @@ S {} E {} B 5 -1.25 -1.25 1.25 1.25 {name=p dir=in} T {@lab} -2.5 -1.25 2 0 0.27 0.27 {} -T {@spice_get_voltage} -1.875 10.15625 0 1 0.2 0.2 {vcenter=true layer=15 hide=true} +T {@spice_get_voltage} 1.875 10.15625 0 0 0.2 0.2 {vcenter=true layer=15 hide=true} diff --git a/xschem_library/devices/spice_probe_vdiff.sym b/xschem_library/devices/spice_probe_vdiff.sym index 980afc18..7c1cdaad 100644 --- a/xschem_library/devices/spice_probe_vdiff.sym +++ b/xschem_library/devices/spice_probe_vdiff.sym @@ -1,4 +1,5 @@ -v {xschem version=3.0.0 file_version=1.2 } +v {xschem version=3.1.0 file_version=1.2 +} G {} K {type=differential_probe format=".save v(@@p\\\\) v(@@m\\\\)" @@ -6,18 +7,9 @@ template="name=p1"} V {} S {} E {} -L 15 0 -17.5 0 -12.5 {} -L 15 -2.5 -15 2.5 -15 {} -L 15 -2.5 15 2.5 15 {} -L 15 -5 0 0 0 {} -L 15 0 -3.75 0 0 {} -L 15 0 -3.75 3.75 -3.75 {} -L 15 3.75 -3.75 3.75 0 {} -L 15 3.75 0 7.5 0 {} -L 15 7.5 -3.75 7.5 0 {} -L 15 7.5 -3.75 10.3125 -3.75 {} -L 15 -7.5 -7.5 -7.5 6.25 {} -L 15 -10 3.75 11.25 3.75 {} +L 15 0 -15 0 -10 {} +L 15 -2.5 -12.5 2.5 -12.5 {} +L 15 -2.5 12.5 2.5 12.5 {} B 5 -1.25 -21.25 1.25 -18.75 {name=p dir=in} B 5 -1.25 18.75 1.25 21.25 {name=m dir=in} -T {@voltage} 15 -5 0 0 0.2 0.2 {layer=15} +T {tcleval([ngspice::get_diff_voltage @@p @@m ])} 1.875 -6.09375 0 0 0.2 0.2 {layer=15 hcenter=true} diff --git a/xschem_library/examples/cmos_example.sch b/xschem_library/examples/cmos_example.sch index 6c6efe02..73e9c98b 100644 --- a/xschem_library/examples/cmos_example.sch +++ b/xschem_library/examples/cmos_example.sch @@ -122,7 +122,7 @@ device="ceramic capacitor" net_name=true} C {lab_pin.sym} 500 -430 0 0 {name=p12 lab=G net_name=true} C {launcher.sym} 700 -60 0 0 {name=h1 descr=Backannotate -tclcommand="ngspice::annotate"} +tclcommand="xschem annotate_op"} C {launcher.sym} 700 -110 0 0 {name=h2 descr="View raw file" tclcommand="textwindow $netlist_dir/cmos_example.raw"} diff --git a/xschem_library/examples/mos_power_ampli.sch b/xschem_library/examples/mos_power_ampli.sch index b46223e8..6faaf122 100644 --- a/xschem_library/examples/mos_power_ampli.sch +++ b/xschem_library/examples/mos_power_ampli.sch @@ -273,7 +273,7 @@ C {ammeter.sym} 700 -440 3 0 {name=v4 net_name=true } C {ammeter.sym} 690 -680 0 0 {name=v5 net_name=true } C {ammeter.sym} 180 -870 0 1 {name=v6 net_name=true } C {ammeter.sym} 840 -890 0 0 {name=v7 net_name=true } -C {spice_probe_vdiff.sym} 860 -410 0 0 {name=p37 voltage=3.688} +C {spice_probe_vdiff.sym} 860 -410 0 0 {name=p37 } C {spice_probe_vdiff.sym} 860 -730 0 0 {name=p38 voltage=3.68} C {ammeter.sym} 1300 -590 3 0 {name=v8 net_name=true } C {opin.sym} 600 -130 0 0 {name=p5 lab=OUT} @@ -456,7 +456,7 @@ C {spice_probe.sym} 180 -720 0 0 {name=p59 voltage=47.27} C {spice_probe.sym} 1020 -1120 0 0 {name=p62 voltage=49.04} C {launcher.sym} 770 -110 0 0 {name=h1 descr=Backannotate -tclcommand="ngspice::annotate"} +tclcommand="xschem annotate_op"} C {launcher.sym} 770 -150 0 0 {name=h4 descr="View Raw file" tclcommand="textwindow $netlist_dir/[file tail [file rootname [ xschem get schname 0 ] ] ].raw" diff --git a/xschem_library/examples/test_extracted_netlist.sch b/xschem_library/examples/test_extracted_netlist.sch index 35d7f615..7500edd5 100644 --- a/xschem_library/examples/test_extracted_netlist.sch +++ b/xschem_library/examples/test_extracted_netlist.sch @@ -1,4 +1,5 @@ -v {xschem version=3.0.0 file_version=1.2 } +v {xschem version=3.1.0 file_version=1.2 +} G {} K {} V {} @@ -184,5 +185,5 @@ m=1} C {lab_pin.sym} 1030 -760 0 0 {name=p17 lab=VSS} C {launcher.sym} 660 -350 0 0 {name=h1 descr=Backannotate -tclcommand="ngspice::annotate"} +tclcommand="xschem annotate_op"} C {spice_probe.sym} 550 -620 0 0 {name=p19 analysis=tran voltage=21.07}