blob: 5ed060d1607af148a3281b310955d7dd8089d94e [file] [log] [blame] [edit]
#!/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()