[FIRRTL] FRT: support creating 0-valued enums (#8772)

This adds the ability to the FullResetTransform to create enumeration
values which are 0.  When the enumeration has a valid variant that is
encoded as a 0, we create this value using the FEnumCreateOp.  If there
is no valid variant with the value 0, we create a constant 0 and bitcast
it to the enumeration type.
This commit is contained in:
Andrew Young 2025-07-23 15:52:56 -07:00 committed by GitHub
parent 57a2a9aedb
commit dafbb02738
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 21 additions and 0 deletions

View File

@ -141,6 +141,21 @@ static Value createZeroValue(ImplicitLocOpBuilder &builder, FIRRTLBaseType type,
return builder.create<ConstantOp>(
type, APInt::getZero(type.getWidth().value_or(1)));
})
.Case<FEnumType>([&](auto type) -> Value {
// There might not be a variant that corresponds to 0, in which case
// we have to create a 0 value and bitcast it to the enum.
if (type.getNumElements() != 0 &&
type.getElement(0).value.getValue().isZero()) {
const auto &element = type.getElement(0);
auto value = createZeroValue(builder, element.type, cache);
return builder.create<FEnumCreateOp>(type, element.name, value);
}
auto value = builder.create<ConstantOp>(
UIntType::get(builder.getContext(), type.getBitWidth(),
/*isConst=*/true),
APInt::getZero(type.getBitWidth()));
return builder.create<BitCastOp>(type, value);
})
.Case<BundleType>([&](auto type) {
auto wireOp = builder.create<WireOp>(type);
for (unsigned i = 0, e = type.getNumElements(); i < e; ++i) {

View File

@ -495,6 +495,12 @@ firrtl.circuit "Top" {
// CHECK: firrtl.matchingconnect %10, %c0_ui8_0
// CHECK: %reg_vector = firrtl.regreset %clock, %reset, %6
%reg_vector = firrtl.reg %clock : !firrtl.clock, !firrtl.vector<uint<8>, 4>
// CHECK: [[ENUMCREATE:%[0-9]+]] = firrtl.enumcreate a(%c0_ui0) : (!firrtl.const.uint<0>) -> !firrtl.const.enum<a>
// CHECK: %reg_enum_0 = firrtl.regreset %clock, %reset, [[ENUMCREATE]] : !firrtl.clock, !firrtl.asyncreset, !firrtl.const.enum<a>, !firrtl.enum<a>
%reg_enum_0 = firrtl.reg %clock : !firrtl.clock, !firrtl.enum<a>
// CHECK: [[BITCAST:%[0-9]+]] = firrtl.bitcast %c0_ui1 : (!firrtl.const.uint<1>) -> !firrtl.const.enum<a = 1>
// CHECK: %reg_enum_1 = firrtl.regreset %clock, %reset, [[BITCAST]] : !firrtl.clock, !firrtl.asyncreset, !firrtl.const.enum<a = 1>, !firrtl.enum<a = 1>
%reg_enum_1 = firrtl.reg %clock : !firrtl.clock, !firrtl.enum<a = 1>
}
}