'Add a call edge to the function transition map.
:param int addr: Address that is being called (callee).
:param CFGNode src_node: The source CFG node (caller).
:param int ret_addr: Address that returns to (in case the function returns).
:param int function_addr: Function address..
:param bool syscall: If this is a call to a syscall or not.
:param int or str stmt_idx: Statement ID of this call.
:param int or None ins_addr: Instruction address of this call.
:return: True if the edge is added. False if any exception occurred.
:rtype: bool'

def _function_add_call_edge(self, addr, src_node, ret_addr, function_addr, syscall=False, stmt_idx=None, ins_addr=None):

    try:
        if (src_node is None):
            self.kb.functions._add_node(function_addr, addr, syscall=syscall)
        else:
            src_node = self._to_snippet(src_node)
            try:
                ret_node = self._to_snippet(self._nodes[ret_addr])
            except KeyError:
                ret_node = ret_addr
            self.kb.functions._add_call_to(function_addr, src_node, addr, ret_node, syscall=syscall, stmt_idx=stmt_idx, ins_addr=ins_addr)
        return True
    except (SimMemoryError, SimEngineError):
        return False
