#include "xmlAddressdecoder.h" #include #include "Utils.h" #include "bitset" using namespace std; using namespace tinyxml2; tinyxml2::XMLElement* xmlAddressDecoder::addressmapping = NULL; xmlAddressDecoder::xmlAddressDecoder(string addressConfigURI) { tinyxml2::XMLDocument doc; loadXML(addressConfigURI, doc); xmlAddressDecoder(doc.FirstChildElement("dramconfig")->FirstChildElement("addressmap")); } xmlAddressDecoder::xmlAddressDecoder(XMLElement* addressmap) { tinyxml2::XMLDocument doc; string xmlNodeName(addressmap->Name()); if( xmlNodeName != "addressmapping") reportFatal("AddressDecorder", "addressmap node expected"); if(addressmap->Attribute("src")) { string src(addressmap->Attribute("src")); loadXML(src, doc); addressmap = (doc.FirstChildElement("addressmapping")); } for(XMLElement* child = addressmap->FirstChildElement(); child != NULL; child = child->NextSiblingElement()) { int from; int to; child->QueryAttribute("from", &from); child->QueryAttribute("to", &to); shifts[child->Name()] = from; masks[child->Name()] = pow(2.0, to + 1.0) - pow(2.0, from + 0.0); } } DecodedAddress xmlAddressDecoder::decodeAddress(sc_dt::uint64 addr) { DecodedAddress result; result.channel = (addr & masks["channel"]) >> shifts["channel"]; result.rank = (addr & masks["rank"]) >> shifts["rank"]; result.bankgroup = (addr & masks["bankgroup"]) >> shifts["bankgroup"]; result.row = (addr & masks["row"]) >> shifts["row"]; result.bank = (addr & masks["bank"]) >> shifts["bank"]; result.column = (addr & masks["column"]) >> shifts["column"]; result.bytes = (addr & masks["bytes"]) >> shifts["bytes"]; return result; } void xmlAddressDecoder::print() { cout << "Used addressmapping:" << endl; cout<<"===================="<(pair.second)<