Files
DRAMSys/analyzer/analyzer/evaluationtool.cpp
gernhard2 f11adf51dc Relocated the python scripts. They now live in the analyzer directory and are deployed to the output folder when building the analyzer.
Major change to simulation logic in dramSys: Commands in a transaction are now scheduled one at a time, instead of
scheduling a whole transaction at once. Since single commands (e.g. Pre or Act) are not that long, refreshes are allowed to be delayed
to allow a command to finsh. Consequently, the whole loop in the ControllerCore about trying to scheduleding a transaction and aborting it when
it collides with a refresh could be ommitted. Lastly, Fifo_Strict has been added, which is a Fifo Scheduler that forces the read and write transactions, even
between different banks to be executed in order. Fifo and FR_FCFS have been modified to fit into the new scheduling logic.
2015-02-16 08:21:27 +01:00

169 lines
4.2 KiB
C++

#include <QFileInfo>
#include <QtAlgorithms>
#include <QPainter>
#include <QDebug>
#include <stdio.h>
#include <iostream>
#include <businessObjects/tracetestresults.h>
#include <QApplication>
#include <QFile>
#include <QTextStream>
#include <QFileDialog>
#include "evaluationtool.h"
#include "ui_evaluationtool.h"
using namespace std;
EvaluationTool::EvaluationTool(QWidget *parent) :
QWidget(parent),
ui(new Ui::EvaluationTool), resourcesRelPath("/../../dram/resources/scripts""")
{
ui->setupUi(this);
traceFilesModel = new QStandardItemModel(this);
ui->listView->setModel(traceFilesModel);
QObject::connect(ui->traceTestTreeWidget,SIGNAL(setMessage(QString)),this,SLOT(setTestMessage(QString)));
}
EvaluationTool::~EvaluationTool()
{
delete ui;
}
void EvaluationTool::showForFiles(QList<QString> paths)
{
cleanUpUI();
fillFileList(paths);
show();
ui->toolBox->setCurrentIndex(0);
}
void EvaluationTool::showAndRunTests(QList<QString> paths)
{
cleanUpUI();
fillFileList(paths);
show();
ui->toolBox->setCurrentIndex(0);
runTests();
}
void EvaluationTool::showAndEvaluateMetrics(QList<QString> paths)
{
cleanUpUI();
fillFileList(paths);
show();
ui->toolBox->setCurrentIndex(1);
calculateMetrics();
std::cout<<"done"<<std::endl;
}
void EvaluationTool::cleanUpUI()
{
traceFilesModel->clear();
calculatedMetrics.clear();
ui->traceMetricTreeWidget->clear();
ui->traceTestTreeWidget->clear();
ui->testMessage->setPlainText(QString(""));
ui->testLight->setGray();
}
void EvaluationTool::fillFileList(QList<QString> paths)
{
qSort(paths.begin(), paths.end(), [] (const QString &path1, const QString &path2) {return QFileInfo(path1).baseName() < QFileInfo(path2).baseName();});
for(const QString& path: paths)
{
traceFilesModel->appendRow(new TraceFileItem(path));
}
}
void EvaluationTool::on_btn_test_clicked()
{
runTests();
}
void EvaluationTool::runTests()
{
PythonCaller pythonCaller;
ui->traceTestTreeWidget->clear();
ui->testLight->setGray();
if(traceFilesModel->rowCount() == 0)
return;
bool allTestsPassed = true;
for(int row = 0; row < traceFilesModel->rowCount(); ++row)
{
TraceFileItem* item = static_cast<TraceFileItem*>(traceFilesModel->item(row));
TraceTestResults traceTestResult = pythonCaller.runTestsOnTrace(item->getPath());
if(!traceTestResult.hasPassedAllTests())
allTestsPassed = false;
ui->traceTestTreeWidget->addTraceTestResult(traceTestResult);
}
ui->traceTestTreeWidget->expandAll();
if(allTestsPassed)
ui->testLight->setGreen();
else
ui->testLight->setRed();
}
void EvaluationTool::on_btn_calculateMetrics_clicked()
{
calculateMetrics();
}
void EvaluationTool::calculateMetrics()
{
PythonCaller pythonCaller;
ui->traceMetricTreeWidget->clear();
for(int row = 0; row < traceFilesModel->rowCount(); ++row)
{
TraceFileItem* item = static_cast<TraceFileItem*>(traceFilesModel->item(row));
TraceCalculatedMetrics result = pythonCaller.calculateMetricsOnTrace(item->getPath());
calculatedMetrics.push_back(result);
ui->traceMetricTreeWidget->addTraceMetricResults(result);
}
ui->traceMetricTreeWidget->expandAll();
}
void EvaluationTool::setTestMessage(QString message)
{
ui->testMessage->setPlainText(message);
}
EvaluationTool::TraceFileItem::TraceFileItem(const QString &path)
{
this->path = path;
setText(QFileInfo(this->path).baseName());
setCheckable( false );
setCheckState(Qt::Checked);
setEditable(false);
}
void EvaluationTool::on_btn_exportCSV_clicked()
{
if(calculatedMetrics.size()>0)
{
QString filename = QFileDialog::getSaveFileName(this, "Export to CSV", "", "Comma separated Values(*.csv)");
if(filename != "")
{
QFile file(filename);
file.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(&file);
out << calculatedMetrics[0].toCSVHeader() << "\n";
for(TraceCalculatedMetrics& metrics : calculatedMetrics)
{
out << metrics.toCSVLine() << "\n";
}
file.close();
}
}
}