Skip to content

Commit c14eb0d

Browse files
authored
[ExportVerilog] Require $unsigned for outer-most expression in assignment (#9024)
1 parent a2c4f38 commit c14eb0d

File tree

3 files changed

+13
-10
lines changed

3 files changed

+13
-10
lines changed

lib/Conversion/ExportVerilog/ExportVerilog.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2168,8 +2168,11 @@ class ExprEmitter : public EmitterBase,
21682168
assert(localTokens.empty());
21692169
// Wrap to this column.
21702170
ps.scopedBox(PP::ibox0, [&]() {
2171+
// Require unsigned in an assignment context since every wire is
2172+
// declared as unsigned.
21712173
emitSubExpr(exp, parenthesizeIfLooserThan,
2172-
/*signRequirement*/ NoRequirement,
2174+
/*signRequirement*/
2175+
isAssignmentLikeContext ? RequireUnsigned : NoRequirement,
21732176
/*isSelfDeterminedUnsignedValue*/ false,
21742177
isAssignmentLikeContext);
21752178
});

test/Conversion/ExportVerilog/hw-dialect.mlir

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -171,12 +171,12 @@ hw.module @TESTSIMPLE(in %a: i4, in %b: i4, in %c: i2, in %cond: i1,
171171
// CHECK-NEXT: assign r2 = a - b;
172172
// CHECK-NEXT: assign r4 = a * b;
173173
// CHECK-NEXT: assign r6 = a / b;
174-
// CHECK-NEXT: assign r7 = $signed($signed(a) / $signed(b));
174+
// CHECK-NEXT: assign r7 = $unsigned($signed($signed(a) / $signed(b)));
175175
// CHECK-NEXT: assign r8 = a % b;
176-
// CHECK-NEXT: assign r9 = $signed($signed(a) % $signed(b));
176+
// CHECK-NEXT: assign r9 = $unsigned($signed($signed(a) % $signed(b)));
177177
// CHECK-NEXT: assign r10 = a << b;
178178
// CHECK-NEXT: assign r11 = a >> b;
179-
// CHECK-NEXT: assign r12 = $signed($signed(a) >>> b);
179+
// CHECK-NEXT: assign r12 = $unsigned($signed($signed(a) >>> b));
180180
// CHECK-NEXT: assign r13 = a | b;
181181
// CHECK-NEXT: assign r14 = a & b;
182182
// CHECK-NEXT: assign r15 = a ^ b;
@@ -458,7 +458,7 @@ hw.module @signs(in %in1: i4, in %in2: i4, in %in3: i4, in %in4: i4) {
458458
sv.assign %awire, %b4: i4
459459

460460
// https://github.com/llvm/circt/issues/369
461-
// CHECK: assign awire = $signed(4'sh5 / -4'sh3);
461+
// CHECK: assign awire = $unsigned($signed(4'sh5 / -4'sh3));
462462
%c5_i4 = hw.constant 5 : i4
463463
%c-3_i4 = hw.constant -3 : i4
464464
%divs = comb.divs %c5_i4, %c-3_i4 : i4
@@ -972,7 +972,7 @@ hw.module @ShiftAmountZext(in %a: i8, in %b1: i4, in %b2: i4, in %b3: i4,
972972
// CHECK: assign o2 = a >> b2;
973973
%r2 = comb.shru %a, %B2 : i8
974974

975-
// CHECK: assign o3 = $signed($signed(a) >>> b3);
975+
// CHECK: assign o3 = $unsigned($signed($signed(a) >>> b3));
976976
%r3 = comb.shrs %a, %B3 : i8
977977
hw.output %r1, %r2, %r3 : i8, i8, i8
978978
}
@@ -997,7 +997,7 @@ hw.module @SignedshiftResultSign(in %a: i18, out b: i18) {
997997
}
998998
// CHECK-LABEL: module SignedShiftRightPrecendence
999999
hw.module @SignedShiftRightPrecendence(in %p: i1, in %x: i45, out o: i45) {
1000-
// CHECK: assign o = $signed($signed(x) >>> (p ? 45'h5 : 45'h8))
1000+
// CHECK: assign o = $unsigned($signed($signed(x) >>> (p ? 45'h5 : 45'h8)))
10011001
%c5_i45 = hw.constant 5 : i45
10021002
%c8_i45 = hw.constant 8 : i45
10031003
%0 = comb.mux %p, %c5_i45, %c8_i45 : i45
@@ -1253,7 +1253,7 @@ hw.module @UseParameterValue<xx: i42>(in %arg0: i8,
12531253
%e = comb.extract %d from 0 : (i42) -> i8
12541254
%f = comb.add %e, %e : i8
12551255

1256-
// CHECK-NEXT: assign out4 = $signed(42'd4) >>> $signed(xx);
1256+
// CHECK-NEXT: assign out4 = $unsigned($signed(42'd4) >>> $signed(xx));
12571257
%g = hw.param.value i42 = #hw.param.expr.shrs<4, #hw.param.decl.ref<"xx">>
12581258

12591259
hw.output %a, %b, %f, %g : i8, i8, i8, i42
@@ -1363,7 +1363,7 @@ hw.module @ParamsParensPrecedence<param: i32>(out a:i32, out b:i32, out c:i32) {
13631363
// CHECK: = $clog2($unsigned($clog2($unsigned(param + 8))));
13641364
%3 = hw.param.value i32 = #hw.param.expr.clog2<#hw.param.expr.clog2<#hw.param.expr.add<#hw.param.decl.ref<"param">,8>>>
13651365

1366-
// CHECK: = $signed(param) >>> $signed(param & 8);
1366+
// CHECK: = $unsigned($signed(param) >>> $signed(param & 8));
13671367
%4 = hw.param.value i32 = #hw.param.expr.shrs<#hw.param.decl.ref<"param">,#hw.param.expr.and<8,#hw.param.decl.ref<"param">>>
13681368
hw.output %1, %3, %4: i32, i32, i32
13691369
}

test/Conversion/ExportVerilog/verilog-basic.mlir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ hw.module @Expressions(in %in8: i8, in %in4: i4, in %clock: i1,
140140
// CHECK-DAG: assign out1g = in4 !=? 4'h0;
141141
%cmp6 = comb.icmp wne %in4, %c0_i4 : i4
142142

143-
// CHECK-DAG: assign out4s = $signed($signed(in4) >>> in4);
143+
// CHECK-DAG: assign out4s = $unsigned($signed($signed(in4) >>> in4));
144144
// CHECK-DAG: assign sext17 = {w3[15], w3};
145145
%36 = comb.extract %w3_use from 15 : (i16) -> i1
146146
%35 = comb.concat %36, %w3_use : i1, i16

0 commit comments

Comments
 (0)