@@ -408,21 +408,10 @@ firrtl.circuit "OneAddressNoMask" {
408
408
in %in_rwen: !firrtl.uint <1 >,
409
409
out %result_read: !firrtl.uint <32 >,
410
410
out %result_rw: !firrtl.uint <32 >) {
411
- %c1_ui1 = firrtl.constant 1 : !firrtl.uint <1 >
412
- %Memory_read , %Memory_rw , %Memory_write = firrtl.mem Undefined
413
- {
414
- depth = 1 : i64 ,
415
- name = " Memory" ,
416
- portNames = [" read" , " rw" , " write" ],
417
- readLatency = 2 : i32 ,
418
- writeLatency = 4 : i32
419
- } :
420
- !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data flip : uint <32 >>,
421
- !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , rdata flip : uint <32 >, wmode : uint <1 >, wdata : uint <32 >, wmask : uint <1 >>,
422
- !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data : uint <32 >, mask : uint <1 >>
423
411
424
- // CHECK: %Memory = firrtl.reg %clock : !firrtl.clock, !firrtl.uint<32>
425
-
412
+ // Pipeline the inputs.
413
+ // TODO: It would be good to de-duplicate these either in the pass or in a canonicalizer.
414
+
426
415
// CHECK: %Memory_write_en_0 = firrtl.reg %clock : !firrtl.clock, !firrtl.uint<1>
427
416
// CHECK: firrtl.matchingconnect %Memory_write_en_0, %in_wen : !firrtl.uint<1>
428
417
// CHECK: %Memory_write_en_1 = firrtl.reg %clock : !firrtl.clock, !firrtl.uint<1>
@@ -444,6 +433,22 @@ firrtl.circuit "OneAddressNoMask" {
444
433
// CHECK: %Memory_rw_wdata_2 = firrtl.reg %clock : !firrtl.clock, !firrtl.uint<32>
445
434
// CHECK: firrtl.matchingconnect %Memory_rw_wdata_2, %Memory_rw_wdata_1 : !firrtl.uint<32>
446
435
436
+ %c1_ui1 = firrtl.constant 1 : !firrtl.uint <1 >
437
+
438
+ %Memory_read , %Memory_rw , %Memory_write = firrtl.mem Undefined
439
+ {
440
+ depth = 1 : i64 ,
441
+ name = " Memory" ,
442
+ portNames = [" read" , " rw" , " write" ],
443
+ readLatency = 2 : i32 ,
444
+ writeLatency = 4 : i32
445
+ } :
446
+ !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data flip : uint <32 >>,
447
+ !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , rdata flip : uint <32 >, wmode : uint <1 >, wdata : uint <32 >, wmask : uint <1 >>,
448
+ !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data : uint <32 >, mask : uint <1 >>
449
+
450
+ // CHECK: %Memory = firrtl.reg %clock : !firrtl.clock, !firrtl.uint<32>
451
+
447
452
// CHECK: firrtl.matchingconnect %result_read, %Memory : !firrtl.uint<32>
448
453
%read_addr = firrtl.subfield %Memory_read [addr ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data flip : uint <32 >>
449
454
firrtl.connect %read_addr , %addr : !firrtl.uint <1 >, !firrtl.uint <1 >
@@ -492,105 +497,3 @@ firrtl.circuit "OneAddressNoMask" {
492
497
firrtl.connect %write_mask , %c1_ui1 : !firrtl.uint <1 >, !firrtl.uint <1 >
493
498
}
494
499
}
495
-
496
- // -----
497
-
498
- // This test ensures that the FoldRegMems canonicalization correctly
499
- // folds memories under layerblocks.
500
- firrtl.circuit " Rewrite1ElementMemoryToRegisterUnderLayerblock" {
501
- firrtl.layer @A bind {}
502
-
503
- firrtl.module public @Rewrite1ElementMemoryToRegisterUnderLayerblock (
504
- in %clock: !firrtl.clock ,
505
- in %addr: !firrtl.uint <1 >,
506
- in %in_data: !firrtl.uint <32 >,
507
- in %wmode_rw: !firrtl.uint <1 >,
508
- in %in_wen: !firrtl.uint <1 >,
509
- in %in_rwen: !firrtl.uint <1 >) {
510
-
511
- %c1_ui1 = firrtl.constant 1 : !firrtl.uint <1 >
512
-
513
- // CHECK firrtl.layerblock @A
514
- firrtl.layerblock @A {
515
- // CHECK: %result_read = firrtl.wire : !firrtl.uint<32>
516
- // CHECK: %result_rw = firrtl.wire : !firrtl.uint<32>
517
- %result_read = firrtl.wire : !firrtl.uint <32 >
518
- %result_rw = firrtl.wire : !firrtl.uint <32 >
519
-
520
- %Memory_read , %Memory_rw , %Memory_write = firrtl.mem Undefined
521
- {
522
- depth = 1 : i64 ,
523
- name = " Memory" ,
524
- portNames = [" read" , " rw" , " write" ],
525
- readLatency = 2 : i32 ,
526
- writeLatency = 2 : i32
527
- } :
528
- !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data flip : uint <32 >>,
529
- !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , rdata flip : uint <32 >, wmode : uint <1 >, wdata : uint <32 >, wmask : uint <1 >>,
530
- !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data : uint <32 >, mask : uint <1 >>
531
-
532
- // CHECK: %Memory = firrtl.reg %clock : !firrtl.clock, !firrtl.uint<32>
533
- // CHECK: %Memory_write_mask_0 = firrtl.reg %clock : !firrtl.clock, !firrtl.uint<1>
534
- // CHECK: firrtl.matchingconnect %Memory_write_mask_0, %c1_ui1 : !firrtl.uint<1>
535
-
536
- // CHECK: %Memory_write_en_0 = firrtl.reg %clock : !firrtl.clock, !firrtl.uint<1>
537
- // CHECK: firrtl.matchingconnect %Memory_write_en_0, %in_wen : !firrtl.uint<1>
538
-
539
- // CHECK: %Memory_write_data_0 = firrtl.reg %clock : !firrtl.clock, !firrtl.uint<32>
540
- // CHECK: firrtl.matchingconnect %Memory_write_data_0, %in_data : !firrtl.uint<32>
541
-
542
- // CHECK: %Memory_rw_wmask_0 = firrtl.reg %clock : !firrtl.clock, !firrtl.uint<1>
543
- // CHECK: firrtl.matchingconnect %Memory_rw_wmask_0, %c1_ui1 : !firrtl.uint<1>
544
-
545
- // CHECK: %Memory_rw_wdata_0 = firrtl.reg %clock : !firrtl.clock, !firrtl.uint<32>
546
- // CHECK: firrtl.matchingconnect %Memory_rw_wdata_0, %in_data : !firrtl.uint<32>
547
-
548
- // CHECK: firrtl.matchingconnect %result_read, %Memory : !firrtl.uint<32>
549
- // CHECK: firrtl.matchingconnect %result_rw, %Memory : !firrtl.uint<32>
550
-
551
- // CHECK: %0 = firrtl.and %in_rwen, %wmode_rw : (!firrtl.uint<1>, !firrtl.uint<1>) -> !firrtl.uint<1>
552
- // CHECK: %Memory_rw_wen_0 = firrtl.reg %clock : !firrtl.clock, !firrtl.uint<1>
553
- // CHECK: firrtl.matchingconnect %Memory_rw_wen_0, %0 : !firrtl.uint<1>
554
- // CHECK: %1 = firrtl.and %Memory_rw_wen_0, %Memory_rw_wmask_0 : (!firrtl.uint<1>, !firrtl.uint<1>) -> !firrtl.uint<1>
555
- // CHECK: %2 = firrtl.mux(%1, %Memory_rw_wdata_0, %Memory) : (!firrtl.uint<1>, !firrtl.uint<32>, !firrtl.uint<32>) -> !firrtl.uint<32>
556
- // CHECK: %3 = firrtl.and %Memory_write_en_0, %Memory_write_mask_0 : (!firrtl.uint<1>, !firrtl.uint<1>) -> !firrtl.uint<1>
557
- // CHECK: %4 = firrtl.mux(%3, %Memory_write_data_0, %2) : (!firrtl.uint<1>, !firrtl.uint<32>, !firrtl.uint<32>) -> !firrtl.uint<32>
558
- // CHECK: firrtl.matchingconnect %Memory, %4 : !firrtl.uint<32>
559
-
560
- %read_addr = firrtl.subfield %Memory_read [addr ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data flip : uint <32 >>
561
- firrtl.connect %read_addr , %addr : !firrtl.uint <1 >, !firrtl.uint <1 >
562
- %read_en = firrtl.subfield %Memory_read [en ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data flip : uint <32 >>
563
- firrtl.connect %read_en , %c1_ui1 : !firrtl.uint <1 >, !firrtl.uint <1 >
564
- %read_clk = firrtl.subfield %Memory_read [clk ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data flip : uint <32 >>
565
- firrtl.connect %read_clk , %clock : !firrtl.clock , !firrtl.clock
566
- %read_data = firrtl.subfield %Memory_read [data ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data flip : uint <32 >>
567
- firrtl.connect %result_read , %read_data : !firrtl.uint <32 >, !firrtl.uint <32 >
568
-
569
- %rw_addr = firrtl.subfield %Memory_rw [addr ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , rdata flip : uint <32 >, wmode : uint <1 >, wdata : uint <32 >, wmask : uint <1 >>
570
- firrtl.connect %rw_addr , %addr : !firrtl.uint <1 >, !firrtl.uint <1 >
571
- %rw_en = firrtl.subfield %Memory_rw [en ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , rdata flip : uint <32 >, wmode : uint <1 >, wdata : uint <32 >, wmask : uint <1 >>
572
- firrtl.connect %rw_en , %in_rwen : !firrtl.uint <1 >, !firrtl.uint <1 >
573
- %rw_clk = firrtl.subfield %Memory_rw [clk ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , rdata flip : uint <32 >, wmode : uint <1 >, wdata : uint <32 >, wmask : uint <1 >>
574
- firrtl.connect %rw_clk , %clock : !firrtl.clock , !firrtl.clock
575
- %rw_rdata = firrtl.subfield %Memory_rw [rdata ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , rdata flip : uint <32 >, wmode : uint <1 >, wdata : uint <32 >, wmask : uint <1 >>
576
- firrtl.connect %result_rw , %rw_rdata : !firrtl.uint <32 >, !firrtl.uint <32 >
577
- %rw_wmode = firrtl.subfield %Memory_rw [wmode ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , rdata flip : uint <32 >, wmode : uint <1 >, wdata : uint <32 >, wmask : uint <1 >>
578
- firrtl.connect %rw_wmode , %wmode_rw : !firrtl.uint <1 >, !firrtl.uint <1 >
579
- %rw_wdata = firrtl.subfield %Memory_rw [wdata ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , rdata flip : uint <32 >, wmode : uint <1 >, wdata : uint <32 >, wmask : uint <1 >>
580
- firrtl.connect %rw_wdata , %in_data : !firrtl.uint <32 >, !firrtl.uint <32 >
581
- %rw_wmask = firrtl.subfield %Memory_rw [wmask ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , rdata flip : uint <32 >, wmode : uint <1 >, wdata : uint <32 >, wmask : uint <1 >>
582
- firrtl.connect %rw_wmask , %c1_ui1 : !firrtl.uint <1 >, !firrtl.uint <1 >
583
-
584
- %write_addr = firrtl.subfield %Memory_write [addr ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data : uint <32 >, mask : uint <1 >>
585
- firrtl.connect %write_addr , %addr : !firrtl.uint <1 >, !firrtl.uint <1 >
586
- %write_en = firrtl.subfield %Memory_write [en ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data : uint <32 >, mask : uint <1 >>
587
- firrtl.connect %write_en , %in_wen : !firrtl.uint <1 >, !firrtl.uint <1 >
588
- %write_clk = firrtl.subfield %Memory_write [clk ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data : uint <32 >, mask : uint <1 >>
589
- firrtl.connect %write_clk , %clock : !firrtl.clock , !firrtl.clock
590
- %write_data = firrtl.subfield %Memory_write [data ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data : uint <32 >, mask : uint <1 >>
591
- firrtl.connect %write_data , %in_data : !firrtl.uint <32 >, !firrtl.uint <32 >
592
- %write_mask = firrtl.subfield %Memory_write [mask ] : !firrtl.bundle <addr : uint <1 >, en : uint <1 >, clk : clock , data : uint <32 >, mask : uint <1 >>
593
- firrtl.connect %write_mask , %c1_ui1 : !firrtl.uint <1 >, !firrtl.uint <1 >
594
- }
595
- }
596
- }
0 commit comments