@@ -513,14 +513,19 @@ struct AIEObjectFifoStatefulTransformPass
513513 void createBd (OpBuilder &builder , LockOp acqLock , int acqMode ,
514514 LockAction acqLockAction , LockOp relLock , int relMode ,
515515 MyOp buff , int offset , int len , Block *succ ,
516- BDDimLayoutArrayAttr dims ) {
516+ BDDimLayoutArrayAttr dims , BDPadLayoutArrayAttr padDimensions ) {
517517 if (acqLock)
518518 builder.create<UseLockOp >(builder.getUnknownLoc(), acqLock , acqLockAction ,
519519 acqMode);
520- if (!dims.getValue ().empty())
520+
521+ if (!dims.getValue ().empty() && padDimensions) {
522+ builder.create<DMABDOp >(builder.getUnknownLoc(), buff , offset , len , dims ,
523+ padDimensions);
524+ } else if (!dims.getValue ().empty()) {
521525 builder.create<DMABDOp >(builder.getUnknownLoc(), buff , offset , len , dims);
522- else
526+ } else {
523527 builder.create<DMABDOp >(builder.getUnknownLoc(), buff , offset , len);
528+ }
524529 if (acqLock)
525530 builder.create<UseLockOp >(builder.getUnknownLoc(), relLock ,
526531 LockAction::Release , relMode);
@@ -534,7 +539,8 @@ struct AIEObjectFifoStatefulTransformPass
534539 void createBdBlock (OpBuilder &builder , ObjectFifoCreateOp op , int lockMode ,
535540 int acqNum , int relNum , MyOp buff , int offset , int len ,
536541 DMAChannelDir channelDir , size_t blockIndex , Block *succ ,
537- BDDimLayoutArrayAttr dims ) {
542+ BDDimLayoutArrayAttr dims ,
543+ BDPadLayoutArrayAttr padDimensions ) {
538544 LockOp acqLock;
539545 LockOp relLock;
540546 int acqMode = 1 ;
@@ -559,20 +565,23 @@ struct AIEObjectFifoStatefulTransformPass
559565 }
560566 }
561567 createBd(builder , acqLock , acqMode , acqLockAction , relLock , relMode , buff ,
562- offset , len , succ , dims);
568+ offset , len , succ , dims , padDimensions );
563569 }
564570
565571 /// Function that either calls createAIETileDMA(), createShimDMA() or
566572 /// createMemTileDMA() based on op tile row value.
567573 void createDMA (DeviceOp &device , OpBuilder &builder , ObjectFifoCreateOp op ,
568574 DMAChannelDir channelDir , int channelIndex , int lockMode ,
569- BDDimLayoutArrayAttr dims ) {
575+ BDDimLayoutArrayAttr dims , BDPadLayoutArrayAttr pad_dims ) {
570576 if (op.getProducerTileOp().isShimTile()) {
571577 createShimDMA(device , builder , op , channelDir , channelIndex , lockMode ,
572578 dims);
573579 } else if (op.getProducerTileOp().isMemTile()) {
580+ BDPadLayoutArrayAttr padDims = nullptr;
581+ if (channelDir == DMAChannelDir::MM2 S && pad_dims)
582+ padDims = pad_dims;
574583 createMemTileDMA(device , builder , op , channelDir , channelIndex , lockMode ,
575- dims);
584+ dims , padDims );
576585 } else {
577586 createAIETileDMA(device , builder , op , channelDir , channelIndex , lockMode ,
578587 dims);
@@ -669,7 +678,7 @@ struct AIEObjectFifoStatefulTransformPass
669678 builder.setInsertionPointToStart(curr);
670679 createBdBlock<BufferOp >(builder , target , lockMode , acqNum , relNum ,
671680 buffersPerFifo[target ][blockIndex ], /*offset*/ 0 ,
672- len , channelDir , blockIndex , succ , dims);
681+ len , channelDir , blockIndex , succ , dims , nullptr );
673682 curr = succ;
674683 blockIndex++;
675684 }
@@ -745,7 +754,7 @@ struct AIEObjectFifoStatefulTransformPass
745754 createBdBlock<ExternalBufferOp >(builder , op , lockMode , acqNum , relNum ,
746755 externalBuffersPerFifo[op ][blockIndex ],
747756 /*offset*/ 0 , len , channelDir , blockIndex ,
748- succ , dims);
757+ succ , dims , nullptr );
749758 curr = succ;
750759 blockIndex++;
751760 }
@@ -756,7 +765,8 @@ struct AIEObjectFifoStatefulTransformPass
756765 void createMemTileDMA (DeviceOp &device , OpBuilder &builder ,
757766 ObjectFifoCreateOp op , DMAChannelDir channelDir ,
758767 int channelIndex , int lockMode ,
759- BDDimLayoutArrayAttr dims ) {
768+ BDDimLayoutArrayAttr dims ,
769+ BDPadLayoutArrayAttr padDimensions ) {
760770 size_t numBlocks = op.size();
761771 if (numBlocks == 0 )
762772 return;
@@ -898,7 +908,8 @@ struct AIEObjectFifoStatefulTransformPass
898908 offset = extraOffset;
899909 createBdBlock<BufferOp >(builder , target , lockMode , acqNum , relNum ,
900910 buffersPerFifo[target ][blockIndex ], offset ,
901- lenOut , channelDir , blockIndex , succ , dims);
911+ lenOut , channelDir , blockIndex , succ , dims ,
912+ padDimensions);
902913 curr = succ;
903914 blockIndex++;
904915 }
@@ -1361,7 +1372,6 @@ struct AIEObjectFifoStatefulTransformPass
13611372 auto consumerWireType = WireBundle::DMA;
13621373 std::set<TileOp >
13631374 objectFifoTiles; // track cores to check for loops during unrolling
1364-
13651375 //===------------------------------------------------------------------===//
13661376 // Split objectFifos into a consumer end and producer end if needed
13671377 //===------------------------------------------------------------------===//
@@ -1511,7 +1521,8 @@ struct AIEObjectFifoStatefulTransformPass
15111521 DMAChannel producerChan =
15121522 dmaAnalysis.getMasterDMAChannel(producer.getProducerTile());
15131523 createDMA(device , builder , producer , producerChan.direction ,
1514- producerChan.channel , 0 , producer.getDimensionsToStreamAttr());
1524+ producerChan.channel , 0 , producer.getDimensionsToStreamAttr(),
1525+ producer.getPadDimensionsAttr());
15151526 // generate objectFifo allocation info
15161527 builder.setInsertionPoint(&device.getBody()->back());
15171528
@@ -1529,7 +1540,7 @@ struct AIEObjectFifoStatefulTransformPass
15291540 BDDimLayoutArrayAttr consumerDims =
15301541 consumer.getDimensionsFromStreamPerConsumer()[0 ];
15311542 createDMA(device , builder , consumer , consumerChan.direction ,
1532- consumerChan.channel , 1 , consumerDims);
1543+ consumerChan.channel , 1 , consumerDims , nullptr );
15331544 // generate objectFifo allocation info
15341545 builder.setInsertionPoint(&device.getBody()->back());
15351546
0 commit comments