From e1e7e0feaf1f444d90c771d5ae16ad4a66e9ed88 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 19 Sep 2021 12:33:01 -0700 Subject: [PATCH] [SV] Switch LocalParamOp to take an attribute instead of SSA value. This keeps params and attributes in different domains. This will allow better enforcement of valid parameter values in the verifier. --- include/circt/Dialect/SV/SVExpressions.td | 11 ++++------- lib/Translation/ExportVerilog/ExportVerilog.cpp | 2 +- test/Dialect/SV/basic.mlir | 6 +++--- test/ExportVerilog/sv-dialect.mlir | 9 ++++----- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/include/circt/Dialect/SV/SVExpressions.td b/include/circt/Dialect/SV/SVExpressions.td index 385635228d..4fa4777614 100644 --- a/include/circt/Dialect/SV/SVExpressions.td +++ b/include/circt/Dialect/SV/SVExpressions.td @@ -95,20 +95,17 @@ def ConstantZOp : SVOp<"constantZ", [NoSideEffect, HasCustomSSAName]> { } def LocalParamOp : SVOp<"localparam", - [SameOperandsAndResultType, NoSideEffect, HasCustomSSAName]> { + [FirstAttrDerivedResultType, NoSideEffect, HasCustomSSAName]> { let summary = "Declare a localparam"; let description = [{ The localparam operation produces a `localparam` declaration. See SV spec 6.20.4 p125. - ``` - %result = hw.localparam %input : t1 - ``` }]; - let arguments = (ins StrAttr:$name, HWIntegerType:$input); - let results = (outs HWIntegerType:$result); + let arguments = (ins AnyAttr:$value, StrAttr:$name); + let results = (outs HWValueType:$result); let assemblyFormat = [{ - custom(attr-dict) $input `:` type($result) + `:` type($result) custom(attr-dict) }]; } diff --git a/lib/Translation/ExportVerilog/ExportVerilog.cpp b/lib/Translation/ExportVerilog/ExportVerilog.cpp index 7368850a19..6b7d87a7ca 100644 --- a/lib/Translation/ExportVerilog/ExportVerilog.cpp +++ b/lib/Translation/ExportVerilog/ExportVerilog.cpp @@ -2860,7 +2860,7 @@ void StmtEmitter::collectNamesEmitDecls(Block &block) { if (auto localparam = dyn_cast(op)) { os << " = "; - emitExpression(localparam.input(), opsForLocation, ForceEmitMultiUse); + printParamValue(localparam.value(), op, localparam.name(), os); } // Constants carry their assignment directly in the declaration. diff --git a/test/Dialect/SV/basic.mlir b/test/Dialect/SV/basic.mlir index a04c138db1..565aaaf3ed 100644 --- a/test/Dialect/SV/basic.mlir +++ b/test/Dialect/SV/basic.mlir @@ -4,9 +4,9 @@ // CHECK-LABEL: hw.module @test1(%arg0: i1, %arg1: i1, %arg8: i8) { hw.module @test1(%arg0: i1, %arg1: i1, %arg8: i8) { - %c11_i42 = hw.constant 11: i42 - // CHECK: %param_x = sv.localparam %c11_i42 : i42 - %param_x = sv.localparam %c11_i42 : i42 + // CHECK: %param_x = sv.localparam : i42 {value = 11 : i42} + %param_x = sv.localparam : i42 {value = 11 : i42} + // This corresponds to this block of system verilog code: // always @(posedge arg0) begin diff --git a/test/ExportVerilog/sv-dialect.mlir b/test/ExportVerilog/sv-dialect.mlir index ad207f8e1e..d0c437bfb9 100644 --- a/test/ExportVerilog/sv-dialect.mlir +++ b/test/ExportVerilog/sv-dialect.mlir @@ -6,12 +6,11 @@ hw.module @M1(%clock : i1, %cond : i1, %val : i8) { %forceWire = sv.wire : !hw.inout %c11_i42 = hw.constant 11: i42 - // CHECK: localparam [41:0] param_x = 42'hB; - %param_x = sv.localparam %c11_i42 : i42 + // CHECK: localparam [41:0] param_x = 42'd11; + %param_x = sv.localparam : i42 { value = 11: i42 } - %param_tmp = comb.add %param_x, %c11_i42 : i42 - // CHECK: localparam [41:0] param_y = param_x + 42'hB; - %param_y = sv.localparam %param_tmp : i42 + // CHECK: localparam [41:0] param_y = 42'd4; + %param_y = sv.localparam : i42 { value = 4: i42 } // CHECK: always @(posedge clock) begin sv.always posedge %clock {