mirror of https://github.com/KLayout/klayout.git
Fixed DRC logging.
This commit is contained in:
parent
e639c30570
commit
a904aabcce
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
Loading…
Reference in New Issue