diff --git a/src/report.jl b/src/report.jl
index 88a12c071..96c85d9bc 100644
--- a/src/report.jl
+++ b/src/report.jl
@@ -5,10 +5,11 @@ import Printf: @sprintf
function _status_cell(ok::Bool, t::Float64, logFile::Union{String,Nothing})
link = isnothing(logFile) ? "" : """ (log)"""
+ time = t > 0 ? @sprintf("%.2f", t) * " s" : ""
if ok
- return """
✓ $(@sprintf "%.2f" t) s$link | """
+ return """✓$(time)$(link) | """
else
- return """✗$link | """
+ return """✗$(time)$(link) | """
end
end
@@ -18,12 +19,17 @@ function _cmp_cell(r::ModelResult, results_root::String)
end
n, p = r.cmp_total, r.cmp_pass
if p == n
- return """✓ $p/$n | """
+ # No diff CSV when all signals pass — link the sim CSV instead
+ short = split(r.name, ".")[end]
+ sim_csv = joinpath("files", r.name, "$(short)_sim.csv")
+ csv_link = isfile(joinpath(results_root, sim_csv)) ? """ (CSV)""" : ""
+ return """✓ $p/$n$(csv_link) | """
else
# Link to the interactive diff HTML (next to the CSV, same name, .html extension)
diff_html = replace(r.cmp_csv, r"\.csv$" => ".html")
rel = relpath(isfile(diff_html) ? diff_html : r.cmp_csv, results_root)
- return """$p/$n | """
+ csv_link = isempty(r.cmp_csv) ? "" : """ (CSV)"""
+ return """$p/$n$(csv_link) | """
end
end
diff --git a/src/summary.jl b/src/summary.jl
index d922deca1..7de1e2d54 100644
--- a/src/summary.jl
+++ b/src/summary.jl
@@ -37,8 +37,11 @@ function write_summary(
print(io,
" {\"name\":\"$(_esc_json(r.name))\"," *
"\"export\":$(r.export_success)," *
+ "\"export_time\":$(@sprintf "%.3f" r.export_time)," *
"\"parse\":$(r.parse_success)," *
+ "\"parse_time\":$(@sprintf "%.3f" r.parse_time)," *
"\"sim\":$(r.sim_success)," *
+ "\"sim_time\":$(@sprintf "%.3f" r.sim_time)," *
"\"cmp_total\":$(r.cmp_total)," *
"\"cmp_pass\":$(r.cmp_pass)}$sep\n")
end
@@ -112,15 +115,18 @@ function load_summary(results_root::String)::Union{RunSummary,Nothing}
models = Dict{String,Any}[]
for m in eachmatch(
- r"\{\"name\":\"([^\"]*)\",\"export\":(true|false),\"parse\":(true|false),\"sim\":(true|false),\"cmp_total\":(\d+),\"cmp_pass\":(\d+)\}",
+ r"\{\"name\":\"([^\"]*)\",\"export\":(true|false),\"export_time\":([\d.]+),\"parse\":(true|false),\"parse_time\":([\d.]+),\"sim\":(true|false),\"sim_time\":([\d.]+),\"cmp_total\":(\d+),\"cmp_pass\":(\d+)\}",
txt)
push!(models, Dict{String,Any}(
- "name" => string(m.captures[1]),
- "export" => m.captures[2] == "true",
- "parse" => m.captures[3] == "true",
- "sim" => m.captures[4] == "true",
- "cmp_total" => parse(Int, m.captures[5]),
- "cmp_pass" => parse(Int, m.captures[6]),
+ "name" => string(m.captures[1]),
+ "export" => m.captures[2] == "true",
+ "export_time" => parse(Float64, m.captures[3]),
+ "parse" => m.captures[4] == "true",
+ "parse_time" => parse(Float64, m.captures[5]),
+ "sim" => m.captures[6] == "true",
+ "sim_time" => parse(Float64, m.captures[7]),
+ "cmp_total" => parse(Int, m.captures[8]),
+ "cmp_pass" => parse(Int, m.captures[9]),
))
end
return RunSummary(