code: def updat_winograd(I, E, U, padding, minimal=False, inner=False):
      C, Y, X, N = I.shape
      K, P, Q, N = E.shape
  
      B = 2
      D = B + 2
      Yw = ceil_div(P, B)
      Xw = ceil_div(Q, B)
  
      Iw = np.empty((D, D, N, C))
      Ew = np.empty((D, D, N, K))
      if inner:
          Mw = np.empty((D, D, C, K))
          U.fill(0.0)
      else:
          Mw = np.zeros((D, D, C, K))
  
      for y in range(Yw):
          start_y, stop_y, pad_y = image_slice(y, Y, B, D, padding[0])
          start_p, stop_p, pad_p = image_slice(y, P, B, B)
  
          for x in range(Xw):
              start_x, stop_x, pad_x = image_slice(
                  x, X, B, D, padding[1]
              )
              start_q, stop_q, pad_q = image_slice(x, Q, B, B)
  
              sliceI = I[:, start_y:stop_y, start_x:stop_x, :]
              sliceE = E[:, start_p:stop_p, start_q:stop_q, :]
  
              if any(pad_y) or any(pad_x):
                  sliceI = np.pad(
                      sliceI, ((0, 0), pad_y, pad_x, (0, 0)), "constant"
                  )
  
              if any(pad_p) or any(pad_q):
                  sliceE = np.pad(
                      sliceE, ((0, 0), pad_p, pad_q, (0, 0)), "constant"
                  )
  
              for c in range(C):
                  for n in range(N):
                      trans_I_3x3_2x2(
                          Iw[:, :, n, c], sliceI[c, :, :, n], minimal
                      )
  
              # print y,x
              # print Iw[:,:,0,0].reshape((16,))
              # exit()
  
              for k in range(K):
                  for n in range(N):
                      trans_F_3x3_2x2(
                          Ew[:, :, n, k], sliceE[k, :, :, n], minimal
                      )
  
              # print Ew[:,:,0,0].reshape((16,))
  
              for s in range(D):
                  for t in range(D):
                      # [C,K] += [N,C].T . [N,K]
                      if inner:
                          Mw[s, t] = np.dot(Iw[s, t].T, Ew[s, t])
                      else:
                          Mw[s, t] += np.dot(Iw[s, t].T, Ew[s, t])
  
              # Transform can be applied in inner or outer loop
              if inner:
                  for c in range(C):
                      for k in range(K):
                          U[c, :, :, k] += trans_O_3x3_2x2(
                              Mw[:, :, c, k], minimal
                          )
  
      # outer loop transform
      if not inner:
          for c in range(C):
              for k in range(K):
                  U[c, :, :, k] = trans_O_3x3_2x2(
                      Mw[:, :, c, k], minimal
                  )
  
imports: from __future__ import division
  import numpy
  from struct import pack, unpack
  from neon import logger
label_desc: Use image node_id 17 for calling a global function with example usage: updat_winograd(I, E, U, padding, minimal, inner) without return types