diff options
Diffstat (limited to 'src/uscxml/transform/ChartToVHDL.h')
-rw-r--r-- | src/uscxml/transform/ChartToVHDL.h | 271 |
1 files changed, 134 insertions, 137 deletions
diff --git a/src/uscxml/transform/ChartToVHDL.h b/src/uscxml/transform/ChartToVHDL.h index b6c7853..d93d59f 100644 --- a/src/uscxml/transform/ChartToVHDL.h +++ b/src/uscxml/transform/ChartToVHDL.h @@ -31,129 +31,129 @@ namespace uscxml { -class USCXML_API ChartToVHDL : public ChartToC { -public: + class USCXML_API ChartToVHDL : public ChartToC { + public: - virtual ~ChartToVHDL(); + virtual ~ChartToVHDL(); - static Transformer transform(const Interpreter &other); + static Transformer transform(const Interpreter &other); - void writeTo(std::ostream &stream); + void writeTo(std::ostream &stream); - struct VNode { - virtual void print(std::ostream &stream, const std::string padding = "") = 0; + struct VNode { + virtual void print(std::ostream &stream, const std::string padding = "") = 0; - virtual ~VNode() { }; - }; - - struct VBranch : VNode { - std::vector<VNode *> v; + virtual ~VNode() { }; + }; - virtual ~VBranch() { - for (unsigned i = 0; i < v.size(); i++) - delete v[i]; - } + struct VBranch : VNode { + std::vector<VNode *> v; - VBranch &operator+=(VNode *p) { - v.push_back(p); - return *this; - } - }; + virtual ~VBranch() { + for (unsigned i = 0; i < v.size(); i++) + delete v[i]; + } - struct VPointer { - VNode *ptr; + VBranch &operator+=(VNode *p) { + v.push_back(p); + return *this; + } + }; - operator VNode *() { - return ptr; - } + struct VPointer { + VNode *ptr; - operator VBranch *() { - return static_cast<VBranch *> (ptr); - } + operator VNode *() { + return ptr; + } - VPointer &operator/(VNode *p) { - ptr = p; - return *this; - } - }; + operator VBranch *() { + return static_cast<VBranch *> (ptr); + } - struct VContainer { - VBranch *ptr; + VPointer &operator/(VNode *p) { + ptr = p; + return *this; + } + }; - operator VBranch *() { - return ptr; - } + struct VContainer { + VBranch *ptr; - VContainer &operator/(VBranch *p) { - ptr = p; - return *this; - } + operator VBranch *() { + return ptr; + } - VContainer &operator,(VPointer p) { - if (ptr) ptr->v.push_back(p.ptr); - return *this; - } + VContainer &operator/(VBranch *p) { + ptr = p; + return *this; + } - VContainer &operator,(VContainer c) { - if (ptr) ptr->v.push_back(c.ptr); - return *this; - } - }; + VContainer &operator,(VPointer p) { + if (ptr) ptr->v.push_back(p.ptr); + return *this; + } - struct VLine : VNode { - VLine(const std::string &name) : name(name) { } + VContainer &operator,(VContainer c) { + if (ptr) ptr->v.push_back(c.ptr); + return *this; + } + }; - virtual void print(std::ostream &stream, const std::string padding = "") { - stream << " " << name; - } + struct VLine : VNode { + VLine(const std::string &name) : name(name) { } - std::string name; - }; + virtual void print(std::ostream &stream, const std::string padding = "") { + stream << " " << 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 + " "); - } - }; + std::string name; + }; - 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 + " "); + 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 + " "); } - 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 + " "); + }; + + 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; } - stream << std::endl << 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 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); - } - }; + struct VNop : VBranch { + virtual void print(std::ostream &stream, const std::string padding = "") { + v[0]->print(stream, padding); + } + }; //TODO can we create the macros without IDE errors ?! #define VLINE VPointer()/new VLine @@ -164,71 +164,68 @@ public: #define VNOP VContainer()/new VNop -protected: - ChartToVHDL(const Interpreter &other); + protected: + ChartToVHDL(const Interpreter &other); - void checkDocument(); + void checkDocument(); - void findEvents(); + void findEvents(); - void writeTypes(std::ostream &stream); + void writeTypes(std::ostream &stream); - void writeIncludes(std::ostream &stream); + void writeIncludes(std::ostream &stream); - // top layer components - void writeFiFo(std::ostream &stream); + // top layer components + void writeFiFo(std::ostream &stream); - void writeEventController(std::ostream &stream); + void writeEventController(std::ostream &stream); - void writeMicroStepper(std::ostream &stream); + void writeMicroStepper(std::ostream &stream); - void writeTestbench(std::ostream &stream); + void writeTestbench(std::ostream &stream); - // system - void writeSignalsAndComponents(std::ostream &stream); + void writeTopLevel(std::ostream &stream); - void writeSystemSignalMapping(std::ostream &stream); + // system + void writeSignalsAndComponents(std::ostream &stream); - void writeModuleInstantiation(std::ostream &stream); + void writeSystemSignalMapping(std::ostream &stream); - // combinatorial logic - void writeOptimalTransitionSetSelection(std::ostream &stream); + void writeModuleInstantiation(std::ostream &stream); - void writeExitSet(std::ostream &stream); + // combinatorial logic + void writeOptimalTransitionSetSelection(std::ostream &stream); - void writeEntrySet(std::ostream &stream); + void writeExitSet(std::ostream &stream); - void writeTransitionSet(std::ostream &stream); + void writeEntrySet(std::ostream &stream); - void writeDefaultCompletions(std::ostream &stream); + void writeCompleteEntrySet(std::ostream &stream); - void writeCompleteEntrySet(std::ostream &stream); + void writeActiveStateNplusOne(std::ostream &stream); - void writeActiveStateNplusOne(std::ostream &stream); + // handler + void writeStateHandler(std::ostream &stream); - // handler - void writeStateHandler(std::ostream &stream); + void writeResetHandler(std::ostream &stream); - void writeResetHandler(std::ostream &stream); + void writeSpontaneousHandler(std::ostream &stream); - void writeSpontaneousHandler(std::ostream &stream); + void writeInternalEventHandler(std::ostream &stream); - void writeInternalEventHandler(std::ostream &stream); + void writeErrorHandler(std::ostream &stream); - void writeErrorHandler(std::ostream &stream); - // event generation - void writeExContentBlock(std::ostream &stream, std::string index, - std::list<XERCESC_NS::DOMElement *> commandSequence); + Trie _eventTrie; + std::list<TrieNode *> _eventNames; + size_t _eventBitSize = 0; + std::map<std::string, std::string> _eventsOnBus; + std::list<XERCESC_NS::DOMElement *> _execContent; - Trie _eventTrie; - std::list<XERCESC_NS::DOMElement *> _execContent; - -private: - std::string getLineForExecContent(const XERCESC_NS::DOMNode *elem); - - bool isSupportedExecContent(XERCESC_NS::DOMElement *execContentElement); -}; + private: + std::string getLineForExecContent(const XERCESC_NS::DOMNode *elem); + bool isSupportedExecContent(XERCESC_NS::DOMElement *execContentElement); + }; } |