Fixed DRC logging.

This commit is contained in:
Matthias Koefferlein 2021-03-01 22:35:04 +01:00
parent e639c30570
commit a904aabcce
5 changed files with 80 additions and 43 deletions

View File

@ -48,6 +48,8 @@ module DRC
@deep = false
@netter = nil
@netter_data = nil
@total_timer = nil
@drc_progress = nil
# initialize the defaults for max_area_ratio, max_vertex_count
dss = RBA::DeepShapeStore::new
@ -58,7 +60,7 @@ module DRC
@verbose = false
@in_context = false
@in_context = nil
end
@ -476,15 +478,20 @@ module DRC
# %DRC%
# @name info
# @brief Outputs as message to the logger window
# @brief Outputs as message to the logger or progress window
# @synopsis info(message)
# @synopsis info(message, indent)
# Prints the message to the log window in verbose mode.
# In non-verbose more, nothing is printed.
# In non-verbose more, nothing is printed but a statement is put into the progress window.
# \log is a function that always prints a message.
def info(arg, indent = 0)
@verbose && log(arg, indent)
if @verbose
log(arg, indent)
else
str = (" " * indent) + arg
RBA::Logger::log(str)
end
end
# %DRC%
@ -497,7 +504,7 @@ module DRC
# verbose mode is enabled.
def log(arg, indent = 0)
str = (" " * indent) + arg
str = (" " * indent) + arg
if @log_file
@log_file.puts(str)
else
@ -1849,7 +1856,7 @@ CODE
def _wrapper_context(func, *args, &proc)
in_context_outer = @in_context
begin
@in_context = true
@in_context = func
return yield(*args)
rescue => ex
raise("'" + func + "': " + ex.to_s)
@ -1863,19 +1870,35 @@ CODE
return yield(*args)
else
begin
@in_context = true
@in_context = func
return yield(*args)
rescue => ex
raise("'" + func + "': " + ex.to_s)
ensure
@in_context = false
@in_context = nil
end
end
end
def _result_info(res, indent, prefix = "")
if res.is_a?(Array)
res.each_with_index do |a, index|
_result_info(a, indent, "[#{index + 1}] ")
end
elsif res.is_a?(RBA::Region)
info(prefix + "Polygons (raw): #{res.count} (flat) #{res.hier_count} (hierarchical)", indent)
elsif res.is_a?(RBA::Edges)
info(prefix + "Edges: #{res.count} (flat) #{res.hier_count} (hierarchical)", indent)
elsif res.is_a?(RBA::EdgePairs)
info(prefix + "Edge pairs: #{res.count} (flat) #{res.hier_count} (hierarchical)", indent)
elsif res.is_a?(RBA::Texts)
info(prefix + "Texts: #{res.count} (flat) #{res.hier_count} (hierarchical)", indent)
end
end
def run_timed(desc, obj)
log(desc)
info(desc)
# enable progress
disable_progress = false
@ -1895,15 +1918,7 @@ CODE
if @verbose
# Report result statistics
if res.is_a?(RBA::Region)
info("Polygons (raw): #{res.count} (flat) #{res.hier_count} (hierarchical)", 1)
elsif res.is_a?(RBA::Edges)
info("Edges: #{res.count} (flat) #{res.hier_count} (hierarchical)", 1)
elsif res.is_a?(RBA::EdgePairs)
info("Edge pairs: #{res.count} (flat) #{res.hier_count} (hierarchical)", 1)
elsif res.is_a?(RBA::Texts)
info("Texts: #{res.count} (flat) #{res.hier_count} (hierarchical)", 1)
end
_result_info(res, 1)
mem = RBA::Timer::memory_size
if mem > 0
@ -1928,7 +1943,7 @@ CODE
end
def _cmd(obj, method, *args)
run_timed("\"#{method}\" in: #{src_line}", obj) do
run_timed("\"#{@in_context || method}\" in: #{src_line}", obj) do
obj.send(method, *args)
end
end
@ -1958,8 +1973,9 @@ CODE
end
av = args.size.times.collect { |i| "a#{i}" }.join(", ")
tp.queue("_output(res, self.#{method}(#{av}))")
run_timed("\"#{method}\" in: #{src_line}", obj) do
run_timed("\"#{@in_context || method}\" in: #{src_line}", obj) do
tp.execute("Tiled \"#{method}\" in: #{src_line}")
res
end
else
@ -1969,7 +1985,7 @@ CODE
end
res = nil
run_timed("\"#{method}\" in: #{src_line}", obj) do
run_timed("\"#{@in_context || method}\" in: #{src_line}", obj) do
res = obj.send(method, *args)
end
@ -2008,8 +2024,9 @@ CODE
end
av = args.size.times.collect { |i| "a#{i}" }.join(", ")
tp.queue("var rr = self.#{method}(#{av}); _output(res1, rr[0]); _output(res2, rr[1])")
run_timed("\"#{method}\" in: #{src_line}", obj) do
run_timed("\"#{@in_context || method}\" in: #{src_line}", obj) do
tp.execute("Tiled \"#{method}\" in: #{src_line}")
res
end
else
@ -2019,7 +2036,7 @@ CODE
end
res = nil
run_timed("\"#{method}\" in: #{src_line}", obj) do
run_timed("\"#{@in_context || method}\" in: #{src_line}", obj) do
res = obj.send(method, *args)
end
@ -2044,8 +2061,9 @@ CODE
tp.input("self", obj)
tp.threads = (@tt || 1)
tp.queue("_output(res, _tile ? self.#{method}(_tile.bbox) : self.#{method})")
run_timed("\"#{method}\" in: #{src_line}", obj) do
run_timed("\"#{@in_context || method}\" in: #{src_line}", obj) do
tp.execute("Tiled \"#{method}\" in: #{src_line}")
res
end
res = res.value
@ -2057,7 +2075,7 @@ CODE
end
res = nil
run_timed("\"#{method}\" in: #{src_line}", obj) do
run_timed("\"#{@in_context || method}\" in: #{src_line}", obj) do
res = obj.send(method)
end
@ -2068,23 +2086,29 @@ CODE
end
def _rcmd(obj, method, *args)
run_timed("\"#{method}\" in: #{src_line}", obj) do
run_timed("\"#{@in_context || method}\" in: #{src_line}", obj) do
RBA::Region::new(obj.send(method, *args))
end
end
def _vcmd(obj, method, *args)
run_timed("\"#{method}\" in: #{src_line}", obj) do
run_timed("\"#{@in_context || method}\" in: #{src_line}", obj) do
obj.send(method, *args)
end
end
def _start
def _start(macro_path)
# clearing the selection avoids some nasty problems
view = RBA::LayoutView::current
view && view.cancel
@total_timer = RBA::Timer::new
@total_timer.start
@drc_progress = RBA::AbstractProgress::new("DRC: " + macro_path)
end
def _flush
@ -2224,6 +2248,18 @@ CODE
@netter = nil
@netter_data = nil
if final
@total_timer.stop
if @verbose
mem = RBA::Timer::memory_size
if mem > 0
info("Total elapsed: #{'%.3f'%(@total_timer.sys+@total_timer.user)}s Memory: #{'%.2f'%(mem/(1024*1024))}M")
else
info("Total elapsed: #{'%.3f'%(@total_timer.sys+@total_timer.user)}s")
end
end
end
if final && @log_file
@log_file.close
@log_file = nil
@ -2232,6 +2268,10 @@ CODE
# force garbage collection
GC.start
# unlocks the UI
@drc_progress._destroy
@drc_progress = nil
end
end
@ -2540,6 +2580,9 @@ CODE
end
end
data
end
def make_source(layout, cell = nil, path = nil)

View File

@ -1263,6 +1263,7 @@ CODE
self.data.send(new_data.is_a?(RBA::EdgePairs) ? :each : :each_merged) do |object|
block.call(object.transformed(t)) && new_data.insert(object)
end
new_data
end
DRCLayer::new(@engine, new_data)
@ -1285,7 +1286,7 @@ CODE
@engine._wrapper_context("each") do
t = RBA::CplxTrans::new(@engine.dbu)
@engine.run_timed("\"select\" in: #{@engine.src_line}", self.data) do
@engine.run_timed("\"each\" in: #{@engine.src_line}", self.data) do
self.data.send(self.data.is_a?(RBA::EdgePairs) ? :each : :each_merged) do |object|
block.call(object.transformed(t))
end
@ -1368,10 +1369,11 @@ CODE
t = RBA::CplxTrans::new(@engine.dbu)
dbu_trans = RBA::VCplxTrans::new(1.0 / @engine.dbu)
@engine.run_timed("\\"select\\" in: " + @engine.src_line, self.data) do
@engine.run_timed("\\"#{f}\\" in: " + @engine.src_line, self.data) do
self.data.send(new_data.is_a?(RBA::EdgePairs) ? :each : :each_merged) do |object|
insert_object_into(new_data, block.call(object.transformed(t)), dbu_trans)
end
new_data
end
DRCLayer::new(@engine, new_data)
@ -3817,6 +3819,7 @@ TP_SCRIPT
@engine.run_timed("\"#{method}\" in: #{@engine.src_line}", self.data) do
tp.execute("Tiled \"#{method}\" in: #{@engine.src_line}")
res
end
DRCLayer::new(@engine, res)

View File

@ -19,13 +19,10 @@ module DRC
def DRC.execute_drc(macro, generator, rdb_index = nil)
timer = RBA::Timer::new
timer.start
drc = DRCEngine::new
drc._rdb_index = rdb_index
drc._generator = generator
drc_progress = RBA::AbstractProgress::new("DRC: " + macro.path)
drc._start(macro.path)
begin
@ -48,14 +45,8 @@ module DRC
# cleans up and creates layout and report views
drc._finish
# unlocks the UI
drc_progress._destroy
end
timer.stop
drc.info("Total run time: #{'%.3f'%(timer.sys+timer.user)}s")
end
# A DSL implementation for a DRC language (XML format)

View File

@ -738,7 +738,7 @@ This function will evaluate the conditions c1 to cn and return the
current primary shape if all conditions renders an empty result.
See <a href="#if_all">if_all</a> for an example how to use the if_... functions.
</p>
<a name="info"/><h2>"info" - Outputs as message to the logger window</h2>
<a name="info"/><h2>"info" - Outputs as message to the logger or progress window</h2>
<keyword name="info"/>
<p>Usage:</p>
<ul>
@ -747,7 +747,7 @@ See <a href="#if_all">if_all</a> for an example how to use the if_... functions.
</ul>
<p>
Prints the message to the log window in verbose mode.
In non-verbose more, nothing is printed.
In non-verbose more, nothing is printed but a statement is put into the progress window.
<a href="#log">log</a> is a function that always prints a message.
</p>
<a name="input"/><h2>"input" - Fetches the shapes from the specified input from the default source</h2>

View File

@ -101,7 +101,7 @@ LogReceiver::begin ()
LogFile::LogFile (size_t max_entries, bool register_global)
: m_error_receiver (this, 0, &LogFile::add_error),
m_warn_receiver (this, 0, &LogFile::add_warn),
m_log_receiver (this, 10, &LogFile::add_info),
m_log_receiver (this, 0, &LogFile::add_info),
m_info_receiver (this, 0, &LogFile::add_info),
m_max_entries (max_entries),
m_generation_id (0),