TraceParser.cc revision 12266
110515SAli.Saidi@ARM.com/*
210515SAli.Saidi@ARM.com * Copyright (c) 2012-2014, TU Delft
311441Sandreas.hansson@arm.com * Copyright (c) 2012-2014, TU Eindhoven
411441Sandreas.hansson@arm.com * Copyright (c) 2012-2014, TU Kaiserslautern
511441Sandreas.hansson@arm.com * All rights reserved.
610515SAli.Saidi@ARM.com *
711530Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
811530Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
911530Sandreas.sandberg@arm.com * met:
1011530Sandreas.sandberg@arm.com *
1111530Sandreas.sandberg@arm.com * 1. Redistributions of source code must retain the above copyright
1211441Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer.
1311441Sandreas.hansson@arm.com *
1410515SAli.Saidi@ARM.com * 2. Redistributions in binary form must reproduce the above copyright
1510515SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the
1611530Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution.
1711441Sandreas.hansson@arm.com *
1811441Sandreas.hansson@arm.com * 3. Neither the name of the copyright holder nor the names of its
1911441Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
2011441Sandreas.hansson@arm.com * this software without specific prior written permission.
2111441Sandreas.hansson@arm.com *
2211441Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
2311441Sandreas.hansson@arm.com * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2411441Sandreas.hansson@arm.com * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
2511441Sandreas.hansson@arm.com * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2610636Snilay@cs.wisc.edu * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2711441Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
2811441Sandreas.hansson@arm.com * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2911441Sandreas.hansson@arm.com * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3011441Sandreas.hansson@arm.com * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3111441Sandreas.hansson@arm.com * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3211441Sandreas.hansson@arm.com * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3311441Sandreas.hansson@arm.com *
3411441Sandreas.hansson@arm.com * Authors: Omar Naji
3510636Snilay@cs.wisc.edu *
3611441Sandreas.hansson@arm.com */
3711441Sandreas.hansson@arm.com#include "TraceParser.h"
3811441Sandreas.hansson@arm.com
3911441Sandreas.hansson@arm.com#include "CommandAnalysis.h"
4011441Sandreas.hansson@arm.com#include "CmdScheduler.h"
4111441Sandreas.hansson@arm.com
4211441Sandreas.hansson@arm.comusing namespace Data;
4311441Sandreas.hansson@arm.comusing namespace std;
4411441Sandreas.hansson@arm.com
4511441Sandreas.hansson@arm.comTraceParser::TraceParser(const MemorySpecification& memSpec) :
4610892Sandreas.hansson@arm.com  counters(memSpec)
4711441Sandreas.hansson@arm.com{
4811441Sandreas.hansson@arm.com}
4911441Sandreas.hansson@arm.com
5011441Sandreas.hansson@arm.com
5111441Sandreas.hansson@arm.comData::MemCommand TraceParser::parseLine(std::string line)
5211441Sandreas.hansson@arm.com{
5311441Sandreas.hansson@arm.com  MemCommand memcmd(MemCommand::UNINITIALIZED, 0, 0);
5411441Sandreas.hansson@arm.com  istringstream linestream(line);
5511441Sandreas.hansson@arm.com  string item;
5611441Sandreas.hansson@arm.com  int64_t item_val;
5711441Sandreas.hansson@arm.com  unsigned itemnum = 0;
5811441Sandreas.hansson@arm.com
5911441Sandreas.hansson@arm.com  while (getline(linestream, item, ',')) {
6011441Sandreas.hansson@arm.com    if (itemnum == 0) {
6111441Sandreas.hansson@arm.com      stringstream timestamp(item);
6211441Sandreas.hansson@arm.com      timestamp >> item_val;
6311441Sandreas.hansson@arm.com      memcmd.setTime(item_val);
6411441Sandreas.hansson@arm.com    } else if (itemnum == 1) {
6511441Sandreas.hansson@arm.com      item_val = MemCommand::getTypeFromName(item);
6611336Sandreas.hansson@arm.com      memcmd.setType(static_cast<MemCommand::cmds>(item_val));
6711441Sandreas.hansson@arm.com    } else if (itemnum == 2) {
6811441Sandreas.hansson@arm.com      stringstream bank(item);
6911441Sandreas.hansson@arm.com      bank >> item_val;
7011441Sandreas.hansson@arm.com      memcmd.setBank(static_cast<unsigned>(item_val));
7111441Sandreas.hansson@arm.com    }
7211441Sandreas.hansson@arm.com    itemnum++;
7311441Sandreas.hansson@arm.com  }
7411441Sandreas.hansson@arm.com  return memcmd;
7511441Sandreas.hansson@arm.com} // TraceParser::parseLine
7611441Sandreas.hansson@arm.com
7711441Sandreas.hansson@arm.comvoid TraceParser::parseFile(MemorySpecification memSpec, std::ifstream& trace,
7811441Sandreas.hansson@arm.com                            int window, int grouping,  int interleaving, int burst,
7911441Sandreas.hansson@arm.com                            int powerdown, int trans)
8011441Sandreas.hansson@arm.com{
8111441Sandreas.hansson@arm.com  ifstream pwr_trace;
8211441Sandreas.hansson@arm.com
8311441Sandreas.hansson@arm.com  counters = CommandAnalysis(memSpec);
8411441Sandreas.hansson@arm.com  int  nCommands  = 0;
8511441Sandreas.hansson@arm.com  bool lastupdate = false;
8611441Sandreas.hansson@arm.com  if (trans) {
8711441Sandreas.hansson@arm.com    cmdScheduler cmdsched;
8811441Sandreas.hansson@arm.com    cmdsched.transTranslation(memSpec, trace, grouping, interleaving, burst, powerdown);
8911441Sandreas.hansson@arm.com    pwr_trace.open("commands.trace", ifstream::in);
9011441Sandreas.hansson@arm.com    std::string line;
9111441Sandreas.hansson@arm.com    while (getline(pwr_trace, line)) {
9211441Sandreas.hansson@arm.com      MemCommand cmdline = parseLine(line);
9311441Sandreas.hansson@arm.com      cmd_list.push_back(cmdline);
9411441Sandreas.hansson@arm.com      nCommands++;
9511441Sandreas.hansson@arm.com      if (nCommands == window) {
9611441Sandreas.hansson@arm.com        counters.getCommands(cmd_list, lastupdate);
9711441Sandreas.hansson@arm.com        nCommands = 0;
9811441Sandreas.hansson@arm.com        cmd_list.clear();
9910515SAli.Saidi@ARM.com      }
10011441Sandreas.hansson@arm.com    }
10111441Sandreas.hansson@arm.com    lastupdate = true;
10210515SAli.Saidi@ARM.com    counters.getCommands(cmd_list, lastupdate);
10310515SAli.Saidi@ARM.com    cmd_list.clear();
10410515SAli.Saidi@ARM.com    pwr_trace.close();
10510515SAli.Saidi@ARM.com  } else   {
10610515SAli.Saidi@ARM.com    std::string line;
10710515SAli.Saidi@ARM.com    while (getline(trace, line)) {
10811441Sandreas.hansson@arm.com      MemCommand cmdline = parseLine(line);
10910515SAli.Saidi@ARM.com      cmd_list.push_back(cmdline);
11010515SAli.Saidi@ARM.com      nCommands++;
11110515SAli.Saidi@ARM.com      if (nCommands == window) {
11210515SAli.Saidi@ARM.com        counters.getCommands(cmd_list, lastupdate);
11310515SAli.Saidi@ARM.com        nCommands = 0;
11410515SAli.Saidi@ARM.com        cmd_list.clear();
11511441Sandreas.hansson@arm.com      }
11611441Sandreas.hansson@arm.com    }
11711441Sandreas.hansson@arm.com    lastupdate = true;
11811441Sandreas.hansson@arm.com    counters.getCommands(cmd_list, lastupdate);
11911441Sandreas.hansson@arm.com    cmd_list.clear();
12011441Sandreas.hansson@arm.com  }
12111441Sandreas.hansson@arm.com  counters.clear();
12211441Sandreas.hansson@arm.com  trace.close();
12311441Sandreas.hansson@arm.com} // TraceParser::parseFile
12411441Sandreas.hansson@arm.com