diff --git a/src/finn/transformation/fpgadataflow/make_pynq_driver.py b/src/finn/transformation/fpgadataflow/make_pynq_driver.py
index 6fa8eb87102400ef9768a9af727caa78ec463169..bfa2fdbf9594c52d9a3a2376312a929b9008c9ea 100644
--- a/src/finn/transformation/fpgadataflow/make_pynq_driver.py
+++ b/src/finn/transformation/fpgadataflow/make_pynq_driver.py
@@ -147,7 +147,7 @@ class MakePYNQDriver(Transformation):
             ishape_normal.append(i_tensor_shape_normal)
             ishape_folded.append(i_tensor_shape_folded)
             ishape_packed.append(i_tensor_shape_packed)
-            idma_names.append("idma%d" % idma_ind)
+            idma_names.append(getCustomOp(i_consumer).get_nodeattr("instance_name"))
 
         odt = []
         odma_names = []
@@ -194,7 +194,7 @@ class MakePYNQDriver(Transformation):
             oshape_normal.append(o_tensor_shape_normal)
             oshape_folded.append(o_tensor_shape_folded)
             oshape_packed.append(o_tensor_shape_packed)
-            odma_names.append("odma%d" % odma_ind)
+            odma_names.append(getCustomOp(o_producer).get_nodeattr("instance_name"))
 
         # generate external weights npy files
         weights_dir = pynq_driver_dir + "/runtime_weights"
@@ -208,19 +208,31 @@ class MakePYNQDriver(Transformation):
                 node.op_type == "StreamingDataflowPartition"
             ), "CreateDataflowPartition needs to be applied before driver generation"
 
-            producer = model.find_producer(node.input[0])
-            init_tensor = model.get_initializer(node.input[0])
+            if len(node.input) > 0:
+                producer = model.find_producer(node.input[0])
+                init_tensor = model.get_initializer(node.input[0])
+            else:
+                producer = None
+                init_tensor = None
 
             if producer is None:  # input dma?
-                idma_name = "idma" + str(idma_idx)
-                if init_tensor is not None:  # input weights dma?
+                sdp_inst = getCustomOp(node)
+                idma_name = sdp_inst.get_nodeattr("instance_name")
+                df_model = ModelWrapper(sdp_inst.get_nodeattr("model"))
+                assert df_model.graph.node[0].op_type == "IODMA"
+                iodma_node = getCustomOp(df_model.graph.node[0])
+                if iodma_node.get_nodeattr("burstMode") == "wrap":  # input weights dma?
+                    init_tensor = df_model.get_initializer(
+                        iodma_node.onnx_node.input[0]
+                    )
                     ext_weight_dma_cnt += 1
-                    w_dtype = model.get_tensor_datatype(node.input[0])
+                    w_dtype = df_model.get_tensor_datatype(
+                        iodma_node.onnx_node.input[0]
+                    )
                     init_external_tensor = to_external_tensor(init_tensor, w_dtype)
                     np.save(
                         weights_dir + "/" + idma_name + ".npy", init_external_tensor
                     )
-
                 idma_idx += 1
 
         # fill in the driver template