code: def _addr(self):
          
          group_by = self._config['address_group_by']
  
          assert not self._flags['address'], "{} address already assigned".format(self._name)
          assert group_by in ('element', 'variable')
  
          m0 = self.system.dae.m
          n0 = self.system.dae.n
          mend = m0 + len(self._algebs) * self.n
          nend = n0 + len(self._states) * self.n
  
          if group_by == 'variable':
              for idx, item in enumerate(self._algebs):
                  self.__dict__[item] = list(
                      range(m0 + idx * self.n, m0 + (idx + 1) * self.n))
              for idx, item in enumerate(self._states):
                  self.__dict__[item] = list(
                      range(n0 + idx * self.n, n0 + (idx + 1) * self.n))
          elif group_by == 'element':
              for idx, item in enumerate(self._algebs):
                  self.__dict__[item] = list(
                      range(m0 + idx, mend, len(self._algebs)))
              for idx, item in enumerate(self._states):
                  self.__dict__[item] = list(
                      range(n0 + idx, nend, len(self._states)))
  
          self.system.dae.m = mend
          self.system.dae.n = nend
  
          self._flags['address'] = True
docs: Assign dae addresses for algebraic and state variables.
  
          Addresses are stored in ``self.__dict__[var]``.
          ``dae.m`` and ``dae.n`` are updated accordingly.
  
          Returns
          -------
          None