Skip to content

Commit

Permalink
Add blocking/nonblocking assign
Browse files Browse the repository at this point in the history
  • Loading branch information
leonardt committed Jun 13, 2019
1 parent 9eee9f0 commit ce94614
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 14 deletions.
27 changes: 16 additions & 11 deletions include/verilogAST.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -248,10 +248,14 @@ class Assign : public Node {
std::variant<Identifier *, Index *, Slice *> target;
Expression *value;
std::string prefix;
std::string symbol;

Assign(std::variant<Identifier *, Index *, Slice *> target, Expression *value,
std::string prefix)
: target(target), value(value), prefix(prefix){};
: target(target), value(value), prefix(prefix), symbol("="){};
Assign(std::variant<Identifier *, Index *, Slice *> target, Expression *value,
std::string prefix, std::string symbol)
: target(target), value(value), prefix(prefix), symbol(symbol){};

public:
std::string toString();
Expand All @@ -266,23 +270,24 @@ class ContinuousAssign : public StructuralStatement, public Assign {
std::string toString() { return Assign::toString(); };
};

class BehavioralAssign : public BehavioralStatement, public Assign {
class BehavioralAssign : public BehavioralStatement {};

class BlockingAssign : public BehavioralAssign, public Assign {
public:
BehavioralAssign(std::variant<Identifier *, Index *, Slice *> target,
Expression *value)
BlockingAssign(std::variant<Identifier *, Index *, Slice *> target,
Expression *value)
: Assign(target, value, ""){};
// Multiple inheritance forces us to have to explicitly state this?
std::string toString() { return Assign::toString(); };
};

class BlockingAssign : BehavioralAssign {
public:
std::string toString() { return "NOT IMPLEMENTED"; };
};

class NonBlockingAssign : BehavioralAssign {
class NonBlockingAssign : public BehavioralAssign, public Assign {
public:
std::string toString() { return "NOT IMPLEMENTED"; };
NonBlockingAssign(std::variant<Identifier *, Index *, Slice *> target,
Expression *value)
: Assign(target, value, "", "<="){};
// Multiple inheritance forces us to have to explicitly state this?
std::string toString() { return Assign::toString(); };
};

class Always : public Statement {
Expand Down
3 changes: 2 additions & 1 deletion src/verilogAST.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,8 @@ std::string Declaration::toString() {
}

std::string Assign::toString() {
return prefix + variant_to_string(target) + " = " + value->toString();
return prefix + variant_to_string(target) + " " + symbol + " " +
value->toString();
}

}; // namespace verilogAST
7 changes: 5 additions & 2 deletions tests/basic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -261,8 +261,11 @@ TEST(BasicTests, TestAssign) {
vAST::ContinuousAssign cont_assign(&a, &b);
EXPECT_EQ(cont_assign.toString(), "assign a = b");

vAST::BehavioralAssign behave_assign(&a, &b);
EXPECT_EQ(behave_assign.toString(), "a = b");
vAST::BlockingAssign blocking_assign(&a, &b);
EXPECT_EQ(blocking_assign.toString(), "a = b");

vAST::NonBlockingAssign non_blocking_assign(&a, &b);
EXPECT_EQ(non_blocking_assign.toString(), "a <= b");
}

} // namespace
Expand Down

0 comments on commit ce94614

Please sign in to comment.