def gen_library_src(  # noqa: C901
    sorted_graph: List[Tensor],
    max_blob_size: int,
    max_constant_blob_size: int,
    workspace: Workspace,
    workdir: str,
    output_tensors: List[Tensor],
    model_name: str = "",
    debug_settings: AITDebugSettings = _DEBUG_SETTINGS,
    additional_unbound_constants: Optional[List[Tensor]] = None,
) -> List[Tuple[str, str]]:
    """Generate model driver source code files for the given graph

    Parameters
    ----------
    sorted_graph : List[Tensor]
        The network after running toposort transformation
    max_blob_size : int
        Total memory for input/output tensor and intermediate results,
        calculated by memory planning transformation
    workspace : Workspace
        Workspace sizes, computed by memory planning
    workdir : str
        Target directory for generated C++ source code files
    model_name : str, optional
        Sub working directory in the workdir for the given model, by default ""
    debug_settings : AITDebugSettings
        specify debug settings such as where to dump AITemplate model Python file, etc.

    Returns
    -------
    List[Tuple[str, str]]
        List of tuple (source file path, object file path)
    """

    def to_obj_name(name: str):
        name, _ = os.path.splitext(name)
        return f"{name}.obj"

    prefix = os.path.join(workdir, model_name)
    constants_fname = os.path.join(prefix, "constants.bin")
    constants_data_file = open(constants_fname, "wb")

    model_container_generator = ModelContainerGenerator(
        max_blob_size,
        max_constant_blob_size,
        workspace,
        constants_data_file,
        sorted_graph,
        output_tensors,
        additional_unbound_constants=additional_unbound_constants,
        debug_settings=debug_settings,
        model_dir=prefix,
    )
    model_container_generator.append_all_tensors()
    constants_data_file.close()

    files = model_container_generator.generate_source()
    to_build = [(constants_fname, to_obj_name(constants_fname))]
    for fname, contents in files.items():
        fname_full = os.path.join(prefix, fname)
        with open(fname_full, "w") as fo:
            fo.write(contents)
        if not fname_full.endswith(".h"):
            to_build.append((fname_full, to_obj_name(fname_full)))

    # Copy over static csrc/headers
    sources = model_container_generator.target.copy_headers_and_csrc_to_workdir(prefix)
    for fname in sources:
        to_build.append((fname, to_obj_name(fname)))

    _LOGGER.info(f"generated {len(to_build)} library srcs")
    return to_build
Generate model driver source code files for the given graph

Parameters
----------
sorted_graph : List[Tensor]
The network after running toposort transformation
max_blob_size : int
Total memory for input/output tensor and intermediate results,
calculated by memory planning transformation
workspace : Workspace
Workspace sizes, computed by memory planning
workdir : str
Target directory for generated C++ source code files
model_name : str, optional
Sub working directory in the workdir for the given model, by default ""
debug_settings : AITDebugSettings
specify debug settings such as where to dump AITemplate model Python file, etc.

Returns
-------
List[Tuple[str, str]]
List of tuple (source file path, object file path)
python/aitemplate/backend/codegen.py