CAHelpers.cc revision 12266
112266Sradhika.jagtap@arm.com/* 212266Sradhika.jagtap@arm.com * Copyright (c) 2012-2014, TU Delft 312266Sradhika.jagtap@arm.com * Copyright (c) 2012-2014, TU Eindhoven 412266Sradhika.jagtap@arm.com * Copyright (c) 2012-2014, TU Kaiserslautern 512266Sradhika.jagtap@arm.com * All rights reserved. 612266Sradhika.jagtap@arm.com * 712266Sradhika.jagtap@arm.com * Redistribution and use in source and binary forms, with or without 812266Sradhika.jagtap@arm.com * modification, are permitted provided that the following conditions are 912266Sradhika.jagtap@arm.com * met: 1012266Sradhika.jagtap@arm.com * 1112266Sradhika.jagtap@arm.com * 1. Redistributions of source code must retain the above copyright 1212266Sradhika.jagtap@arm.com * notice, this list of conditions and the following disclaimer. 1312266Sradhika.jagtap@arm.com * 1412266Sradhika.jagtap@arm.com * 2. Redistributions in binary form must reproduce the above copyright 1512266Sradhika.jagtap@arm.com * notice, this list of conditions and the following disclaimer in the 1612266Sradhika.jagtap@arm.com * documentation and/or other materials provided with the distribution. 1712266Sradhika.jagtap@arm.com * 1812266Sradhika.jagtap@arm.com * 3. Neither the name of the copyright holder nor the names of its 1912266Sradhika.jagtap@arm.com * contributors may be used to endorse or promote products derived from 2012266Sradhika.jagtap@arm.com * this software without specific prior written permission. 2112266Sradhika.jagtap@arm.com * 2212266Sradhika.jagtap@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 2312266Sradhika.jagtap@arm.com * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2412266Sradhika.jagtap@arm.com * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 2512266Sradhika.jagtap@arm.com * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2612266Sradhika.jagtap@arm.com * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2712266Sradhika.jagtap@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 2812266Sradhika.jagtap@arm.com * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2912266Sradhika.jagtap@arm.com * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 3012266Sradhika.jagtap@arm.com * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 3112266Sradhika.jagtap@arm.com * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3212266Sradhika.jagtap@arm.com * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3312266Sradhika.jagtap@arm.com * 3412266Sradhika.jagtap@arm.com */ 3512266Sradhika.jagtap@arm.com 3612266Sradhika.jagtap@arm.com#include <cstdio> 3712266Sradhika.jagtap@arm.com#include <algorithm> // std::count 3812266Sradhika.jagtap@arm.com#include <string> 3912266Sradhika.jagtap@arm.com 4012266Sradhika.jagtap@arm.com#include "CommandAnalysis.h" 4112266Sradhika.jagtap@arm.com 4212266Sradhika.jagtap@arm.comusing std::cerr; 4312266Sradhika.jagtap@arm.comusing std::endl; 4412266Sradhika.jagtap@arm.comusing std::string; 4512266Sradhika.jagtap@arm.com 4612266Sradhika.jagtap@arm.comusing namespace Data; 4712266Sradhika.jagtap@arm.com 4812266Sradhika.jagtap@arm.com 4912266Sradhika.jagtap@arm.com// To get the time of completion of the issued command 5012266Sradhika.jagtap@arm.com// Derived based on JEDEC specifications 5112266Sradhika.jagtap@arm.com 5212266Sradhika.jagtap@arm.comint64_t CommandAnalysis::timeToCompletion(MemCommand::cmds type) 5312266Sradhika.jagtap@arm.com{ 5412266Sradhika.jagtap@arm.com int64_t offset = 0; 5512266Sradhika.jagtap@arm.com const MemTimingSpec& memTimingSpec = memSpec.memTimingSpec; 5612266Sradhika.jagtap@arm.com const MemArchitectureSpec& memArchSpec = memSpec.memArchSpec; 5712266Sradhika.jagtap@arm.com 5812266Sradhika.jagtap@arm.com if (type == MemCommand::RD) { 5912266Sradhika.jagtap@arm.com offset = memTimingSpec.RL + 6012266Sradhika.jagtap@arm.com memTimingSpec.DQSCK + 1 + (memArchSpec.burstLength / 6112266Sradhika.jagtap@arm.com memArchSpec.dataRate); 6212266Sradhika.jagtap@arm.com } else if (type == MemCommand::WR) { 6312266Sradhika.jagtap@arm.com offset = memTimingSpec.WL + 6412266Sradhika.jagtap@arm.com (memArchSpec.burstLength / memArchSpec.dataRate) + 6512266Sradhika.jagtap@arm.com memTimingSpec.WR; 6612266Sradhika.jagtap@arm.com } else if (type == MemCommand::ACT) { 6712266Sradhika.jagtap@arm.com offset = memTimingSpec.RCD; 6812266Sradhika.jagtap@arm.com } else if ((type == MemCommand::PRE) || (type == MemCommand::PREA)) { 6912266Sradhika.jagtap@arm.com offset = memTimingSpec.RP; 7012266Sradhika.jagtap@arm.com } 7112266Sradhika.jagtap@arm.com return offset; 7212266Sradhika.jagtap@arm.com} // CommandAnalysis::timeToCompletion 7312266Sradhika.jagtap@arm.com 7412266Sradhika.jagtap@arm.com 7512266Sradhika.jagtap@arm.com// Returns the number of active banks based on the bank_state vector. 7612266Sradhika.jagtap@arm.comunsigned CommandAnalysis::get_num_active_banks(void) 7712266Sradhika.jagtap@arm.com{ 7812266Sradhika.jagtap@arm.com return (unsigned)std::count(bank_state.begin(), bank_state.end(), BANK_ACTIVE); 7912266Sradhika.jagtap@arm.com} 8012266Sradhika.jagtap@arm.com 8112266Sradhika.jagtap@arm.com// Naming-standard compliant wrapper 8212266Sradhika.jagtap@arm.comunsigned CommandAnalysis::nActiveBanks(void) 8312266Sradhika.jagtap@arm.com{ 8412266Sradhika.jagtap@arm.com return CommandAnalysis::get_num_active_banks(); 8512266Sradhika.jagtap@arm.com} 8612266Sradhika.jagtap@arm.com 8712266Sradhika.jagtap@arm.combool CommandAnalysis::isPrecharged(unsigned bank) 8812266Sradhika.jagtap@arm.com{ 8912266Sradhika.jagtap@arm.com return bank_state[bank] == BANK_PRECHARGED; 9012266Sradhika.jagtap@arm.com} 9112266Sradhika.jagtap@arm.com 9212266Sradhika.jagtap@arm.comvoid CommandAnalysis::printWarningIfActive(const string& warning, int type, int64_t timestamp, unsigned bank) 9312266Sradhika.jagtap@arm.com{ 9412266Sradhika.jagtap@arm.com if (get_num_active_banks() != 0) { 9512266Sradhika.jagtap@arm.com printWarning(warning, type, timestamp, bank); 9612266Sradhika.jagtap@arm.com } 9712266Sradhika.jagtap@arm.com} 9812266Sradhika.jagtap@arm.com 9912266Sradhika.jagtap@arm.comvoid CommandAnalysis::printWarningIfNotActive(const string& warning, int type, int64_t timestamp, unsigned bank) 10012266Sradhika.jagtap@arm.com{ 10112266Sradhika.jagtap@arm.com if (get_num_active_banks() == 0) { 10212266Sradhika.jagtap@arm.com printWarning(warning, type, timestamp, bank); 10312266Sradhika.jagtap@arm.com } 10412266Sradhika.jagtap@arm.com} 10512266Sradhika.jagtap@arm.com 10612266Sradhika.jagtap@arm.comvoid CommandAnalysis::printWarningIfPoweredDown(const string& warning, int type, int64_t timestamp, unsigned bank) 10712266Sradhika.jagtap@arm.com{ 10812266Sradhika.jagtap@arm.com if (mem_state != 0) { 10912266Sradhika.jagtap@arm.com printWarning(warning, type, timestamp, bank); 11012266Sradhika.jagtap@arm.com } 11112266Sradhika.jagtap@arm.com} 11212266Sradhika.jagtap@arm.com 11312266Sradhika.jagtap@arm.comvoid CommandAnalysis::printWarning(const string& warning, int type, int64_t timestamp, unsigned bank) 11412266Sradhika.jagtap@arm.com{ 11512266Sradhika.jagtap@arm.com cerr << "WARNING: " << warning << endl; 11612266Sradhika.jagtap@arm.com cerr << "Command: " << type << ", Timestamp: " << timestamp << 11712266Sradhika.jagtap@arm.com ", Bank: " << bank << endl; 11812266Sradhika.jagtap@arm.com} 119