1 #include "netlist_test_utils.h"
14 test_utils::init_log_channels();
31 auto gl_res = liberty_parser.
parse(path_lib);
32 ASSERT_TRUE(gl_res.is_ok());
33 std::unique_ptr<GateLibrary> gl = gl_res.get();
35 ASSERT_NE(gl,
nullptr);
38 EXPECT_EQ(gl->get_name(),
"TEST_GATE_LIBRARY");
41 auto gate_types = gl->get_gate_types();
42 ASSERT_EQ(gate_types.size(), 1);
43 auto gt_it = gate_types.find(
"TEST_GATE_TYPE");
44 ASSERT_TRUE(gt_it != gate_types.end());
46 EXPECT_EQ(gt->
get_properties(), std::set<GateTypeProperty>({GateTypeProperty::combinational}));
50 ASSERT_EQ(
pins.size(), 4);
52 const auto* vdd_pin =
pins.at(0);
53 EXPECT_EQ(vdd_pin->get_id(), 1);
54 EXPECT_EQ(vdd_pin->get_name(),
"VDD");
59 const auto* gnd_pin =
pins.at(1);
60 EXPECT_EQ(gnd_pin->get_id(), 2);
61 EXPECT_EQ(gnd_pin->get_name(),
"GND");
66 const auto* i_pin =
pins.at(2);
67 EXPECT_EQ(i_pin->get_id(), 3);
68 EXPECT_EQ(i_pin->get_name(),
"I");
73 const auto* o_pin =
pins.at(3);
74 EXPECT_EQ(o_pin->get_id(), 4);
75 EXPECT_EQ(o_pin->get_name(),
"O");
102 auto gl_res = liberty_parser.
parse(path_lib);
103 ASSERT_TRUE(gl_res.is_ok());
104 std::unique_ptr<GateLibrary> gl = gl_res.get();
106 ASSERT_NE(gl,
nullptr);
109 auto gate_types = gl->get_gate_types();
110 ASSERT_EQ(gate_types.size(), 1);
111 auto gt_it = gate_types.find(
"TEST_FF");
112 ASSERT_TRUE(gt_it != gate_types.end());
114 EXPECT_EQ(gt->
get_properties(), std::set<GateTypeProperty>({GateTypeProperty::sequential, GateTypeProperty::ff}));
118 ASSERT_EQ(
pins.size(), 8);
120 const auto* clk_pin =
pins.at(0);
121 EXPECT_EQ(clk_pin->get_id(), 1);
122 EXPECT_EQ(clk_pin->get_name(),
"CLK");
127 const auto* ce_pin =
pins.at(1);
128 EXPECT_EQ(ce_pin->get_id(), 2);
129 EXPECT_EQ(ce_pin->get_name(),
"CE");
133 const auto* d_pin =
pins.at(2);
134 EXPECT_EQ(d_pin->get_id(), 3);
135 EXPECT_EQ(d_pin->get_name(),
"D");
139 const auto* r_pin =
pins.at(3);
140 EXPECT_EQ(r_pin->get_id(), 4);
141 EXPECT_EQ(r_pin->get_name(),
"R");
145 const auto* s_pin =
pins.at(4);
146 EXPECT_EQ(s_pin->get_id(), 5);
147 EXPECT_EQ(s_pin->get_name(),
"S");
151 const auto* q_pin =
pins.at(5);
152 EXPECT_EQ(q_pin->get_id(), 6);
153 EXPECT_EQ(q_pin->get_name(),
"Q");
158 const auto* qn_pin =
pins.at(6);
159 EXPECT_EQ(qn_pin->get_id(), 7);
160 EXPECT_EQ(qn_pin->get_name(),
"QN");
165 const auto* o_pin =
pins.at(7);
166 EXPECT_EQ(o_pin->get_id(), 8);
167 EXPECT_EQ(o_pin->get_name(),
"O");
182 ASSERT_NE(ff_component,
nullptr);
184 ASSERT_NE(state_component,
nullptr);
207 auto gl_res = liberty_parser.
parse(path_lib);
208 ASSERT_TRUE(gl_res.is_ok());
209 std::unique_ptr<GateLibrary> gl = gl_res.get();
211 ASSERT_NE(gl,
nullptr);
214 auto gate_types = gl->get_gate_types();
215 ASSERT_EQ(gate_types.size(), 1);
216 auto gt_it = gate_types.find(
"TEST_LATCH");
217 ASSERT_TRUE(gt_it != gate_types.end());
219 EXPECT_EQ(gt->
get_properties(), std::set<GateTypeProperty>({GateTypeProperty::sequential, GateTypeProperty::latch}));
223 ASSERT_EQ(
pins.size(), 7);
225 const auto* g_pin =
pins.at(0);
226 EXPECT_EQ(g_pin->get_id(), 1);
227 EXPECT_EQ(g_pin->get_name(),
"G");
231 const auto* d_pin =
pins.at(1);
232 EXPECT_EQ(d_pin->get_id(), 2);
233 EXPECT_EQ(d_pin->get_name(),
"D");
237 const auto* s_pin =
pins.at(2);
238 EXPECT_EQ(s_pin->get_id(), 3);
239 EXPECT_EQ(s_pin->get_name(),
"S");
243 const auto* r_pin =
pins.at(3);
244 EXPECT_EQ(r_pin->get_id(), 4);
245 EXPECT_EQ(r_pin->get_name(),
"R");
249 const auto* q_pin =
pins.at(4);
250 EXPECT_EQ(q_pin->get_id(), 5);
251 EXPECT_EQ(q_pin->get_name(),
"Q");
256 const auto* qn_pin =
pins.at(5);
257 EXPECT_EQ(qn_pin->get_id(), 6);
258 EXPECT_EQ(qn_pin->get_name(),
"QN");
263 const auto* o_pin =
pins.at(6);
264 EXPECT_EQ(o_pin->get_id(), 7);
265 EXPECT_EQ(o_pin->get_name(),
"O");
280 ASSERT_NE(latch_component,
nullptr);
282 ASSERT_NE(state_component,
nullptr);
305 auto gl_res = liberty_parser.
parse(path_lib);
306 ASSERT_TRUE(gl_res.is_ok());
307 std::unique_ptr<GateLibrary> gl = gl_res.get();
309 ASSERT_NE(gl,
nullptr);
311 auto gate_types = gl->get_gate_types();
312 ASSERT_EQ(gate_types.size(), 1);
313 auto gt_it = gate_types.find(
"TEST_GATE_TYPE");
314 ASSERT_TRUE(gt_it != gate_types.end());
319 ASSERT_EQ(
pins.size(), 5);
321 const auto* o0_pin =
pins.at(0);
322 EXPECT_EQ(o0_pin->get_id(), 1);
323 EXPECT_EQ(o0_pin->get_name(),
"I");
327 const auto* o0_pin =
pins.at(1);
328 EXPECT_EQ(o0_pin->get_id(), 2);
329 EXPECT_EQ(o0_pin->get_name(),
"O0");
333 const auto* o1_pin =
pins.at(2);
334 EXPECT_EQ(o1_pin->get_id(), 3);
335 EXPECT_EQ(o1_pin->get_name(),
"O1");
339 const auto* o2_pin =
pins.at(3);
340 EXPECT_EQ(o2_pin->get_id(), 4);
341 EXPECT_EQ(o2_pin->get_name(),
"O2");
345 const auto* g_pin =
pins.at(4);
346 EXPECT_EQ(g_pin->get_id(), 5);
347 EXPECT_EQ(g_pin->get_name(),
"O3");
364 std::string path_lib =
utils::get_base_directory().string() +
"/bin/hal_plugins/test-files/liberty_parser/test_noexist.lib";
366 auto gl_res = liberty_parser.
parse(path_lib);
367 ASSERT_TRUE(gl_res.is_error());
372 std::string path_lib =
utils::get_base_directory().string() +
"/bin/hal_plugins/test-files/liberty_parser/invalid_test1.lib";
374 auto gl_res = liberty_parser.
parse(path_lib);
375 ASSERT_TRUE(gl_res.is_error());
380 std::string path_lib =
utils::get_base_directory().string() +
"/bin/hal_plugins/test-files/liberty_parser/invalid_test2.lib";
382 auto gl_res = liberty_parser.
parse(path_lib);
383 ASSERT_TRUE(gl_res.is_error());
388 std::string path_lib =
utils::get_base_directory().string() +
"/bin/hal_plugins/test-files/liberty_parser/invalid_test3.lib";
390 auto gl_res = liberty_parser.
parse(path_lib);
391 ASSERT_TRUE(gl_res.is_error());
396 std::string path_lib =
utils::get_base_directory().string() +
"/bin/hal_plugins/test-files/liberty_parser/invalid_test4.lib";
398 auto gl_res = liberty_parser.
parse(path_lib);
399 ASSERT_TRUE(gl_res.is_error());
401 #if !defined (__APPLE__)
405 std::string path_lib =
utils::get_base_directory().string() +
"/bin/hal_plugins/test-files/liberty_parser/invalid_test6.lib";
407 auto gl_res = liberty_parser.
parse(path_lib);
408 ASSERT_TRUE(gl_res.is_error());
423 std::string path_lib =
utils::get_base_directory().string() +
"/bin/hal_plugins/test-files/liberty_parser/invalid_test8.lib";
425 auto gl_res = liberty_parser.
parse(path_lib);
426 ASSERT_TRUE(gl_res.is_ok());
427 std::unique_ptr<GateLibrary> gl = gl_res.get();
429 ASSERT_NE(gl,
nullptr);
431 auto gate_types = gl->get_gate_types();
432 ASSERT_TRUE(gate_types.find(
"TEST_GATE_TYPE") != gate_types.end());
433 EXPECT_EQ(gate_types.at(
"TEST_GATE_TYPE")->get_properties(), std::set<GateTypeProperty>({GateTypeProperty::combinational}));
438 std::string path_lib =
utils::get_base_directory().string() +
"/bin/hal_plugins/test-files/liberty_parser/invalid_test9.lib";
440 auto gl_res = liberty_parser.
parse(path_lib);
441 ASSERT_TRUE(gl_res.is_error());
447 std::string path_lib =
utils::get_base_directory().string() +
"/bin/hal_plugins/test-files/liberty_parser/invalid_test10.lib";
449 auto gl_res = liberty_parser.
parse(path_lib);
450 ASSERT_TRUE(gl_res.is_error());
455 std::string path_lib =
utils::get_base_directory().string() +
"/bin/hal_plugins/test-files/liberty_parser/invalid_test11.lib";
457 auto gl_res = liberty_parser.
parse(path_lib);
458 ASSERT_TRUE(gl_res.is_error());
462 std::string path_lib =
utils::get_base_directory().string() +
"/bin/hal_plugins/test-files/liberty_parser/invalid_test12.lib";
464 auto gl_res = liberty_parser.
parse(path_lib);
465 ASSERT_TRUE(gl_res.is_ok());
466 std::unique_ptr<GateLibrary> gl = gl_res.get();
468 ASSERT_NE(gl,
nullptr);
470 auto gate_types = gl->get_gate_types();
471 ASSERT_TRUE(gate_types.find(
"TEST_GATE_TYPE") != gate_types.end());
472 EXPECT_EQ(gate_types.at(
"TEST_GATE_TYPE")->get_properties(), std::set<GateTypeProperty>({GateTypeProperty::combinational}));
473 EXPECT_EQ(gate_types.at(
"TEST_GATE_TYPE")->get_output_pins().size(), 1);
478 std::string path_lib =
utils::get_base_directory().string() +
"/bin/hal_plugins/test-files/liberty_parser/invalid_test13.lib";
480 auto gl_res = liberty_parser.
parse(path_lib);
481 ASSERT_TRUE(gl_res.is_error());
static BooleanFunction Var(const std::string &name, u16 size=1)
static Result< BooleanFunction > from_string(const std::string &expression)
BooleanFunction get_clock_function() const
const std::pair< AsyncSetResetBehavior, AsyncSetResetBehavior > & get_async_set_reset_behavior() const
BooleanFunction get_async_set_function() const
static bool is_class_of(const GateTypeComponent *component)
BooleanFunction get_async_reset_function() const
BooleanFunction get_next_state_function() const
std::vector< GateTypeComponent * > get_components(const std::function< bool(const GateTypeComponent *)> &filter=nullptr) const
T * get_component_as(const std::function< bool(const GateTypeComponent *)> &filter=nullptr) const
std::set< GateTypeProperty > get_properties() const
const std::unordered_map< std::string, BooleanFunction > & get_boolean_functions() const
std::vector< GatePin * > get_pins(const std::function< bool(GatePin *)> &filter=nullptr) const
BooleanFunction get_async_reset_function() const
static bool is_class_of(const GateTypeComponent *component)
const std::pair< AsyncSetResetBehavior, AsyncSetResetBehavior > & get_async_set_reset_behavior() const
BooleanFunction get_async_set_function() const
BooleanFunction get_enable_function() const
BooleanFunction get_data_in_function() const
Result< std::unique_ptr< GateLibrary > > parse(const std::filesystem::path &file_path) override
const std::string & get_state_identifier() const
static bool is_class_of(const GateTypeComponent *component)
const std::string & get_neg_state_identifier() const
std::filesystem::path get_base_directory()
TEST_F(HGLParserTest, check_library)
std::vector< PinInformation > pins