3 #include "netlist_test_utils.h"
4 #include "gate_library_test_utils.h"
16 test_utils::init_log_channels();
17 test_utils::create_sandbox_directory();
22 test_utils::remove_sandbox_directory();
45 std::string netlist_input(
"module top ("
49 " input net_global_in ;"
50 " output net_global_out ;"
54 " .I (net_global_in ),"
58 " .I0 (net_global_in ),"
59 " .I1 (net_global_in ),"
65 " .O (net_global_out )"
69 std::filesystem::path verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
72 ASSERT_TRUE(nl_res.is_ok());
73 std::unique_ptr<Netlist> nl = nl_res.get();
74 ASSERT_NE(nl,
nullptr);
77 ASSERT_EQ(nl->get_gates(test_utils::gate_type_filter(
"BUF")).size(), 1);
78 Gate* gate_0 = *(nl->get_gates(test_utils::gate_type_filter(
"BUF")).begin());
79 ASSERT_EQ(nl->get_gates(test_utils::gate_type_filter(
"AND2")).size(), 1);
80 Gate* gate_1 = *(nl->get_gates(test_utils::gate_type_filter(
"AND2")).begin());
81 ASSERT_EQ(nl->get_gates(test_utils::gate_type_filter(
"AND3")).size(), 1);
82 Gate* gate_2 = *(nl->get_gates(test_utils::gate_type_filter(
"AND3")).begin());
84 ASSERT_NE(gate_0,
nullptr);
85 EXPECT_EQ(gate_0->
get_name(),
"gate_0");
87 ASSERT_NE(gate_1,
nullptr);
88 EXPECT_EQ(gate_1->
get_name(),
"gate_1");
90 ASSERT_NE(gate_2,
nullptr);
91 EXPECT_EQ(gate_2->
get_name(),
"gate_2");
94 Net* net_0 = *(nl->get_nets(test_utils::net_name_filter(
"net_0")).begin());
95 Net* net_1 = *(nl->get_nets(test_utils::net_name_filter(
"net_1")).begin());
97 net_global_in = *(nl->get_nets(test_utils::net_name_filter(
"net_global_in")).begin());
99 net_global_out = *(nl->get_nets(test_utils::net_name_filter(
"net_global_out")).begin());
101 ASSERT_NE(net_0,
nullptr);
102 EXPECT_EQ(net_0->
get_name(),
"net_0");
104 EXPECT_EQ(net_0->
get_sources()[0], test_utils::get_endpoint(gate_0,
"O"));
105 std::vector<Endpoint*> exp_net_0_dsts = {test_utils::get_endpoint(gate_2,
"I0")};
107 std::vector<Endpoint*>({test_utils::get_endpoint(gate_2,
110 ASSERT_NE(net_1,
nullptr);
111 EXPECT_EQ(net_1->
get_name(),
"net_1");
113 EXPECT_EQ(net_1->
get_sources()[0], test_utils::get_endpoint(gate_1,
"O"));
115 std::vector<Endpoint*>({test_utils::get_endpoint(gate_2,
118 ASSERT_NE(net_global_in,
nullptr);
119 EXPECT_EQ(net_global_in->
get_name(),
"net_global_in");
122 std::vector<Endpoint*>({test_utils::get_endpoint(gate_0,
124 test_utils::get_endpoint(gate_1,
126 test_utils::get_endpoint(gate_1,
128 EXPECT_TRUE(nl->is_global_input_net(net_global_in));
130 ASSERT_NE(net_global_out,
nullptr);
131 EXPECT_EQ(net_global_out->
get_name(),
"net_global_out");
132 ASSERT_EQ(net_global_out->
get_sources().size(), 1);
133 EXPECT_EQ(net_global_out->
get_sources()[0], test_utils::get_endpoint(gate_2,
"O"));
135 EXPECT_TRUE(nl->is_global_output_net(net_global_out));
137 EXPECT_EQ(nl->get_global_input_nets().size(), 1);
138 EXPECT_EQ(nl->get_global_output_nets().size(), 1);
152 std::string netlist_input(
"module top(net_global_in,net_global_out);input net_global_in;\n"
153 " output net_global_out;wire net_0;wire net_1;BUF gate_0 (\n"
154 " .I (net_global_in),\n"
158 "AND2 gate_1 (.I0\n\t"
163 " .I1 (net_global_in),.O (net_1));\n"
164 "AND3 gate_2 (.I0 (net_0 ),.I1 (net_1 ),.O (net_global_out ));endmodule");
166 std::filesystem::path verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
169 ASSERT_TRUE(nl_res.is_ok());
170 std::unique_ptr<Netlist> nl = nl_res.get();
171 ASSERT_NE(nl,
nullptr);
174 ASSERT_EQ(nl->get_gates(test_utils::gate_type_filter(
"BUF")).size(), 1);
175 Gate* gate_0 = *(nl->get_gates(test_utils::gate_type_filter(
"BUF")).begin());
176 ASSERT_EQ(nl->get_gates(test_utils::gate_type_filter(
"AND2")).size(), 1);
177 Gate* gate_1 = *(nl->get_gates(test_utils::gate_type_filter(
"AND2")).begin());
178 ASSERT_EQ(nl->get_gates(test_utils::gate_type_filter(
"AND3")).size(), 1);
179 Gate* gate_2 = *(nl->get_gates(test_utils::gate_type_filter(
"AND3")).begin());
181 ASSERT_NE(gate_0,
nullptr);
182 EXPECT_EQ(gate_0->
get_name(),
"gate_0");
184 ASSERT_NE(gate_1,
nullptr);
185 EXPECT_EQ(gate_1->
get_name(),
"gate_1");
187 ASSERT_NE(gate_2,
nullptr);
188 EXPECT_EQ(gate_2->
get_name(),
"gate_2");
191 Net* net_0 = *(nl->get_nets(test_utils::net_name_filter(
"net_0")).begin());
192 Net* net_1 = *(nl->get_nets(test_utils::net_name_filter(
"net_1")).begin());
193 Net* net_global_in = *(nl->get_nets(test_utils::net_name_filter(
"net_global_in")).begin());
194 Net* net_global_out = *(nl->get_nets(test_utils::net_name_filter(
"net_global_out")).begin());
196 ASSERT_NE(net_0,
nullptr);
197 EXPECT_EQ(net_0->
get_name(),
"net_0");
199 EXPECT_EQ(net_0->
get_sources()[0], test_utils::get_endpoint(gate_0,
"O"));
200 std::vector<Endpoint*> exp_net_0_dsts = {test_utils::get_endpoint(gate_2,
"I0")};
203 ASSERT_NE(net_1,
nullptr);
204 EXPECT_EQ(net_1->
get_name(),
"net_1");
206 EXPECT_EQ(net_1->
get_sources()[0], test_utils::get_endpoint(gate_1,
"O"));
209 ASSERT_NE(net_global_in,
nullptr);
210 EXPECT_EQ(net_global_in->
get_name(),
"net_global_in");
213 test_utils::get_endpoint(gate_1,
"I0"),
214 test_utils::get_endpoint(gate_1,
"I1")})));
215 EXPECT_TRUE(nl->is_global_input_net(net_global_in));
217 ASSERT_NE(net_global_out,
nullptr);
218 EXPECT_EQ(net_global_out->
get_name(),
"net_global_out");
219 ASSERT_EQ(net_global_out->
get_sources().size(), 1);
220 EXPECT_EQ(net_global_out->
get_sources()[0], test_utils::get_endpoint(gate_2,
"O"));
222 EXPECT_TRUE(nl->is_global_output_net(net_global_out));
224 EXPECT_EQ(nl->get_global_input_nets().size(), 1);
225 EXPECT_EQ(nl->get_global_output_nets().size(), 1);
241 std::string netlist_input(
"module top (a, b, c, d); "
259 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
262 ASSERT_TRUE(nl_res.is_ok());
263 std::unique_ptr<Netlist> nl = nl_res.get();
264 ASSERT_NE(nl,
nullptr);
266 EXPECT_EQ(nl->get_gates().size(), 2);
267 EXPECT_EQ(nl->get_nets().size(), 4);
268 EXPECT_EQ(nl->get_modules().size(), 1);
270 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).size(), 1);
271 Gate* gate_0 = nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).front();
275 ASSERT_NE(ep_g0_net_a,
nullptr);
276 ASSERT_NE(ep_g0_net_b,
nullptr);
277 ASSERT_NE(ep_g0_net_c,
nullptr);
281 ASSERT_NE(net_g0_a,
nullptr);
282 ASSERT_NE(net_g0_b,
nullptr);
283 ASSERT_NE(net_g0_c,
nullptr);
284 EXPECT_EQ(net_g0_a->
get_name(),
"a");
285 EXPECT_EQ(net_g0_b->
get_name(),
"b");
286 EXPECT_EQ(net_g0_c->
get_name(),
"c");
288 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"OR2",
"gate_1")).size(), 1);
289 Gate* gate_1 = nl->get_gates(test_utils::gate_filter(
"OR2",
"gate_1")).front();
293 ASSERT_NE(ep_g1_net_a,
nullptr);
294 ASSERT_NE(ep_g1_net_b,
nullptr);
295 ASSERT_NE(ep_g1_net_d,
nullptr);
299 ASSERT_NE(net_g1_a,
nullptr);
300 ASSERT_NE(net_g1_b,
nullptr);
301 ASSERT_NE(net_g1_d,
nullptr);
302 EXPECT_EQ(net_g1_a->
get_name(),
"a");
303 EXPECT_EQ(net_g1_b->
get_name(),
"b");
304 EXPECT_EQ(net_g1_d->
get_name(),
"d");
306 ASSERT_EQ(net_g0_a, net_g1_a);
307 ASSERT_EQ(net_g0_b, net_g1_b);
309 Net* net_a = net_g0_a;
310 Net* net_b = net_g0_b;
311 Net* net_c = net_g0_c;
312 Net* net_d = net_g1_d;
314 Module* top = nl->get_top_module();
315 ASSERT_NE(top,
nullptr);
329 std::string netlist_input(
"module top (input a, b, output c, d); "
345 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
348 ASSERT_TRUE(nl_res.is_ok());
349 std::unique_ptr<Netlist> nl = nl_res.get();
350 ASSERT_NE(nl,
nullptr);
352 EXPECT_EQ(nl->get_gates().size(), 2);
353 EXPECT_EQ(nl->get_nets().size(), 4);
354 EXPECT_EQ(nl->get_modules().size(), 1);
356 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).size(), 1);
357 Gate* gate_0 = nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).front();
361 ASSERT_NE(ep_g0_net_a,
nullptr);
362 ASSERT_NE(ep_g0_net_b,
nullptr);
363 ASSERT_NE(ep_g0_net_c,
nullptr);
367 ASSERT_NE(net_g0_a,
nullptr);
368 ASSERT_NE(net_g0_b,
nullptr);
369 ASSERT_NE(net_g0_c,
nullptr);
370 EXPECT_EQ(net_g0_a->
get_name(),
"a");
371 EXPECT_EQ(net_g0_b->
get_name(),
"b");
372 EXPECT_EQ(net_g0_c->
get_name(),
"c");
374 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"OR2",
"gate_1")).size(), 1);
375 Gate* gate_1 = nl->get_gates(test_utils::gate_filter(
"OR2",
"gate_1")).front();
379 ASSERT_NE(ep_g1_net_a,
nullptr);
380 ASSERT_NE(ep_g1_net_b,
nullptr);
381 ASSERT_NE(ep_g1_net_d,
nullptr);
385 ASSERT_NE(net_g1_a,
nullptr);
386 ASSERT_NE(net_g1_b,
nullptr);
387 ASSERT_NE(net_g1_d,
nullptr);
388 EXPECT_EQ(net_g1_a->
get_name(),
"a");
389 EXPECT_EQ(net_g1_b->
get_name(),
"b");
390 EXPECT_EQ(net_g1_d->
get_name(),
"d");
392 ASSERT_EQ(net_g0_a, net_g1_a);
393 ASSERT_EQ(net_g0_b, net_g1_b);
395 Net* net_a = net_g0_a;
396 Net* net_b = net_g0_b;
397 Net* net_c = net_g0_c;
398 Net* net_d = net_g1_d;
400 Module* top = nl->get_top_module();
401 ASSERT_NE(top,
nullptr);
415 std::string netlist_input(
"module top (input a, b, output c, d); "
433 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
436 ASSERT_TRUE(nl_res.is_ok());
437 std::unique_ptr<Netlist> nl = nl_res.get();
438 ASSERT_NE(nl,
nullptr);
440 EXPECT_EQ(nl->get_gates().size(), 2);
441 EXPECT_EQ(nl->get_nets().size(), 4);
442 EXPECT_EQ(nl->get_modules().size(), 1);
444 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).size(), 1);
445 Gate* gate_0 = nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).front();
449 ASSERT_NE(ep_g0_net_a,
nullptr);
450 ASSERT_NE(ep_g0_net_b,
nullptr);
451 ASSERT_NE(ep_g0_net_c,
nullptr);
455 ASSERT_NE(net_g0_a,
nullptr);
456 ASSERT_NE(net_g0_b,
nullptr);
457 ASSERT_NE(net_g0_c,
nullptr);
458 EXPECT_EQ(net_g0_a->
get_name(),
"a");
459 EXPECT_EQ(net_g0_b->
get_name(),
"b");
460 EXPECT_EQ(net_g0_c->
get_name(),
"c");
462 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"OR2",
"gate_1")).size(), 1);
463 Gate* gate_1 = nl->get_gates(test_utils::gate_filter(
"OR2",
"gate_1")).front();
467 ASSERT_NE(ep_g1_net_a,
nullptr);
468 ASSERT_NE(ep_g1_net_b,
nullptr);
469 ASSERT_NE(ep_g1_net_d,
nullptr);
473 ASSERT_NE(net_g1_a,
nullptr);
474 ASSERT_NE(net_g1_b,
nullptr);
475 ASSERT_NE(net_g1_d,
nullptr);
476 EXPECT_EQ(net_g1_a->
get_name(),
"a");
477 EXPECT_EQ(net_g1_b->
get_name(),
"b");
478 EXPECT_EQ(net_g1_d->
get_name(),
"d");
480 ASSERT_EQ(net_g0_a, net_g1_a);
481 ASSERT_EQ(net_g0_b, net_g1_b);
483 Net* net_a = net_g0_a;
484 Net* net_b = net_g0_b;
485 Net* net_c = net_g0_c;
486 Net* net_d = net_g1_d;
488 Module* top = nl->get_top_module();
489 ASSERT_NE(top,
nullptr);
503 std::string netlist_input(
"module top (a, b, c, d); "
523 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
526 ASSERT_TRUE(nl_res.is_ok());
527 std::unique_ptr<Netlist> nl = nl_res.get();
528 ASSERT_NE(nl,
nullptr);
530 EXPECT_EQ(nl->get_gates().size(), 2);
531 EXPECT_EQ(nl->get_nets().size(), 4);
532 EXPECT_EQ(nl->get_modules().size(), 1);
534 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).size(), 1);
535 Gate* gate_0 = nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).front();
539 ASSERT_NE(ep_g0_net_a,
nullptr);
540 ASSERT_NE(ep_g0_net_b,
nullptr);
541 ASSERT_NE(ep_g0_net_c,
nullptr);
545 ASSERT_NE(net_g0_a,
nullptr);
546 ASSERT_NE(net_g0_b,
nullptr);
547 ASSERT_NE(net_g0_c,
nullptr);
548 EXPECT_EQ(net_g0_a->
get_name(),
"a");
549 EXPECT_EQ(net_g0_b->
get_name(),
"b");
550 EXPECT_EQ(net_g0_c->
get_name(),
"c");
552 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"OR2",
"gate_1")).size(), 1);
553 Gate* gate_1 = nl->get_gates(test_utils::gate_filter(
"OR2",
"gate_1")).front();
557 ASSERT_NE(ep_g1_net_a,
nullptr);
558 ASSERT_NE(ep_g1_net_b,
nullptr);
559 ASSERT_NE(ep_g1_net_d,
nullptr);
563 ASSERT_NE(net_g1_a,
nullptr);
564 ASSERT_NE(net_g1_b,
nullptr);
565 ASSERT_NE(net_g1_d,
nullptr);
566 EXPECT_EQ(net_g1_a->
get_name(),
"a");
567 EXPECT_EQ(net_g1_b->
get_name(),
"b");
568 EXPECT_EQ(net_g1_d->
get_name(),
"d");
570 ASSERT_EQ(net_g0_a, net_g1_a);
571 ASSERT_EQ(net_g0_b, net_g1_b);
573 Net* net_a = net_g0_a;
574 Net* net_b = net_g0_b;
575 Net* net_c = net_g0_c;
576 Net* net_d = net_g1_d;
578 Module* top = nl->get_top_module();
579 ASSERT_NE(top,
nullptr);
604 std::string netlist_input(
605 "module top (a, b, c); "
626 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
629 ASSERT_TRUE(nl_res.is_ok());
630 std::unique_ptr<Netlist> nl = nl_res.get();
631 ASSERT_NE(nl,
nullptr);
633 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).size(), 1);
634 Gate* gate_0 = nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).front();
639 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_1")).size(), 1);
640 Gate* gate_1 = nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_1")).front();
645 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_2")).size(), 1);
646 Gate* gate_2 = nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_2")).front();
654 std::string netlist_input(
655 "module top (a, b, c); "
679 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
682 ASSERT_TRUE(nl_res.is_ok());
683 std::unique_ptr<Netlist> nl = nl_res.get();
684 ASSERT_NE(nl,
nullptr);
686 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).size(), 1);
687 Gate* gate_0 = nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).front();
692 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_1")).size(), 1);
693 Gate* gate_1 = nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_1")).front();
698 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_2")).size(), 1);
699 Gate* gate_2 = nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_2")).front();
707 std::string netlist_input(
708 "module top (a, b, c); "
712 " AND2 gate_0 (a, b, c);"
714 " AND2 gate_1 (a, b);"
720 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
723 ASSERT_TRUE(nl_res.is_ok());
724 std::unique_ptr<Netlist> nl = nl_res.get();
725 ASSERT_NE(nl,
nullptr);
727 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).size(), 1);
728 Gate* gate_0 = nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_0")).front();
733 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_1")).size(), 1);
734 Gate* gate_1 = nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_1")).front();
739 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_2")).size(), 1);
740 Gate* gate_2 = nl->get_gates(test_utils::gate_filter(
"AND2",
"gate_2")).front();
748 std::string netlist_input(
749 "module sub_mod (as, bs, cs);"
760 "module top (a, b, c); "
782 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
785 ASSERT_TRUE(nl_res.is_ok());
786 std::unique_ptr<Netlist> nl = nl_res.get();
787 ASSERT_NE(nl,
nullptr);
789 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_0")).size(), 1);
790 Module* inst_0 = nl->get_modules(test_utils::module_name_filter(
"inst_0")).front();
791 const auto pins_0 = inst_0->
get_pins();
792 EXPECT_EQ(pins_0.size(), 3);
793 EXPECT_EQ(pins_0.at(0)->get_name(),
"as");
794 EXPECT_EQ(pins_0.at(0)->get_net()->get_name(),
"a");
795 EXPECT_EQ(pins_0.at(1)->get_name(),
"bs");
796 EXPECT_EQ(pins_0.at(1)->get_net()->get_name(),
"b");
797 EXPECT_EQ(pins_0.at(2)->get_name(),
"cs");
798 EXPECT_EQ(pins_0.at(2)->get_net()->get_name(),
"c");
800 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_1")).size(), 1);
801 Module* inst_1 = nl->get_modules(test_utils::module_name_filter(
"inst_1")).front();
802 const auto pins_1 = inst_1->
get_pins();
803 EXPECT_EQ(pins_1.size(), 2);
804 EXPECT_EQ(pins_1.at(0)->get_name(),
"bs");
805 EXPECT_EQ(pins_1.at(0)->get_net()->get_name(),
"b");
806 EXPECT_EQ(pins_1.at(1)->get_name(),
"cs");
807 EXPECT_EQ(pins_1.at(1)->get_net()->get_name(),
"c");
809 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_2")).size(), 1);
810 Module* inst_2 = nl->get_modules(test_utils::module_name_filter(
"inst_2")).front();
811 const auto pins_2 = inst_2->
get_pins();
812 EXPECT_EQ(pins_2.size(), 1);
813 EXPECT_EQ(pins_2.at(0)->get_name(),
"cs");
814 EXPECT_EQ(pins_2.at(0)->get_net()->get_name(),
"c");
819 std::string netlist_input(
"module sub_mod (as, .bs(bs_int), cs);"
830 "module top (a, b, c); "
851 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
854 ASSERT_TRUE(nl_res.is_ok());
855 std::unique_ptr<Netlist> nl = nl_res.get();
856 ASSERT_NE(nl,
nullptr);
858 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_0")).size(), 1);
859 Module* inst_0 = nl->get_modules(test_utils::module_name_filter(
"inst_0")).front();
860 const auto pins_0 = inst_0->
get_pins();
861 EXPECT_EQ(pins_0.size(), 3);
862 EXPECT_EQ(pins_0.at(0)->get_name(),
"as");
863 EXPECT_EQ(pins_0.at(0)->get_net()->get_name(),
"a");
864 EXPECT_EQ(pins_0.at(1)->get_name(),
"bs");
865 EXPECT_EQ(pins_0.at(1)->get_net()->get_name(),
"b");
866 EXPECT_EQ(pins_0.at(2)->get_name(),
"cs");
867 EXPECT_EQ(pins_0.at(2)->get_net()->get_name(),
"c");
869 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_1")).size(), 1);
870 Module* inst_1 = nl->get_modules(test_utils::module_name_filter(
"inst_1")).front();
871 const auto pins_1 = inst_1->
get_pins();
872 EXPECT_EQ(pins_1.size(), 2);
873 EXPECT_EQ(pins_1.at(0)->get_name(),
"bs");
874 EXPECT_EQ(pins_1.at(0)->get_net()->get_name(),
"b");
875 EXPECT_EQ(pins_1.at(1)->get_name(),
"cs");
876 EXPECT_EQ(pins_1.at(1)->get_net()->get_name(),
"c");
878 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_2")).size(), 1);
879 Module* inst_2 = nl->get_modules(test_utils::module_name_filter(
"inst_2")).front();
880 const auto pins_2 = inst_2->
get_pins();
881 EXPECT_EQ(pins_2.size(), 1);
882 EXPECT_EQ(pins_2.at(0)->get_name(),
"cs");
883 EXPECT_EQ(pins_2.at(0)->get_net()->get_name(),
"c");
888 std::string netlist_input(
889 "module sub_mod (as, bs, cs);"
900 "module top (a, b, c); "
925 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
928 ASSERT_TRUE(nl_res.is_ok());
929 std::unique_ptr<Netlist> nl = nl_res.get();
930 ASSERT_NE(nl,
nullptr);
932 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_0")).size(), 1);
933 Module* inst_0 = nl->get_modules(test_utils::module_name_filter(
"inst_0")).front();
934 const auto pins_0 = inst_0->
get_pins();
935 EXPECT_EQ(pins_0.size(), 3);
936 EXPECT_EQ(pins_0.at(0)->get_name(),
"as");
937 EXPECT_EQ(pins_0.at(0)->get_net()->get_name(),
"a");
938 EXPECT_EQ(pins_0.at(1)->get_name(),
"bs");
939 EXPECT_EQ(pins_0.at(1)->get_net()->get_name(),
"b");
940 EXPECT_EQ(pins_0.at(2)->get_name(),
"cs");
941 EXPECT_EQ(pins_0.at(2)->get_net()->get_name(),
"c");
943 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_1")).size(), 1);
944 Module* inst_1 = nl->get_modules(test_utils::module_name_filter(
"inst_1")).front();
945 const auto pins_1 = inst_1->
get_pins();
946 EXPECT_EQ(pins_1.size(), 2);
947 EXPECT_EQ(pins_1.at(0)->get_name(),
"bs");
948 EXPECT_EQ(pins_1.at(0)->get_net()->get_name(),
"b");
949 EXPECT_EQ(pins_1.at(1)->get_name(),
"cs");
950 EXPECT_EQ(pins_1.at(1)->get_net()->get_name(),
"c");
952 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_2")).size(), 1);
953 Module* inst_2 = nl->get_modules(test_utils::module_name_filter(
"inst_2")).front();
954 const auto pins_2 = inst_2->
get_pins();
955 EXPECT_EQ(pins_2.size(), 1);
956 EXPECT_EQ(pins_2.at(0)->get_name(),
"cs");
957 EXPECT_EQ(pins_2.at(0)->get_net()->get_name(),
"c");
962 std::string netlist_input(
963 "module sub_mod (as, bs, cs);"
967 " AND2 gate_0 (as, bs, cs);"
970 "module top (a, b, c); "
974 " sub_mod inst_0 (a, b, c);"
976 " sub_mod inst_1 (a, b);"
978 " sub_mod inst_2 (a);"
983 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
986 ASSERT_TRUE(nl_res.is_ok());
987 std::unique_ptr<Netlist> nl = nl_res.get();
988 ASSERT_NE(nl,
nullptr);
990 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_0")).size(), 1);
991 Module* inst_0 = nl->get_modules(test_utils::module_name_filter(
"inst_0")).front();
992 const auto pins_0 = inst_0->
get_pins();
993 EXPECT_EQ(pins_0.size(), 3);
994 EXPECT_EQ(pins_0.at(0)->get_name(),
"as");
995 EXPECT_EQ(pins_0.at(0)->get_net()->get_name(),
"a");
996 EXPECT_EQ(pins_0.at(1)->get_name(),
"bs");
997 EXPECT_EQ(pins_0.at(1)->get_net()->get_name(),
"b");
998 EXPECT_EQ(pins_0.at(2)->get_name(),
"cs");
999 EXPECT_EQ(pins_0.at(2)->get_net()->get_name(),
"c");
1001 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_1")).size(), 1);
1002 Module* inst_1 = nl->get_modules(test_utils::module_name_filter(
"inst_1")).front();
1003 const auto pins_1 = inst_1->
get_pins();
1004 EXPECT_EQ(pins_1.size(), 2);
1005 EXPECT_EQ(pins_1.at(0)->get_name(),
"as");
1006 EXPECT_EQ(pins_1.at(0)->get_net()->get_name(),
"a");
1007 EXPECT_EQ(pins_1.at(1)->get_name(),
"bs");
1008 EXPECT_EQ(pins_1.at(1)->get_net()->get_name(),
"b");
1010 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_2")).size(), 1);
1011 Module* inst_2 = nl->get_modules(test_utils::module_name_filter(
"inst_2")).front();
1012 const auto pins_2 = inst_2->
get_pins();
1013 EXPECT_EQ(pins_2.size(), 1);
1014 EXPECT_EQ(pins_2.at(0)->get_name(),
"as");
1015 EXPECT_EQ(pins_2.at(0)->get_net()->get_name(),
"a");
1020 std::string netlist_input(
1021 "module sub_sub_mod (ass, bss, css);"
1032 "module sub_mod (as, bs, cs);"
1036 " sub_sub_mod mid ("
1043 "module top (a, b, c); "
1065 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
1068 ASSERT_TRUE(nl_res.is_ok());
1069 std::unique_ptr<Netlist> nl = nl_res.get();
1070 ASSERT_NE(nl,
nullptr);
1072 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_0")).size(), 1);
1073 Module* inst_0 = nl->get_modules(test_utils::module_name_filter(
"inst_0")).front();
1074 const auto pins_0 = inst_0->
get_pins();
1075 EXPECT_EQ(pins_0.size(), 3);
1076 EXPECT_EQ(pins_0.at(0)->get_name(),
"as");
1077 EXPECT_EQ(pins_0.at(0)->get_net()->get_name(),
"a");
1078 EXPECT_EQ(pins_0.at(1)->get_name(),
"bs");
1079 EXPECT_EQ(pins_0.at(1)->get_net()->get_name(),
"b");
1080 EXPECT_EQ(pins_0.at(2)->get_name(),
"cs");
1081 EXPECT_EQ(pins_0.at(2)->get_net()->get_name(),
"c");
1083 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_1")).size(), 1);
1084 Module* inst_1 = nl->get_modules(test_utils::module_name_filter(
"inst_1")).front();
1085 const auto pins_1 = inst_1->
get_pins();
1086 EXPECT_EQ(pins_1.size(), 2);
1087 EXPECT_EQ(pins_1.at(0)->get_name(),
"bs");
1088 EXPECT_EQ(pins_1.at(0)->get_net()->get_name(),
"b");
1089 EXPECT_EQ(pins_1.at(1)->get_name(),
"cs");
1090 EXPECT_EQ(pins_1.at(1)->get_net()->get_name(),
"c");
1092 ASSERT_EQ(nl->get_modules(test_utils::module_name_filter(
"inst_2")).size(), 1);
1093 Module* inst_2 = nl->get_modules(test_utils::module_name_filter(
"inst_2")).front();
1094 const auto pins_2 = inst_2->
get_pins();
1095 EXPECT_EQ(pins_2.size(), 1);
1096 EXPECT_EQ(pins_2.at(0)->get_name(),
"cs");
1097 EXPECT_EQ(pins_2.at(0)->get_net()->get_name(),
"c");
1113 std::string netlist_input(
"module top ("
1117 " input global_in ;"
1118 " output global_out ;"
1120 ".key_integer(1234),"
1121 ".key_floating_point(1.234),"
1122 ".key_string(\"test_string\"),"
1123 ".key_bit_vector_hex('habc),"
1124 ".key_bit_vector_dec('d2748),"
1125 ".key_bit_vector_oct('o5274),"
1126 ".key_bit_vector_bin('b1010_1011_1100),"
1127 ".key_negative_comma_string(\"test,1,2,3\"),"
1128 ".key_negative_float_string(\"1.234\")) "
1133 "defparam gate_0.external_int = 3;"
1136 std::filesystem::path verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
1140 ASSERT_TRUE(nl_res.is_ok());
1141 std::unique_ptr<Netlist> nl = nl_res.get();
1142 ASSERT_NE(nl,
nullptr);
1144 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_0")).size(), 1);
1145 Gate* gate_0 = *nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_0")).begin();
1148 EXPECT_EQ(gate_0->
get_data(
"generic",
"key_integer"), std::make_tuple(
"integer",
"1234"));
1149 EXPECT_EQ(gate_0->
get_data(
"generic",
"key_floating_point"), std::make_tuple(
"floating_point",
"1.234"));
1150 EXPECT_EQ(gate_0->
get_data(
"generic",
"key_string"), std::make_tuple(
"string",
"test_string"));
1151 EXPECT_EQ(gate_0->
get_data(
"generic",
"key_bit_vector_hex"), std::make_tuple(
"bit_vector",
"ABC"));
1152 EXPECT_EQ(gate_0->
get_data(
"generic",
"key_bit_vector_dec"), std::make_tuple(
"bit_vector",
"ABC"));
1153 EXPECT_EQ(gate_0->
get_data(
"generic",
"key_bit_vector_oct"), std::make_tuple(
"bit_vector",
"ABC"));
1154 EXPECT_EQ(gate_0->
get_data(
"generic",
"key_bit_vector_bin"), std::make_tuple(
"bit_vector",
"ABC"));
1155 EXPECT_EQ(gate_0->
get_data(
"generic",
"external_int"), std::make_tuple(
"integer",
"3"));
1158 EXPECT_EQ(gate_0->
get_data(
"generic",
"key_negative_comma_string"), std::make_tuple(
"string",
"test,1,2,3"));
1159 EXPECT_EQ(gate_0->
get_data(
"generic",
"key_negative_float_string"), std::make_tuple(
"string",
"1.234"));
1163 std::string netlist_input(
"module top ("
1167 " input global_in ;"
1168 " output global_out ;"
1171 " .I ({net_0, global_in} )"
1179 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
1182 ASSERT_TRUE(nl_res.is_ok());
1183 std::unique_ptr<Netlist> nl = nl_res.get();
1187 ASSERT_NE(nl,
nullptr);
1188 ASSERT_FALSE(nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_0")).empty());
1189 gate = *(nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_0")).begin());
1217 std::string netlist_input(
"module top ( "
1221 " input global_in ; "
1222 " output global_out ; "
1223 " wire [0:3] n_vec_1 ; "
1224 " wire [3:0] n_vec_2 ; "
1226 " .I (global_in ), "
1227 " .O0 (n_vec_1[0]), "
1228 " .O1 (n_vec_1[1]), "
1229 " .O2 (n_vec_1[2]), "
1230 " .O3 (n_vec_1[3]) "
1233 " .I0 (n_vec_1[0]), "
1234 " .I1 (n_vec_1[1]), "
1235 " .I2 (n_vec_1[2]), "
1236 " .I3 (n_vec_1[3]), "
1237 " .O0 (n_vec_2[0]), "
1238 " .O1 (n_vec_2[1]), "
1239 " .O2 (n_vec_2[2]), "
1240 " .O3 (n_vec_2[3]) "
1243 " .I0 (n_vec_2[0]), "
1244 " .I1 (n_vec_2[1]), "
1245 " .I2 (n_vec_2[2]), "
1246 " .I3 (n_vec_2[3]), "
1247 " .O (global_out ) "
1251 std::filesystem::path verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
1254 ASSERT_TRUE(nl_res.is_ok());
1255 std::unique_ptr<Netlist> nl = nl_res.get();
1256 ASSERT_NE(nl,
nullptr);
1259 EXPECT_EQ(nl->get_nets().size(),
1261 for (
auto net_name : std::set<std::string>({
"n_vec_1(0)",
"n_vec_1(1)",
"n_vec_1(2)",
"n_vec_1(3)",
1262 "n_vec_2(0)",
"n_vec_2(1)",
"n_vec_2(2)",
"n_vec_2(3)"})) {
1263 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(net_name)).size(), 1);
1265 for (
unsigned i = 0; i < 4; i++) {
1266 std::string i_str = std::to_string(i);
1267 Net* n_vec_1_i = *nl->get_nets(test_utils::net_name_filter(
"n_vec_1(" + i_str +
")")).begin();
1268 Net* n_vec_2_i = *nl->get_nets(test_utils::net_name_filter(
"n_vec_2(" + i_str +
")")).begin();
1270 EXPECT_EQ(n_vec_1_i->
get_sources()[0]->get_pin()->get_name(),
"O" + i_str);
1271 EXPECT_EQ((*n_vec_1_i->
get_destinations().begin())->get_pin()->get_name(),
"I" + i_str);
1273 EXPECT_EQ(n_vec_2_i->
get_sources()[0]->get_pin()->get_name(),
"O" + i_str);
1274 EXPECT_EQ((*n_vec_2_i->
get_destinations().begin())->get_pin()->get_name(),
"I" + i_str);
1279 std::string netlist_input(
"module top ( "
1283 " input global_in ; "
1284 " output global_out ; "
1285 " wire [0:1][2:3] n_vec ; "
1287 " .I (global_in ), "
1288 " .O0 (n_vec[0][2]), "
1289 " .O1 (n_vec[0][3]), "
1290 " .O2 (n_vec[1][2]), "
1291 " .O3 (n_vec[1][3]) "
1294 " .I0 (n_vec[0][2]), "
1295 " .I1 (n_vec[0][3]), "
1296 " .I2 (n_vec[1][2]), "
1297 " .I3 (n_vec[1][3]), "
1298 " .O (global_out ) "
1302 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
1305 ASSERT_TRUE(nl_res.is_ok());
1306 std::unique_ptr<Netlist> nl = nl_res.get();
1307 ASSERT_NE(nl,
nullptr);
1310 EXPECT_EQ(nl->get_nets().size(), 6);
1312 for (
auto n : std::vector<std::string>({
"n_vec(0)(2)",
"n_vec(0)(3)",
"n_vec(1)(2)",
"n_vec(1)(3)"})) {
1313 ASSERT_FALSE(nl->get_nets(test_utils::net_name_filter(
n)).empty());
1314 Net* n_vec_i_j = *nl->get_nets(test_utils::net_name_filter(
n)).begin();
1316 EXPECT_EQ(n_vec_i_j->
get_sources()[0]->get_pin()->get_name(),
"O" + std::to_string(pin));
1317 EXPECT_EQ((*n_vec_i_j->
get_destinations().begin())->get_pin()->get_name(),
"I" + std::to_string(pin));
1323 std::string netlist_input(
"module top ( "
1327 " input global_in ; "
1328 " output global_out ; "
1329 " wire [0:1][1:0][0:1] n_vec ; "
1331 " .I (global_in ), "
1332 " .O0 (n_vec[0][0][0]), "
1333 " .O1 (n_vec[0][0][1]), "
1334 " .O2 (n_vec[0][1][0]), "
1335 " .O3 (n_vec[0][1][1]), "
1336 " .O4 (n_vec[1][0][0]), "
1337 " .O5 (n_vec[1][0][1]), "
1338 " .O6 (n_vec[1][1][0]), "
1339 " .O7 (n_vec[1][1][1]) "
1342 " .I0 (n_vec[0][0][0]), "
1343 " .I1 (n_vec[0][0][1]), "
1344 " .I2 (n_vec[0][1][0]), "
1345 " .I3 (n_vec[0][1][1]), "
1346 " .I4 (n_vec[1][0][0]), "
1347 " .I5 (n_vec[1][0][1]), "
1348 " .I6 (n_vec[1][1][0]), "
1349 " .I7 (n_vec[1][1][1]), "
1350 " .O (global_out ) "
1354 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
1357 ASSERT_TRUE(nl_res.is_ok());
1358 std::unique_ptr<Netlist> nl = nl_res.get();
1359 ASSERT_NE(nl,
nullptr);
1362 EXPECT_EQ(nl->get_nets().size(), 10);
1363 std::vector<std::string> net_idx
1364 ({
"(0)(0)(0)",
"(0)(0)(1)",
"(0)(1)(0)",
"(0)(1)(1)",
"(1)(0)(0)",
"(1)(0)(1)",
"(1)(1)(0)",
1366 for (
size_t idx = 0; idx < 8; idx++)
1368 ASSERT_FALSE(nl->get_nets(test_utils::net_name_filter(
"n_vec" + net_idx[idx])).empty());
1369 Net* n_vec_i_j = nl->get_nets(test_utils::net_name_filter(
"n_vec" + net_idx[idx])).front();
1371 EXPECT_EQ(n_vec_i_j->
get_sources()[0]->get_pin()->get_name(),
"O" + std::to_string(idx));
1372 EXPECT_EQ((*n_vec_i_j->
get_destinations().begin())->get_pin()->get_name(),
"I" + std::to_string(idx));
1389 std::string netlist_input(
1391 " wire [3:0] gate_0_in, gate_1_in;\n"
1393 " .DATA_IN (gate_0_in ) \n"
1396 " .DATA_IN (gate_1_in ) \n"
1398 " assign gate_0_in = 4'd0;\n"
1399 " assign gate_1_in = 1'd0;\n"
1403 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
1406 ASSERT_TRUE(nl_res.is_ok());
1407 std::unique_ptr<Netlist> nl = nl_res.get();
1408 ASSERT_NE(nl,
nullptr);
1410 ASSERT_TRUE(!nl->get_gnd_gates().empty());
1411 EXPECT_EQ(nl->get_gnd_gates().front()->get_successors().size(), 8);
1412 for (
Gate* gate : nl->get_gates([](
const Gate* gate) { return !gate->is_gnd_gate(); }))
1417 EXPECT_TRUE(ep->get_net()->is_gnd_net());
1433 std::string netlist_input(
"module top ("
1439 " output global_out_0 ;"
1440 " output global_out_1 ;"
1441 " output global_out_2 ;"
1442 " output global_out_3 ;"
1445 " .O (global_out_0)"
1449 " .O (global_out_1)"
1453 " .O (global_out_2)"
1457 " .O (global_out_3)"
1461 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
1464 ASSERT_TRUE(nl_res.is_ok());
1465 std::unique_ptr<Netlist> nl = nl_res.get();
1466 ASSERT_NE(nl,
nullptr);
1468 Gate* gate_0 = nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_0")).front();
1469 ASSERT_NE(gate_0,
nullptr);
1470 Gate* gate_1 = nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_1")).front();
1471 ASSERT_NE(gate_1,
nullptr);
1472 Gate* gate_2 = nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_2")).front();
1473 ASSERT_NE(gate_2,
nullptr);
1474 Gate* gate_3 = nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_3")).front();
1475 ASSERT_NE(gate_3,
nullptr);
1479 ASSERT_NE(net_gnd,
nullptr);
1480 EXPECT_EQ(net_gnd->
get_name(),
"'0'");
1482 ASSERT_NE(net_gnd->
get_sources()[0]->get_gate(),
nullptr);
1483 EXPECT_TRUE(net_gnd->
get_sources()[0]->get_gate()->is_gnd_gate());
1487 ASSERT_NE(net_vcc,
nullptr);
1488 EXPECT_EQ(net_vcc->
get_name(),
"'1'");
1490 ASSERT_NE(net_vcc->
get_sources()[0]->get_gate(),
nullptr);
1491 EXPECT_TRUE(net_vcc->
get_sources()[0]->get_gate()->is_vcc_gate());
1522 std::string netlist_input(
"(* child_attribute = \"child_attribute_value\" *)"
1523 "module MODULE_CHILD ("
1527 " (* child_net_attribute = \"child_net_attribute_value\" *)"
1529 " output child_out ;"
1530 " wire net_0_child ;"
1531 "BUF gate_0_child ("
1533 " .O (net_0_child )"
1535 "BUF gate_1_child ("
1536 " .I (net_0_child ),"
1541 "module MODULE_TOP ("
1545 " input net_global_in ;"
1546 " output net_global_out ;"
1550 " .I (net_global_in ),"
1553 "MODULE_CHILD child_mod ("
1554 " .\\child_in (net_0 ),"
1555 " .\\child_out (net_1 )"
1559 " .O (net_global_out )"
1563 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
1566 ASSERT_TRUE(nl_res.is_ok());
1567 std::unique_ptr<Netlist> nl = nl_res.get();
1568 ASSERT_NE(nl,
nullptr);
1571 Gate* gate_0 = *nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_0")).begin();
1572 ASSERT_NE(gate_0,
nullptr);
1573 Gate* gate_1 = *nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_1")).begin();
1574 ASSERT_NE(gate_1,
nullptr);
1575 Gate* gate_0_child = *nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_0_child")).begin();
1576 ASSERT_NE(gate_0_child,
nullptr);
1577 Gate* gate_1_child = *nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_1_child")).begin();
1578 ASSERT_NE(gate_1_child,
nullptr);
1581 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_0")).size(), 1);
1582 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_1")).size(), 1);
1583 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_global_in")).size(), 1);
1584 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_global_out")).size(), 1);
1585 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_0_child")).size(), 1);
1586 Net* net_0 = *nl->get_nets(test_utils::net_name_filter(
"net_0")).begin();
1587 Net* net_1 = *nl->get_nets(test_utils::net_name_filter(
"net_1")).begin();
1588 Net* net_global_in = *nl->get_nets(test_utils::net_name_filter(
"net_global_in")).begin();
1589 Net* net_global_out = *nl->get_nets(test_utils::net_name_filter(
"net_global_out")).begin();
1590 Net* net_0_child = *nl->get_nets(test_utils::net_name_filter(
"net_0_child")).begin();
1603 Module* top_mod = nl->get_top_module();
1604 ASSERT_NE(top_mod,
nullptr);
1606 EXPECT_EQ(top_mod->
get_name(),
"top_module");
1607 EXPECT_EQ(top_mod->
get_type(),
"MODULE_TOP");
1610 ASSERT_NE(child_mod,
nullptr);
1611 EXPECT_EQ(child_mod->
get_name(),
"child_mod");
1612 EXPECT_EQ(child_mod->
get_type(),
"MODULE_CHILD");
1613 EXPECT_EQ(top_mod->
get_gates(), std::vector<Gate*>({gate_0, gate_1}));
1614 EXPECT_EQ(child_mod->
get_gates(), std::vector<Gate*>({gate_0_child, gate_1_child}));
1617 EXPECT_EQ(net_0->
get_data(
"attribute",
"child_net_attribute"), std::make_tuple(
"unknown",
"child_net_attribute_value"));
1618 EXPECT_EQ(child_mod->
get_data(
"attribute",
"child_attribute"), std::make_tuple(
"unknown",
"child_attribute_value"));
1639 std::string netlist_input(
"module ENT_CHILD_TWO ( "
1645 "BUF gate_child_two ( "
1651 "module ENT_CHILD_ONE ( "
1657 " wire net_child_0 ; "
1658 " wire net_child_1 ; "
1659 "ENT_CHILD_TWO gate_0_ent_two ( "
1660 " .\\I_c2 (I_c1 ), "
1661 " .\\O_c2 (net_child_0 ) "
1663 "ENT_CHILD_TWO gate_1_ent_two ( "
1664 " .\\I_c2 (net_child_0 ), "
1665 " .\\O_c2 (net_child_1 ) "
1667 "BUF gate_child_one ( "
1668 " .I (net_child_1 ), "
1677 " input net_global_in ;"
1678 " output net_global_out ;"
1682 " .child_one_mod_key(1234)"
1684 " .\\I_c1 (net_global_in ),"
1687 "ENT_CHILD_TWO child_two_mod ("
1688 " .\\I_c2 (net_0 ),"
1693 " .O (net_global_out )"
1697 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
1700 ASSERT_TRUE(nl_res.is_ok());
1701 std::unique_ptr<Netlist> nl = nl_res.get();
1704 ASSERT_NE(nl,
nullptr);
1705 EXPECT_EQ(nl->get_gates().size(), 5);
1706 EXPECT_EQ(nl->get_modules().size(), 5);
1707 Module* top_module = nl->get_top_module();
1713 std::swap(top_child_one, top_child_two);
1721 std::string module_suffix =
"";
1723 EXPECT_EQ(top_child_one->
get_name(),
"child_one_mod");
1729 EXPECT_EQ(std::set<std::string>({top_child_two->
get_name(), one_child_0->
get_name(),
1730 one_child_1->
get_name()}).size(), 3);
1733 std::string gate_suffix =
"";
1735 ASSERT_EQ(top_module->
get_gates().size(), 1);
1736 EXPECT_EQ((*top_module->
get_gates().begin())->get_name(),
"gate_top");
1738 ASSERT_EQ(top_child_one->
get_gates().size(), 1);
1739 EXPECT_EQ((*top_child_one->
get_gates().begin())->get_name(),
"gate_child_one");
1741 ASSERT_EQ(top_child_two->
get_gates().size(), 1);
1742 ASSERT_EQ(one_child_0->
get_gates().size(), 1);
1743 ASSERT_EQ(one_child_1->
get_gates().size(), 1);
1744 Gate* gate_child_two_0 = *top_child_two->
get_gates().begin();
1752 EXPECT_EQ(std::set<std::string>({gate_child_two_0->
get_name(), gate_child_two_1->
get_name(),
1753 gate_child_two_2->
get_name()}).size(), 3);
1756 EXPECT_EQ(top_child_one->
get_data(
"generic",
"child_one_mod_key"),
1757 std::make_tuple(
"integer",
"1234"));
1772 std::string netlist_input(
"module ENT_MODULE ( "
1777 " output mod_out ; "
1778 " wire mod_inner ; "
1779 " assign mod_out = mod_inner ; "
1794 " input net_global_in ; "
1795 " output net_global_out ; "
1798 " .\\mod_in (net_global_in ), "
1799 " .\\mod_out (net_0 ) "
1803 " .O (net_global_out ) "
1807 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
1810 ASSERT_TRUE(nl_res.is_ok());
1811 std::unique_ptr<Netlist> nl = nl_res.get();
1814 ASSERT_NE(nl,
nullptr);
1815 EXPECT_EQ(nl->get_gates().size(), 3);
1816 EXPECT_EQ(nl->get_modules().size(), 2);
1817 Module* top_module = nl->get_top_module();
1822 ASSERT_EQ(mod->
get_gates(test_utils::gate_name_filter(
"gate_a")).size(), 1);
1823 ASSERT_EQ(mod->
get_gates(test_utils::gate_name_filter(
"gate_b")).size(), 1);
1824 ASSERT_EQ(nl->get_gates(test_utils::gate_name_filter(
"gate_top")).size(), 1);
1825 Gate* gate_a = *mod->
get_gates(test_utils::gate_name_filter(
"gate_a")).begin();
1826 Gate* gate_b = *mod->
get_gates(test_utils::gate_name_filter(
"gate_b")).begin();
1827 Gate* gate_top = *nl->get_gates(test_utils::gate_name_filter(
"gate_top")).begin();
1830 ASSERT_NE(mod_out,
nullptr);
1835 std::vector<Endpoint*>({test_utils::get_endpoint(gate_b,
1837 test_utils::get_endpoint(
1867 std::string netlist_input(
"module MODULE_A ( "
1873 " wire shared_net_name ; "
1875 "COMB12 shared_gate_name ( "
1877 " .\\O0 (shared_net_name ), "
1881 " .\\I0 (shared_net_name ), "
1887 "module MODULE_B ( "
1893 " wire shared_net_name ; "
1895 "COMB12 shared_gate_name ( "
1897 " .\\O0 (shared_net_name ), "
1901 " .\\I0 (shared_net_name ), "
1911 " input net_global_in ; "
1912 " output net_global_out ; "
1916 "MODULE_B mod_b_0 ( "
1917 " .\\I_B (net_global_in ), "
1920 "MODULE_A mod_a_0 ( "
1921 " .\\I_A (net_0 ), "
1924 "MODULE_B mod_b_1 ( "
1925 " .\\I_B (net_1 ), "
1930 " .\\O (net_global_out ) "
1934 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
1937 ASSERT_TRUE(nl_res.is_ok());
1938 std::unique_ptr<Netlist> nl = nl_res.get();
1941 ASSERT_NE(nl,
nullptr);
1946 Net* glob_in = *nl->get_global_input_nets().begin();
1947 ASSERT_NE(glob_in,
nullptr);
1951 ASSERT_NE(shared_gate_0,
nullptr);
1954 std::vector<Gate*> nl_gates = {shared_gate_0};
1955 std::vector<std::string> suc_pin = {
"O0",
"O",
"O0",
"O",
"O0",
"O"};
1956 for(
size_t idx = 0; idx < suc_pin.size(); idx++){
1957 ASSERT_NE(nl_gates[idx]->get_successor(suc_pin[idx]),
nullptr);
1959 ASSERT_NE(next_gate,
nullptr);
1960 nl_gates.push_back(next_gate);
1964 std::vector<Net*> nl_nets = {glob_in};
1965 std::vector<std::pair<Gate*, std::string>> net_out_gate_and_pin = {{nl_gates[0],
"O0"}, {nl_gates[0],
"O1"}, {nl_gates[1],
"O"}, {nl_gates[2],
"O0"},
1966 {nl_gates[2],
"O1"}, {nl_gates[3],
"O"}, {nl_gates[4],
"O0"}, {nl_gates[4],
"O1"}, {nl_gates[5],
"O"}, {nl_gates[6],
"O"}};
1967 for(
size_t idx = 0; idx < net_out_gate_and_pin.size(); idx++){
1968 Net* next_net = (net_out_gate_and_pin[idx].first)->get_fan_out_net(net_out_gate_and_pin[idx].second);
1969 ASSERT_NE(next_net,
nullptr);
1970 nl_nets.push_back(next_net);
1974 std::vector<std::string> nl_gate_names;
1975 for(
Gate*
g : nl_gates) nl_gate_names.push_back(
g->get_name());
1976 std::vector<std::string> expected_gate_names = {
"mod_b_0/shared_gate_name",
"mod_b_0/gate_b",
"mod_a_0/shared_gate_name",
"gate_a",
"mod_b_1/shared_gate_name",
"mod_b_1/gate_b",
"gate_top"};
1977 EXPECT_EQ(nl_gate_names, expected_gate_names);
1980 std::vector<std::string> nl_net_names;
1981 for(
Net*
n : nl_nets) nl_net_names.push_back(
n->get_name());
1982 std::vector<std::string> expected_net_names = {
"net_global_in",
"mod_b_0/shared_net_name",
"mod_b_0/net_b",
"net_0",
"mod_a_0/shared_net_name",
"net_a",
"net_1",
"mod_b_1/shared_net_name",
"mod_b_1/net_b",
"net_2",
"net_global_out"};
1983 EXPECT_EQ(nl_net_names, expected_net_names);
2011 std::string netlist_input(
2014 " net_global_out,\n"
2017 " input net_global_in ;\n"
2018 " output net_global_out ;\n"
2019 " wire net_slave_1 ;\n"
2020 " wire net_slave_0 ;\n"
2021 " input net_master ;\n"
2022 " wire net_slave_2 ;\n"
2023 " assign net_slave_1 = net_slave_0;\n"
2024 " assign net_slave_2 = net_slave_0;\n"
2025 " assign net_master = net_slave_0;\n"
2028 " .I (net_global_in ),\n"
2029 " .O (net_slave_0 )\n"
2032 " .I0 (net_master ),\n"
2033 " .I1 (net_slave_1 ),\n"
2034 " .I2 (net_slave_2 ),\n"
2035 " .O (net_global_out )\n"
2040 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2043 ASSERT_TRUE(nl_res.is_ok());
2044 std::unique_ptr<Netlist> nl = nl_res.get();
2046 ASSERT_NE(nl,
nullptr);
2047 EXPECT_EQ(nl->get_nets().size(), 3);
2048 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_master")).size(), 1);
2049 Net* net_master = nl->get_nets(test_utils::net_name_filter(
"net_master")).front();
2051 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_0")).size(), 1);
2052 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"AND3",
"gate_1")).size(), 1);
2054 Gate* g_0 = *nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_0")).begin();
2055 Gate* g_1 = *nl->get_gates(test_utils::gate_filter(
"AND3",
"gate_1")).begin();
2070 std::string netlist_input(
"module top ("
2074 " input global_in ;"
2075 " output global_out ;"
2078 " assign net_0 = net_1;"
2079 " assign net_1 = net_0;"
2090 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2093 ASSERT_TRUE(nl_res.is_ok());
2094 std::unique_ptr<Netlist> nl = nl_res.get();
2096 ASSERT_NE(nl,
nullptr);
2097 EXPECT_EQ(nl->get_nets().size(), 3);
2098 EXPECT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_0")).size(), 1);
2101 std::string netlist_input(
"module passthrough_test (\n"
2106 " assign net_out = net_a;\n"
2113 "module top (net_global_in, net_global_out) ;\n"
2114 " input net_global_in ;\n"
2115 " output net_global_out ;\n"
2116 " passthrough_test pt (\n"
2117 " .net_in (net_global_in ),\n"
2123 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2126 ASSERT_TRUE(nl_res.is_ok());
2127 std::unique_ptr<Netlist> nl = nl_res.get();
2129 ASSERT_NE(nl,
nullptr);
2130 EXPECT_EQ(nl->get_nets().size(), 2);
2131 EXPECT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_global_in")).size(), 1);
2132 EXPECT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_out")).size(), 1);
2135 std::string netlist_input(
"module passthrough_test (\n"
2140 " assign net_out = net_a;\n"
2147 "module top (net_global_in, net_global_out) ;\n"
2148 " input net_global_in ;\n"
2149 " output net_global_out ;\n"
2150 " passthrough_test pt (\n"
2152 " .net_out (net_global_out)\n"
2157 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2160 ASSERT_TRUE(nl_res.is_ok());
2161 std::unique_ptr<Netlist> nl = nl_res.get();
2163 ASSERT_NE(nl,
nullptr);
2164 EXPECT_EQ(nl->get_nets().size(), 2);
2165 EXPECT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_in")).size(), 1);
2166 EXPECT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_global_out")).size(), 1);
2174 const u8 MAX_DIMENSION = 3;
2176 for (
u8 dim = 0; dim <= MAX_DIMENSION; dim++) {
2177 std::stringstream global_out_list_module;
2178 std::stringstream global_out_list;
2179 std::stringstream gate_list;
2180 std::string dim_decl =
"";
2183 for (
u8 d = 0; d < dim; d++) {
2184 dim_decl +=
"[0:1]";
2188 for (
u64 i = 0; i < (1 << dim); i++) {
2189 global_out_list_module <<
" global_out_" << i <<
",";
2190 global_out_list <<
" output global_out_" << i <<
";";
2192 std::bitset<64> i_bs(i);
2193 std::stringstream brackets(
"");
2194 for (
int j = dim - 1; j >= 0; j--) {
2195 brackets <<
"[" << (i_bs[j] ?
"1" :
"0") <<
"]";
2198 gate_list <<
"BUF in_gate_" << i
2201 " .O ( net_slave_vector"
2205 gate_list <<
"BUF out_gate_" << i
2207 " .I (net_slave_vector"
2216 std::stringstream netlist_input;
2217 netlist_input <<
"module top ("
2219 << global_out_list_module.str()
2221 " input global_in ;"
2222 << global_out_list.str() <<
" wire " << dim_decl <<
" net_slave_vector;"
2223 <<
" wire [0:" << ((1 << dim) - 1) <<
"] net_master_vector;"
2224 <<
" assign net_master_vector = net_slave_vector;"
2225 << gate_list.str() <<
"endmodule";
2228 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input.str());
2231 ASSERT_TRUE(nl_res.is_ok());
2232 std::unique_ptr<Netlist> nl = nl_res.get();
2234 for (
u64 i = 0; i < (1 << dim); i++) {
2235 ASSERT_NE(nl,
nullptr);
2237 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
2238 "net_master_vector(" + std::to_string(i) +
")")).size(),
2241 *nl->get_nets(test_utils::net_name_filter(
"net_master_vector(" + std::to_string(i) +
")"))
2244 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"BUF",
"in_gate_" + std::to_string(i)))
2246 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"BUF",
"out_gate_" + std::to_string(i)))
2249 *nl->get_gates(test_utils::gate_filter(
"BUF",
"in_gate_" + std::to_string(i)))
2252 *nl->get_gates(test_utils::gate_filter(
"BUF",
"out_gate_" + std::to_string(i)))
2262 std::string netlist_input(
"module top ("
2265 " output global_out ;"
2266 " wire [0:3] bit_vector ;"
2267 " assign bit_vector = 4'hA ;"
2270 " .I (bit_vector[0] ),"
2275 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2278 ASSERT_TRUE(nl_res.is_ok());
2279 std::unique_ptr<Netlist> nl = nl_res.get();
2281 ASSERT_NE(nl,
nullptr);
2283 ASSERT_EQ(nl->get_gates(test_utils::gate_name_filter(
"test_gate")).size(), 1);
2284 Gate* test_gate = *nl->get_gates(test_utils::gate_name_filter(
"test_gate")).begin();
2288 std::string netlist_input(
"module top ("
2293 " output global_out_0 ;"
2294 " output global_out_1 ;"
2295 " output global_out_2 ;"
2297 " wire single_net ;"
2298 " wire [0:2][0:2] _2_d_vector_0;"
2299 " wire [0:2][0:1] _2_d_vector_1;"
2300 " wire [0:15] big_vector;"
2301 " wire [0:11] net_vector_master;"
2302 " assign net_vector_master = {single_net, big_vector[3], big_vector[0:1], _2_d_vector_0[0:1][0:1], _2_d_vector_1[1:0][0:1]};"
2304 "AND4 test_gate_0 ("
2305 " .I0 (single_net ),"
2306 " .I1 (big_vector[3] ),"
2307 " .I2 (big_vector[0] ),"
2308 " .I3 (big_vector[1] ),"
2309 " .O (global_out_0 )"
2312 "AND4 test_gate_1 ("
2313 " .I0 (_2_d_vector_0[0][0] ),"
2314 " .I1 (_2_d_vector_0[0][1] ),"
2315 " .I2 (_2_d_vector_0[1][0] ),"
2316 " .I3 (_2_d_vector_0[1][1] ),"
2317 " .O (global_out_1 )"
2319 "AND4 test_gate_2 ("
2320 " .I0 (_2_d_vector_1[1][0] ),"
2321 " .I1 (_2_d_vector_1[1][1] ),"
2322 " .I2 (_2_d_vector_1[0][0] ),"
2323 " .I3 (_2_d_vector_1[0][1] ),"
2324 " .O (global_out_2 )"
2328 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2331 ASSERT_TRUE(nl_res.is_ok());
2332 std::unique_ptr<Netlist> nl = nl_res.get();
2334 ASSERT_NE(nl,
nullptr);
2335 std::vector<Net *> net_master_vector(12);
2336 for (
int i = 0; i < 12; i++) {
2337 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_vector_master(" + std::to_string(i) +
")"))
2339 net_master_vector[i] =
2340 *nl->get_nets(test_utils::net_name_filter(
"net_vector_master(" + std::to_string(i) +
")"))
2343 for (
int i = 0; i < 12; i++) {
2344 ASSERT_EQ(net_master_vector[i]->get_destinations().size(), 1);
2345 Endpoint *ep = *net_master_vector[i]->get_destinations().begin();
2346 EXPECT_EQ(ep->
get_gate()->
get_name(),
"test_gate_" + std::to_string(i / 4));
2353 std::string netlist_input(
"module top ("
2356 " output global_out ;"
2357 " wire net_master_0 ;"
2358 " wire net_master_1 ;"
2359 " wire [0:1] net_vector_slave;"
2360 " assign { net_master_0, net_master_1 } = net_vector_slave;"
2362 " .I0 ( net_vector_slave[0] ),"
2363 " .I1 ( net_vector_slave[1] ),"
2369 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2372 ASSERT_TRUE(nl_res.is_ok());
2373 std::unique_ptr<Netlist> nl = nl_res.get();
2375 ASSERT_NE(nl,
nullptr);
2377 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_master_0")).size(), 1);
2378 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_master_1")).size(), 1);
2380 net_vector_master_0 = *nl->get_nets(test_utils::net_name_filter(
"net_master_0")).begin();
2382 net_vector_master_1 = *nl->get_nets(test_utils::net_name_filter(
"net_master_1")).begin();
2385 EXPECT_EQ((*net_vector_master_0->
get_destinations().begin())->get_pin()->get_name(),
"I0");
2386 EXPECT_EQ((*net_vector_master_1->
get_destinations().begin())->get_pin()->get_name(),
"I1");
2391 std::string netlist_input(
"module top ("
2394 " output global_out ;"
2395 " wire \\escaped_net_range[0:3] ;"
2396 " wire [0:3] escaped_net_range ;"
2397 " wire \\escaped_net[0] ;"
2398 " wire [0:1] net_vector_master ;"
2399 " assign net_vector_master = { \\escaped_net_range[0:3] , \\escaped_net[0] };"
2401 " .I0 ( \\escaped_net_range[0:3] ),"
2402 " .I1 ( \\escaped_net[0] ),"
2408 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2411 ASSERT_TRUE(nl_res.is_ok());
2412 std::unique_ptr<Netlist> nl = nl_res.get();
2414 ASSERT_NE(nl,
nullptr);
2429 std::string netlist_input(
"module top (\n"
2431 " wire [0:3] l_vec;\n"
2438 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2441 ASSERT_TRUE(nl_res.is_ok());
2442 std::unique_ptr<Netlist> nl = nl_res.get();
2444 ASSERT_NE(nl,
nullptr);
2445 ASSERT_FALSE(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).empty());
2446 Gate* gate_0 = *(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).begin());
2448 ASSERT_NE(net_0,
nullptr);
2449 EXPECT_EQ(net_0->
get_name(),
"'1'");
2452 ASSERT_NE(net_1,
nullptr);
2453 EXPECT_EQ(net_1->
get_name(),
"'0'");
2456 ASSERT_NE(net_2,
nullptr);
2457 EXPECT_EQ(net_2->
get_name(),
"'1'");
2460 ASSERT_NE(net_3,
nullptr);
2461 EXPECT_EQ(net_3->
get_name(),
"'0'");
2466 std::string netlist_input(
"module top (\n"
2470 " wire[0:1] l_vec;\n"
2472 " .DATA_OUT ({net_0, net_1, l_vec[0], l_vec[1]})\n"
2476 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2479 ASSERT_TRUE(nl_res.is_ok());
2480 std::unique_ptr<Netlist> nl = nl_res.get();
2482 ASSERT_NE(nl,
nullptr);
2483 ASSERT_FALSE(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).empty());
2484 Gate* gate_0 = *(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).begin());
2489 ASSERT_NE(net_0,
nullptr);
2490 EXPECT_EQ(net_0->
get_name(),
"l_vec(1)");
2493 ASSERT_NE(net_1,
nullptr);
2494 EXPECT_EQ(net_1->
get_name(),
"l_vec(0)");
2497 ASSERT_NE(net_2,
nullptr);
2498 EXPECT_EQ(net_2->
get_name(),
"net_1");
2501 ASSERT_NE(net_3,
nullptr);
2502 EXPECT_EQ(net_3->
get_name(),
"net_0");
2506 std::string netlist_input(
"module top (\n"
2508 " wire [3:0] l_vec;\n"
2511 " .DATA_OUT (l_vec)\n"
2515 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2518 ASSERT_TRUE(nl_res.is_ok());
2519 std::unique_ptr<Netlist> nl = nl_res.get();
2521 ASSERT_NE(nl,
nullptr);
2522 ASSERT_FALSE(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).empty());
2523 Gate* gate_0 = *(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).begin());
2527 ASSERT_NE(net_0,
nullptr);
2528 EXPECT_EQ(net_0->
get_name(),
"l_vec(0)");
2531 ASSERT_NE(net_1,
nullptr);
2532 EXPECT_EQ(net_1->
get_name(),
"l_vec(1)");
2535 ASSERT_NE(net_2,
nullptr);
2536 EXPECT_EQ(net_2->
get_name(),
"l_vec(2)");
2539 ASSERT_NE(net_3,
nullptr);
2540 EXPECT_EQ(net_3->
get_name(),
"l_vec(3)");
2546 std::string netlist_input(
"module top (\n"
2548 " wire [2:0] l_vec;\n"
2550 " .DATA_OUT (l_vec)\n"
2554 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2557 ASSERT_TRUE(nl_res.is_ok());
2558 std::unique_ptr<Netlist> nl = nl_res.get();
2560 ASSERT_NE(nl,
nullptr);
2561 ASSERT_FALSE(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).empty());
2562 Gate* gate_0 = *(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).begin());
2566 ASSERT_NE(net_0,
nullptr);
2567 EXPECT_EQ(net_0->
get_name(),
"l_vec(0)");
2570 ASSERT_NE(net_1,
nullptr);
2571 EXPECT_EQ(net_1->
get_name(),
"l_vec(1)");
2574 ASSERT_NE(net_2,
nullptr);
2575 EXPECT_EQ(net_2->
get_name(),
"l_vec(2)");
2582 std::string netlist_input(
"module top (in, out) ;\n"
2583 " input [1:0] in;\n"
2584 " output [2:0] out;\n"
2587 " .DATA_OUT (out)\n"
2591 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2594 ASSERT_TRUE(nl_res.is_ok());
2595 std::unique_ptr<Netlist> nl = nl_res.get();
2600 ASSERT_NE(nl,
nullptr);
2601 ASSERT_FALSE(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).empty());
2602 gate = *(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).begin());
2606 ASSERT_NE(
net,
nullptr);
2609 ASSERT_NE(
net,
nullptr);
2614 ASSERT_NE(
net,
nullptr);
2617 ASSERT_NE(
net,
nullptr);
2620 ASSERT_NE(
net,
nullptr);
2625 std::string netlist_input(
"module top (in, out) ;\n"
2626 " input [1:0] in;\n"
2627 " output [1:0] out;\n"
2634 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2637 ASSERT_TRUE(nl_res.is_ok());
2638 std::unique_ptr<Netlist> nl = nl_res.get();
2643 ASSERT_NE(nl,
nullptr);
2644 ASSERT_FALSE(nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_0")).empty());
2645 gate = *(nl->get_gates(test_utils::gate_filter(
"BUF",
"gate_0")).begin());
2647 EXPECT_EQ(nl->get_nets().size(), 2);
2648 EXPECT_EQ(nl->get_top_module()->get_pins().size(), 2);
2652 ASSERT_NE(
net,
nullptr);
2657 ASSERT_NE(
net,
nullptr);
2662 std::string netlist_input(
"module top (in) ;\n"
2663 " input [3:0] in;\n"
2670 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2673 ASSERT_TRUE(nl_res.is_ok());
2674 std::unique_ptr<Netlist> nl = nl_res.get();
2679 ASSERT_NE(nl,
nullptr);
2680 ASSERT_FALSE(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).empty());
2681 gate = *(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).begin());
2683 EXPECT_EQ(nl->get_nets().size(), 4);
2684 EXPECT_EQ(nl->get_top_module()->get_pins([](
const ModulePin* p) {return p->get_direction() == PinDirection::input; }).size(), 4);
2685 EXPECT_EQ(nl->get_top_module()->get_pins([](
const ModulePin* p) {return p->get_direction() == PinDirection::output; }).size(), 0);
2693 std::string netlist_input(
"module top (\n"
2697 " wire[5:0] l_vec;\n"
2699 " .DATA_OUT (l_vec)\n"
2703 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2706 ASSERT_TRUE(nl_res.is_ok());
2707 std::unique_ptr<Netlist> nl = nl_res.get();
2708 ASSERT_NE(nl,
nullptr);
2709 ASSERT_FALSE(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).empty());
2710 Gate* gate_0 = *(nl->get_gates(test_utils::gate_filter(
"RAM",
"gate_0")).begin());
2713 ASSERT_NE(net_0,
nullptr);
2714 EXPECT_EQ(net_0->
get_name(),
"l_vec(0)");
2716 ASSERT_NE(net_1,
nullptr);
2717 EXPECT_EQ(net_1->
get_name(),
"l_vec(1)");
2719 ASSERT_NE(net_2,
nullptr);
2720 EXPECT_EQ(net_2->
get_name(),
"l_vec(2)");
2722 ASSERT_NE(net_3,
nullptr);
2723 EXPECT_EQ(net_3->
get_name(),
"l_vec(3)");
2742 std::string netlist_input(
"/*here comes a module*/ module top (\n"
2744 " \\global_out_with//comment \n"
2746 " input global_in;\n"
2747 " output \\global_out_with//comment ;\n"
2750 " .no_comment_0(123), //.comment_0(123),\n"
2751 " //.comment_1(123),\n"
2752 " .no_comment_1(123), /*.comment_2(123),*/ .no_comment_2(123),\n"
2753 " /*.comment_3(123),\n"
2754 " .comment_4(123),\n"
2755 " .comment_5(123),*/\n"
2756 " .no_comment_3(123),\n"
2757 " .no_comment_4(123), /*.comment_6(123),*/ .no_comment_5(123),\n"
2758 " /*.comment_7(123),\n"
2759 " .comment_8(123),\n"
2760 " .comment_9(123),*/\n"
2761 " .no_comment_6(123)\n"
2764 " .I (global_in ),\n"
2765 " .O (\\global_out_with//comment )\n"
2769 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2772 ASSERT_TRUE(nl_res.is_ok());
2773 std::unique_ptr<Netlist> nl = nl_res.get();
2775 ASSERT_NE(nl,
nullptr);
2776 ASSERT_EQ(nl->get_gates(test_utils::gate_filter(
"BUF",
"test_gate")).size(), 1);
2778 test_gate = *nl->get_gates(test_utils::gate_filter(
"BUF",
"test_gate")).begin();
2781 for (std::string key : std::set<std::string>({
"no_comment_0",
"no_comment_1",
"no_comment_2",
2782 "no_comment_3",
"no_comment_4",
"no_comment_5",
2784 EXPECT_NE(test_gate->
get_data(
"generic", key), std::make_tuple(
"",
""));
2785 if (test_gate->
get_data(
"generic", key) == std::make_tuple(
"",
"")) {
2786 std::cout <<
"comment test failed for: " << key << std::endl;
2791 for (std::string key : std::set<std::string>({
"comment_0",
"comment_1",
"comment_2",
"comment_3",
2792 "comment_4",
"comment_5",
"comment_6",
"comment_7",
2793 "comment_8",
"comment_9"})) {
2794 EXPECT_EQ(test_gate->
get_data(
"generic", key), std::make_tuple(
"",
""));
2795 if (test_gate->
get_data(
"generic", key) != std::make_tuple(
"",
"")) {
2796 std::cout <<
"comment failed for: " << key << std::endl;
2815 std::string netlist_input(
"(* ATTRIBUTE_MODULE=attri_module, FLAG_MODULE *)\n"
2820 "(* ATTRIBUTE_NET=attri_net, FLAG_NET *)\n"
2821 " input net_global_in ;\n"
2822 " output net_global_out ;\n"
2823 "(* ATTRIBUTE_GATE=attri_gate, FLAG_GATE *)\n"
2825 " .\\I (net_global_in ),\n"
2826 " .\\O (net_global_out )\n"
2830 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2833 ASSERT_TRUE(nl_res.is_ok());
2834 std::unique_ptr<Netlist> nl = nl_res.get();
2836 ASSERT_NE(nl,
nullptr);
2839 Module* attri_module = nl->get_top_module();
2841 ASSERT_EQ(nl->get_gates(test_utils::gate_type_filter(
"BUF")).size(), 1);
2842 Gate* attri_gate = *nl->get_gates(test_utils::gate_type_filter(
"BUF")).begin();
2844 ASSERT_EQ(nl->get_global_input_nets().size(), 1);
2845 Net* attri_net = *nl->get_global_input_nets().begin();
2849 EXPECT_EQ(attri_module->
get_data(
"attribute",
"ATTRIBUTE_MODULE"),
2850 std::make_tuple(
"unknown",
"attri_module"));
2851 EXPECT_EQ(attri_module->
get_data(
"attribute",
"FLAG_MODULE"), std::make_tuple(
"unknown",
""));
2853 EXPECT_EQ(attri_gate->
get_data(
"attribute",
"ATTRIBUTE_GATE"),
2854 std::make_tuple(
"unknown",
"attri_gate"));
2855 EXPECT_EQ(attri_gate->
get_data(
"attribute",
"FLAG_GATE"), std::make_tuple(
"unknown",
""));
2857 EXPECT_EQ(attri_net->
get_data(
"attribute",
"ATTRIBUTE_NET"),
2858 std::make_tuple(
"unknown",
"attri_net"));
2859 EXPECT_EQ(attri_net->
get_data(
"attribute",
"FLAG_NET"), std::make_tuple(
"unknown",
""));
2863 std::string netlist_input(
"module top (\n"
2867 " input net_global_in ;\n"
2868 " output net_global_out ;\n"
2869 " (* ATTRI_COMMA_STRING=\"test, 1, 2, 3\", ATTRI_FLOAT_STRING=\"1.234\" *)\n"
2871 " .\\I (net_global_in ),\n"
2872 " .\\O (net_global_out )\n"
2876 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2879 ASSERT_TRUE(nl_res.is_ok());
2880 std::unique_ptr<Netlist> nl = nl_res.get();
2882 ASSERT_NE(nl,
nullptr);
2883 ASSERT_EQ(nl->get_gates(test_utils::gate_type_filter(
"BUF")).size(), 1);
2884 Gate* attri_gate = *nl->get_gates(test_utils::gate_type_filter(
"BUF")).begin();
2885 EXPECT_EQ(attri_gate->
get_data(
"attribute",
"ATTRI_COMMA_STRING"),
2886 std::make_tuple(
"unknown",
"test, 1, 2, 3"));
2887 EXPECT_EQ(attri_gate->
get_data(
"attribute",
"ATTRI_FLOAT_STRING"),
2888 std::make_tuple(
"unknown",
"1.234"));
2903 std::string netlist_input(
"module top ("
2907 " input global_in ;"
2908 " output global_out ;"
2909 " wire [0:1] net_vec_0, net_vec_1 ;"
2911 " .I0 (net_vec_0[0] ),"
2912 " .I1 (net_vec_0[1] ),"
2913 " .I2 (net_vec_1[0] ),"
2914 " .I3 (net_vec_1[1] ),"
2919 " .O (net_vec_0[0] )"
2923 " .O (net_vec_0[1] )"
2927 " .O (net_vec_1[0] )"
2931 " .O (net_vec_1[1] )"
2935 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2938 if(nl_res.is_error()) {
2939 std::cout << nl_res.get_error().get() << std::endl;
2941 ASSERT_TRUE(nl_res.is_ok());
2942 std::unique_ptr<Netlist> nl = nl_res.get();
2944 ASSERT_NE(nl,
nullptr);
2945 EXPECT_EQ(nl->get_nets().size(), 6);
2946 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_vec_0(0)")).size(), 1);
2947 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_vec_0(1)")).size(), 1);
2948 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_vec_0(0)")).size(), 1);
2949 ASSERT_EQ(nl->get_nets(test_utils::net_name_filter(
"net_vec_0(1)")).size(), 1);
2963 std::string netlist_input(
"module top ( \n"
2964 " input global_in_0, global_in_1, global_in_2,\n"
2965 " output global_out_0, global_out_1, global_out_2,\n"
2966 " input global_in_3,"
2967 " output global_out_3"
2969 "COMB44 gate_0 ( \n"
2970 " .I0 (global_in_0 ), \n"
2971 " .I1 (global_in_1 ), \n"
2972 " .I2 (global_in_2 ), \n"
2973 " .I3 (global_in_3 ), \n"
2974 " .O0 (global_out_0 ), \n"
2975 " .O1 (global_out_1 ), \n"
2976 " .O2 (global_out_2 ), \n"
2977 " .O3 (global_out_3 ) \n"
2981 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
2984 ASSERT_TRUE(nl_res.is_ok());
2985 std::unique_ptr<Netlist> nl = nl_res.get();
2987 ASSERT_NE(nl,
nullptr);
2990 std::set<std::string> input_net_names;
2991 for(
Net*
n : nl->get_global_input_nets())
2992 input_net_names.insert(
n->get_name());
2993 EXPECT_EQ(input_net_names, std::set<std::string>({
"global_in_0",
"global_in_1",
"global_in_2",
"global_in_3"}));
2996 std::set<std::string> output_net_names;
2997 for(
Net*
n : nl->get_global_output_nets())
2998 output_net_names.insert(
n->get_name());
2999 EXPECT_EQ(output_net_names, std::set<std::string>({
"global_out_0",
"global_out_1",
"global_out_2",
"global_out_3"}));
3003 std::string netlist_input(
"module top ( \n"
3004 " input [0:1] global_in_asc,\n"
3005 " output [0:1] global_out_asc,\n"
3006 " input [3:2] global_in_desc,"
3007 " output [3:2] global_out_desc"
3009 "COMB44 gate_0 ( \n"
3010 " .I0 (global_in_asc[0] ), \n"
3011 " .I1 (global_in_asc[1] ), \n"
3012 " .I2 (global_in_desc[2] ), \n"
3013 " .I3 (global_in_desc[3] ), \n"
3014 " .O0 (global_out_asc[0] ), \n"
3015 " .O1 (global_out_asc[1] ), \n"
3016 " .O2 (global_out_desc[2] ), \n"
3017 " .O3 (global_out_desc[3] ) \n"
3021 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3024 ASSERT_TRUE(nl_res.is_ok());
3025 std::unique_ptr<Netlist> nl = nl_res.get();
3027 ASSERT_NE(nl,
nullptr);
3030 std::set<std::string> input_net_names;
3031 for(
Net*
n : nl->get_global_input_nets())
3032 input_net_names.insert(
n->get_name());
3033 EXPECT_EQ(input_net_names, std::set<std::string>({
"global_in_asc(0)",
"global_in_asc(1)",
"global_in_desc(2)",
"global_in_desc(3)"}));
3036 std::set<std::string> output_net_names;
3037 for(
Net*
n : nl->get_global_output_nets())
3038 output_net_names.insert(
n->get_name());
3039 EXPECT_EQ(output_net_names, std::set<std::string>({
"global_out_asc(0)",
"global_out_asc(1)",
"global_out_desc(2)",
"global_out_desc(3)"}));
3043 std::string netlist_input(
"module top ( \n"
3044 " input [0:1][1:0] global_in,\n"
3045 " output [1:0][0:1] global_out"
3047 "COMB44 gate_0 ( \n"
3048 " .I0 (global_in[0][0] ), \n"
3049 " .I1 (global_in[0][1] ), \n"
3050 " .I2 (global_in[1][0] ), \n"
3051 " .I3 (global_in[1][1] ), \n"
3052 " .O0 (global_out[0][0] ), \n"
3053 " .O1 (global_out[0][1] ), \n"
3054 " .O2 (global_out[1][0] ), \n"
3055 " .O3 (global_out[1][1] ) \n"
3059 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3062 ASSERT_TRUE(nl_res.is_ok());
3063 std::unique_ptr<Netlist> nl = nl_res.get();
3065 ASSERT_NE(nl,
nullptr);
3068 std::set<std::string> input_net_names;
3069 for(
Net*
n : nl->get_global_input_nets())
3070 input_net_names.insert(
n->get_name());
3071 EXPECT_EQ(input_net_names, std::set<std::string>({
"global_in(0)(0)",
"global_in(0)(1)",
"global_in(1)(0)",
"global_in(1)(1)"}));
3074 std::set<std::string> output_net_names;
3075 for(
Net*
n : nl->get_global_output_nets())
3076 output_net_names.insert(
n->get_name());
3077 EXPECT_EQ(output_net_names, std::set<std::string>({
"global_out(0)(0)",
"global_out(0)(1)",
"global_out(1)(0)",
"global_out(1)(1)"}));
3091 std::string netlist_input(
"module top ("
3094 " input global_in ;"
3097 " .\\NON_EXISTING_PIN (global_in)"
3101 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3104 EXPECT_TRUE(nl_res.is_error());
3109 std::string netlist_input(
"module top ("
3113 " input global_in ;"
3114 " output global_out ;"
3115 "UNKNOWN_GATE_TYPE gate_0 ("
3121 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3124 EXPECT_TRUE(nl_res.is_error());
3129 std::string netlist_input(
"");
3131 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3134 EXPECT_TRUE(nl_res.is_error());
3173 if(test_utils::known_issue_tests_active())
3177 std::string netlist_input(
"module top ("
3181 " input global_in ;"
3182 " output global_out ;"
3183 " wire [0:4] signal_vec_0 ;"
3184 " wire [0:4] signal_vec_1 ;"
3185 " assign signal_vec_0[p:q] = signal_vec_1[p:q];"
3187 " .\\I (global_in ),"
3188 " .\\O (global_out )"
3192 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3195 EXPECT_TRUE(nl_res.is_error());
3198 #if !defined(__APPLE__)
3202 std::string netlist_input(
"module ("
3206 " input global_in ;"
3207 " output global_out ;"
3214 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3217 EXPECT_TRUE(nl_res.is_error());
3222 std::string netlist_input(
3228 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3231 EXPECT_TRUE(nl_res.is_error());
3236 std::string netlist_input(
3245 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3248 EXPECT_TRUE(nl_res.is_error());
3251 if(test_utils::known_issue_tests_active())
3255 std::string netlist_input(
"module top ("
3259 " input global_in ;"
3260 " output global_out ;"
3262 " assign signal_0 = ;"
3265 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3268 EXPECT_TRUE(nl_res.is_error());
3273 std::string netlist_input(
"module ENT_0 ("
3296 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3299 EXPECT_TRUE(nl_res.is_error());
3304 std::string netlist_input(
"module top ("
3308 " input global_in ;"
3309 " output global_out ;"
3311 ".key_unknown(#Unkn0wn!)) "
3318 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3321 EXPECT_TRUE(nl_res.is_ok());
3326 std::string netlist_input(
"module top ("
3330 " input global_in ;"
3331 " output global_out ;"
3342 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3345 EXPECT_TRUE(nl_res.is_error());
3350 std::string netlist_input(
"module top ("
3354 " input global_in ;"
3355 " output global_out ;"
3356 " wire [0:4] signal_vec ;"
3357 " assign signal_unknown[0:4] = signal_vec[0:4];"
3364 auto verilog_file = test_utils::create_sandbox_file(
"netlist.v", netlist_input);
3367 EXPECT_TRUE(nl_res.is_ok());
const std::string & get_name() const
std::tuple< std::string, std::string > get_data(const std::string &category, const std::string &key) const
GatePin * get_pin() const
Net * get_fan_in_net(const std::string &pin_name) const
const std::vector< Net * > & get_fan_in_nets() const
Net * get_fan_out_net(const std::string &pin_name) const
const std::string & get_name() const
Endpoint * get_fan_in_endpoint(const std::string &pin_name) const
Endpoint * get_successor(const std::string &pin_name) const
const std::vector< Net * > & get_fan_out_nets() const
const std::vector< Endpoint * > & get_fan_in_endpoints() const
Endpoint * get_fan_out_endpoint(const std::string &pin_name) const
bool is_input_net(Net *net) const
std::vector< ModulePin * > get_pins(const std::function< bool(ModulePin *)> &filter=nullptr) const
bool is_top_module() const
bool is_output_net(Net *net) const
const std::vector< Gate * > & get_gates() const
std::string get_name() const
std::vector< Module * > get_submodules(const std::function< bool(Module *)> &filter=nullptr, bool recursive=false) const
std::string get_type() const
const std::unordered_set< Net * > & get_output_nets() const
const std::string & get_name() const
bool is_global_output_net() const
std::vector< Endpoint * > get_destinations(const std::function< bool(Endpoint *ep)> &filter=nullptr) const
bool is_global_input_net() const
std::vector< Endpoint * > get_sources(const std::function< bool(Endpoint *ep)> &filter=nullptr) const
Result< std::unique_ptr< Netlist > > parse_and_instantiate(const std::filesystem::path &file_path, const GateLibrary *gate_library)
GateLibrary * get_gate_library(const std::string &file_path)
CORE_API bool starts_with(const T &s, const T &start)
bool vectors_have_same_content(std::vector< T > vec_1, std::vector< T > vec_2)
TEST_F(HGLParserTest, check_library)