Files
brice.boisson 46c5561ee5 First version
2025-10-21 22:00:23 +02:00

105 lines
3.1 KiB
Plaintext

# modelsim_poll.tcl — robust, logged, per-request protocol
# === CONFIG: set to your absolute shared folder ===
set shared_dir "/home/brice/Code/modelsim_wave_ext/test/tmp"
# === Derived paths ===
set commands_file [file join $shared_dir "modelsim_commands.txt"]
# Minimal logger
proc elog {msg} {
puts "[clock format [clock seconds] -format {%H:%M:%S}] [info nameofexecutable]: $msg"
}
# Return lines: "<module> /test/...", one per INSTANCE (not unique by module)
proc extract_modules_from_find {} {
set result [find instances -r /*]
elog $result
return $result
}
proc getTimeAtPercent {percent} {
lassign [wave zoom range] start end
lassign $start sVal sUnit
lassign $end eVal eUnit
# (Usually sUnit == eUnit; if not, convert eVal to sUnit as needed.)
set t [expr {$sVal + ($eVal - $sVal) * $percent / 100.0}]
return "$t $sUnit"
}
proc zoomAtPercent {percent {factor 1.1}} {
set time [getTimeAtPercent $percent]
lassign [wave zoom range] start end
lassign $start sVal sUnit
lassign $end eVal eUnit
set new [expr {$eVal + 1}]
wave seetime "${new}${eUnit}" -at 0
wave seetime $time -at 50
wave zoom in $factor
lassign [wave zoom range] start end
lassign $start sVal sUnit
lassign $end eVal eUnit
set new [expr {$eVal + 1}]
wave seetime "${new}${eUnit}" -at 0
wave seetime $time -at $percent
}
proc handle_command {payload} {
if {[regexp {^get_module_tree\s+(.+)$} $payload -> top]} {
return [extract_modules_from_find]
} elseif {[regexp {^zoom_in_at\s+(.+)$} $payload -> percent]} {
return [zoomAtPercent $percent]
} elseif {[regexp {^zoom_out_at\s+(.+)$} $payload -> percent]} {
return [zoomAtPercent $percent 0.9]
} else {
if {[catch {eval $payload} out]} { return "ERROR: $out" }
return $out
}
}
proc poll_commands {} {
global commands_file
if {[file exists $commands_file]} {
set fid [open $commands_file r]
# Handle both \n and \r\n
set content [string map {\r ""} [read $fid]]
close $fid
file delete -force $commands_file
foreach raw [split $content "\n"] {
set line [string trim $raw]
if {$line eq ""} { continue }
# Expect: <id>|<result_path>|<payload>
if {![regexp {^(\S+)\|(\S+)\|(.*)$} $line -> id result_path payload]} {
elog "WARN: bad command line: $line"
continue
}
elog "CMD id=$id -> $payload"
set out [handle_command $payload]
# Ensure directory exists
set dir [file dirname $result_path]
if {![file isdirectory $dir]} {
catch { file mkdir $dir }
}
if {[catch { set rf [open $result_path w] } err]} {
elog "ERROR: cannot open result file '$result_path': $err"
continue
}
puts $rf $out
close $rf
elog "WROTE result -> $result_path (len=[string length $out])"
}
}
after 200 poll_commands
}
# Start
elog "Poller starting. shared_dir=$shared_dir pwd=[pwd]"
poll_commands