Skip to content

Commit 72b212d

Browse files
authored
Merge pull request #67 from leonardt/ifdef-decl
Add support for Declaration inside IfMacro nodes
2 parents 9625cc9 + e001a21 commit 72b212d

File tree

5 files changed

+79
-43
lines changed

5 files changed

+79
-43
lines changed

include/verilogAST.hpp

Lines changed: 51 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -645,19 +645,46 @@ class ModuleInstantiation : public StructuralStatement {
645645
~ModuleInstantiation(){};
646646
};
647647

648+
class Declaration : public Node {
649+
public:
650+
std::string decl;
651+
std::variant<std::unique_ptr<Identifier>, std::unique_ptr<Index>,
652+
std::unique_ptr<Slice>, std::unique_ptr<Vector>>
653+
value;
654+
655+
Declaration(std::variant<std::unique_ptr<Identifier>, std::unique_ptr<Index>,
656+
std::unique_ptr<Slice>, std::unique_ptr<Vector>>
657+
value,
658+
std::string decl)
659+
: decl(decl), value(std::move(value)){};
660+
661+
std::string toString();
662+
virtual ~Declaration() = default;
663+
};
664+
648665
class IfMacro : public StructuralStatement {
649666
virtual std::string getMacroString() = 0;
650667

651668
public:
652669
std::string condition_str;
653-
std::vector<std::unique_ptr<StructuralStatement>> true_body;
654-
std::vector<std::unique_ptr<StructuralStatement>> else_body;
670+
std::vector<std::variant<std::unique_ptr<StructuralStatement>,
671+
std::unique_ptr<Declaration>>>
672+
true_body;
673+
std::vector<std::variant<std::unique_ptr<StructuralStatement>,
674+
std::unique_ptr<Declaration>>>
675+
else_body;
655676
IfMacro(std::string condition_str,
656-
std::vector<std::unique_ptr<StructuralStatement>> true_body)
677+
std::vector<std::variant<std::unique_ptr<StructuralStatement>,
678+
std::unique_ptr<Declaration>>>
679+
true_body)
657680
: condition_str(condition_str), true_body(std::move(true_body)){};
658681
IfMacro(std::string condition_str,
659-
std::vector<std::unique_ptr<StructuralStatement>> true_body,
660-
std::vector<std::unique_ptr<StructuralStatement>> else_body)
682+
std::vector<std::variant<std::unique_ptr<StructuralStatement>,
683+
std::unique_ptr<Declaration>>>
684+
true_body,
685+
std::vector<std::variant<std::unique_ptr<StructuralStatement>,
686+
std::unique_ptr<Declaration>>>
687+
else_body)
661688
: condition_str(condition_str),
662689
true_body(std::move(true_body)),
663690
else_body(std::move(else_body)){};
@@ -670,12 +697,18 @@ class IfDef : public IfMacro {
670697

671698
public:
672699
IfDef(std::string condition_str,
673-
std::vector<std::unique_ptr<StructuralStatement>> body)
700+
std::vector<std::variant<std::unique_ptr<StructuralStatement>,
701+
std::unique_ptr<Declaration>>>
702+
body)
674703
: IfMacro(condition_str, std::move(body)){};
675704
IfDef(std::string condition_str,
676-
std::vector<std::unique_ptr<StructuralStatement>> true_body,
677-
std::vector<std::unique_ptr<StructuralStatement>> else_body)
678-
: IfMacro(condition_str, std::move(true_body), std::move(else_body)){};
705+
std::vector<std::variant<std::unique_ptr<StructuralStatement>,
706+
std::unique_ptr<Declaration>>>
707+
true_body,
708+
std::vector<std::variant<std::unique_ptr<StructuralStatement>,
709+
std::unique_ptr<Declaration>>>
710+
else_body)
711+
: IfMacro(condition_str, std::move(true_body), std::move(else_body)){};
679712
~IfDef(){};
680713
};
681714

@@ -684,32 +717,21 @@ class IfNDef : public IfMacro {
684717

685718
public:
686719
IfNDef(std::string condition_str,
687-
std::vector<std::unique_ptr<StructuralStatement>> body)
720+
std::vector<std::variant<std::unique_ptr<StructuralStatement>,
721+
std::unique_ptr<Declaration>>>
722+
body)
688723
: IfMacro(condition_str, std::move(body)){};
689724
IfNDef(std::string condition_str,
690-
std::vector<std::unique_ptr<StructuralStatement>> true_body,
691-
std::vector<std::unique_ptr<StructuralStatement>> else_body)
725+
std::vector<std::variant<std::unique_ptr<StructuralStatement>,
726+
std::unique_ptr<Declaration>>>
727+
true_body,
728+
std::vector<std::variant<std::unique_ptr<StructuralStatement>,
729+
std::unique_ptr<Declaration>>>
730+
else_body)
692731
: IfMacro(condition_str, std::move(true_body), std::move(else_body)){};
693732
~IfNDef(){};
694733
};
695734

696-
class Declaration : public Node {
697-
public:
698-
std::string decl;
699-
std::variant<std::unique_ptr<Identifier>, std::unique_ptr<Index>,
700-
std::unique_ptr<Slice>, std::unique_ptr<Vector>>
701-
value;
702-
703-
Declaration(std::variant<std::unique_ptr<Identifier>, std::unique_ptr<Index>,
704-
std::unique_ptr<Slice>, std::unique_ptr<Vector>>
705-
value,
706-
std::string decl)
707-
: decl(decl), value(std::move(value)){};
708-
709-
std::string toString();
710-
virtual ~Declaration() = default;
711-
};
712-
713735
class Wire : public Declaration {
714736
public:
715737
Wire(std::variant<std::unique_ptr<Identifier>, std::unique_ptr<Index>,

src/transformer.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,12 +244,16 @@ std::unique_ptr<InlineVerilog> Transformer::visit(
244244
}
245245

246246
std::unique_ptr<IfMacro> Transformer::visit(std::unique_ptr<IfMacro> node) {
247-
std::vector<std::unique_ptr<StructuralStatement>> new_true_body;
247+
std::vector<std::variant<std::unique_ptr<StructuralStatement>,
248+
std::unique_ptr<Declaration>>>
249+
new_true_body;
248250
for (auto&& item : node->true_body) {
249251
new_true_body.push_back(this->visit(std::move(item)));
250252
}
251253
node->true_body = std::move(new_true_body);
252-
std::vector<std::unique_ptr<StructuralStatement>> new_else_body;
254+
std::vector<std::variant<std::unique_ptr<StructuralStatement>,
255+
std::unique_ptr<Declaration>>>
256+
new_else_body;
253257
for (auto&& item : node->else_body) {
254258
new_else_body.push_back(this->visit(std::move(item)));
255259
}

src/verilogAST.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,12 +413,12 @@ std::string IfMacro::toString() {
413413
std::string s = this->getMacroString();
414414
s += this->condition_str + "\n";
415415
for (auto &statement : this->true_body) {
416-
s += statement->toString() + "\n";
416+
s += variant_to_string(statement) + "\n";
417417
}
418418
if (this->else_body.size() > 0) {
419419
s += "`else\n";
420420
for (auto &statement : this->else_body) {
421-
s += statement->toString() + "\n";
421+
s += variant_to_string(statement) + "\n";
422422
}
423423
}
424424
return s + "`endif";

tests/assign_inliner.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -661,10 +661,14 @@ TEST(InlineAssignTests, TestInstConn) {
661661
"inner_module", std::move(parameters), "inner_module_inst",
662662
std::move(connections));
663663

664-
std::vector<std::unique_ptr<vAST::StructuralStatement>> if_def_true_body;
664+
std::vector<std::variant<std::unique_ptr<vAST::StructuralStatement>,
665+
std::unique_ptr<vAST::Declaration>>>
666+
if_def_true_body;
665667
if_def_true_body.push_back(std::move(module_inst));
666668

667-
std::vector<std::unique_ptr<vAST::StructuralStatement>> if_def_false_body;
669+
std::vector<std::variant<std::unique_ptr<vAST::StructuralStatement>,
670+
std::unique_ptr<vAST::Declaration>>>
671+
if_def_false_body;
668672
if_def_false_body.push_back(std::make_unique<vAST::ContinuousAssign>(
669673
vAST::make_id("y"), vAST::make_num("0")));
670674

@@ -766,7 +770,9 @@ TEST(InlineAssignTests, TestNoInlineIndex) {
766770
body.push_back(std::make_unique<vAST::ContinuousAssign>(vAST::make_id("y"),
767771
vAST::make_id("i1")));
768772

769-
std::vector<std::unique_ptr<vAST::StructuralStatement>> if_n_def_body;
773+
std::vector<std::variant<std::unique_ptr<vAST::StructuralStatement>,
774+
std::unique_ptr<vAST::Declaration>>>
775+
if_n_def_body;
770776
if_n_def_body.push_back(std::make_unique<vAST::ContinuousAssign>(
771777
vAST::make_id("o1"),
772778
std::make_unique<vAST::Index>(vAST::make_id("y"), vAST::make_num("0"))));

tests/basic.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -757,11 +757,12 @@ TEST(BasicTests, TestIfDef) {
757757
std::move(parameters),
758758
instance_name,
759759
make_simple_connections());
760-
std::vector<std::unique_ptr<vAST::StructuralStatement>>
760+
std::vector<std::variant<std::unique_ptr<vAST::StructuralStatement>,
761+
std::unique_ptr<vAST::Declaration>>>
761762
body;
762763
body.push_back(std::move(module_inst));
763764
vAST::IfDef if_def("ASSERT_ON", std::move(body));
764-
EXPECT_EQ(if_def.toString(),
765+
EXPECT_EQ(if_def.toString(),
765766
"`ifdef ASSERT_ON\n"
766767
"test_module #(\n"
767768
" .param0(0),\n"
@@ -786,11 +787,12 @@ TEST(BasicTests, TestIfDefInvert) {
786787
std::move(parameters),
787788
instance_name,
788789
make_simple_connections());
789-
std::vector<std::unique_ptr<vAST::StructuralStatement>>
790+
std::vector<std::variant<std::unique_ptr<vAST::StructuralStatement>,
791+
std::unique_ptr<vAST::Declaration>>>
790792
body;
791793
body.push_back(std::move(module_inst));
792794
vAST::IfNDef if_def("ASSERT_ON", std::move(body));
793-
EXPECT_EQ(if_def.toString(),
795+
EXPECT_EQ(if_def.toString(),
794796
"`ifndef ASSERT_ON\n"
795797
"test_module #(\n"
796798
" .param0(0),\n"
@@ -811,7 +813,8 @@ TEST(BasicTests, TestIfDefElse) {
811813
make_simple_params(),
812814
"test_module_inst0",
813815
make_simple_connections());
814-
std::vector<std::unique_ptr<vAST::StructuralStatement>>
816+
std::vector<std::variant<std::unique_ptr<vAST::StructuralStatement>,
817+
std::unique_ptr<vAST::Declaration>>>
815818
true_body;
816819
true_body.push_back(std::move(module_inst0));
817820

@@ -820,11 +823,12 @@ TEST(BasicTests, TestIfDefElse) {
820823
make_simple_params(),
821824
"test_module_inst1",
822825
make_simple_connections());
823-
std::vector<std::unique_ptr<vAST::StructuralStatement>>
826+
std::vector<std::variant<std::unique_ptr<vAST::StructuralStatement>,
827+
std::unique_ptr<vAST::Declaration>>>
824828
else_body;
825829
else_body.push_back(std::move(module_inst1));
826830
vAST::IfNDef if_def("ASSERT_ON", std::move(true_body), std::move(else_body));
827-
EXPECT_EQ(if_def.toString(),
831+
EXPECT_EQ(if_def.toString(),
828832
"`ifndef ASSERT_ON\n"
829833
"test_module #(\n"
830834
" .param0(0),\n"

0 commit comments

Comments
 (0)