| #!/usr/bin/env python3 | 
 | # -*- coding: utf-8 -*- | 
 | # | 
 | # Copyright (C) 2020  The Symbiflow Authors. | 
 | # | 
 | # Use of this source code is governed by a ISC-style | 
 | # license that can be found in the LICENSE file or at | 
 | # https://opensource.org/licenses/ISC | 
 | # | 
 | # SPDX-License-Identifier: ISC | 
 | """Generates sources for the Ibex example and copies them to the example build directory""" | 
 | import argparse | 
 | import tempfile | 
 | import os.path | 
 | import subprocess | 
 | import shutil | 
 | import sys | 
 |  | 
 |  | 
 | def patch_ibex(current_dir, ibex_tmp_dir, f_log): | 
 |     """ Patch ibex sources. """ | 
 |  | 
 |     # TODO: Remove the need for ibex.patch | 
 |     with open(os.path.join(current_dir, 'ibex.patch')) as f_patch: | 
 |         subprocess.check_call( | 
 |             "patch -p1", | 
 |             stdin=f_patch, | 
 |             stdout=f_log, | 
 |             stderr=f_log, | 
 |             shell=True, | 
 |             cwd=ibex_tmp_dir | 
 |         ) | 
 |  | 
 |  | 
 | def run_fusesoc(ibex_tmp_dir, soc, part, f_log): | 
 |     """ Invoke fusesoc to generate sources. """ | 
 |  | 
 |     subprocess.check_call( | 
 |         ( | 
 |             'python3 -mfusesoc.main --cores-root={ibex_tmp_dir} run ' + | 
 |             '--target=synth --setup {soc} --part {part}' | 
 |         ).format(ibex_tmp_dir=ibex_tmp_dir, soc=soc, part=part), | 
 |         stdout=f_log, | 
 |         stderr=f_log, | 
 |         shell=True, | 
 |         cwd=ibex_tmp_dir | 
 |     ) | 
 |  | 
 |  | 
 | def get_fusesoc_sources(root_dir, eda_yaml_path, f_log): | 
 |     """ Get list of sources in fusesoc output. """ | 
 |  | 
 |     if not os.path.exists(eda_yaml_path): | 
 |         print('ERROR: Wrong path to EDA YAML file!', file=f_log) | 
 |         print( | 
 |             'Check if the main lowrisc_ibex_top_artya7_x version is still valid!', | 
 |             file=f_log | 
 |         ) | 
 |         sys.exit(1) | 
 |  | 
 |     get_sources_invocation = 'python3 "{get_source_path}" "{eda_yaml_path}"'.format( | 
 |         get_source_path=os.path.join( | 
 |             root_dir, 'utils', 'fusesoc_get_sources.py' | 
 |         ), | 
 |         eda_yaml_path=eda_yaml_path | 
 |     ) | 
 |  | 
 |     return list( | 
 |         s.decode() for s in | 
 |         subprocess.check_output(get_sources_invocation, shell=True).split() | 
 |     ) | 
 |  | 
 |  | 
 | def copy_fusesoc_sources_to_build_dir( | 
 |         ibex_tmp_dir, fusesoc_sources, ibex_test_build_dir, f_log | 
 | ): | 
 |     """ Copy fusesoc sources from ibex_tmp_dir to the build dir. """ | 
 |  | 
 |     for root, _, files in os.walk(os.path.join(ibex_tmp_dir, 'build')): | 
 |         for f in files: | 
 |             if f in fusesoc_sources: | 
 |                 shutil.copy(os.path.join(root, f), ibex_test_build_dir) | 
 |                 print("Copying {} ... ".format(f), file=f_log) | 
 |  | 
 |  | 
 | def print_log_file(log_file, file=sys.stdout): | 
 |     with open(log_file) as f_log: | 
 |         for line in f_log: | 
 |             print(line.strip(), file=file) | 
 |  | 
 |  | 
 | def main(): | 
 |     parser = argparse.ArgumentParser(description=__doc__) | 
 |     parser.add_argument('--only-deps', action='store_true') | 
 |     parser.add_argument('--root_source_dir', required=True) | 
 |     parser.add_argument('--current_binary_dir', required=True) | 
 |  | 
 |     args = parser.parse_args() | 
 |  | 
 |     current_dir = os.path.dirname(__file__) | 
 |     root_dir = args.root_source_dir | 
 |     ibex_dir = os.path.join(args.root_source_dir, 'third_party', 'ibex') | 
 |     ibex_test_build_dir = args.current_binary_dir | 
 |     log_file = os.path.join(ibex_test_build_dir, 'generate.log') | 
 |  | 
 |     try: | 
 |         with tempfile.TemporaryDirectory() as tmp_dir, open(log_file, | 
 |                                                             'w') as f_log: | 
 |             ibex_tmp_dir = os.path.join(tmp_dir, 'ibex') | 
 |  | 
 |             shutil.copytree(ibex_dir, ibex_tmp_dir) | 
 |             patch_ibex(current_dir, ibex_tmp_dir, f_log) | 
 |  | 
 |             soc = 'lowrisc:ibex:top_artya7' | 
 |             part = 'xc7a35ticsg324-1L' | 
 |             run_fusesoc(ibex_tmp_dir, soc, part, f_log) | 
 |  | 
 |             eda_yaml_path = os.path.join( | 
 |                 ibex_tmp_dir, 'build', 'lowrisc_ibex_top_artya7_0.1', | 
 |                 'synth-vivado', 'lowrisc_ibex_top_artya7_0.1.eda.yml' | 
 |             ) | 
 |             fusesoc_sources = get_fusesoc_sources( | 
 |                 root_dir, eda_yaml_path, f_log | 
 |             ) | 
 |  | 
 |             if args.only_deps: | 
 |                 for source in fusesoc_sources: | 
 |                     print(source) | 
 |             else: | 
 |                 copy_fusesoc_sources_to_build_dir( | 
 |                     ibex_tmp_dir, fusesoc_sources, ibex_test_build_dir, f_log | 
 |                 ) | 
 |  | 
 |         if not args.only_deps: | 
 |             print_log_file(log_file) | 
 |     except Exception: | 
 |         print_log_file(log_file, file=sys.stderr) | 
 |         raise | 
 |  | 
 |  | 
 | if __name__ == "__main__": | 
 |     main() |