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.
-Usage:
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.