diff --git a/lib/Dialect/FIRRTL/Transforms/LowerClasses.cpp b/lib/Dialect/FIRRTL/Transforms/LowerClasses.cpp index ad66f37aed4..a4d848eaae8 100644 --- a/lib/Dialect/FIRRTL/Transforms/LowerClasses.cpp +++ b/lib/Dialect/FIRRTL/Transforms/LowerClasses.cpp @@ -760,7 +760,7 @@ updateInstanceInClass(InstanceOp firrtlInstance, hw::HierPathOp hierPath, // Value as an actual parameter to the Object instance. auto propertyAssignment = getPropertyAssignment(propertyResult); assert(propertyAssignment && "properties require single assignment"); - actualParameters.push_back(propertyAssignment.getSrc()); + actualParameters.push_back(propertyAssignment.getSrcMutable().get()); // Erase the property assignment. opsToErase.push_back(propertyAssignment); diff --git a/test/Dialect/FIRRTL/lower-classes.mlir b/test/Dialect/FIRRTL/lower-classes.mlir index 678b6b61928..d7332a3a3ca 100644 --- a/test/Dialect/FIRRTL/lower-classes.mlir +++ b/test/Dialect/FIRRTL/lower-classes.mlir @@ -341,3 +341,19 @@ firrtl.circuit "ModuleWithPropertySubmodule" { firrtl.module private @SubmoduleWithProperty(in %prop: !firrtl.integer) { } } + +// CHECK-LABEL: firrtl.circuit "DownwardReferences" +firrtl.circuit "DownwardReferences" { + firrtl.class @MyClass() { + } + firrtl.module @MyClassUser(in %myClassIn: !firrtl.class<@MyClass()>) { + } + firrtl.module @DownwardReferences() { + // CHECK: [[OBJ:%.+]] = om.object @MyClass + %myClass = firrtl.object @MyClass() + // CHECK: [[BP:%.+]] = om.basepath_create + // CHECK: om.object @MyClassUser_Class([[BP]], [[OBJ]]) + %myClassUser.myClassIn = firrtl.instance myClassUser @MyClassUser(in myClassIn: !firrtl.class<@MyClass()>) + firrtl.propassign %myClassUser.myClassIn, %myClass : !firrtl.class<@MyClass()> + } +}