From 79f38b8c56cd29d738b2f5c26fe5464ef98d3f11 Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Thu, 7 Jan 2016 16:14:41 +0100 Subject: [PATCH] vhdlpp: Basic loop support (loop..end loop). --- vhdlpp/parse.y | 1 - vhdlpp/sequential.h | 2 ++ vhdlpp/sequential_elaborate.cc | 4 ++-- vhdlpp/sequential_emit.cc | 18 ++++++++++++++++++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/vhdlpp/parse.y b/vhdlpp/parse.y index dbc561867..970f21617 100644 --- a/vhdlpp/parse.y +++ b/vhdlpp/parse.y @@ -1660,7 +1660,6 @@ loop_statement BasicLoopStatement* tmp = new BasicLoopStatement(loop_name, $3); FILE_NAME(tmp, @2); - sorrymsg(@1, "Loop statements are not supported.\n"); $$ = tmp; }; diff --git a/vhdlpp/sequential.h b/vhdlpp/sequential.h index ce68bcc3e..43f3ac344 100644 --- a/vhdlpp/sequential.h +++ b/vhdlpp/sequential.h @@ -273,6 +273,8 @@ class BasicLoopStatement : public LoopStatement { ~BasicLoopStatement(); int elaborate(Entity*ent, ScopeBase*scope); + int emit(ostream&out, Entity*ent, ScopeBase*scope); + void write_to_stream(std::ostream&fd); void dump(ostream&out, int indent) const; }; diff --git a/vhdlpp/sequential_elaborate.cc b/vhdlpp/sequential_elaborate.cc index 98b8766c0..8646fd9a7 100644 --- a/vhdlpp/sequential_elaborate.cc +++ b/vhdlpp/sequential_elaborate.cc @@ -212,9 +212,9 @@ int WhileLoopStatement::elaborate(Entity*ent, ScopeBase*scope) return errors; } -int BasicLoopStatement::elaborate(Entity*, ScopeBase*) +int BasicLoopStatement::elaborate(Entity*ent, ScopeBase*scope) { - return 0; + return elaborate_substatements(ent, scope); } int ReportStmt::elaborate(Entity*ent, ScopeBase*scope) diff --git a/vhdlpp/sequential_emit.cc b/vhdlpp/sequential_emit.cc index 0431a1f53..f5454c1f3 100644 --- a/vhdlpp/sequential_emit.cc +++ b/vhdlpp/sequential_emit.cc @@ -477,6 +477,24 @@ int ForLoopStatement::emit_runtime_(ostream&out, Entity*ent, ScopeBase*scope) return errors; } +int BasicLoopStatement::emit(ostream&out, Entity*ent, ScopeBase*scope) +{ + int errors = 0; + + out << "forever begin" << endl; + errors += emit_substatements(out, ent, scope); + out << "end" << endl; + + return errors; +} + +void BasicLoopStatement::write_to_stream(std::ostream&fd) +{ + fd << "loop" << endl; + write_to_stream_substatements(fd); + fd << "end loop;" << endl; +} + int ReportStmt::emit(ostream&out, Entity*ent, ScopeBase*scope) { out << "$display(\"** ";