#include "xmlAddressdecoder.h" #include using namespace std; string xmlAddressDecoder::addressConfigURI = ""; xmlAddressDecoder::xmlAddressDecoder(string addressConfigURI) { doc = new TiXmlDocument(addressConfigURI.c_str()); if (doc->LoadFile()) { dramconfig = doc->FirstChildElement("dramconfig"); addressmap = dramconfig->FirstChildElement("addressmap"); unsigned int from; unsigned int to; // get channel: // TiXmlElement* channel = addressmap->FirstChildElement("channel"); // // // from = getAttribute(channel, "from"); // to = getAttribute(channel, "to"); // // channelShift = from; // channelMask = pow(2.0, to + 1.0) - pow(2.0, from + 0.0); // channelSize = pow(2.0, to - from + 1.0); // get row: TiXmlElement* row = addressmap->FirstChildElement("row"); from = getAttribute(row, "from"); to = getAttribute(row, "to"); rowShift = from; rowMask = pow(2.0, to + 1.0) - pow(2.0, from + 0.0); rowSize = pow(2.0, to - from + 1.0); // get bank: TiXmlElement* bank = addressmap->FirstChildElement("bank"); from = getAttribute(bank, "from"); to = getAttribute(bank, "to"); bankShift = from; bankMask = pow(2.0, to + 1.0) - pow(2.0, from + 0.0); bankSize = pow(2.0, to - from + 1.0); // get colum: TiXmlElement* colum = addressmap->FirstChildElement("colum"); from = getAttribute(colum, "from"); to = getAttribute(colum, "to"); columShift = from; columMask = pow(2.0, to + 1.0) - pow(2.0, from + 0.0); columSize = pow(2.0, to - from + 1.0); // get bytes: // TiXmlElement* bytes = addressmap->FirstChildElement("bytes"); // // from = getAttribute(bytes, "from"); // to = getAttribute(bytes, "to"); // bytesShift = from; // bytesMask = pow(2.0, to + 1.0) - pow(2.0, from + 0.0); // bytesSize = pow(2.0, to - from + 1.0); } else { SC_REPORT_FATAL("xmlAddressDecoder can not find ", addressConfigURI.c_str()); } } xmlAddressDecoder::~xmlAddressDecoder() { delete doc; } void xmlAddressDecoder::getNode(unsigned int addr, node * n) { n->channel = 0; n->row = (addr & rowMask) >> rowShift; n->bank = (addr & bankMask) >> bankShift; n->colum = (addr & columMask) >> columShift; } void xmlAddressDecoder::getBRC(unsigned int addr, unsigned int &bank, unsigned int &row, unsigned int &colum) { row = (addr & rowMask) >> rowShift; bank = (addr & bankMask) >> bankShift; colum = (addr & columMask) >> columShift; } void xmlAddressDecoder::getCBRC(unsigned int addr, unsigned int &channel, unsigned int &bank, unsigned int &row, unsigned int &colum) { channel = (addr & channelMask) >> channelShift; getBRC(addr, bank, row, colum); } void xmlAddressDecoder::getC(unsigned int addr, unsigned int &channel) { channel = (addr & channelMask) >> channelShift; } unsigned int xmlAddressDecoder::getNumberOfBanks() { return bankSize; } unsigned int xmlAddressDecoder::getNumberOfRowsPerBank() { return rowSize; } unsigned int xmlAddressDecoder::getNumberOfColumsPerRow() { return columSize; } unsigned int xmlAddressDecoder::getNumberOfBytesPerColumn() { return 1; }