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