def gen_doc_html(opts, title): if not opts.list_files: build_exe_for_doc(opts) md2html = 'md2html.exe' if platform.system() == 'Windows' \ else 'md2html' doc_dir = os.path.join(opts.script_dir, '..', 'doc') full_path_md2html = os.path.join(doc_dir, md2html) if not os.path.isfile(full_path_md2html): common.myprint(opts, '{} not found'.format(md2html)) return # get all markdown files md_dir = common.get_markdown_dir(opts) html_dir = get_html_dir(opts) if not os.path.isdir(html_dir): mkdir_p(html_dir) doc_files = [] for filename in os.listdir(md_dir): name = os.path.basename(filename) if name.endswith('.md'): doc_files.append(os.path.splitext(name)[0]) if opts.list_files: ## list gen files for filename in doc_files: input_name = os.path.join(md_dir, filename + '.md') output_name = os.path.join(html_dir, filename + '.html') print(output_name) else: ## gen html files footer = get_html_footer() tmp_file = os.path.join(doc_dir, 'tmp.html') for filename in doc_files: header = get_html_header(opts, title, filename) input_name = os.path.join(md_dir, filename + '.md') output_name = os.path.join(html_dir, filename + '.html') os.system('{} "{}" "{}"'.format(full_path_md2html, input_name, tmp_file)) with common.open_utf8(opts, output_name) as fout: fout.write(header) with io.open(tmp_file, mode='r', encoding='utf-8') as fin: fout.write(fin.read()) fout.write(footer)
def gen_doc(opts): common.myprint(opts, 'Generating doc for each function') # Build tree for api.md api = dict() for _, operator in operators.items(): for c in operator.categories: if c not in api: api[c] = [operator] else: api[c].append(operator) # api.md # filename = os.path.join(opts.script_dir, '..','doc', 'markdown', 'api.md') filename = common.get_markdown_file(opts, 'api') if common.can_create_filename(opts, filename): with common.open_utf8(opts, filename) as fout: fout.write('# General API\n\n') fout.write('- [Memory function](memory.md)\n') fout.write('- [Float16 related functions](fp16.md)\n') fout.write('- [Defines provided by NSIMD](defines.md)\n') fout.write('- [NSIMD pack and related functions](pack.md)\n\n') fout.write('- [NSIMD C++20 concepts](concepts.md)\n\n') fout.write('# SIMD operators\n') for c, ops in api.items(): if len(ops) == 0: continue fout.write('\n## {}\n\n'.format(c.title)) for op in ops: Full_name = op.full_name[0].upper() + op.full_name[1:] fout.write('- [{} ({})](api_{}.md)\n'.format( Full_name, op.name, common.to_filename(op.name))) # helper to get list of function signatures def to_string(var): sigs = [var] if type(var) == str or not hasattr(var, '__iter__') \ else list(var) for i in range(0, len(sigs)): sigs[i] = re.sub('[ \n\t\r]+', ' ', sigs[i]) return '\n'.join(sigs) # Operators (one file per operator) # dirname = os.path.join(opts.script_dir, '..','doc', 'markdown') dirname = common.get_markdown_dir(opts) common.mkdir_p(dirname) for op_name, operator in operators.items(): # Skip non-matching doc if opts.match and not opts.match.match(op_name): continue # filename = os.path.join(dirname, 'api_{}.md'.format(common.to_filename( # operator.name))) filename = common.get_markdown_api_file(opts, operator.name) if not common.can_create_filename(opts, filename): continue Full_name = operator.full_name[0].upper() + operator.full_name[1:] with common.open_utf8(opts, filename) as fout: fout.write('# {}\n\n'.format(Full_name)) fout.write('## Description\n\n') fout.write(operator.desc) fout.write('\n\n## C base API (generic)\n\n') fout.write('```c\n') fout.write(to_string(operator.get_generic_signature('c_base'))) fout.write('\n```\n\n') fout.write('\n\n## C advanced API (generic, requires C11)\n\n') fout.write('```c\n') fout.write(to_string(operator.get_generic_signature('c_adv'))) fout.write('\n```\n\n') fout.write('## C++ base API (generic)\n\n') fout.write('```c++\n') fout.write(to_string(operator.get_generic_signature('cxx_base'))) fout.write('\n```\n\n') fout.write('## C++ advanced API\n\n') fout.write('```c++\n') fout.write(to_string(operator.get_generic_signature('cxx_adv'). \ values())) fout.write('\n```\n\n') fout.write('## C base API (architecture specifics)') for simd_ext in opts.simd: fout.write('\n\n### {}\n\n'.format(simd_ext.upper())) fout.write('```c\n') for typ in operator.types: fout.write(operator.get_signature(typ, 'c_base', simd_ext)) fout.write(';\n') fout.write('```') fout.write('\n\n## C++ base API (architecture specifics)') for simd_ext in opts.simd: fout.write('\n\n### {}\n\n'.format(simd_ext.upper())) fout.write('```c\n') for typ in operator.types: fout.write( operator.get_signature(typ, 'cxx_base', simd_ext)) fout.write(';\n') fout.write('```')
def gen_what_is_wrapped(opts): common.myprint(opts, 'Generating "which intrinsics are wrapped"') build_exe_for_doc(opts) wrapped = 'what_is_wrapped.exe' if platform.system() == 'Windows' \ else 'what_is_wrapped' doc_dir = os.path.join(opts.script_dir, '..', 'doc') full_path_wrapped = os.path.join(doc_dir, wrapped) if not os.path.isfile(full_path_wrapped): common.myprint(opts, '{} not found'.format(wrapped)) return # Content for indexing files created in this function index = '# Intrinsics that are wrapped\n' # Build command line cmd0 = '{} {},{},{},{},{},{}'.format(full_path_wrapped, common.in0, common.in1, common.in2, common.in3, common.in4, common.in5) # For now we only list Intel, Arm and POWERPC intrinsics simd_exts = common.x86_simds + common.arm_simds + common.ppc_simds for p in common.get_platforms(opts): index_simds = '' for simd_ext in opts.platforms_list[p].get_simd_exts(): if simd_ext not in simd_exts: continue md = os.path.join(common.get_markdown_dir(opts), 'wrapped_intrinsics_for_{}.md'.format(simd_ext)) index_simds += '- [{}](wrapped_intrinsics_for_{}.md)\n'. \ format(simd_ext.upper(), simd_ext) ops = [[], [], [], []] for op_name, operator in operators.items(): if operator.src: continue c_src = os.path.join(opts.include_dir, p, simd_ext, '{}.h'.format(op_name)) ops[operator.output_to].append('{} "{}"'. \ format(op_name, c_src)) if not common.can_create_filename(opts, md): continue with common.open_utf8(opts, md) as fout: fout.write('# Intrinsics wrapped for {}\n\n'. \ format(simd_ext.upper())) fout.write('Notations are as follows:\n' '- `T` for trick usually using other intrinsics\n' '- `E` for scalar emulation\n' '- `NOOP` for no operation\n' '- `NA` means the operator does not exist for ' 'the given type\n' '- `intrinsic` for the actual wrapped intrinsic\n' '\n') cmd = '{} {} same {} >> "{}"'.format( cmd0, simd_ext, ' '.join(ops[common.OUTPUT_TO_SAME_TYPE]), md) if os.system(cmd) != 0: common.myprint(opts, 'Unable to generate markdown for ' '"same"') continue cmd = '{} {} same_size {} >> "{}"'.format( cmd0, simd_ext, ' '.join(ops[common.OUTPUT_TO_SAME_SIZE_TYPES]), md) if os.system(cmd) != 0: common.myprint( opts, 'Unable to generate markdown for ' '"same_size"') continue cmd = '{} {} bigger_size {} >> "{}"'.format( cmd0, simd_ext, ' '.join(ops[common.OUTPUT_TO_UP_TYPES]), md) if os.system(cmd) != 0: common.myprint( opts, 'Unable to generate markdown for ' '"bigger_size"') continue cmd = '{} {} lesser_size {} >> "{}"'.format( cmd0, simd_ext, ' '.join(ops[common.OUTPUT_TO_DOWN_TYPES]), md) if os.system(cmd) != 0: common.myprint( opts, 'Unable to generate markdown for ' '"lesser_size"') continue if index_simds != '': index += '\n## Platform {}\n\n'.format(p) index += index_simds md = os.path.join(common.get_markdown_dir(opts), 'wrapped_intrinsics.md') if common.can_create_filename(opts, md): with common.open_utf8(opts, md) as fout: fout.write(index)
def gen_doc(opts): sys.stdout.write('-- Generating doc for each function\n') # Build tree for api.md api = dict() for _, operator in operators.items(): for c in operator.categories: if c not in api: api[c] = [operator] else: api[c].append(operator) # helper to construct filename for operator # def to_filename(op_name): # valid = string.ascii_letters + string.digits # ret = '' # for c in op_name: # ret += '-' if c not in valid else c # return ret # api.md # filename = os.path.join(opts.script_dir, '..','doc', 'markdown', 'api.md') filename = common.get_markdown_file(opts, 'api') if common.can_create_filename(opts, filename): with common.open_utf8(opts, filename) as fout: fout.write('# API\n') for c, ops in api.items(): if len(ops) == 0: continue fout.write('\n## {}\n\n'.format(c.title)) for op in ops: Full_name = op.full_name[0].upper() + op.full_name[1:] fout.write('- [{} ({})](api_{}.md)\n'.format( Full_name, op.name, common.to_filename(op.name))) # helper to get list of function signatures def to_string(var): sigs = [var] if type(var) == str or not hasattr(var, '__iter__') \ else list(var) for i in range(0, len(sigs)): sigs[i] = re.sub('[ \n\t\r]+', ' ', sigs[i]) return '\n'.join(sigs) # Operators (one file per operator) # dirname = os.path.join(opts.script_dir, '..','doc', 'markdown') dirname = common.get_markdown_dir(opts) common.mkdir_p(dirname) for op_name, operator in operators.items(): # Skip non-matching doc if opts.match and not opts.match.match(op_name): continue # filename = os.path.join(dirname, 'api_{}.md'.format(common.to_filename( # operator.name))) filename = common.get_markdown_api_file(opts, operator.name) if not common.can_create_filename(opts, filename): continue Full_name = operator.full_name[0].upper() + operator.full_name[1:] with common.open_utf8(opts, filename) as fout: fout.write('# {}\n\n'.format(Full_name)) fout.write('## Description\n\n') fout.write(operator.desc) fout.write('\n\n## C base API (generic)\n\n') fout.write('```c\n') fout.write(to_string(operator.get_generic_signature('c_base'))) fout.write('\n```\n\n') fout.write('## C++ base API (generic)\n\n') fout.write('```c++\n') fout.write(to_string(operator.get_generic_signature('cxx_base'))) fout.write('\n```\n\n') fout.write('## C++ advanced API\n\n') fout.write('```c++\n') fout.write(to_string(operator.get_generic_signature('cxx_adv'). \ values())) fout.write('\n```\n\n') fout.write('## C base API (architecture specifics)') for simd_ext in opts.simd: fout.write('\n\n### {}\n\n'.format(simd_ext.upper())) fout.write('```c\n') for typ in operator.types: fout.write(operator.get_signature(typ, 'c_base', simd_ext)) fout.write(';\n') fout.write('```') fout.write('\n\n## C++ base API (architecture specifics)') for simd_ext in opts.simd: fout.write('\n\n### {}\n\n'.format(simd_ext.upper())) fout.write('```c\n') for typ in operator.types: fout.write( operator.get_signature(typ, 'cxx_base', simd_ext)) fout.write(';\n') fout.write('```')