summaryrefslogtreecommitdiffstats
path: root/src/uscxml/transform/ChartToVHDL.h
diff options
context:
space:
mode:
authorStefan Radomski <sradomski@mintwerk.de>2016-02-24 10:50:32 (GMT)
committerStefan Radomski <sradomski@mintwerk.de>2016-02-24 10:50:32 (GMT)
commitcf19f11b8d2bd6d9566c7528fbed40af06928abf (patch)
treea373b8e934fa78a1bf9db8afca2e9854437e45da /src/uscxml/transform/ChartToVHDL.h
parent7212d5a3dbbd2845d09df96b2c345132c8a24931 (diff)
downloaduscxml-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.h115
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);