Skip to content

Commit

Permalink
Add attribute test code path, refactor paren logic
Browse files Browse the repository at this point in the history
  • Loading branch information
leonardt committed Mar 17, 2020
1 parent b08d0d8 commit e7fcdad
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 43 deletions.
60 changes: 20 additions & 40 deletions src/verilogAST.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,21 @@ std::string join(std::vector<std::string> vec, std::string separator) {
}

namespace verilogAST {

std::string expr_to_string_with_parens(std::unique_ptr<Expression> &expr) {
// FIXME: For now we just do naive precedence logic
std::string expr_str = expr->toString();
if (dynamic_cast<Identifier *>(expr.get())) {
} else if (dynamic_cast<NumericLiteral *>(expr.get())) {
} else if (dynamic_cast<Index *>(expr.get())) {
} else if (dynamic_cast<Slice *>(expr.get())) {
} else if (dynamic_cast<Attribute *>(expr.get())) {
} else {
expr_str = "(" + expr_str + ")";
}
return expr_str;
}

std::string NumericLiteral::toString() {
std::string signed_str = _signed ? "s" : "";

Expand Down Expand Up @@ -108,24 +123,12 @@ std::string Attribute::toString() {
std::string String::toString() { return "\"" + value + "\""; }

std::string Index::toString() {
std::string expr_str = value->toString();
if (dynamic_cast<Identifier *>(value.get())) {
} else if (dynamic_cast<Index *>(value.get())) {
} else if (dynamic_cast<Slice *>(value.get())) {
} else {
expr_str = "(" + expr_str + ")";
}
std::string expr_str = expr_to_string_with_parens(value);
return expr_str + '[' + index->toString() + ']';
}

std::string Slice::toString() {
std::string expr_str = expr->toString();
if (dynamic_cast<Identifier *>(expr.get())) {
} else if (dynamic_cast<Index *>(expr.get())) {
} else if (dynamic_cast<Slice *>(expr.get())) {
} else {
expr_str = "(" + expr_str + ")";
}
std::string expr_str = expr_to_string_with_parens(expr);
return expr_str + '[' + high_index->toString() + ':' + low_index->toString() +
']';
}
Expand Down Expand Up @@ -201,23 +204,8 @@ std::string BinaryOp::toString() {
op_str = ">=";
break;
}
std::string lstr = left->toString();
std::string rstr = right->toString();
// TODO Precedence logic, for now we just insert parens if not symbol or num
if (dynamic_cast<Identifier *>(left.get())) {
} else if (dynamic_cast<NumericLiteral *>(left.get())) {
} else if (dynamic_cast<Index *>(left.get())) {
} else if (dynamic_cast<Slice *>(left.get())) {
} else {
lstr = "(" + lstr + ")";
}
if (dynamic_cast<Identifier *>(right.get())) {
} else if (dynamic_cast<NumericLiteral *>(right.get())) {
} else if (dynamic_cast<Index *>(right.get())) {
} else if (dynamic_cast<Slice *>(right.get())) {
} else {
rstr = "(" + rstr + ")";
}
std::string lstr = expr_to_string_with_parens(left);
std::string rstr = expr_to_string_with_parens(right);
return lstr + ' ' + op_str + ' ' + rstr;
}

Expand Down Expand Up @@ -258,15 +246,7 @@ std::string UnaryOp::toString() {
op_str = "-";
break;
}
std::string operand_str = operand->toString();
// TODO Precedence logic, for now we just insert parens if not symbol or num
if (dynamic_cast<Identifier *>(operand.get())) {
} else if (dynamic_cast<NumericLiteral *>(operand.get())) {
} else if (dynamic_cast<Index *>(operand.get())) {
} else if (dynamic_cast<Slice *>(operand.get())) {
} else {
operand_str = "(" + operand_str + ")";
}
std::string operand_str = expr_to_string_with_parens(operand);
return op_str + ' ' + operand_str;
}

Expand Down
7 changes: 4 additions & 3 deletions tests/transformer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,9 @@ TEST(TransformerTests, TestXtoZ) {
call_args.push_back(std::make_unique<vAST::TernaryOp>(
std::make_unique<vAST::Concat>(std::move(concat_args)),
vAST::make_binop(
std::make_unique<vAST::Slice>(vAST::make_id("x"), vAST::make_num("3"),
vAST::make_num("1")),
std::make_unique<vAST::Slice>(
std::make_unique<vAST::Attribute>(vAST::make_id("x"), "j"),
vAST::make_num("3"), vAST::make_num("1")),
vAST::BinOp::ADD,
std::make_unique<vAST::UnaryOp>(
std::make_unique<vAST::Index>(vAST::make_id("y"),
Expand All @@ -99,7 +100,7 @@ TEST(TransformerTests, TestXtoZ) {
std::make_unique<vAST::CallExpr>("my_func", std::move(call_args));
XtoZ transformer;
EXPECT_EQ(transformer.visit(std::move(expr))->toString(),
"my_func({z,b} ? z[3:1] + (~ y[1]) : {(2){z}}, z)");
"my_func({z,b} ? z.j[3:1] + (~ y[1]) : {(2){z}}, z)");
}
TEST(TransformerTests, TestReplaceNameWithExpr) {
std::unique_ptr<vAST::Expression> expr = vAST::make_binop(
Expand Down

0 comments on commit e7fcdad

Please sign in to comment.