diff --git a/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py b/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py index e2a2f90b85a790a6d4fc7053d0e742329a7a1012..d2588c2c8eefab698ed579b1de6821bdfb915857 100644 --- a/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py +++ b/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py @@ -29,7 +29,10 @@ import os import numpy as np -from pyverilator import PyVerilator +try: + from pyverilator import PyVerilator +except ModuleNotFoundError: + PyVerilator = None from finn.core.datatype import DataType from finn.custom_op.fpgadataflow import HLSCustomOp @@ -206,6 +209,9 @@ class ConvolutionInputGenerator(HLSCustomOp): did not produce expected ofolded utput shape" context[node.output[0]] = context[node.output[0]].reshape(*exp_oshape) elif mode == "rtlsim": + if PyVerilator is None: + raise ImportError("Installation of PyVerilator is required.") + prefixed_top_name = "%s_%s" % (node.name, node.name) # check if needed file exists verilog_file = "{}/project_{}/sol1/impl/verilog/{}.v".format( diff --git a/src/finn/custom_op/fpgadataflow/streamingdatawidthconverter_batch.py b/src/finn/custom_op/fpgadataflow/streamingdatawidthconverter_batch.py index ce135e91088d2bfabe0259e1cc6873bb54884198..1d9a10804f81f4039316daac2ca74c212cbbce6e 100644 --- a/src/finn/custom_op/fpgadataflow/streamingdatawidthconverter_batch.py +++ b/src/finn/custom_op/fpgadataflow/streamingdatawidthconverter_batch.py @@ -28,7 +28,10 @@ import os import numpy as np -from pyverilator import PyVerilator +try: + from pyverilator import PyVerilator +except ModuleNotFoundError: + PyVerilator = None from finn.custom_op.fpgadataflow import HLSCustomOp from finn.core.datatype import DataType from onnx import TensorProto, helper @@ -353,6 +356,9 @@ class StreamingDataWidthConverter_Batch(HLSCustomOp): context[node.output[0]] = output elif mode == "rtlsim": + if PyVerilator is None: + raise ImportError("Installation of PyVerilator is required.") + prefixed_top_name = "%s_%s" % (node.name, node.name) # check if needed file exists verilog_file = "{}/project_{}/sol1/impl/verilog/{}.v".format( diff --git a/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py b/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py index 00b8287a312fc82425b508ffef66f5187d074617..a00402cf18f0f1798be9ba1536176a7162685d8a 100644 --- a/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py +++ b/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py @@ -32,7 +32,10 @@ import subprocess from shutil import copy import numpy as np -from pyverilator import PyVerilator +try: + from pyverilator import PyVerilator +except ModuleNotFoundError: + PyVerilator = None from onnx import TensorProto, helper from finn.core.datatype import DataType from finn.custom_op.fpgadataflow import HLSCustomOp @@ -631,6 +634,9 @@ class StreamingFCLayer_Batch(HLSCustomOp): oshape = self.get_normal_output_shape() context[node.output[0]] = context[node.output[0]].reshape(*oshape) elif mode == "rtlsim": + if PyVerilator is None: + raise ImportError("Installation of PyVerilator is required.") + # set top name depending on mem_mode mem_mode = self.get_nodeattr("mem_mode") if mem_mode == "const": diff --git a/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py b/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py index 804da50f5a2c2de7c920975de4e082851a627c4e..4f19f2cf10020b7022ea9c946f8a578ace145a30 100644 --- a/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py +++ b/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py @@ -28,7 +28,10 @@ import os import numpy as np -from pyverilator import PyVerilator +try: + from pyverilator import PyVerilator +except ModuleNotFoundError: + PyVerilator = None from finn.custom_op.fpgadataflow import HLSCustomOp from finn.custom_op.im2col import compute_conv_output_dim from finn.core.datatype import DataType @@ -301,6 +304,9 @@ class StreamingMaxPool_Batch(HLSCustomOp): did not produce expected ofolded utput shape" context[node.output[0]] = context[node.output[0]].reshape(*exp_oshape) elif mode == "rtlsim": + if PyVerilator is None: + raise ImportError("Installation of PyVerilator is required.") + prefixed_top_name = "%s_%s" % (node.name, node.name) # check if needed file exists verilog_file = "{}/project_{}/sol1/impl/verilog/{}.v".format( diff --git a/src/finn/util/fpgadataflow.py b/src/finn/util/fpgadataflow.py index 29607b002bd7d7748d450c84f816606d18fded81..a32ca4a5dbc9176466b39c7cce206969f5a4cdb0 100644 --- a/src/finn/util/fpgadataflow.py +++ b/src/finn/util/fpgadataflow.py @@ -29,7 +29,10 @@ import os import subprocess -from pyverilator import PyVerilator +try: + from pyverilator import PyVerilator +except ModuleNotFoundError: + PyVerilator = None class IPGenBuilder: @@ -69,6 +72,9 @@ class IPGenBuilder: def pyverilate_stitched_ip(model): "Given a model with stitched IP, return a PyVerilator sim object." + if PyVerilator is None: + raise ImportError("Installation of PyVerilator is required.") + vivado_stitch_proj_dir = model.get_metadata_prop("vivado_stitch_proj") with open(vivado_stitch_proj_dir + "/all_verilog_srcs.txt", "r") as f: all_verilog_srcs = f.read().split()