221 lines
6.5 KiB
C++
221 lines
6.5 KiB
C++
#include "Utils.h"
|
|
#include <string>
|
|
#include <tlm.h>
|
|
#include <fstream>
|
|
#include "dramExtension.h"
|
|
|
|
using namespace std;
|
|
using namespace tinyxml2;
|
|
|
|
|
|
bool TimeInterval::timeIsInInterval(sc_time time)
|
|
{
|
|
return (start < time && time < end);
|
|
}
|
|
|
|
bool TimeInterval::intersects(TimeInterval other)
|
|
{
|
|
return other.timeIsInInterval(this->start) || this->timeIsInInterval(other.start);
|
|
}
|
|
|
|
sc_time getDistance(sc_time a, sc_time b)
|
|
{
|
|
if (a > b)
|
|
return a - b;
|
|
else
|
|
return b - a;
|
|
}
|
|
|
|
void reportFatal(std::string sender, std::string message)
|
|
{
|
|
SC_REPORT_FATAL(sender.c_str(), message.c_str());
|
|
}
|
|
|
|
std::string phaseNameToString(tlm::tlm_phase phase)
|
|
{
|
|
std::ostringstream oss;
|
|
oss << phase;
|
|
std::string str = oss.str();
|
|
return str;
|
|
}
|
|
|
|
unsigned int queryUIntParameter(XMLElement* node, string name)
|
|
{
|
|
int result;
|
|
XMLElement* element;
|
|
for (element = node->FirstChildElement("parameter"); element != NULL;
|
|
element = element->NextSiblingElement("parameter"))
|
|
{
|
|
if (element->Attribute("id") == name)
|
|
{
|
|
sc_assert(!strcmp(element->Attribute("type"), "uint"));
|
|
XMLError error = element->QueryIntAttribute("value", &result);
|
|
sc_assert(!error);
|
|
return result;
|
|
}
|
|
}
|
|
|
|
reportFatal("Query XML", "Parameter '" + name + "' does not exist.");
|
|
return 0;
|
|
}
|
|
|
|
bool parameterExists(tinyxml2::XMLElement* node, std::string name)
|
|
{
|
|
XMLElement* element;
|
|
for (element = node->FirstChildElement("parameter"); element != NULL;
|
|
element = element->NextSiblingElement("parameter"))
|
|
{
|
|
if (element->Attribute("id") == name)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
double queryDoubleParameter(XMLElement* node, string name)
|
|
{
|
|
double result;
|
|
XMLElement* element;
|
|
for (element = node->FirstChildElement("parameter"); element != NULL;
|
|
element = element->NextSiblingElement("parameter"))
|
|
{
|
|
if (element->Attribute("id") == name)
|
|
{
|
|
sc_assert(!strcmp(element->Attribute("type"), "double"));
|
|
XMLError error = element->QueryDoubleAttribute("value", &result);
|
|
sc_assert(!error);
|
|
return result;
|
|
}
|
|
}
|
|
|
|
reportFatal("Query XML", "Parameter '" + name + "' does not exist.");
|
|
return 0;
|
|
}
|
|
|
|
bool queryBoolParameter(XMLElement* node, string name)
|
|
{
|
|
bool result;
|
|
XMLElement* element;// = node->FirstChildElement("parameter");
|
|
for (element = node->FirstChildElement("parameter"); element != NULL;
|
|
element = element->NextSiblingElement("parameter"))
|
|
{
|
|
if (element->Attribute("id") == name)
|
|
{
|
|
sc_assert(!strcmp(element->Attribute("type"), "bool"));
|
|
XMLError error = element->QueryBoolAttribute("value", &result);
|
|
sc_assert(!error);
|
|
return result;
|
|
}
|
|
}
|
|
|
|
reportFatal("Query XML", "Parameter '" + name + "' does not exist.");
|
|
return 0;
|
|
}
|
|
|
|
string queryStringParameter(XMLElement* node, string name)
|
|
{
|
|
XMLElement* element;
|
|
for (element = node->FirstChildElement("parameter"); element != NULL;
|
|
element = element->NextSiblingElement("parameter"))
|
|
{
|
|
if (element->Attribute("id") == name)
|
|
{
|
|
return element->Attribute("value");
|
|
}
|
|
}
|
|
|
|
reportFatal("Query XML", "Parameter '" + name + "' does not exist.");
|
|
return 0;
|
|
}
|
|
|
|
string errorToString(XMLError error)
|
|
{
|
|
switch(error){
|
|
case XML_NO_ERROR: return "no error"; case XML_NO_ATTRIBUTE: return "NO_ATTRIBUTE";
|
|
case XML_WRONG_ATTRIBUTE_TYPE: return "WRONG_ATTRIBUTE_TYPE";
|
|
case XML_ERROR_FILE_NOT_FOUND: return "FILE_NOT_FOUND";
|
|
case XML_ERROR_FILE_COULD_NOT_BE_OPENED: return "FILE_COULD_NOT_BE_OPENED";
|
|
case XML_ERROR_FILE_READ_ERROR: return "FILE_READ_ERROR";
|
|
case XML_ERROR_ELEMENT_MISMATCH: return "ERROR_ELEMENT_MISMATCH";
|
|
case XML_ERROR_PARSING_ELEMENT: return "ERROR_PARSING_ELEMENT";
|
|
case XML_ERROR_PARSING_ATTRIBUTE: return "ERROR_PARSING_ATTRIBUTE";
|
|
case XML_ERROR_IDENTIFYING_TAG: return "ERROR_IDENTIFYING_TAG";
|
|
case XML_ERROR_PARSING_TEXT: return "ERROR_PARSING_TEXT";
|
|
case XML_ERROR_PARSING_CDATA: return "ERROR_PARSING_CDATA";
|
|
case XML_ERROR_PARSING_COMMENT: return "ERROR_PARSING_COMMENT";
|
|
case XML_ERROR_PARSING_DECLARATION: return "ERROR_PARSING_DECLARATION";
|
|
case XML_ERROR_PARSING_UNKNOWN: return "ERROR_PARSING_UNKNOWN";
|
|
case XML_ERROR_EMPTY_DOCUMENT: return "ERROR_EMPTY_DOCUMENT";
|
|
case XML_ERROR_MISMATCHED_ELEMENT: return "ERROR_MISMATCHED_ELEMENT";
|
|
case XML_ERROR_PARSING: return "ERROR_PARSING";
|
|
case XML_CAN_NOT_CONVERT_TEXT: return "CAN_NOT_CONVERT_TEXT";
|
|
case XML_NO_TEXT_NODE: return "NO_TEXT_NODE";
|
|
default: "";
|
|
}
|
|
}
|
|
|
|
void loadXML(string uri, XMLDocument& doc)
|
|
{
|
|
XMLError error = doc.LoadFile(uri.c_str());
|
|
|
|
if (error)
|
|
{
|
|
reportFatal("Configuration", "Error loading xml from: " + uri + " "
|
|
+ errorToString(error));
|
|
}
|
|
}
|
|
|
|
string loadTextFileContents(string filename)
|
|
{
|
|
|
|
ifstream in(filename.c_str(), ios::in | ios::binary);
|
|
if (in)
|
|
{
|
|
string contents;
|
|
in.seekg(0, ios::end);
|
|
contents.resize(in.tellg());
|
|
in.seekg(0, ios::beg);
|
|
in.read(&contents[0], contents.size());
|
|
in.close();
|
|
return (contents);
|
|
}
|
|
else
|
|
{
|
|
reportFatal("Error loading file", "Could not load textfile from " + filename);
|
|
return "";
|
|
}
|
|
}
|
|
|
|
void setUpDummy(tlm::tlm_generic_payload& payload, Bank& bank)
|
|
{
|
|
payload.set_address(bank.getStartAddress());
|
|
payload.set_command(tlm::TLM_READ_COMMAND);
|
|
payload.set_data_length(0);
|
|
payload.set_response_status(tlm::TLM_OK_RESPONSE);
|
|
payload.set_dmi_allowed(false);
|
|
payload.set_byte_enable_length(0);
|
|
payload.set_streaming_width(0);
|
|
payload.set_extension(new DramExtension(Thread(0), bank, BankGroup(0), Row(0), Column(0))); //payload takes ownership
|
|
//TODO .. Dummies muessen noch banggruppe und rank sauber bekommen .. noch was ueberlegen!!!
|
|
}
|
|
|
|
std::string getFileName(std::string uri)
|
|
{
|
|
// Remove directory if present.
|
|
// Do this before extension removal incase directory has a period character.
|
|
const size_t last_slash_idx = uri.find_last_of("\\/");
|
|
if (std::string::npos != last_slash_idx)
|
|
{
|
|
uri.erase(0, last_slash_idx + 1);
|
|
}
|
|
|
|
// Remove extension if present.
|
|
const size_t period_idx = uri.rfind('.');
|
|
if (std::string::npos != period_idx)
|
|
{
|
|
uri.erase(period_idx);
|
|
}
|
|
return uri;
|
|
}
|