@@ -23,6 +23,13 @@ using llvm::MapVector;
2323
2424#define DEBUG_TYPE " lower-seq-firreg"
2525
26+ static Value buildXMRTo (OpBuilder &builder, HierPathOp path, Location loc,
27+ Type type) {
28+ auto name = path.getSymNameAttr ();
29+ auto ref = mlir::FlatSymbolRefAttr::get (name);
30+ return sv::XMRRefOp::create (builder, loc, type, ref);
31+ }
32+
2633// / Immediately before the terminator, if present. Otherwise, the block's end.
2734static Block::iterator getBlockEnd (Block *block) {
2835 if (block->mightHaveTerminator ())
@@ -370,13 +377,22 @@ void FirRegLowering::createPresetInitialization(ImplicitLocOpBuilder &builder) {
370377void FirRegLowering::createAsyncResetInitialization (
371378 ImplicitLocOpBuilder &builder) {
372379 for (auto &reset : asyncResets) {
380+ OpBuilder::InsertionGuard guard (builder);
381+
373382 // if (reset) begin
374383 // ..
375384 // end
376- sv::IfOp::create (builder, reset.first , [&] {
377- for (auto ® : reset.second )
378- sv::BPAssignOp::create (builder, reg.reg .getLoc (), reg.reg ,
385+ sv::IfOp::create (builder, reset.first , [&]() {
386+ for (auto ® : reset.second ) {
387+ OpBuilder::InsertionGuard guard (builder);
388+ buildRegConditions (builder, reg.reg );
389+ Value target = reg.reg ;
390+ if (reg.path )
391+ target = buildXMRTo (builder, reg.path , reg.reg .getLoc (),
392+ reg.reg .getType ());
393+ sv::BPAssignOp::create (builder, reg.reg .getLoc (), target,
379394 reg.asyncResetValue );
395+ }
380396 });
381397 }
382398}
@@ -798,13 +814,6 @@ void FirRegLowering::buildRegConditions(OpBuilder &b, sv::RegOp reg) {
798814 }
799815}
800816
801- static Value buildXMRTo (OpBuilder &builder, HierPathOp path, Location loc,
802- Type type) {
803- auto name = path.getSymNameAttr ();
804- auto ref = mlir::FlatSymbolRefAttr::get (name);
805- return sv::XMRRefOp::create (builder, loc, type, ref);
806- }
807-
808817void FirRegLowering::initialize (OpBuilder &builder, RegLowerInfo reg,
809818 ArrayRef<Value> rands) {
810819 auto loc = reg.reg .getLoc ();
0 commit comments