|
31 | 31 | import numpy as np |
32 | 32 | import os |
33 | 33 | import shutil |
| 34 | +import warnings |
34 | 35 | from copy import deepcopy |
35 | 36 | from functools import partial |
36 | 37 | from qonnx.core.modelwrapper import ModelWrapper |
|
87 | 88 | from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP |
88 | 89 | from finn.transformation.fpgadataflow.insert_dwc import InsertDWC |
89 | 90 | from finn.transformation.fpgadataflow.insert_fifo import InsertFIFO |
90 | | -from finn.transformation.fpgadataflow.make_pynq_driver import MakePYNQDriver |
| 91 | +from finn.transformation.fpgadataflow.make_driver import MakeCPPDriver, MakePYNQDriver |
91 | 92 | from finn.transformation.fpgadataflow.make_zynq_proj import ZynqBuild |
92 | 93 | from finn.transformation.fpgadataflow.minimize_accumulator_width import ( |
93 | 94 | MinimizeAccumulatorWidth, |
@@ -732,15 +733,31 @@ def step_measure_rtlsim_performance(model: ModelWrapper, cfg: DataflowBuildConfi |
732 | 733 | return model |
733 | 734 |
|
734 | 735 |
|
735 | | -def step_make_pynq_driver(model: ModelWrapper, cfg: DataflowBuildConfig): |
736 | | - """Create a PYNQ Python driver that can be used to interface the generated |
737 | | - accelerator.""" |
| 736 | +def step_make_driver(model: ModelWrapper, cfg: DataflowBuildConfig): |
| 737 | + """Create a driver that can be used to interface the generated accelerator. |
| 738 | + Use DataflowBuildConfig to select PYNQ Python or C++ driver.""" |
738 | 739 |
|
| 740 | + driver_dir = os.path.join(cfg.output_dir, "driver") |
739 | 741 | if DataflowOutputType.PYNQ_DRIVER in cfg.generate_outputs: |
740 | | - driver_dir = cfg.output_dir + "/driver" |
| 742 | + # generate PYNQ driver |
741 | 743 | model = model.transform(MakePYNQDriver(cfg._resolve_driver_platform())) |
742 | 744 | shutil.copytree(model.get_metadata_prop("pynq_driver_dir"), driver_dir, dirs_exist_ok=True) |
743 | 745 | print("PYNQ Python driver written into " + driver_dir) |
| 746 | + elif DataflowOutputType.CPP_DRIVER in cfg.generate_outputs: |
| 747 | + # generate C++ Driver |
| 748 | + model = model.transform( |
| 749 | + MakeCPPDriver( |
| 750 | + cfg._resolve_driver_platform(), |
| 751 | + version=cfg.cpp_driver_version, |
| 752 | + ) |
| 753 | + ) |
| 754 | + shutil.copytree(model.get_metadata_prop("cpp_driver_dir"), driver_dir, dirs_exist_ok=True) |
| 755 | + print("C++ driver written into " + driver_dir) |
| 756 | + else: |
| 757 | + warnings.warn( |
| 758 | + "The step step_make_driver is in the build list but will not be executed" |
| 759 | + + " since no driver is selected in generate_outputs in your build.py file!" |
| 760 | + ) |
744 | 761 | return model |
745 | 762 |
|
746 | 763 |
|
@@ -862,7 +879,7 @@ def step_deployment_package(model: ModelWrapper, cfg: DataflowBuildConfig): |
862 | 879 | "step_set_fifo_depths": step_set_fifo_depths, |
863 | 880 | "step_create_stitched_ip": step_create_stitched_ip, |
864 | 881 | "step_measure_rtlsim_performance": step_measure_rtlsim_performance, |
865 | | - "step_make_pynq_driver": step_make_pynq_driver, |
| 882 | + "step_make_driver": step_make_driver, |
866 | 883 | "step_out_of_context_synthesis": step_out_of_context_synthesis, |
867 | 884 | "step_synthesize_bitfile": step_synthesize_bitfile, |
868 | 885 | "step_deployment_package": step_deployment_package, |
|
0 commit comments