1baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret#    Copyright 2017 ARM Limited
2baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret#
3baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret# Licensed under the Apache License, Version 2.0 (the "License");
4baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret# you may not use this file except in compliance with the License.
5baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret# You may obtain a copy of the License at
6baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret#
7baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret#     http://www.apache.org/licenses/LICENSE-2.0
8baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret#
9baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret# Unless required by applicable law or agreed to in writing, software
10baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret# distributed under the License is distributed on an "AS IS" BASIS,
11baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret# See the License for the specific language governing permissions and
13baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret# limitations under the License.
14baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret
15baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perretimport re
1634d73e6af1b170178f9b9923637ce789d7985161Quentin Perretimport logging
1734d73e6af1b170178f9b9923637ce789d7985161Quentin Perret
1834d73e6af1b170178f9b9923637ce789d7985161Quentin Perretfrom devlib.utils.types import numeric
19baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret
20baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret
21baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin PerretGEM5STATS_FIELD_REGEX = re.compile("^(?P<key>[^- ]\S*) +(?P<value>[^#]+).+$")
22baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin PerretGEM5STATS_DUMP_HEAD = '---------- Begin Simulation Statistics ----------'
23baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin PerretGEM5STATS_DUMP_TAIL = '---------- End Simulation Statistics   ----------'
24baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin PerretGEM5STATS_ROI_NUMBER = 8
25baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret
2634d73e6af1b170178f9b9923637ce789d7985161Quentin Perretlogger = logging.getLogger('gem5')
2734d73e6af1b170178f9b9923637ce789d7985161Quentin Perret
28baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret
29baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perretdef iter_statistics_dump(stats_file):
30baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret    '''
31baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret    Yields statistics dumps as dicts. The parameter is assumed to be a stream
32baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret    reading from the statistics log file.
33baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret    '''
34baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret    cur_dump = {}
35baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret    while True:
36baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret        line = stats_file.readline()
37baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret        if not line:
38baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret            break
39baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret        if GEM5STATS_DUMP_TAIL in line:
40baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret            yield cur_dump
41baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret            cur_dump = {}
42baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret        else:
43baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret            res = GEM5STATS_FIELD_REGEX.match(line)
44baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret            if res:
45baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret                k = res.group("key")
4634d73e6af1b170178f9b9923637ce789d7985161Quentin Perret                vtext = res.group("value")
4734d73e6af1b170178f9b9923637ce789d7985161Quentin Perret                try:
4834d73e6af1b170178f9b9923637ce789d7985161Quentin Perret                    v = map(numeric, vtext.split())
4934d73e6af1b170178f9b9923637ce789d7985161Quentin Perret                    cur_dump[k] = v[0] if len(v)==1 else set(v)
5034d73e6af1b170178f9b9923637ce789d7985161Quentin Perret                except ValueError:
5134d73e6af1b170178f9b9923637ce789d7985161Quentin Perret                    msg = 'Found non-numeric entry in gem5 stats ({}: {})'
5234d73e6af1b170178f9b9923637ce789d7985161Quentin Perret                    logger.warning(msg.format(k, vtext))
53baedd676a94c6f912d52f4d5fad5fe5eff724616Quentin Perret
54