diff options
author | Stefan Radomski <sradomski@mintwerk.de> | 2016-02-24 10:50:32 (GMT) |
---|---|---|
committer | Stefan Radomski <sradomski@mintwerk.de> | 2016-02-24 10:50:32 (GMT) |
commit | cf19f11b8d2bd6d9566c7528fbed40af06928abf (patch) | |
tree | a373b8e934fa78a1bf9db8afca2e9854437e45da /src/uscxml/transform/ChartToVHDL.h | |
parent | 7212d5a3dbbd2845d09df96b2c345132c8a24931 (diff) | |
download | uscxml-cf19f11b8d2bd6d9566c7528fbed40af06928abf.zip uscxml-cf19f11b8d2bd6d9566c7528fbed40af06928abf.tar.gz uscxml-cf19f11b8d2bd6d9566c7528fbed40af06928abf.tar.bz2 |
Some more refactoring and VHDL transformation
Diffstat (limited to 'src/uscxml/transform/ChartToVHDL.h')
-rw-r--r-- | src/uscxml/transform/ChartToVHDL.h | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/uscxml/transform/ChartToVHDL.h b/src/uscxml/transform/ChartToVHDL.h index c2dec15..933faa4 100644 --- a/src/uscxml/transform/ChartToVHDL.h +++ b/src/uscxml/transform/ChartToVHDL.h @@ -30,6 +30,7 @@ #include <DOM/Node.hpp> #include <XPath/XPath.hpp> #include <ostream> +#include <vector> namespace uscxml { @@ -41,6 +42,120 @@ public: void writeTo(std::ostream& stream); + + struct VNode { + virtual void print(std::ostream& stream, const std::string padding = "") = 0; + virtual ~VNode() {}; + }; + struct VBranch : VNode { + std::vector< VNode* > v; + virtual ~VBranch(){ + for(unsigned i = 0; i < v.size(); i++) + delete v[i]; + } + + VBranch& operator +=(VNode* p ) { + v.push_back(p); + return *this; + } + }; + + struct VPointer{ + VNode* ptr; + + operator VNode*() { + return ptr; + } + + VPointer& operator /( VNode* p ){ + ptr = p; + return *this; + } + }; + + struct VContainer { + VBranch* ptr; + + operator VBranch*() { + return ptr; + } + VContainer& operator /( VBranch* p ){ + ptr = p; + return *this; + } + VContainer& operator , ( VPointer p ) { + if(ptr) ptr->v.push_back(p.ptr); + return *this; + } + VContainer& operator , ( VContainer c ) { + if(ptr) ptr->v.push_back(c.ptr); + return *this; + } + }; + + struct VLine : VNode { + VLine(const std::string& name) : name(name) {} + virtual void print(std::ostream& stream, const std::string padding = "") { + stream << " " << name; + } + + std::string name; + }; + + struct VAssign : VBranch { + virtual void print(std::ostream& stream, const std::string padding = "") { + v[0]->print(stream, padding); + stream << padding << " <="; + v[1]->print(stream, padding + " "); + } + }; + + struct VAnd : VBranch { + virtual void print(std::ostream& stream, const std::string padding = "") { + stream << std::endl << padding << "( '1' "; + for(unsigned i = 0; i < v.size(); i++) { + stream << std::endl << padding << " and"; + v[i]->print(stream, padding + " "); + } + stream << padding << ")" << std::endl; + } + }; + + struct VOr : VBranch { + virtual void print(std::ostream& stream, const std::string padding = "") { + stream << std::endl << padding << "( '0' "; + for(unsigned i = 0; i < v.size(); i++) { + stream << std::endl << padding << " or"; + v[i]->print(stream, padding + " "); + } + stream << std::endl << padding << ")" << std::endl; + } + }; + + struct VNot : VBranch { + virtual void print(std::ostream& stream, const std::string padding = "") { + stream << " ( not"; + v[0]->print(stream, padding + " "); + stream << " )"; + } + }; + + struct VNop : VBranch { + virtual void print(std::ostream& stream, const std::string padding = "") { + v[0]->print(stream, padding); + } + }; + + +#define VLINE VPointer()/new VLine +#define VASSIGN VContainer()/new VAssign +#define VOR VContainer()/new VOr +#define VAND VContainer()/new VAnd +#define VNOT VContainer()/new VNot +#define VNOP VContainer()/new VNop + + + protected: ChartToVHDL(const Interpreter& other); |