TraceParser.cc revision 10428:0caf62b57dfd
1/*
2 * Copyright (c) 2012-2014, TU Delft
3 * Copyright (c) 2012-2014, TU Eindhoven
4 * Copyright (c) 2012-2014, TU Kaiserslautern
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 *
18 * 3. Neither the name of the copyright holder nor the names of its
19 * contributors may be used to endorse or promote products derived from
20 * this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
23 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
28 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 *
34 * Authors: Omar Naji
35 *
36 */
37#include "TraceParser.h"
38
39#include "CommandAnalysis.h"
40#include "CmdScheduler.h"
41
42using namespace Data;
43using namespace std;
44
45Data::MemCommand TraceParser::parseLine(std::string line)
46{
47  MemCommand memcmd;
48  istringstream linestream(line);
49  string item;
50  double item_val;
51  unsigned itemnum = 0;
52  MemCommand::cmds type = MemCommand::NOP; // Initialized to prevent warning
53
54  while (getline(linestream, item, ',')) {
55    if (itemnum == 0) {
56      stringstream timestamp(item);
57      timestamp >> item_val;
58      memcmd.setTime(item_val);
59    } else if (itemnum == 1) {
60      item_val = MemCommand::getTypeFromName(item);
61      memcmd.setType(static_cast<MemCommand::cmds>(item_val));
62    } else if (itemnum == 2) {
63      stringstream bank(item);
64      bank >> item_val;
65      memcmd.setType(type);
66      memcmd.setBank(static_cast<unsigned>(item_val));
67    }
68    type = memcmd.getType();
69    itemnum++;
70  }
71  return memcmd;
72} // TraceParser::parseLine
73
74void TraceParser::parseFile(MemorySpecification memSpec, std::ifstream& trace,
75                            int window, int grouping,  int interleaving, int burst,
76                            int powerdown, int trans)
77{
78  ifstream pwr_trace;
79
80  counters = CommandAnalysis(memSpec.memArchSpec.nbrOfBanks);
81  int  nCommands  = 0;
82  bool lastupdate = false;
83  if (trans) {
84    cmdScheduler cmdsched;
85    cmdsched.transTranslation(memSpec, trace, grouping, interleaving, burst, powerdown);
86    pwr_trace.open("commands.trace", ifstream::in);
87    std::string line;
88    while (getline(pwr_trace, line)) {
89      MemCommand cmdline = parseLine(line);
90      cmd_list.push_back(cmdline);
91      nCommands++;
92      if (nCommands == window) {
93        counters.getCommands(memSpec, memSpec.memArchSpec.nbrOfBanks, cmd_list, lastupdate);
94        nCommands = 0;
95        cmd_list.clear();
96      }
97    }
98    lastupdate = true;
99    counters.getCommands(memSpec, memSpec.memArchSpec.nbrOfBanks, cmd_list, lastupdate);
100    cmd_list.clear();
101    pwr_trace.close();
102  } else   {
103    std::string line;
104    while (getline(trace, line)) {
105      MemCommand cmdline = parseLine(line);
106      cmd_list.push_back(cmdline);
107      nCommands++;
108      if (nCommands == window) {
109        counters.getCommands(memSpec, memSpec.memArchSpec.nbrOfBanks, cmd_list, lastupdate);
110        nCommands = 0;
111        cmd_list.clear();
112      }
113    }
114    lastupdate = true;
115    counters.getCommands(memSpec, memSpec.memArchSpec.nbrOfBanks, cmd_list, lastupdate);
116    cmd_list.clear();
117  }
118  counters.clear();
119  trace.close();
120} // TraceParser::parseFile
121