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 @deep = false
@netter = nil @netter = nil
@netter_data = nil @netter_data = nil
@total_timer = nil
@drc_progress = nil
# initialize the defaults for max_area_ratio, max_vertex_count # initialize the defaults for max_area_ratio, max_vertex_count
dss = RBA::DeepShapeStore::new dss = RBA::DeepShapeStore::new
@ -58,7 +60,7 @@ module DRC
@verbose = false @verbose = false
@in_context = false @in_context = nil
end end
@ -476,15 +478,20 @@ module DRC
# %DRC% # %DRC%
# @name info # @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)
# @synopsis info(message, indent) # @synopsis info(message, indent)
# Prints the message to the log window in verbose mode. # 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. # \log is a function that always prints a message.
def info(arg, indent = 0) def info(arg, indent = 0)
@verbose && log(arg, indent) if @verbose
log(arg, indent)
else
str = (" " * indent) + arg
RBA::Logger::log(str)
end
end end
# %DRC% # %DRC%
@ -497,7 +504,7 @@ module DRC
# verbose mode is enabled. # verbose mode is enabled.
def log(arg, indent = 0) def log(arg, indent = 0)
str = (" " * indent) + arg str = (" " * indent) + arg
if @log_file if @log_file
@log_file.puts(str) @log_file.puts(str)
else else
@ -1849,7 +1856,7 @@ CODE
def _wrapper_context(func, *args, &proc) def _wrapper_context(func, *args, &proc)
in_context_outer = @in_context in_context_outer = @in_context
begin begin
@in_context = true @in_context = func
return yield(*args) return yield(*args)
rescue => ex rescue => ex
raise("'" + func + "': " + ex.to_s) raise("'" + func + "': " + ex.to_s)
@ -1863,19 +1870,35 @@ CODE
return yield(*args) return yield(*args)
else else
begin begin
@in_context = true @in_context = func
return yield(*args) return yield(*args)
rescue => ex rescue => ex
raise("'" + func + "': " + ex.to_s) raise("'" + func + "': " + ex.to_s)
ensure ensure
@in_context = false @in_context = nil
end end
end 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) def run_timed(desc, obj)
log(desc) info(desc)
# enable progress # enable progress
disable_progress = false disable_progress = false
@ -1895,15 +1918,7 @@ CODE
if @verbose if @verbose
# Report result statistics # Report result statistics
if res.is_a?(RBA::Region) _result_info(res, 1)
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
mem = RBA::Timer::memory_size mem = RBA::Timer::memory_size
if mem > 0 if mem > 0
@ -1928,7 +1943,7 @@ CODE
end end
def _cmd(obj, method, *args) 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) obj.send(method, *args)
end end
end end
@ -1958,8 +1973,9 @@ CODE
end end
av = args.size.times.collect { |i| "a#{i}" }.join(", ") av = args.size.times.collect { |i| "a#{i}" }.join(", ")
tp.queue("_output(res, self.#{method}(#{av}))") 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}") tp.execute("Tiled \"#{method}\" in: #{src_line}")
res
end end
else else
@ -1969,7 +1985,7 @@ CODE
end end
res = nil 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) res = obj.send(method, *args)
end end
@ -2008,8 +2024,9 @@ CODE
end end
av = args.size.times.collect { |i| "a#{i}" }.join(", ") av = args.size.times.collect { |i| "a#{i}" }.join(", ")
tp.queue("var rr = self.#{method}(#{av}); _output(res1, rr[0]); _output(res2, rr[1])") 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}") tp.execute("Tiled \"#{method}\" in: #{src_line}")
res
end end
else else
@ -2019,7 +2036,7 @@ CODE
end end
res = nil 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) res = obj.send(method, *args)
end end
@ -2044,8 +2061,9 @@ CODE
tp.input("self", obj) tp.input("self", obj)
tp.threads = (@tt || 1) tp.threads = (@tt || 1)
tp.queue("_output(res, _tile ? self.#{method}(_tile.bbox) : self.#{method})") 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}") tp.execute("Tiled \"#{method}\" in: #{src_line}")
res
end end
res = res.value res = res.value
@ -2057,7 +2075,7 @@ CODE
end end
res = nil res = nil
run_timed("\"#{method}\" in: #{src_line}", obj) do run_timed("\"#{@in_context || method}\" in: #{src_line}", obj) do
res = obj.send(method) res = obj.send(method)
end end
@ -2068,23 +2086,29 @@ CODE
end end
def _rcmd(obj, method, *args) 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)) RBA::Region::new(obj.send(method, *args))
end end
end end
def _vcmd(obj, method, *args) 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) obj.send(method, *args)
end end
end end
def _start def _start(macro_path)
# clearing the selection avoids some nasty problems # clearing the selection avoids some nasty problems
view = RBA::LayoutView::current view = RBA::LayoutView::current
view && view.cancel view && view.cancel
@total_timer = RBA::Timer::new
@total_timer.start
@drc_progress = RBA::AbstractProgress::new("DRC: " + macro_path)
end end
def _flush def _flush
@ -2224,6 +2248,18 @@ CODE
@netter = nil @netter = nil
@netter_data = 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 if final && @log_file
@log_file.close @log_file.close
@log_file = nil @log_file = nil
@ -2232,6 +2268,10 @@ CODE
# force garbage collection # force garbage collection
GC.start GC.start
# unlocks the UI
@drc_progress._destroy
@drc_progress = nil
end end
end end
@ -2540,6 +2580,9 @@ CODE
end end
end end
data
end end
def make_source(layout, cell = nil, path = nil) 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| self.data.send(new_data.is_a?(RBA::EdgePairs) ? :each : :each_merged) do |object|
block.call(object.transformed(t)) && new_data.insert(object) block.call(object.transformed(t)) && new_data.insert(object)
end end
new_data
end end
DRCLayer::new(@engine, new_data) DRCLayer::new(@engine, new_data)
@ -1285,7 +1286,7 @@ CODE
@engine._wrapper_context("each") do @engine._wrapper_context("each") do
t = RBA::CplxTrans::new(@engine.dbu) 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| self.data.send(self.data.is_a?(RBA::EdgePairs) ? :each : :each_merged) do |object|
block.call(object.transformed(t)) block.call(object.transformed(t))
end end
@ -1368,10 +1369,11 @@ CODE
t = RBA::CplxTrans::new(@engine.dbu) t = RBA::CplxTrans::new(@engine.dbu)
dbu_trans = RBA::VCplxTrans::new(1.0 / @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| 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) insert_object_into(new_data, block.call(object.transformed(t)), dbu_trans)
end end
new_data
end end
DRCLayer::new(@engine, new_data) DRCLayer::new(@engine, new_data)
@ -3817,6 +3819,7 @@ TP_SCRIPT
@engine.run_timed("\"#{method}\" in: #{@engine.src_line}", self.data) do @engine.run_timed("\"#{method}\" in: #{@engine.src_line}", self.data) do
tp.execute("Tiled \"#{method}\" in: #{@engine.src_line}") tp.execute("Tiled \"#{method}\" in: #{@engine.src_line}")
res
end end
DRCLayer::new(@engine, res) DRCLayer::new(@engine, res)

View File

@ -19,13 +19,10 @@ module DRC
def DRC.execute_drc(macro, generator, rdb_index = nil) def DRC.execute_drc(macro, generator, rdb_index = nil)
timer = RBA::Timer::new
timer.start
drc = DRCEngine::new drc = DRCEngine::new
drc._rdb_index = rdb_index drc._rdb_index = rdb_index
drc._generator = generator drc._generator = generator
drc._start(macro.path)
drc_progress = RBA::AbstractProgress::new("DRC: " + macro.path)
begin begin
@ -48,14 +45,8 @@ module DRC
# cleans up and creates layout and report views # cleans up and creates layout and report views
drc._finish drc._finish
# unlocks the UI
drc_progress._destroy
end end
timer.stop
drc.info("Total run time: #{'%.3f'%(timer.sys+timer.user)}s")
end end
# A DSL implementation for a DRC language (XML format) # 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. 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. See <a href="#if_all">if_all</a> for an example how to use the if_... functions.
</p> </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"/> <keyword name="info"/>
<p>Usage:</p> <p>Usage:</p>
<ul> <ul>
@ -747,7 +747,7 @@ See <a href="#if_all">if_all</a> for an example how to use the if_... functions.
</ul> </ul>
<p> <p>
Prints the message to the log window in verbose mode. 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. <a href="#log">log</a> is a function that always prints a message.
</p> </p>
<a name="input"/><h2>"input" - Fetches the shapes from the specified input from the default source</h2> <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) LogFile::LogFile (size_t max_entries, bool register_global)
: m_error_receiver (this, 0, &LogFile::add_error), : m_error_receiver (this, 0, &LogFile::add_error),
m_warn_receiver (this, 0, &LogFile::add_warn), 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_info_receiver (this, 0, &LogFile::add_info),
m_max_entries (max_entries), m_max_entries (max_entries),
m_generation_id (0), m_generation_id (0),