summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/uscxml/transform/ChartToVHDL.cpp33
-rw-r--r--src/uscxml/transform/ChartToVHDL.h329
-rw-r--r--test/w3c/ecma/test144.scxml2
3 files changed, 195 insertions, 169 deletions
diff --git a/src/uscxml/transform/ChartToVHDL.cpp b/src/uscxml/transform/ChartToVHDL.cpp
index 6b4eebf..7c69e2d 100644
--- a/src/uscxml/transform/ChartToVHDL.cpp
+++ b/src/uscxml/transform/ChartToVHDL.cpp
@@ -138,6 +138,11 @@ namespace uscxml {
}
+ bool ChartToVHDL::filterSupportedExecContent(DOMElement *execContentElement) {
+ return (TAGNAME(execContentElement) == XML_PREFIX(_scxml).str() + "raise" ||
+ TAGNAME(execContentElement) == XML_PREFIX(_scxml).str() + "send");
+ }
+
void ChartToVHDL::writeTo(std::ostream &stream) {
// checkDocument();
findEvents();
@@ -539,8 +544,7 @@ namespace uscxml {
for (auto ecIter = _execContent.begin(); ecIter != _execContent.end(); ecIter++, i++) {
DOMElement *exContentElem = *ecIter;
- if (TAGNAME(exContentElem) == XML_PREFIX(_scxml).str() + "raise" ||
- TAGNAME(exContentElem) == XML_PREFIX(_scxml).str() + "send") {
+ if (filterSupportedExecContent(exContentElem)) {
stream << seperator << "if start_" << toStr(i) << "_sig = '1' then"
<< std::endl;
@@ -556,8 +560,7 @@ namespace uscxml {
//for (auto exContentElem : _execContent) {
for (auto ecIter = _execContent.begin(); ecIter != _execContent.end(); ecIter++, i++) {
DOMElement *exContentElem = *ecIter;
- //TODO y not send here --> general filter function ?
- if (TAGNAME(exContentElem) == XML_PREFIX(_scxml).str() + "raise") {
+ if (filterSupportedExecContent(exContentElem)) {
stream << " done_" << toStr(i) << "_sig <= '0';" << std::endl;
}
}
@@ -588,18 +591,16 @@ namespace uscxml {
if (_execContent.size() > 1) {
i = 0;
for (auto ecIter = _execContent.begin(); ecIter != _execContent.end(); ecIter++, i++) {
- if (i == 0) {
- // prevent writing seq_0_sig since this should be hardcoded to '1'
- continue;
+ // prevent writing seq_0_sig since this should be hardcoded to '1'
+ if (i != 0) {
+ // seq lines (input if process i is in seqence now)
+ stream << "seq_" << toStr(i) << "_sig <= "
+ << "done_" << toStr(i - 1) << "_sig or "
+ << "( not "
+ << getLineForExecContent(*ecIter);
+ stream << " and seq_" << toStr(i - 1) << "_sig";
+ stream << " );" << std::endl;
}
- // seq lines (input if process i is in seqence now)
-
- stream << "seq_" << toStr(i) << "_sig <= "
- << "done_" << toStr(i - 1) << "_sig or "
- << "( not "
- << getLineForExecContent(*ecIter);
- stream << " and seq_" << toStr(i - 1) << "_sig";
- stream << " );" << std::endl;
}
}
stream << std::endl;
@@ -940,7 +941,7 @@ namespace uscxml {
stream << " if spontaneous_en = '1' then" << std::endl;
stream << " spontaneous_en <= optimal_transition_set_combined_sig;" << std::endl;
stream << " else" << std::endl;
- //TODO if new event is dequeued then 1 else stay 0
+ //if new event is dequeued then 1 else stay 0
stream << " spontaneous_en <= next_event_dequeued;" << std::endl;
stream << " end if;" << std::endl;
stream << " end if;" << std::endl;
diff --git a/src/uscxml/transform/ChartToVHDL.h b/src/uscxml/transform/ChartToVHDL.h
index a46265d..2506584 100644
--- a/src/uscxml/transform/ChartToVHDL.h
+++ b/src/uscxml/transform/ChartToVHDL.h
@@ -31,121 +31,129 @@
namespace uscxml {
-class USCXML_API ChartToVHDL : public ChartToC {
-public:
-
- virtual ~ChartToVHDL();
- static Transformer transform(const Interpreter& other);
-
- 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;
- }
-
- operator VBranch*() {
- return static_cast<VBranch*> (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);
- }
- };
+ class USCXML_API ChartToVHDL : public ChartToC {
+ public:
+
+ virtual ~ChartToVHDL();
+
+ static Transformer transform(const Interpreter &other);
+
+ 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;
+ }
+
+ operator VBranch *() {
+ return static_cast<VBranch *> (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);
+ }
+ };
//TODO can we create the macros without IDE errors ?!
#define VLINE VPointer()/new VLine
@@ -156,54 +164,71 @@ 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 writeIncludes(std::ostream& stream);
+ void writeTypes(std::ostream &stream);
- // top layer components
- void writeFiFo(std::ostream& stream);
- void writeEventController(std::ostream & stream);
- void writeMicroStepper(std::ostream& stream);
- void writeTestbench(std::ostream & stream);
+ void writeIncludes(std::ostream &stream);
- // system
- void writeSignalsAndComponents(std::ostream& stream);
- void writeSystemSignalMapping(std::ostream& stream);
- void writeModuleInstantiation(std::ostream& stream);
+ // top layer components
+ void writeFiFo(std::ostream &stream);
- // combinatorial logic
- void writeOptimalTransitionSetSelection(std::ostream& stream);
- void writeExitSet(std::ostream & stream);
- void writeEntrySet(std::ostream & stream);
- void writeTransitionSet(std::ostream & stream);
- void writeDefaultCompletions(std::ostream & stream);
- void writeCompleteEntrySet(std::ostream & stream);
- void writeActiveStateNplusOne(std::ostream & stream);
+ void writeEventController(std::ostream &stream);
- // handler
- void writeStateHandler(std::ostream& stream);
- void writeResetHandler(std::ostream & stream);
- void writeSpontaneousHandler(std::ostream & stream);
- void writeInternalEventHandler(std::ostream & stream);
- void writeErrorHandler(std::ostream& stream);
+ void writeMicroStepper(std::ostream &stream);
- // event generation
- void writeExContentBlock(std::ostream & stream, std::string index,
- std::list< XERCESC_NS::DOMElement* > commandSequence);
+ void writeTestbench(std::ostream &stream);
- Trie _eventTrie;
- std::list< XERCESC_NS::DOMElement* > _execContent;
+ // system
+ void writeSignalsAndComponents(std::ostream &stream);
-private:
- std::string getLineForExecContent(const XERCESC_NS::DOMNode* elem);
+ void writeSystemSignalMapping(std::ostream &stream);
-};
+ void writeModuleInstantiation(std::ostream &stream);
+
+ // combinatorial logic
+ void writeOptimalTransitionSetSelection(std::ostream &stream);
+
+ void writeExitSet(std::ostream &stream);
+
+ void writeEntrySet(std::ostream &stream);
+
+ void writeTransitionSet(std::ostream &stream);
+
+ void writeDefaultCompletions(std::ostream &stream);
+
+ void writeCompleteEntrySet(std::ostream &stream);
+
+ void writeActiveStateNplusOne(std::ostream &stream);
+
+ // handler
+ void writeStateHandler(std::ostream &stream);
+
+ void writeResetHandler(std::ostream &stream);
+
+ void writeSpontaneousHandler(std::ostream &stream);
+
+ void writeInternalEventHandler(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<XERCESC_NS::DOMElement *> _execContent;
+
+ private:
+ std::string getLineForExecContent(const XERCESC_NS::DOMNode *elem);
+
+ bool filterSupportedExecContent(XERCESC_NS::DOMElement *execContentElement);
+ };
}
diff --git a/test/w3c/ecma/test144.scxml b/test/w3c/ecma/test144.scxml
index e47f3f0..76ee416 100644
--- a/test/w3c/ecma/test144.scxml
+++ b/test/w3c/ecma/test144.scxml
@@ -5,7 +5,7 @@ foo occurs before bar, success, otherwise failure -->
<state id="s0">
<onentry>
<raise event="foo"/>
- <raise event="*"/>
+ <raise event="bar"/>
</onentry>
<transition event="foo" target="s1"/>
<transition event="*" target="fail"/>