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