According to the docs torch.mul does an elementwise multiplication. I’m not sure what the * operation does. So let’s test it…
import torch
import numpy as np

a = torch.randn((2, 100, 100))
b = torch.randn((2, 100, 100))

assert np.all(a * b == torch.mul(a, b))

Your implementation seems good to me, except for the extra underscore in the line…
super(_iLayer, self).__init__()