xref: /aosp_15_r20/external/vixl/tools/printer.py (revision f5c631da2f1efdd72b5fd1e20510e4042af13d77)
1*f5c631daSSadaf Ebrahimi#!/usr/bin/env python2.7
2*f5c631daSSadaf Ebrahimi
3*f5c631daSSadaf Ebrahimi# Copyright 2014, VIXL authors
4*f5c631daSSadaf Ebrahimi# All rights reserved.
5*f5c631daSSadaf Ebrahimi#
6*f5c631daSSadaf Ebrahimi# Redistribution and use in source and binary forms, with or without
7*f5c631daSSadaf Ebrahimi# modification, are permitted provided that the following conditions are met:
8*f5c631daSSadaf Ebrahimi#
9*f5c631daSSadaf Ebrahimi#   * Redistributions of source code must retain the above copyright notice,
10*f5c631daSSadaf Ebrahimi#     this list of conditions and the following disclaimer.
11*f5c631daSSadaf Ebrahimi#   * Redistributions in binary form must reproduce the above copyright notice,
12*f5c631daSSadaf Ebrahimi#     this list of conditions and the following disclaimer in the documentation
13*f5c631daSSadaf Ebrahimi#     and/or other materials provided with the distribution.
14*f5c631daSSadaf Ebrahimi#   * Neither the name of ARM Limited nor the names of its contributors may be
15*f5c631daSSadaf Ebrahimi#     used to endorse or promote products derived from this software without
16*f5c631daSSadaf Ebrahimi#     specific prior written permission.
17*f5c631daSSadaf Ebrahimi#
18*f5c631daSSadaf Ebrahimi# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
19*f5c631daSSadaf Ebrahimi# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20*f5c631daSSadaf Ebrahimi# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21*f5c631daSSadaf Ebrahimi# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
22*f5c631daSSadaf Ebrahimi# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23*f5c631daSSadaf Ebrahimi# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24*f5c631daSSadaf Ebrahimi# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25*f5c631daSSadaf Ebrahimi# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26*f5c631daSSadaf Ebrahimi# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*f5c631daSSadaf Ebrahimi# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*f5c631daSSadaf Ebrahimi
29*f5c631daSSadaf Ebrahimi
30*f5c631daSSadaf Ebrahimiimport sys
31*f5c631daSSadaf Ebrahimiimport time
32*f5c631daSSadaf Ebrahimiimport multiprocessing
33*f5c631daSSadaf Ebrahimi
34*f5c631daSSadaf Ebrahimioutput_redirected_to_file = not sys.stdout.isatty()
35*f5c631daSSadaf Ebrahimi
36*f5c631daSSadaf Ebrahimidef ColourCode(colour):
37*f5c631daSSadaf Ebrahimi  return '' if output_redirected_to_file else colour
38*f5c631daSSadaf Ebrahimi
39*f5c631daSSadaf EbrahimiCOLOUR_GREEN =  ColourCode("\x1b[0;32m")
40*f5c631daSSadaf EbrahimiCOLOUR_ORANGE = ColourCode("\x1b[0;33m")
41*f5c631daSSadaf EbrahimiCOLOUR_RED =    ColourCode("\x1b[0;31m")
42*f5c631daSSadaf EbrahimiNO_COLOUR =     ColourCode("\x1b[0m")
43*f5c631daSSadaf Ebrahimi
44*f5c631daSSadaf Ebrahimi# Indicates the 'type' of the last printed line.
45*f5c631daSSadaf EbrahimiLINE_TYPE_NONE = 0
46*f5c631daSSadaf Ebrahimi# Any type below this one is overwritable.
47*f5c631daSSadaf EbrahimiLINE_TYPE_OVERWRITABLE = 1
48*f5c631daSSadaf EbrahimiLINE_TYPE_PROGRESS = 2
49*f5c631daSSadaf EbrahimiLINE_TYPE_LINTER = 3
50*f5c631daSSadaf Ebrahimi
51*f5c631daSSadaf Ebrahimi__print_lock__ = multiprocessing.Lock()
52*f5c631daSSadaf Ebrahimi__last_overwritable_line_length__ = multiprocessing.Value('i', 0)
53*f5c631daSSadaf Ebrahimi__last_line_type__ = multiprocessing.Value('i', LINE_TYPE_NONE)
54*f5c631daSSadaf Ebrahimi
55*f5c631daSSadaf Ebrahimi
56*f5c631daSSadaf Ebrahimidef EnsureNewLine():
57*f5c631daSSadaf Ebrahimi  if __last_line_type__.value >= LINE_TYPE_OVERWRITABLE:
58*f5c631daSSadaf Ebrahimi    sys.stdout.write('\n')
59*f5c631daSSadaf Ebrahimi    __last_line_type__.value = LINE_TYPE_NONE
60*f5c631daSSadaf Ebrahimi
61*f5c631daSSadaf Ebrahimi
62*f5c631daSSadaf Ebrahimidef PrintInternal(string):
63*f5c631daSSadaf Ebrahimi  sys.stdout.write(string)
64*f5c631daSSadaf Ebrahimi  spaces = __last_overwritable_line_length__.value - len(string)
65*f5c631daSSadaf Ebrahimi  if spaces > 0:
66*f5c631daSSadaf Ebrahimi    sys.stdout.write(' ' * spaces)
67*f5c631daSSadaf Ebrahimi
68*f5c631daSSadaf Ebrahimi
69*f5c631daSSadaf Ebrahimidef Print(string, has_lock = False):
70*f5c631daSSadaf Ebrahimi  if not has_lock: __print_lock__.acquire()
71*f5c631daSSadaf Ebrahimi
72*f5c631daSSadaf Ebrahimi  if __last_line_type__.value != LINE_TYPE_NONE:
73*f5c631daSSadaf Ebrahimi    sys.stdout.write('\n')
74*f5c631daSSadaf Ebrahimi
75*f5c631daSSadaf Ebrahimi  PrintInternal(string)
76*f5c631daSSadaf Ebrahimi  sys.stdout.write('\n')
77*f5c631daSSadaf Ebrahimi  __last_overwritable_line_length__.value = 0
78*f5c631daSSadaf Ebrahimi  __last_line_type__.value = LINE_TYPE_NONE
79*f5c631daSSadaf Ebrahimi
80*f5c631daSSadaf Ebrahimi  if not has_lock: __print_lock__.release()
81*f5c631daSSadaf Ebrahimi
82*f5c631daSSadaf Ebrahimi
83*f5c631daSSadaf Ebrahimi# Lines of a specific type only overwrite and can only be overwritten by lines
84*f5c631daSSadaf Ebrahimi# of the same type.
85*f5c631daSSadaf Ebrahimidef PrintOverwritableLine(string, has_lock = False, type = LINE_TYPE_NONE):
86*f5c631daSSadaf Ebrahimi  if not has_lock: __print_lock__.acquire()
87*f5c631daSSadaf Ebrahimi
88*f5c631daSSadaf Ebrahimi  if (__last_line_type__.value != type) and \
89*f5c631daSSadaf Ebrahimi      (__last_line_type__.value >= LINE_TYPE_OVERWRITABLE):
90*f5c631daSSadaf Ebrahimi    sys.stdout.write('\n')
91*f5c631daSSadaf Ebrahimi
92*f5c631daSSadaf Ebrahimi  PrintInternal(string)
93*f5c631daSSadaf Ebrahimi  if not output_redirected_to_file:
94*f5c631daSSadaf Ebrahimi    sys.stdout.write('\r')
95*f5c631daSSadaf Ebrahimi  else:
96*f5c631daSSadaf Ebrahimi    sys.stdout.write('\n')
97*f5c631daSSadaf Ebrahimi  sys.stdout.flush()
98*f5c631daSSadaf Ebrahimi
99*f5c631daSSadaf Ebrahimi  __last_overwritable_line_length__.value = len(string)
100*f5c631daSSadaf Ebrahimi  __last_line_type__.value = type
101*f5c631daSSadaf Ebrahimi
102*f5c631daSSadaf Ebrahimi  if not has_lock: __print_lock__.release()
103*f5c631daSSadaf Ebrahimi
104*f5c631daSSadaf Ebrahimi
105*f5c631daSSadaf Ebrahimi# Display the run progress:
106*f5c631daSSadaf Ebrahimi# prefix [time| progress|+ passed|- failed]  name
107*f5c631daSSadaf Ebrahimidef UpdateProgress(start_time, passed, failed, count, skipped, known_failures,
108*f5c631daSSadaf Ebrahimi                   name, prefix = '', prevent_next_overwrite = False,
109*f5c631daSSadaf Ebrahimi                   has_lock = False):
110*f5c631daSSadaf Ebrahimi  minutes, seconds = divmod(time.time() - start_time, 60)
111*f5c631daSSadaf Ebrahimi  progress = float(passed + failed + skipped) / max(1, count) * 100
112*f5c631daSSadaf Ebrahimi  passed_colour = COLOUR_GREEN if passed != 0 else ''
113*f5c631daSSadaf Ebrahimi  failed_colour = COLOUR_RED if failed != 0 else ''
114*f5c631daSSadaf Ebrahimi  skipped_colour = COLOUR_ORANGE if (skipped + known_failures) != 0 else ''
115*f5c631daSSadaf Ebrahimi  indicator = '[%02d:%02d| %3d%%|'
116*f5c631daSSadaf Ebrahimi  indicator += passed_colour + '+ %d' + NO_COLOUR + '|'
117*f5c631daSSadaf Ebrahimi  indicator += failed_colour + '- %d' + NO_COLOUR + '|'
118*f5c631daSSadaf Ebrahimi  indicator += skipped_colour + '? %d' + NO_COLOUR + ']'
119*f5c631daSSadaf Ebrahimi
120*f5c631daSSadaf Ebrahimi  progress_string = prefix
121*f5c631daSSadaf Ebrahimi  progress_string += indicator % (minutes, seconds, progress, passed, failed,
122*f5c631daSSadaf Ebrahimi                                  skipped + known_failures)
123*f5c631daSSadaf Ebrahimi  progress_string += '  ' + name
124*f5c631daSSadaf Ebrahimi
125*f5c631daSSadaf Ebrahimi  PrintOverwritableLine(progress_string, type = LINE_TYPE_PROGRESS,
126*f5c631daSSadaf Ebrahimi                        has_lock = has_lock)
127*f5c631daSSadaf Ebrahimi  if prevent_next_overwrite:
128*f5c631daSSadaf Ebrahimi    sys.stdout.write('\n')
129*f5c631daSSadaf Ebrahimi    __last_line_type__.value = LINE_TYPE_NONE
130