code: def fprop(self, inputs_nopad, permute=False):
      # add padding
      if self.padding == 0:
          inputs = inputs_nopad.astype(np.float32).copy()
      else:
          shp = inputs_nopad.shape
          shp = [shp[0], self.nifm]
          shp.extend(self.ifmshape_nopad)
          in_rs = inputs_nopad.reshape(shp)
          pad = self.padding
          inputs = np.zeros(
              (shp[0], self.nifm, self.ifmshape[0], self.ifmshape[1])
          )
          inputs[:, :, pad:-pad, pad:-pad] = in_rs
          inputs = (
              inputs.reshape((shp[0], -1)).astype(np.float32).copy()
          )
      self.inputs = inputs
  
      for dst in range(self.ofmsize):
          # Compute the weighted average of the receptive field
          # and store the result within the destination feature map.
          # Do this for all filters in one shot.
          rflinks = self.links[dst]
          A = inputs[:, rflinks]
          B = self.weights.T
          if permute:
              inds = np.random.permutation(A.shape[1])
              self.y[:, self.ofmlocs[dst]] = np.dot(
                  A[:, inds], B[inds, :]
              )
          else:
              self.y[:, self.ofmlocs[dst]] = np.dot(A, B)
  
imports: import itertools
  import numpy
  import pytest
  from neon import NervanaObject
  from neon.layers.layer import Convolution
  from neon.initializers.initializer import Uniform
  from utils import allclose_with_out
label_desc: Use image node_id 3 for calling the ConvLayerRef obj's underlying member method code with example usage: obj.fprop(inputs_nopad, permute) without return types