From 0605e58c05f093fff797010c3c6938287bc33b39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Czy=C5=BC?= Date: Fri, 22 Nov 2019 15:22:52 +0100 Subject: [PATCH] Fixed builders, fixed passing arguments to ClassBuilder --- Src/Builders.cpp | 46 ++++++++++++++++++++++++++------------------ Src/Builders.hpp | 21 ++++++++++++-------- Src/ClassBuilder.cpp | 13 ++++++------- Src/ClassBuilder.hpp | 6 +++--- Src/IBuilder.hpp | 2 +- Src/Peripheral.hpp | 20 ++++++++----------- Src/XmlParser.cpp | 6 +++--- Src/XmlParser.hpp | 4 ++-- Src/main.cpp | 2 +- 9 files changed, 64 insertions(+), 56 deletions(-) diff --git a/Src/Builders.cpp b/Src/Builders.cpp index 032cf3a..237194a 100644 --- a/Src/Builders.cpp +++ b/Src/Builders.cpp @@ -1,39 +1,47 @@ #include +#include -void ZeroPointerBuilder::build(std::stringstream& ss){ + +void ZeroPointerBuilder::build(std::stringstream& ss) const{ ss << "template \n" "constexpr unsigned int *zeroVal = reinterpret_cast(zero);\n"; } -void PeripheralBuilder::build(std::stringstream& ss){ - ss << "namespace " << peripheral.name.c_str() << "{\n"; +void PeripheralBuilder::build(std::stringstream& ss) const{ + ss << "namespace " << peripheral.name << "{\n"; for(auto& registe : peripheral.registers){ - RegisterBuilder(registe).build(ss); + RegisterBuilder(registe, peripheral.baseAddress).build(ss); } ss << "}\n"; } -void RegisterBuilder::build(std::stringstream& ss){ - //TODO: fix INVALID: some derived names are not copied +void RegisterBuilder::build(std::stringstream& ss) const{ ss << " " - << "namespace " << (registe.name.length() > 100 ? "INVALID" : registe.name) << "{\n"; + << "namespace " << registe.name << "{\n"; for(auto& field : registe.fields){ - FieldBuilder(field).build(ss); + FieldBuilder(field, getRegisterAddress()).build(ss); } ss << " " << "}\n"; } -void FieldBuilder::build(std::stringstream& ss){ - ss << " " << "struct " << (field.name.length() > 100 ? "INVALID" : field.name) << "{\n"; +unsigned int RegisterBuilder::getRegisterAddress() const{ + return baseAddress + registe.addressOffset; +} + +void FieldBuilder::build(std::stringstream& ss) const{ + ss << " " << "struct " << field.name << "{\n"; - //TODO: fix INVALID: some derived items are not copied ss << " " << " " << "constexpr static inline unsigned int bitOffset(){" - << "return " << field.bitOffset << "}\n"; - + << "return " << field.bitOffset << ";}\n"; + ss << " " << " " << "constexpr static inline unsigned int bitMask(){" - << "return " << field.bitWidth << "}\n"; - - ss << " " << " " << "constexpr static inline unsigned int address(){" - << "return " << "TODO" << "}\n"; - ss << " }\n"; -} \ No newline at end of file + << "return " << field.bitWidth << ";}\n"; + + ss << " " << " " << "constexpr static inline unsigned int* address(){" + << "return zeroVal<> + " << getAddress() << ";}\n"; + ss << " };\n"; +} + +std::string FieldBuilder::getAddress() const{ + return std::to_string(registerAddress); +} diff --git a/Src/Builders.hpp b/Src/Builders.hpp index 912e078..058de84 100644 --- a/Src/Builders.hpp +++ b/Src/Builders.hpp @@ -7,30 +7,35 @@ #include struct ZeroPointerBuilder : public IBuilder{ - void build(std::stringstream& ss) final; + void build(std::stringstream& ss) const final; }; struct PeripheralBuilder : public IBuilder{ - PeripheralBuilder(const Peripheral& peripheral_) : peripheral(peripheral_){} - void build(std::stringstream& ss) final; + PeripheralBuilder(const Peripheral &peripheral_) : peripheral(peripheral_) {} + void build(std::stringstream& ss) const final; private: const Peripheral& peripheral; }; struct RegisterBuilder : public IBuilder{ - RegisterBuilder(const Register& register_) : registe(register_){} - void build(std::stringstream& ss) final; - + RegisterBuilder(const Register& register_, const unsigned int baseAddress_) + : registe(register_), baseAddress(baseAddress_) {} + void build(std::stringstream& ss) const final; + unsigned int getRegisterAddress() const; private: const Register& registe; + const unsigned int baseAddress; }; struct FieldBuilder : public IBuilder{ - FieldBuilder(const Field& field_) : field(field_){} - void build(std::stringstream& ss) final; + FieldBuilder(const Field& field_, const unsigned int registerAddress_) + : field(field_), registerAddress(registerAddress_) {} + void build(std::stringstream& ss) const final; + std::string getAddress() const; private: const Field& field; + const unsigned int registerAddress; }; #endif diff --git a/Src/ClassBuilder.cpp b/Src/ClassBuilder.cpp index 29218e9..e135ec8 100644 --- a/Src/ClassBuilder.cpp +++ b/Src/ClassBuilder.cpp @@ -2,13 +2,12 @@ #include -ClassBuilder::ClassBuilder(const cxxopts::ParseResult& results, - const DeviceInfo& deviceInfo, - const std::vector& peripherals) : - results(results), - deviceInfo(deviceInfo), - peripherals(peripherals){ - } +ClassBuilder::ClassBuilder(const cxxopts::ParseResult& results_, + const DeviceInfo& deviceInfo_, + const std::vector& peripherals_) : + results(results_), + deviceInfo(deviceInfo_), + peripherals(peripherals_){} void ClassBuilder::setupBuilders(){ builders.push_back(std::make_unique()); diff --git a/Src/ClassBuilder.hpp b/Src/ClassBuilder.hpp index ec39105..b443842 100644 --- a/Src/ClassBuilder.hpp +++ b/Src/ClassBuilder.hpp @@ -12,9 +12,9 @@ struct ClassBuilder { - ClassBuilder(const cxxopts::ParseResult& results, - const DeviceInfo& deviceInfo, - const std::vector& peripherals); + ClassBuilder(const cxxopts::ParseResult& results_, + const DeviceInfo& deviceInfo_, + const std::vector& peripherals_); void setupBuilders(); void build(); diff --git a/Src/IBuilder.hpp b/Src/IBuilder.hpp index e785886..cf5fc14 100644 --- a/Src/IBuilder.hpp +++ b/Src/IBuilder.hpp @@ -5,7 +5,7 @@ struct IBuilder{ - virtual void build(std::stringstream&) = 0; + virtual void build(std::stringstream&) const = 0; virtual ~IBuilder() = default; }; diff --git a/Src/Peripheral.hpp b/Src/Peripheral.hpp index f867296..6d8a30b 100644 --- a/Src/Peripheral.hpp +++ b/Src/Peripheral.hpp @@ -11,17 +11,13 @@ enum class EAccess{ Read_Write }; -struct IDisplay{ - virtual void display() = 0; -}; - -struct Field : public IDisplay{ +struct Field{ std::string name; std::string description; unsigned int bitOffset; unsigned int bitWidth; EAccess fieldAccess; - void display() final{ + void display() const{ std::cout << "\t\tname: " << name << std::endl << "\t\tdescription: " << description << std::endl << "\t\tbitOffset: " << bitOffset << std::endl @@ -31,7 +27,7 @@ struct Field : public IDisplay{ } }; -struct Register : public IDisplay{ +struct Register{ std::string name; std::string description; unsigned int addressOffset; @@ -40,7 +36,7 @@ struct Register : public IDisplay{ unsigned int resetValue; std::vector fields; - void display() final{ + void display() const{ std::cout << "\tname: " << name << std::endl << "\tdescription: " << description << std::endl << "\taddressOffset: " << addressOffset << std::endl @@ -55,24 +51,24 @@ struct Register : public IDisplay{ } }; -struct AddressBlock : public IDisplay{ +struct AddressBlock{ unsigned int offset; unsigned int size; - void display() final{ + void display() const{ std::cout << std::endl << "\toffset: " << offset << std::endl << "\tsize: " << size << std::endl; } }; -struct Peripheral : public IDisplay{ +struct Peripheral{ std::string name; std::string description; std::string groupName; unsigned int baseAddress; AddressBlock addressBlock; std::vector registers; - void display() final{ + void display() const{ std::cout << std::endl << "name: " << name << std::endl << "description: " << description << std::endl diff --git a/Src/XmlParser.cpp b/Src/XmlParser.cpp index a0dd512..47e9c46 100644 --- a/Src/XmlParser.cpp +++ b/Src/XmlParser.cpp @@ -41,7 +41,7 @@ void XmlParser::parseXml(){ void XmlParser::setDeviceInfoAttrib(tinyxml2::XMLElement* deviceRoot, const char* name, std::string &field) const{ tinyxml2::XMLElement* deviceEntry = deviceRoot->FirstChildElement(name); - field = deviceEntry != nullptr ? deviceEntry->GetText() : noValue; + field = deviceEntry != nullptr ? std::string(deviceEntry->GetText()) : noValue; } void XmlParser::setDeviceInfoAttrib(tinyxml2::XMLElement* deviceRoot, const char* name, unsigned int &field) const{ @@ -79,8 +79,8 @@ Peripheral XmlParser::parsePeripheral(tinyxml2::XMLElement* peripheralRoot) cons //Find the base peripheral and copy it to the new one auto crit = [&](auto &periph) { return periph.name == derivedFrom; }; auto resultIt = std::find_if(peripherals.begin(), peripherals.end(), crit); - if(resultIt < peripherals.end()){ - peripheral = *resultIt; + if(resultIt <= peripherals.end()){ + peripheral = Peripheral(*resultIt); } else{ std::cout << "Couldn't find peripheral " << derivedFrom << std::endl; diff --git a/Src/XmlParser.hpp b/Src/XmlParser.hpp index 3df6a4a..96b80e7 100644 --- a/Src/XmlParser.hpp +++ b/Src/XmlParser.hpp @@ -13,10 +13,10 @@ struct XmlParser{ XmlParser(const std::string& inputFile); std::optional isError() const; void parseXml(); - inline const DeviceInfo getDeviceInfo() const{ + inline const DeviceInfo& getDeviceInfo() const{ return deviceInfo; } - inline const std::vector getPeripherals() const{ + inline const std::vector& getPeripherals() const{ return peripherals; } diff --git a/Src/main.cpp b/Src/main.cpp index dcc6387..76cdd0b 100644 --- a/Src/main.cpp +++ b/Src/main.cpp @@ -24,7 +24,7 @@ int main(int argc, char** argv){ } inputFile = result["input"].as(); outputFile = result["output"].as(); - std::cout << "Input: " << inputFile << "\tOutput: " << outputFile << std::endl; + // std::cout << "Input: " << inputFile << "\tOutput: " << outputFile << std::endl; } catch(cxxopts::OptionException& ex){ std::cout << ex.what() << std::endl;