diff --git a/include/circt/Dialect/FIRRTL/FIRRTLVisitors.h b/include/circt/Dialect/FIRRTL/FIRRTLVisitors.h index 8895d5737dd6..780e8745d0ff 100644 --- a/include/circt/Dialect/FIRRTL/FIRRTLVisitors.h +++ b/include/circt/Dialect/FIRRTL/FIRRTLVisitors.h @@ -61,7 +61,7 @@ class ExprVisitor { UninferredResetCastOp, ConstCastOp, RefCastOp, mlir::UnrealizedConversionCastOp, // Property expressions. - BigIntConstantOp>([&](auto expr) -> ResultType { + StringConstantOp, BigIntConstantOp>([&](auto expr) -> ResultType { return thisCast->visitExpr(expr, args...); }) .Default([&](auto expr) -> ResultType { @@ -197,6 +197,7 @@ class ExprVisitor { HANDLE(RefCastOp, Unhandled); // Property expressions. + HANDLE(StringConstantOp, Unhandled); HANDLE(BigIntConstantOp, Unhandled); #undef HANDLE }; diff --git a/lib/Dialect/FIRRTL/Export/FIREmitter.cpp b/lib/Dialect/FIRRTL/Export/FIREmitter.cpp index 0f10c7c8572d..6061c6a63f1e 100644 --- a/lib/Dialect/FIRRTL/Export/FIREmitter.cpp +++ b/lib/Dialect/FIRRTL/Export/FIREmitter.cpp @@ -109,6 +109,7 @@ struct Emitter { void emitExpression(RefSubOp op); void emitExpression(UninferredResetCastOp op); void emitExpression(ConstCastOp op); + void emitExpression(StringConstantOp op); void emitExpression(BigIntConstantOp op); void emitPrimExpr(StringRef mnemonic, Operation *op, @@ -1010,7 +1011,8 @@ void Emitter::emitExpression(Value value) { CvtPrimOp, NegPrimOp, NotPrimOp, AndRPrimOp, OrRPrimOp, XorRPrimOp, // Miscellaneous BitsPrimOp, HeadPrimOp, TailPrimOp, PadPrimOp, MuxPrimOp, ShlPrimOp, - ShrPrimOp, UninferredResetCastOp, ConstCastOp, BigIntConstantOp, + ShrPrimOp, UninferredResetCastOp, ConstCastOp, StringConstantOp, + BigIntConstantOp, // Reference expressions RefSendOp, RefResolveOp, RefSubOp>([&](auto op) { ps.scopedBox(PP::ibox0, [&]() { emitExpression(op); }); @@ -1122,6 +1124,12 @@ void Emitter::emitExpression(BigIntConstantOp op) { ps << ")"; } +void Emitter::emitExpression(StringConstantOp op) { + ps << "String("; + ps.writeQuotedEscaped(op.getValue()); + ps << ")"; +} + void Emitter::emitExpression(ConstCastOp op) { emitExpression(op.getInput()); } void Emitter::emitPrimExpr(StringRef mnemonic, Operation *op, diff --git a/test/Dialect/FIRRTL/emit-basic.mlir b/test/Dialect/FIRRTL/emit-basic.mlir index b7e3cb1a16aa..0503d9006170 100644 --- a/test/Dialect/FIRRTL/emit-basic.mlir +++ b/test/Dialect/FIRRTL/emit-basic.mlir @@ -640,10 +640,15 @@ firrtl.circuit "Foo" { } // CHECK-LABEL: module Properties : - firrtl.module @Properties(out %out : !firrtl.bigint) { - // CHECK: propassign out, Integer(99) - %0 = firrtl.bigint 99 - firrtl.propassign %out, %0 : !firrtl.bigint + firrtl.module @Properties(out %string : !firrtl.string, + out %integer : !firrtl.bigint) { + // CHECK: propassign string, String("hello") + %0 = firrtl.string "hello" + firrtl.propassign %string, %0 : !firrtl.string + + // CHECK: propassign integer, Integer(99) + %1 = firrtl.bigint 99 + firrtl.propassign %integer, %1 : !firrtl.bigint } // Test optional group declaration and definition emission.