docs: def convConn (self, preCellsTags, postCellsTags, connParam):
      from .. import sim
  
      ''' Generates connections between all pre and post-syn cells based on probability values'''
      if sim.cfg.verbose: print('Generating set of convergent connections (rule: %s) ...' % (connParam['label']))
             
      # get list of params that have a lambda function
      paramsStrFunc = [param for param in [p+'Func' for p in self.connStringFuncParams] if param in connParam] 
  
      # copy the vars into args immediately and work out which keys are associated with lambda functions only once per method
      funcKeys = {}
      for paramStrFunc in paramsStrFunc:
          connParam[paramStrFunc + 'Args'] = connParam[paramStrFunc + 'Vars'].copy()
          funcKeys[paramStrFunc] = [key for key in connParam[paramStrFunc + 'Vars'] if callable(connParam[paramStrFunc + 'Vars'][key])]
  
      # converted to list only once 
      preCellsTagsKeys = sorted(preCellsTags)
  
      # calculate hash for post cell gids
      hashPreCells = sim.hashList(preCellsTagsKeys)
  
      for postCellGid,postCellTags in postCellsTags.items():  # for each postsyn cell
          if postCellGid in self.gid2lid:  # check if postsyn is in this node
              convergence = connParam['convergenceFunc'][postCellGid] if 'convergenceFunc' in connParam else connParam['convergence']  # num of presyn conns / postsyn cell
              convergence = max(min(int(round(convergence)), len(preCellsTags)-1), 0)
              self.rand.Random123(hashPreCells, postCellGid, sim.cfg.seeds['conn'])  # init randomizer
              randSample = self.randUniqueInt(self.rand, convergence+1, 0, len(preCellsTags)-1)             
  
              # note: randSample[divergence] is an extra value used only if one of the random postGids coincided with the preGid 
              preCellsSample = {preCellsTagsKeys[randSample[convergence]] if preCellsTagsKeys[i]==postCellGid else preCellsTagsKeys[i]:0
                                     for i in randSample[0:convergence]}  # dict of selected gids of postsyn cells with removed post gid
              preCellsConv = {k:v for k,v in preCellsTags.items() if k in preCellsSample}  # dict of selected presyn cells tags
  
              for preCellGid, preCellTags in preCellsConv.items():  # for each presyn cell
           
                  for paramStrFunc in paramsStrFunc: # call lambda functions to get weight func args
                      # update the relevant FuncArgs dict where lambda functions are known to exist in the corresponding FuncVars dict
                      for funcKey in funcKeys[paramStrFunc]:
                          connParam[paramStrFunc + 'Args'][funcKey] = connParam[paramStrFunc+'Vars'][funcKey](preCellTags,postCellTags)
  
                  if preCellGid != postCellGid: # if not self-connection   
                      self._addCellConn(connParam, preCellGid, postCellGid)