Skip to content

Commit e2ebea5

Browse files
authored
[FIRRTL] FoldUnusedBits: Cast compressed data back to signed integer (#7913)
* [FIRRTL] FoldUnusedBits: Cast compressed data back to signed integer * [FIRRTL] Add UnusedBits test for signed integer
1 parent b152422 commit e2ebea5

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

lib/Dialect/FIRRTL/FIRRTLFolds.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2849,6 +2849,15 @@ struct FoldUnusedBits : public mlir::RewritePattern {
28492849
catOfSlices = slice;
28502850
}
28512851
}
2852+
2853+
// If the original memory held a signed integer, then the compressed
2854+
// memory will be signed too. Since the catOfSlices is always unsigned,
2855+
// cast the data to a signed integer if needed before connecting back to
2856+
// the memory.
2857+
if (type.isSigned())
2858+
catOfSlices =
2859+
rewriter.createOrFold<AsSIntPrimOp>(writeOp.getLoc(), catOfSlices);
2860+
28522861
rewriter.replaceOpWithNewOp<MatchingConnectOp>(writeOp, writeOp.getDest(),
28532862
catOfSlices);
28542863
}

test/Dialect/FIRRTL/simplify-mems.mlir

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,36 @@ firrtl.circuit "UnusedBitsAtEnd" {
336336

337337
// -----
338338

339+
firrtl.circuit "UnusedBitsOfSignedInteger" {
340+
firrtl.module public @UnusedBitsOfSignedInteger(
341+
in %in_data: !firrtl.sint<42>,
342+
out %result_read: !firrtl.sint<5>) {
343+
// CHECK: %Memory_read, %Memory_write = firrtl.mem Undefined
344+
// CHECK-SAME: !firrtl.bundle<addr: uint<4>, en: uint<1>, clk: clock, data flip: sint<5>>
345+
// CHECK-SAME: !firrtl.bundle<addr: uint<4>, en: uint<1>, clk: clock, data: sint<5>, mask: uint<1>>
346+
%Memory_read, %Memory_write = firrtl.mem Undefined
347+
{
348+
depth = 12 : i64,
349+
name = "Memory",
350+
portNames = ["read", "write"],
351+
readLatency = 0 : i32,
352+
writeLatency = 1 : i32
353+
} :
354+
!firrtl.bundle<addr: uint<4>, en: uint<1>, clk: clock, data flip: sint<42>>,
355+
!firrtl.bundle<addr: uint<4>, en: uint<1>, clk: clock, data: sint<42>, mask: uint<1>>
356+
357+
%read_data = firrtl.subfield %Memory_read[data] : !firrtl.bundle<addr: uint<4>, en: uint<1>, clk: clock, data flip: sint<42>>
358+
%read_data_slice = firrtl.bits %read_data 7 to 3 : (!firrtl.sint<42>) -> !firrtl.uint<5>
359+
%read_data_slice_sint = firrtl.asSInt %read_data_slice : (!firrtl.uint<5>) -> !firrtl.sint<5>
360+
firrtl.connect %result_read, %read_data_slice_sint : !firrtl.sint<5>, !firrtl.sint<5>
361+
362+
%write_data = firrtl.subfield %Memory_write[data] : !firrtl.bundle<addr: uint<4>, en: uint<1>, clk: clock, data: sint<42>, mask: uint<1>>
363+
firrtl.connect %write_data, %in_data : !firrtl.sint<42>, !firrtl.sint<42>
364+
}
365+
}
366+
367+
// -----
368+
339369
firrtl.circuit "OneAddressMasked" {
340370
firrtl.module public @OneAddressMasked(
341371
in %clock: !firrtl.clock,

0 commit comments

Comments
 (0)