summaryrefslogtreecommitdiff
path: root/ext/drampower/test/libdrampowertest/lib_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ext/drampower/test/libdrampowertest/lib_test.cc')
-rw-r--r--ext/drampower/test/libdrampowertest/lib_test.cc169
1 files changed, 99 insertions, 70 deletions
diff --git a/ext/drampower/test/libdrampowertest/lib_test.cc b/ext/drampower/test/libdrampowertest/lib_test.cc
index 20d4d9ebf..a79839eef 100644
--- a/ext/drampower/test/libdrampowertest/lib_test.cc
+++ b/ext/drampower/test/libdrampowertest/lib_test.cc
@@ -29,15 +29,16 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * Authors: Matthias Jung, Omar Naji
+ * Authors: Matthias Jung, Omar Naji, Felipe S. Prado
*
*/
+#include <iostream>
#include <string>
#include "libdrampower/LibDRAMPower.h"
#if USE_XERCES
- #include "xmlparser/MemSpecParser.h"
+#include "xmlparser/MemSpecParser.h"
#endif
using namespace std;
@@ -45,79 +46,107 @@ using namespace Data;
int main(int argc, char* argv[])
{
- assert(argc == 2);
- //Setup of DRAMPower for your simulation
- string filename;
- //type path to memspec file
- filename = argv[1];
- //Parsing the Memspec specification of found in memspec folder
- #if USE_XERCES
- MemorySpecification memSpec(MemSpecParser::getMemSpecFromXML(filename));
- #else
- MemorySpecification memSpec;
- #endif
- libDRAMPower test = libDRAMPower(memSpec, 0);
- // During the simulation you can report activity
- // to DRAMPower with the doCommand(...) function:
- test.doCommand(MemCommand::ACT,0,35);
- test.doCommand(MemCommand::RDA,0,50);
- test.doCommand(MemCommand::ACT,4,51);
- test.doCommand(MemCommand::RDA,4,66);
- test.doCommand(MemCommand::ACT,0,86);
- test.doCommand(MemCommand::RDA,0,101);
- test.doCommand(MemCommand::ACT,2,102);
- //This functionality is still not implemented.
- test.updateCounters(false);
- test.doCommand(MemCommand::RDA,2,117);
- test.doCommand(MemCommand::ACT,5,119);
- test.doCommand(MemCommand::RDA,5,134);
- test.doCommand(MemCommand::ACT,0,137);
- test.doCommand(MemCommand::RDA,0,152);
- test.doCommand(MemCommand::ACT,3,159);
- test.doCommand(MemCommand::RDA,3,174);
- test.doCommand(MemCommand::ACT,0,195);
- test.doCommand(MemCommand::RDA,0,210);
- test.doCommand(MemCommand::ACT,4,232);
- test.doCommand(MemCommand::WRA,4,247);
- // Need at least tWRAPDEN = AL + CWL + BL/2 + WR + 1 cycles between WR and PDN_F_PRE
- test.doCommand(MemCommand::PDN_F_PRE,3,265);
+ assert(argc == 2);
+ //Setup of DRAMPower for your simulation
+ string filename;
+ //type path to memspec file
+ filename = argv[1];
+ //Parsing the Memspec specification of found in memspec folder
+#if USE_XERCES
+ MemorySpecification memSpec(MemSpecParser::getMemSpecFromXML(filename));
+#else
+ MemorySpecification memSpec;
+#endif
+ libDRAMPower test = libDRAMPower(memSpec, 0);
+
+ ios_base::fmtflags flags = cout.flags();
+ streamsize precision = cout.precision();
+ cout.precision(2);
+ cout << fixed << endl;
+
+ // During the simulation you can report activity
+ // to DRAMPower with the doCommand(...) function:
+ test.doCommand(MemCommand::ACT,0,35);
+ test.doCommand(MemCommand::RDA,0,50);
+ test.doCommand(MemCommand::ACT,4,51);
+ test.doCommand(MemCommand::RDA,4,66);
+ test.doCommand(MemCommand::ACT,0,86);
+ test.doCommand(MemCommand::RDA,0,101);
+ test.doCommand(MemCommand::ACT,2,102);
+ test.doCommand(MemCommand::RDA,2,117);
+ test.doCommand(MemCommand::ACT,5,119);
+ test.doCommand(MemCommand::RDA,5,134);
+ test.doCommand(MemCommand::ACT,0,137);
+ test.doCommand(MemCommand::RDA,0,152);
+ test.doCommand(MemCommand::ACT,3,159);
+ test.doCommand(MemCommand::RDA,3,174);
+ test.doCommand(MemCommand::ACT,0,195);
+ test.doCommand(MemCommand::RDA,0,210);
+ test.doCommand(MemCommand::ACT,4,232);
+ test.doCommand(MemCommand::WRA,4,247);
+ // Need at least tWRAPDEN = AL + CWL + BL/2 + WR + 1 cycles between WR and PDN_F_PRE
+ test.doCommand(MemCommand::PDN_F_PRE,3,265);
+ // Exit from Precharge Power-down
+ test.doCommand(MemCommand::PUP_PRE,3,300);
+ // Activate bank 0
+ test.doCommand(MemCommand::ACT,0,350);
+ // Precharge all banks with bank 0 active
+ test.doCommand(MemCommand::PREA,0,400);
+ // Precharge all banks again
+ // XXX: For testing purpose only! Double precharge all should never
+ // happen. Warnings are generated.
+ test.doCommand(MemCommand::PREA,0,450);
+ // Activate bank 0 twice
+ // XXX: For testing purpose only! Double activate should never happen.
+ // Warnings are generated.
+ test.doCommand(MemCommand::ACT,0,500);
+ test.doCommand(MemCommand::ACT,0,550);
+ // Precharge bank 0 twice
+ // XXX: For testing purpose only! Double precharge for the same bank
+ // should never happen. Warnings are generated.
+ test.doCommand(MemCommand::PRE,0,600);
+ test.doCommand(MemCommand::PRE,0,650);
- //set bool to true when this is the last update of the counters
- test.updateCounters(true);
+ // At the end of your simulation call the getEnergy(...)
+ // function to print the power report
+ test.calcEnergy();
- // At the end of your simulation call the getEnergy(...)
- // function to print the power report
- test.calcEnergy();
+ // Accesing the results:
- // Accesing the results:
+ // Number of issued Commands
+ std::cout << "Number of ACTs: " << std::accumulate(test.counters.numberofactsBanks.begin(),
+ test.counters.numberofactsBanks.end()
+ ,0)<< endl;
+ std::cout << "Number of RDs: " << std::accumulate(test.counters.numberofreadsBanks.begin(),
+ test.counters.numberofreadsBanks.end()
+ ,0)<< endl;
+ std::cout << "Number of PREs: " << std::accumulate(test.counters.numberofpresBanks.begin(),
+ test.counters.numberofpresBanks.end()
+ ,0)<< endl;
+ // many other timing parameters in test.mpm.timings
- // Number of issued Commands
- std::cout << "# of acts" << "\t" <<test.counters.numberofacts << endl;
- std::cout << "# of reads" << "\t" <<test.counters.numberofreads << endl;
- std::cout << "# of precharges" << "\t" <<test.counters.numberofpres << endl;
- // many other timing parameters in test.mpm.timings
+ //ENERGIES per Rank
+ std::cout << "ACT Cmd Energy: " << test.getEnergy().act_energy << " pJ" << endl;
+ std::cout << "PRE Cmd Energy: " << test.getEnergy().pre_energy << " pJ" << endl;
+ std::cout << "RD Cmd Energy: " << test.getEnergy().read_energy << " pJ" << endl;
+ std::cout << "WR Cmd Energy: " << test.getEnergy().write_energy << " pJ" << endl << endl;
+ //Standby Energy for 1 rank
+ //In total energy calculated for both ranks= test.memSpec.memArchSpec *
+ //test.getEnergy().act_stdby_energy
+ std::cout << "ACT Stdby Energy: " << test.getEnergy().act_stdby_energy << " pJ" << endl;
+ //total active standby energy for both ranks
+ std::cout << "ACT Stdby Energy total ranks: " << static_cast<double>(memSpec.memArchSpec.nbrOfRanks) *
+ test.getEnergy().act_stdby_energy << " pJ" << endl ;
+ std::cout << "PRE Stdby Energy: " << test.getEnergy().pre_stdby_energy << " pJ" << endl << endl;
+ std::cout << "Total Trace Energy: " << test.getEnergy().total_energy << " pJ" << endl;
+ //many other energies in test.mpm.energy
- //ENERGIES per Rank
- std::cout << "ACT Cmd Energy" << "\t" << test.getEnergy().act_energy << endl;
- std::cout << "PRE Cmd Energy" << "\t" << test.getEnergy().pre_energy << endl;
- std::cout << "Read Cmd Energy" << "\t" << test.getEnergy().read_energy << endl;
- std::cout << "Write Cmd Energy" << "\t" << test.getEnergy().write_energy << endl;
- //Standby Energy for 1 rank
- //In total energy calculated for both ranks= test.memSpec.memArchSpec *
- //test.getEnergy().act_stdby_energy
- std::cout << "ACT Std Energy" << "\t" << test.getEnergy().act_stdby_energy << endl;
- //total active standby energy for both ranks
- std::cout << "ACT Std Energy total ranks" << "\t" << static_cast<double>(memSpec.memArchSpec.nbrOfRanks) *
- test.getEnergy().act_stdby_energy << "\n" ;
- std::cout << "PRE Std Energy" << "\t" << test.getEnergy().pre_stdby_energy << endl;
- std::cout << "Total Energy" << "\t" << test.getEnergy().total_energy << endl;
- //many other energies in test.mpm.energy
+ //Powers per Rank
+ std::cout << "Average Power: " << test.getPower().average_power << " mW" << endl;
+ //many other powers in test.getPower()
- //Powers per Rank
- std::cout << "Average Power" << "\t" << test.getPower().average_power << endl;
- //many other powers in test.getPower()
+ cout.flags(flags);
+ cout.precision(precision);
- // Test clearState function.
- test.clearState();
- return 0;
+ return 0;
}