code: def __call__(self, func):
      if str(func) == "Sink":
          return
      inputs = []
      outputs = []
      for v in func.inputs:
          if v.data in self.names:
              v_name = self.names[v.data]
          else:
              v_name = self.join_name(func.name + "_in")
              self.names[v.data] = v_name
          inputs.append(v_name)
          if v_name not in self.variables:
              var = self._create_variable(v.data, v_name)
              self.variables[v_name] = var
  
      for v in func.outputs:
          if v.data in self.names:
              v_name = self.names[v.data]
          else:
              v_name = self.join_name(func.name + "_out")
              self.names[v.data] = v_name
          outputs.append(v_name)
          if v_name not in self.variables:
              var = self._create_variable(v.data, v_name)
              self.variables[v_name] = var
  
      function = {
          "type": func.info.type_name,
          "inputs": inputs,
          "outputs": outputs,
          "args": func.info.args,
      }
      proto_func = nnabla_pb2.Function()
      _create_function_nntxt(proto_func, func.name, function)
      self.functions.append(proto_func)
  
file_path: nnabla/python/src/nnabla/utils/converter/nnablart/resolver.py
imports: from collections import OrderedDict
  import nnabla
  import nnabla.functions
  import numpy
  from nnabla.utils import nnabla_pb2
  from nnabla.utils.save_function import _create_function_nntxt
label_desc: Use image node_id 4 for calling the ProtoGenerator obj's underlying member method code with example usage: obj.__call__(func) without return types