110428Sandreas.hansson@arm.com/* 210428Sandreas.hansson@arm.com * Copyright (c) 2014, TU Delft, TU Eindhoven and TU Kaiserslautern 310428Sandreas.hansson@arm.com * All rights reserved. 410428Sandreas.hansson@arm.com * 510428Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 610428Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 710428Sandreas.hansson@arm.com * met: 810428Sandreas.hansson@arm.com * 910428Sandreas.hansson@arm.com * 1. Redistributions of source code must retain the above copyright 1010428Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer. 1110428Sandreas.hansson@arm.com * 1210428Sandreas.hansson@arm.com * 2. Redistributions in binary form must reproduce the above copyright 1310428Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1410428Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution. 1510428Sandreas.hansson@arm.com * 1610428Sandreas.hansson@arm.com * 3. Neither the name of the copyright holder nor the names of its 1710428Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 1810428Sandreas.hansson@arm.com * this software without specific prior written permission. 1910428Sandreas.hansson@arm.com * 2010428Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 2110428Sandreas.hansson@arm.com * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2210428Sandreas.hansson@arm.com * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 2310428Sandreas.hansson@arm.com * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2410428Sandreas.hansson@arm.com * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2510428Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 2610428Sandreas.hansson@arm.com * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2710428Sandreas.hansson@arm.com * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2810428Sandreas.hansson@arm.com * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2910428Sandreas.hansson@arm.com * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3010428Sandreas.hansson@arm.com * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3110428Sandreas.hansson@arm.com * 3212266Sradhika.jagtap@arm.com * Authors: Matthias Jung, Omar Naji, Felipe S. Prado 3310428Sandreas.hansson@arm.com * 3410428Sandreas.hansson@arm.com */ 3510428Sandreas.hansson@arm.com 3612266Sradhika.jagtap@arm.com#include <iostream> 3710428Sandreas.hansson@arm.com#include <string> 3810428Sandreas.hansson@arm.com#include "libdrampower/LibDRAMPower.h" 3910428Sandreas.hansson@arm.com 4010428Sandreas.hansson@arm.com#if USE_XERCES 4112266Sradhika.jagtap@arm.com#include "xmlparser/MemSpecParser.h" 4210428Sandreas.hansson@arm.com#endif 4310428Sandreas.hansson@arm.com 4410428Sandreas.hansson@arm.comusing namespace std; 4510428Sandreas.hansson@arm.comusing namespace Data; 4610428Sandreas.hansson@arm.com 4710428Sandreas.hansson@arm.comint main(int argc, char* argv[]) 4810428Sandreas.hansson@arm.com{ 4912266Sradhika.jagtap@arm.com assert(argc == 2); 5012266Sradhika.jagtap@arm.com //Setup of DRAMPower for your simulation 5112266Sradhika.jagtap@arm.com string filename; 5212266Sradhika.jagtap@arm.com //type path to memspec file 5312266Sradhika.jagtap@arm.com filename = argv[1]; 5412266Sradhika.jagtap@arm.com //Parsing the Memspec specification of found in memspec folder 5512266Sradhika.jagtap@arm.com#if USE_XERCES 5612266Sradhika.jagtap@arm.com MemorySpecification memSpec(MemSpecParser::getMemSpecFromXML(filename)); 5712266Sradhika.jagtap@arm.com#else 5812266Sradhika.jagtap@arm.com MemorySpecification memSpec; 5912266Sradhika.jagtap@arm.com#endif 6012266Sradhika.jagtap@arm.com libDRAMPower test = libDRAMPower(memSpec, 0); 6110428Sandreas.hansson@arm.com 6212266Sradhika.jagtap@arm.com ios_base::fmtflags flags = cout.flags(); 6312266Sradhika.jagtap@arm.com streamsize precision = cout.precision(); 6412266Sradhika.jagtap@arm.com cout.precision(2); 6512266Sradhika.jagtap@arm.com cout << fixed << endl; 6610428Sandreas.hansson@arm.com 6712266Sradhika.jagtap@arm.com // During the simulation you can report activity 6812266Sradhika.jagtap@arm.com // to DRAMPower with the doCommand(...) function: 6912266Sradhika.jagtap@arm.com test.doCommand(MemCommand::ACT,0,35); 7012266Sradhika.jagtap@arm.com test.doCommand(MemCommand::RDA,0,50); 7112266Sradhika.jagtap@arm.com test.doCommand(MemCommand::ACT,4,51); 7212266Sradhika.jagtap@arm.com test.doCommand(MemCommand::RDA,4,66); 7312266Sradhika.jagtap@arm.com test.doCommand(MemCommand::ACT,0,86); 7412266Sradhika.jagtap@arm.com test.doCommand(MemCommand::RDA,0,101); 7512266Sradhika.jagtap@arm.com test.doCommand(MemCommand::ACT,2,102); 7612266Sradhika.jagtap@arm.com test.doCommand(MemCommand::RDA,2,117); 7712266Sradhika.jagtap@arm.com test.doCommand(MemCommand::ACT,5,119); 7812266Sradhika.jagtap@arm.com test.doCommand(MemCommand::RDA,5,134); 7912266Sradhika.jagtap@arm.com test.doCommand(MemCommand::ACT,0,137); 8012266Sradhika.jagtap@arm.com test.doCommand(MemCommand::RDA,0,152); 8112266Sradhika.jagtap@arm.com test.doCommand(MemCommand::ACT,3,159); 8212266Sradhika.jagtap@arm.com test.doCommand(MemCommand::RDA,3,174); 8312266Sradhika.jagtap@arm.com test.doCommand(MemCommand::ACT,0,195); 8412266Sradhika.jagtap@arm.com test.doCommand(MemCommand::RDA,0,210); 8512266Sradhika.jagtap@arm.com test.doCommand(MemCommand::ACT,4,232); 8612266Sradhika.jagtap@arm.com test.doCommand(MemCommand::WRA,4,247); 8712266Sradhika.jagtap@arm.com // Need at least tWRAPDEN = AL + CWL + BL/2 + WR + 1 cycles between WR and PDN_F_PRE 8812266Sradhika.jagtap@arm.com test.doCommand(MemCommand::PDN_F_PRE,3,265); 8912266Sradhika.jagtap@arm.com // Exit from Precharge Power-down 9012266Sradhika.jagtap@arm.com test.doCommand(MemCommand::PUP_PRE,3,300); 9112266Sradhika.jagtap@arm.com // Activate bank 0 9212266Sradhika.jagtap@arm.com test.doCommand(MemCommand::ACT,0,350); 9312266Sradhika.jagtap@arm.com // Precharge all banks with bank 0 active 9412266Sradhika.jagtap@arm.com test.doCommand(MemCommand::PREA,0,400); 9512266Sradhika.jagtap@arm.com // Precharge all banks again 9612266Sradhika.jagtap@arm.com // XXX: For testing purpose only! Double precharge all should never 9712266Sradhika.jagtap@arm.com // happen. Warnings are generated. 9812266Sradhika.jagtap@arm.com test.doCommand(MemCommand::PREA,0,450); 9912266Sradhika.jagtap@arm.com // Activate bank 0 twice 10012266Sradhika.jagtap@arm.com // XXX: For testing purpose only! Double activate should never happen. 10112266Sradhika.jagtap@arm.com // Warnings are generated. 10212266Sradhika.jagtap@arm.com test.doCommand(MemCommand::ACT,0,500); 10312266Sradhika.jagtap@arm.com test.doCommand(MemCommand::ACT,0,550); 10412266Sradhika.jagtap@arm.com // Precharge bank 0 twice 10512266Sradhika.jagtap@arm.com // XXX: For testing purpose only! Double precharge for the same bank 10612266Sradhika.jagtap@arm.com // should never happen. Warnings are generated. 10712266Sradhika.jagtap@arm.com test.doCommand(MemCommand::PRE,0,600); 10812266Sradhika.jagtap@arm.com test.doCommand(MemCommand::PRE,0,650); 10910428Sandreas.hansson@arm.com 11012266Sradhika.jagtap@arm.com // At the end of your simulation call the getEnergy(...) 11112266Sradhika.jagtap@arm.com // function to print the power report 11212266Sradhika.jagtap@arm.com test.calcEnergy(); 11310428Sandreas.hansson@arm.com 11412266Sradhika.jagtap@arm.com // Accesing the results: 11510428Sandreas.hansson@arm.com 11612266Sradhika.jagtap@arm.com // Number of issued Commands 11712266Sradhika.jagtap@arm.com std::cout << "Number of ACTs: " << std::accumulate(test.counters.numberofactsBanks.begin(), 11812266Sradhika.jagtap@arm.com test.counters.numberofactsBanks.end() 11912266Sradhika.jagtap@arm.com ,0)<< endl; 12012266Sradhika.jagtap@arm.com std::cout << "Number of RDs: " << std::accumulate(test.counters.numberofreadsBanks.begin(), 12112266Sradhika.jagtap@arm.com test.counters.numberofreadsBanks.end() 12212266Sradhika.jagtap@arm.com ,0)<< endl; 12312266Sradhika.jagtap@arm.com std::cout << "Number of PREs: " << std::accumulate(test.counters.numberofpresBanks.begin(), 12412266Sradhika.jagtap@arm.com test.counters.numberofpresBanks.end() 12512266Sradhika.jagtap@arm.com ,0)<< endl; 12612266Sradhika.jagtap@arm.com // many other timing parameters in test.mpm.timings 12710428Sandreas.hansson@arm.com 12812266Sradhika.jagtap@arm.com //ENERGIES per Rank 12912266Sradhika.jagtap@arm.com std::cout << "ACT Cmd Energy: " << test.getEnergy().act_energy << " pJ" << endl; 13012266Sradhika.jagtap@arm.com std::cout << "PRE Cmd Energy: " << test.getEnergy().pre_energy << " pJ" << endl; 13112266Sradhika.jagtap@arm.com std::cout << "RD Cmd Energy: " << test.getEnergy().read_energy << " pJ" << endl; 13212266Sradhika.jagtap@arm.com std::cout << "WR Cmd Energy: " << test.getEnergy().write_energy << " pJ" << endl << endl; 13312266Sradhika.jagtap@arm.com //Standby Energy for 1 rank 13412266Sradhika.jagtap@arm.com //In total energy calculated for both ranks= test.memSpec.memArchSpec * 13512266Sradhika.jagtap@arm.com //test.getEnergy().act_stdby_energy 13612266Sradhika.jagtap@arm.com std::cout << "ACT Stdby Energy: " << test.getEnergy().act_stdby_energy << " pJ" << endl; 13712266Sradhika.jagtap@arm.com //total active standby energy for both ranks 13812266Sradhika.jagtap@arm.com std::cout << "ACT Stdby Energy total ranks: " << static_cast<double>(memSpec.memArchSpec.nbrOfRanks) * 13912266Sradhika.jagtap@arm.com test.getEnergy().act_stdby_energy << " pJ" << endl ; 14012266Sradhika.jagtap@arm.com std::cout << "PRE Stdby Energy: " << test.getEnergy().pre_stdby_energy << " pJ" << endl << endl; 14112266Sradhika.jagtap@arm.com std::cout << "Total Trace Energy: " << test.getEnergy().total_energy << " pJ" << endl; 14212266Sradhika.jagtap@arm.com //many other energies in test.mpm.energy 14310428Sandreas.hansson@arm.com 14412266Sradhika.jagtap@arm.com //Powers per Rank 14512266Sradhika.jagtap@arm.com std::cout << "Average Power: " << test.getPower().average_power << " mW" << endl; 14612266Sradhika.jagtap@arm.com //many other powers in test.getPower() 14712266Sradhika.jagtap@arm.com 14812266Sradhika.jagtap@arm.com cout.flags(flags); 14912266Sradhika.jagtap@arm.com cout.precision(precision); 15012266Sradhika.jagtap@arm.com 15112266Sradhika.jagtap@arm.com return 0; 15210428Sandreas.hansson@arm.com} 153