@@ -29,7 +29,7 @@ mod tests {
29
29
use driver:: Canonical ;
30
30
use egg:: { Analysis , Language , RecExpr } ;
31
31
use lut:: { LutExprInfo , LutLang } ;
32
- use verilog:: { SVModule , sv_parse_wrapper} ;
32
+ use verilog:: { PrimitiveType , SVModule , sv_parse_wrapper} ;
33
33
34
34
use super :: * ;
35
35
@@ -290,7 +290,7 @@ endmodule\n"
290
290
#[ test]
291
291
fn test_assignment_emission ( ) {
292
292
let expr: RecExpr < LutLang > = "d" . parse ( ) . unwrap ( ) ;
293
- let module = SVModule :: from_expr ( expr, "passthru" . to_string ( ) , vec ! [ "y" . to_string( ) ] ) ;
293
+ let module = SVModule :: from_luts ( expr, "passthru" . to_string ( ) , vec ! [ "y" . to_string( ) ] ) ;
294
294
assert ! ( module. is_ok( ) ) ;
295
295
let module = module. unwrap ( ) ;
296
296
assert_eq ! ( module. to_string( ) , get_assignment_verilog( ) ) ;
@@ -299,7 +299,7 @@ endmodule\n"
299
299
#[ test]
300
300
fn test_duplicate_assignment ( ) {
301
301
let expr: RecExpr < LutLang > = "(BUS d d)" . parse ( ) . unwrap ( ) ;
302
- let module = SVModule :: from_expr ( expr, "passthru" . to_string ( ) , vec ! [ ] ) ;
302
+ let module = SVModule :: from_luts ( expr, "passthru" . to_string ( ) , vec ! [ ] ) ;
303
303
assert ! ( module. is_ok( ) ) ;
304
304
let module = module. unwrap ( ) ;
305
305
let correct = "module passthru (
@@ -444,7 +444,7 @@ endmodule\n"
444
444
wire b;
445
445
output y;
446
446
wire y;
447
- AND2 _0_ (
447
+ AND _0_ (
448
448
.A(a),
449
449
.B(b),
450
450
.Y(y)
@@ -471,19 +471,19 @@ endmodule\n"
471
471
wire tmp1;
472
472
wire tmp2;
473
473
474
- AND2 _0_ (
474
+ AND _0_ (
475
475
.A(1'd1),
476
476
.B(1'h01),
477
477
.Y(tmp1)
478
478
);
479
479
480
- AND2 _1_ (
480
+ AND _1_ (
481
481
.A(1'b00),
482
482
.B(1'd0),
483
483
.Y(tmp2)
484
484
);
485
485
486
- AND2 _2_ (
486
+ AND _2_ (
487
487
.A(tmp1),
488
488
.B(tmp2),
489
489
.Y(y)
@@ -501,12 +501,47 @@ endmodule\n"
501
501
) ;
502
502
}
503
503
504
+ #[ test]
505
+ fn test_double_inverter ( ) {
506
+ let module = "module dinv (
507
+ d,
508
+ y
509
+ );
510
+ input d;
511
+ wire d;
512
+ output y;
513
+ wire y;
514
+ wire __0__;
515
+
516
+ NOT _1_ (
517
+ .A(d),
518
+ .Y(__0__)
519
+ );
520
+
521
+ INV _2_ (
522
+ .A (__0__),
523
+ .ZN(y)
524
+ );
525
+
526
+ endmodule
527
+ "
528
+ . to_string ( ) ;
529
+ let ast = sv_parse_wrapper ( & module, None ) . unwrap ( ) ;
530
+ let module = SVModule :: from_ast ( & ast) ;
531
+ assert ! ( module. is_ok( ) ) ;
532
+ let module = module. unwrap ( ) ;
533
+ assert_eq ! (
534
+ module. to_single_expr( ) . unwrap( ) . to_string( ) ,
535
+ "(NOT (NOT d))" . to_string( )
536
+ ) ;
537
+ }
538
+
504
539
#[ test]
505
540
fn test_verilog_emitter ( ) {
506
541
let mux: RecExpr < LutLang > = "(LUT 202 s1 (LUT 202 s0 a b) (LUT 202 s0 c d))"
507
542
. parse ( )
508
543
. unwrap ( ) ;
509
- let module = SVModule :: from_expr ( mux, "mux_4_1" . to_string ( ) , Vec :: new ( ) ) ;
544
+ let module = SVModule :: from_luts ( mux, "mux_4_1" . to_string ( ) , Vec :: new ( ) ) ;
510
545
assert ! ( module. is_ok( ) ) ;
511
546
let module = module. unwrap ( ) ;
512
547
let golden = "module mux_4_1 (
@@ -566,7 +601,7 @@ endmodule\n"
566
601
#[ test]
567
602
fn test_emit_reg ( ) {
568
603
let reg: RecExpr < LutLang > = "(REG a)" . parse ( ) . unwrap ( ) ;
569
- let module = SVModule :: from_expr ( reg, "my_reg" . to_string ( ) , Vec :: new ( ) ) ;
604
+ let module = SVModule :: from_luts ( reg, "my_reg" . to_string ( ) , Vec :: new ( ) ) ;
570
605
assert ! ( module. is_ok( ) ) ;
571
606
let module = module. unwrap ( ) ;
572
607
let golden = "module my_reg (
@@ -599,7 +634,7 @@ endmodule\n"
599
634
let expr: RecExpr < LutLang > = "(AND a (XOR b (NOR c (NOT (MUX s t false)))))"
600
635
. parse ( )
601
636
. unwrap ( ) ;
602
- let module = SVModule :: from_expr ( expr, "gate_list" . to_string ( ) , Vec :: new ( ) ) ;
637
+ let module = SVModule :: from_luts ( expr, "gate_list" . to_string ( ) , Vec :: new ( ) ) ;
603
638
assert ! ( module. is_ok( ) ) ;
604
639
let module = module. unwrap ( ) ;
605
640
let golden = "module gate_list (
@@ -640,19 +675,19 @@ endmodule\n"
640
675
.A(__1__),
641
676
.Y(__2__)
642
677
);
643
- NOR2 #(
678
+ NOR #(
644
679
) __8__ (
645
680
.A(c),
646
681
.B(__2__),
647
682
.Y(__3__)
648
683
);
649
- XOR2 #(
684
+ XOR #(
650
685
) __9__ (
651
686
.A(b),
652
687
.B(__3__),
653
688
.Y(__4__)
654
689
);
655
- AND2 #(
690
+ AND #(
656
691
) __10__ (
657
692
.A(a),
658
693
.B(__4__),
@@ -856,6 +891,22 @@ endmodule\n"
856
891
assert ! ( matches!( expr. as_ref( ) . last( ) . unwrap( ) , CellLang :: And ( _) ) ) ;
857
892
}
858
893
894
+ #[ test]
895
+ fn test_input_lists ( ) {
896
+ assert_eq ! (
897
+ PrimitiveType :: AND4 . get_input_list( ) ,
898
+ vec![ "A1" , "A2" , "A3" , "A4" ]
899
+ ) ;
900
+ assert_eq ! (
901
+ PrimitiveType :: AOI22 . get_input_list( ) ,
902
+ vec![ "A1" , "A2" , "B1" , "B2" ]
903
+ ) ;
904
+ assert_eq ! (
905
+ PrimitiveType :: LUT6 . get_input_list( ) ,
906
+ vec![ "I0" , "I1" , "I2" , "I3" , "I4" , "I5" ]
907
+ ) ;
908
+ }
909
+
859
910
#[ test]
860
911
fn test_emit_celllang ( ) {
861
912
let expr: RecExpr < CellLang > = "(NOR2_X1 b (NAND2_X1 a false))" . parse ( ) . unwrap ( ) ;
0 commit comments