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