From a904aabcce6ecea0313689675ef682a38764c106 Mon Sep 17 00:00:00 2001
From: Matthias Koefferlein
Date: Mon, 1 Mar 2021 22:35:04 +0100
Subject: [PATCH] Fixed DRC logging.
---
src/drc/drc/built-in-macros/_drc_engine.rb | 99 +++++++++++++------
src/drc/drc/built-in-macros/_drc_layer.rb | 7 +-
.../drc/built-in-macros/drc_interpreters.lym | 11 +--
src/lay/lay/doc/about/drc_ref_global.xml | 4 +-
src/lay/lay/layLogViewerDialog.cc | 2 +-
5 files changed, 80 insertions(+), 43 deletions(-)
diff --git a/src/drc/drc/built-in-macros/_drc_engine.rb b/src/drc/drc/built-in-macros/_drc_engine.rb
index 1f3caef99..f6efed20e 100644
--- a/src/drc/drc/built-in-macros/_drc_engine.rb
+++ b/src/drc/drc/built-in-macros/_drc_engine.rb
@@ -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)
diff --git a/src/drc/drc/built-in-macros/_drc_layer.rb b/src/drc/drc/built-in-macros/_drc_layer.rb
index 9ebc03775..f13b8b9c6 100644
--- a/src/drc/drc/built-in-macros/_drc_layer.rb
+++ b/src/drc/drc/built-in-macros/_drc_layer.rb
@@ -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)
diff --git a/src/drc/drc/built-in-macros/drc_interpreters.lym b/src/drc/drc/built-in-macros/drc_interpreters.lym
index f1affc3d7..cea344114 100644
--- a/src/drc/drc/built-in-macros/drc_interpreters.lym
+++ b/src/drc/drc/built-in-macros/drc_interpreters.lym
@@ -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)
diff --git a/src/lay/lay/doc/about/drc_ref_global.xml b/src/lay/lay/doc/about/drc_ref_global.xml
index bcfe6bc2f..48877b955 100644
--- a/src/lay/lay/doc/about/drc_ref_global.xml
+++ b/src/lay/lay/doc/about/drc_ref_global.xml
@@ -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 if_all for an example how to use the if_... functions.
-"info" - Outputs as message to the logger window
+"info" - Outputs as message to the logger or progress window
Usage:
@@ -747,7 +747,7 @@ See if_all for an example how to use the if_... functions.
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.
"input" - Fetches the shapes from the specified input from the default source
diff --git a/src/lay/lay/layLogViewerDialog.cc b/src/lay/lay/layLogViewerDialog.cc
index e0ca83912..b3604b652 100644
--- a/src/lay/lay/layLogViewerDialog.cc
+++ b/src/lay/lay/layLogViewerDialog.cc
@@ -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),