#!/usr/bin/env lua5.1
args = {...}
vfile = assert(args[1], "arg1 missing: .v file")
table.remove(args,1)
assert(#args > 0, "arg missing: at lease one aux file")
data_files = args
source = assert(io.open(vfile), "unable to open "..vfile):read("*a")
function htmlescape(s)
return (s:gsub("&","&"):gsub("<","<"):gsub(">",">"))
end
colors = {
'#F08080', '#EEE8AA', '#98FB98'
}
assert(#data_files <= #colors, "only ".. #colors .." data files are supported")
vname = vfile:match("([^/]+.v)$")
print([[
]]..vname..[[
Timings for ]]..vname..[[
]])
for i,data_file in ipairs(data_files) do
print('- ' .. data_file .. "
")
end
print("
")
all_data = {}
for _, data_file in ipairs(data_files) do
local data = {}
local last_end = -1
local lines = 1
for l in io.lines(data_file) do
local b,e,t = l:match('^Chars ([%d]+) %- ([%d]+) %S+ ([%d%.]+) secs')
if b then
if tonumber(b) > last_end + 1 then
local text = string.sub(source,last_end+1,b-1)
if not text:match('^%s+$') then
local _, n = text:gsub('\n','')
data[#data+1] = {
start = last_end+1; stop = b-1; time = 0;
text = text; lines = lines
}
lines = lines + n
last_end = b
end
end
local text = string.sub(source,last_end+1,e)
local _, n = text:gsub('\n','')
local _, eoln = text:match('^[%s\n]*'):gsub('\n','')
data[#data+1] = {
start = b; stop = e; time = tonumber(t); text = text;
lines = lines
}
lines = lines + n
last_end = tonumber(e)
end
end
if last_end + 1 <= string.len(source) then
local text = string.sub(source,last_end+1,string.len(source))
data[#data+1] = {
start = last_end+1; stop = string.len(source); time = 0;
text = text; lines = lines+1
}
end
all_data[#all_data+1] = data
end
max = 0;
for _, data in ipairs(all_data) do
for _,d in ipairs(data) do
max = math.max(max,d.time)
end
end
data = all_data[1]
for j,d in ipairs(data) do
print('')
for k=1,#all_data do
print('
')
end
if d.text == '\n' then
print('
\n\n
')
elseif d.text:match('\n$') then
print('
'..htmlescape(d.text)..'\n
')
else
print('
'..htmlescape(d.text)..'
')
end
print("
")
end
print [[
]]
-- vim: set ts=4:
--for i = 1,#data do
-- io.stderr:write(data[i].text)
--end