diff --git a/lib/Conversion/MooreToCore/MooreToCore.cpp b/lib/Conversion/MooreToCore/MooreToCore.cpp index 12858f01d097..9b2c8e7b6317 100644 --- a/lib/Conversion/MooreToCore/MooreToCore.cpp +++ b/lib/Conversion/MooreToCore/MooreToCore.cpp @@ -320,18 +320,18 @@ struct VariableOpConversion : public OpConversionPattern { ConversionPatternRewriter &rewriter) const override { Location loc = op.getLoc(); Type resultType = typeConverter->convertType(op.getResult().getType()); - Value init = adaptor.getInitial(); - // TODO: Unsupport x/z, so the initial value is 0. - if (!init && cast(op.getResult().getType()).getDomain() == - Domain::FourValued) - return failure(); + // Determine the initial value of the signal. + Value init = adaptor.getInitial(); if (!init) { Type elementType = cast(resultType).getElementType(); int64_t width = hw::getBitWidth(elementType); if (width == -1) return failure(); + // TODO: Once the core dialects support four-valued integers, this code + // will additionally need to generate an all-X value for four-valued + // variables. Value constZero = rewriter.create(loc, APInt(width, 0)); init = rewriter.createOrFold(loc, elementType, constZero); } diff --git a/test/Conversion/MooreToCore/basic.mlir b/test/Conversion/MooreToCore/basic.mlir index af4b6b96628c..71c4c45039b4 100644 --- a/test/Conversion/MooreToCore/basic.mlir +++ b/test/Conversion/MooreToCore/basic.mlir @@ -353,6 +353,9 @@ moore.module @Variable() { %1 = moore.constant 1 : l1 // CHECK: llhd.sig "l" %true : i1 %l = moore.variable %1 : + // CHECK: [[TMP:%.+]] = hw.constant 0 : i19 + // CHECK: llhd.sig "m" [[TMP]] : i19 + %m = moore.variable : // CHECK: [[TMP2:%.+]] = hw.constant 10 : i32 %3 = moore.constant 10 : i32