From dda33ff16045f681aa14731d3d72f8513be443cd Mon Sep 17 00:00:00 2001 From: Yaman Umuroglu <maltanar@gmail.com> Date: Fri, 25 Sep 2020 00:19:05 +0200 Subject: [PATCH] [Refactor] fix resource paths --- src/finn/custom_op/fpgadataflow/__init__.py | 2 +- .../data/cifar10/cifar10-test-data-class3.npz | Bin 3316 -> 0 bytes src/finn/data/cpp/npy2apintstream.hpp | 70 ------ .../finn-hls-model/finn-hls-onnx-model.onnx | 207 ------------------ .../tfc_w1_a1_after_conv_to_hls.onnx | Bin 250099 -> 0 bytes src/finn/util/test.py | 6 +- tests/brevitas/test_brevitas_cnv.py | 2 +- tests/brevitas/test_brevitas_debug.py | 2 +- tests/brevitas/test_brevitas_fc.py | 2 +- .../test_convert_to_hls_layers_cnv.py | 2 +- .../test_convert_to_hls_layers_fc.py | 4 +- .../test_create_dataflow_partition.py | 2 +- .../streamline/test_streamline_cnv.py | 2 +- .../streamline/test_streamline_fc.py | 2 +- .../test_batchnorm_to_affine.py | 4 +- tests/transformation/test_conv_lowering.py | 2 +- tests/transformation/test_fold_constants.py | 6 +- tests/transformation/test_sign_to_thres.py | 2 +- tests/transformation/test_topk_insert.py | 2 +- tests/util/test_data_packing.py | 2 +- 20 files changed, 23 insertions(+), 298 deletions(-) delete mode 100644 src/finn/data/cifar10/cifar10-test-data-class3.npz delete mode 100644 src/finn/data/cpp/npy2apintstream.hpp delete mode 100644 src/finn/data/onnx/finn-hls-model/finn-hls-onnx-model.onnx delete mode 100644 src/finn/data/onnx/finn-hls-model/tfc_w1_a1_after_conv_to_hls.onnx diff --git a/src/finn/custom_op/fpgadataflow/__init__.py b/src/finn/custom_op/fpgadataflow/__init__.py index df03a036f..a3b6a8ff6 100644 --- a/src/finn/custom_op/fpgadataflow/__init__.py +++ b/src/finn/custom_op/fpgadataflow/__init__.py @@ -325,7 +325,7 @@ class HLSCustomOp(CustomOp): builder = CppBuilder() # to enable additional debug features please uncommand the next line # builder.append_includes("-DDEBUG") - builder.append_includes("-I/workspace/finn/src/finn/data/cpp") + builder.append_includes("-I/workspace/finn/src/finn/qnn-data/cpp") builder.append_includes("-I/workspace/cnpy/") builder.append_includes("-I/workspace/finn-hlslib") builder.append_includes("-I{}/include".format(os.environ["VIVADO_PATH"])) diff --git a/src/finn/data/cifar10/cifar10-test-data-class3.npz b/src/finn/data/cifar10/cifar10-test-data-class3.npz deleted file mode 100644 index 697d53830465fd26030b6e66444b42061b29392e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3316 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 diff --git a/src/finn/data/cpp/npy2apintstream.hpp b/src/finn/data/cpp/npy2apintstream.hpp deleted file mode 100644 index f3afbc5bf..000000000 --- a/src/finn/data/cpp/npy2apintstream.hpp +++ /dev/null @@ -1,70 +0,0 @@ -#include <iostream> -#include "cnpy.h" -#include "hls_stream.h" -#include "ap_int.h" -#include <vector> - -#ifdef DEBUG -#define DEBUG_NPY2APINTSTREAM(x) std::cout << "[npy2apintstream] " << x << std::endl; -#define DEBUG_APINTSTREAM2NPY(x) std::cout << "[apintstream2npy] " << x << std::endl; -#else -#define DEBUG_NPY2APINTSTREAM(x) ; -#define DEBUG_APINTSTREAM2NPY(x) ; -#endif - -template <typename PackedT, typename ElemT, int ElemBits, typename NpyT> -void npy2apintstream(const char * npy_path, hls::stream<PackedT> & out_stream, bool reverse_inner = true, size_t numReps = 1) { - for(size_t rep = 0; rep < numReps; rep++) { - cnpy::NpyArray arr = cnpy::npy_load(npy_path); - DEBUG_NPY2APINTSTREAM("word_size " << arr.word_size << " num_vals " << arr.num_vals) - if(arr.word_size != sizeof(NpyT)) { - throw "Npy array word size and specified NpyT size do not match"; - } - NpyT* loaded_data = arr.data<NpyT>(); - size_t outer_dim_elems = 1; - for(size_t dim = 0; dim < arr.shape.size()-1; dim++) { - outer_dim_elems *= arr.shape[dim]; - } - size_t inner_dim_elems = arr.shape[arr.shape.size()-1]; - DEBUG_NPY2APINTSTREAM("n_outer " << outer_dim_elems << " n_inner " << inner_dim_elems) - for(size_t outer_elem = 0; outer_elem < outer_dim_elems; outer_elem++) { - PackedT packed_elem = 0; - for(size_t ii = 0; ii < inner_dim_elems; ii++) { - size_t i = reverse_inner ? inner_dim_elems-ii-1 : ii; - NpyT loaded_elem_npyt = *loaded_data; - ElemT loaded_elem = (ElemT) loaded_elem_npyt; - DEBUG_NPY2APINTSTREAM("NpyT " << loaded_elem_npyt << " elem " << loaded_elem) - packed_elem((i+1)*ElemBits-1, i*ElemBits) = loaded_elem; - loaded_data++; - } - DEBUG_NPY2APINTSTREAM("packed hls elem " << std::hex << packed_elem << std::dec) - out_stream << packed_elem; - } - } -} - -template <typename PackedT, typename ElemT, int ElemBits, typename NpyT> -void apintstream2npy(hls::stream<PackedT> & in_stream, const std::vector<size_t> & shape, const char * npy_path, bool reverse_inner = true, size_t numReps = 1) { - for(size_t rep = 0; rep < numReps; rep++) { - std::vector<NpyT> data_to_save; - size_t outer_dim_elems = 1; - for(size_t dim = 0; dim < shape.size()-1; dim++) { - outer_dim_elems *= shape[dim]; - } - size_t inner_dim_elems = shape[shape.size()-1]; - DEBUG_APINTSTREAM2NPY("n_outer " << outer_dim_elems << " n_inner " << inner_dim_elems) - for(size_t outer_elem = 0; outer_elem < outer_dim_elems; outer_elem++) { - PackedT packed_elem; - in_stream >> packed_elem; - DEBUG_APINTSTREAM2NPY("packed hls elem " << std::hex << packed_elem << std::dec) - for(size_t ii = 0; ii < inner_dim_elems; ii++) { - size_t i = reverse_inner ? inner_dim_elems-ii-1 : ii; - ElemT elem = packed_elem((i+1)*ElemBits-1, i*ElemBits); - NpyT npyt = (NpyT) elem; - DEBUG_APINTSTREAM2NPY("elem " << elem << " NpyT " << npyt) - data_to_save.push_back(npyt); - } - } - cnpy::npy_save(npy_path, &data_to_save[0], shape, "w"); - } -} diff --git a/src/finn/data/onnx/finn-hls-model/finn-hls-onnx-model.onnx b/src/finn/data/onnx/finn-hls-model/finn-hls-onnx-model.onnx deleted file mode 100644 index c2db9153f..000000000 --- a/src/finn/data/onnx/finn-hls-model/finn-hls-onnx-model.onnx +++ /dev/null @@ -1,207 +0,0 @@ -finn-hls-onnx-model:º -R -inp memInStrm memInStrm"FIFO* -backend"fpgadataflow * -depth€ :finn -Ò - memInStrm -weights0 -thresh0out1"StreamingFCLayer_Batch* - -MH€ * - -MWÀ * -PE * -SIMD@ * -backend"fpgadataflow *! -resDataType"Recast<XnorMul> * -resType"ap_resource_lut() :finn -L -out1inter0inter0"FIFO* -backend"fpgadataflow * -depth :finn -Ï -inter0 -weights1 -thresh1out2"StreamingFCLayer_Batch* - -MH€ * - -MW€ * -PE@ * -SIMD * -backend"fpgadataflow *! -resDataType"Recast<XnorMul> * -resType"ap_resource_lut() :finn -L -out2inter1inter1"FIFO* -backend"fpgadataflow * -depth :finn -Ï -inter1 -weights2 -thresh2out3"StreamingFCLayer_Batch* - -MH€ * - -MW€ * -PE * -SIMD@ * -backend"fpgadataflow *! -resDataType"Recast<XnorMul> * -resType"ap_resource_lut() :finn -L -out3inter2inter2"FIFO* -backend"fpgadataflow * -depth :finn -Î -inter2 -weights3 -thresh3out4"StreamingFCLayer_Batch* -MH@ * - -MW€ * -PE * -SIMD * -backend"fpgadataflow *! -resDataType"Recast<XnorMul> * -resType"ap_resource_lut() :finn -O -out4outp -memOutStrm"FIFO* -backend"fpgadataflow * -depth€ :finnfinn_hls_onnx_graphZ -inp - - - -@b -outp - - - -@j - memInStrm - - - -@j -weights0 - -@ - - j% -thresh0 - - - - - -j -out1 - - - - j -inter0 - - - - j -weights1 - - -@ -€j% -thresh1 - - -@ - - -j -out2 - - - -@j -inter1 - - - -@j -weights2 - -@ - -€j% -thresh2 - - - - - -j -out3 - - - - j -inter2 - - - - j -weights3 - - - -€j% -thresh3 - - - - - -j -out4 - - - -@r -inp - finn_datatypeBIPOLARr -outp - finn_datatypeBIPOLARr% - memInStrm - finn_datatypeBIPOLARr$ -weights0 - finn_datatypeBIPOLARr# -thresh0 - finn_datatypeBIPOLARr -out1 - finn_datatypeBIPOLARr" -inter0 - finn_datatypeBIPOLARr$ -weights1 - finn_datatypeBIPOLARr# -thresh1 - finn_datatypeBIPOLARr -out2 - finn_datatypeBIPOLARr" -inter1 - finn_datatypeBIPOLARr$ -weights2 - finn_datatypeBIPOLARr# -thresh2 - finn_datatypeBIPOLARr -out3 - finn_datatypeBIPOLARr" -inter2 - finn_datatypeBIPOLARr$ -weights3 - finn_datatypeBIPOLARr# -thresh3 - finn_datatypeBIPOLARr -out4 - finn_datatypeBIPOLARB \ No newline at end of file diff --git a/src/finn/data/onnx/finn-hls-model/tfc_w1_a1_after_conv_to_hls.onnx b/src/finn/data/onnx/finn-hls-model/tfc_w1_a1_after_conv_to_hls.onnx deleted file mode 100644 index aada6f07e9d3910122d2eb357d8a8c1224e9fbab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250099 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 diff --git a/src/finn/util/test.py b/src/finn/util/test.py index 32c6a0a3a..132b700a2 100644 --- a/src/finn/util/test.py +++ b/src/finn/util/test.py @@ -139,11 +139,13 @@ def get_example_input(topology): "Get example numpy input tensor for given topology." if "fc" in topology: - raw_i = get_data("finn", "data/onnx/mnist-conv/test_data_set_0/input_0.pb") + raw_i = get_data("finn.base-data", "onnx/mnist-conv/test_data_set_0/input_0.pb") onnx_tensor = onnx.load_tensor_from_string(raw_i) return nph.to_array(onnx_tensor) elif topology == "cnv": - fn = pk.resource_filename("finn", "data/cifar10/cifar10-test-data-class3.npz") + fn = pk.resource_filename( + "finn.qnn-data", "cifar10/cifar10-test-data-class3.npz" + ) input_tensor = np.load(fn)["arr_0"].astype(np.float32) return input_tensor else: diff --git a/tests/brevitas/test_brevitas_cnv.py b/tests/brevitas/test_brevitas_cnv.py index 120c67646..4b072535b 100644 --- a/tests/brevitas/test_brevitas_cnv.py +++ b/tests/brevitas/test_brevitas_cnv.py @@ -58,7 +58,7 @@ def test_brevitas_cnv_export_exec(wbits, abits): model = model.transform(RemoveStaticGraphInputs()) assert len(model.graph.input) == 1 assert len(model.graph.output) == 1 - fn = pk.resource_filename("finn", "data/cifar10/cifar10-test-data-class3.npz") + fn = pk.resource_filename("finn.qnn-data", "cifar10/cifar10-test-data-class3.npz") input_tensor = np.load(fn)["arr_0"].astype(np.float32) input_tensor = input_tensor / 255 assert input_tensor.shape == (1, 3, 32, 32) diff --git a/tests/brevitas/test_brevitas_debug.py b/tests/brevitas/test_brevitas_debug.py index 50d0ca44c..2ebaa2519 100644 --- a/tests/brevitas/test_brevitas_debug.py +++ b/tests/brevitas/test_brevitas_debug.py @@ -55,7 +55,7 @@ def test_brevitas_debug(): assert len(model.graph.input) == 1 assert len(model.graph.output) == 1 # load one of the test vectors - raw_i = get_data("finn", "data/onnx/mnist-conv/test_data_set_0/input_0.pb") + raw_i = get_data("finn.base-data", "onnx/mnist-conv/test_data_set_0/input_0.pb") input_tensor = onnx.load_tensor_from_string(raw_i) # run using FINN-based execution input_dict = {"0": nph.to_array(input_tensor)} diff --git a/tests/brevitas/test_brevitas_fc.py b/tests/brevitas/test_brevitas_fc.py index 9369b2538..8397aaceb 100644 --- a/tests/brevitas/test_brevitas_fc.py +++ b/tests/brevitas/test_brevitas_fc.py @@ -68,7 +68,7 @@ def test_brevitas_fc_onnx_export_and_exec(size, wbits, abits): assert len(model.graph.input) == 1 assert len(model.graph.output) == 1 # load one of the test vectors - raw_i = get_data("finn", "data/onnx/mnist-conv/test_data_set_0/input_0.pb") + raw_i = get_data("finn.base-data", "onnx/mnist-conv/test_data_set_0/input_0.pb") input_tensor = onnx.load_tensor_from_string(raw_i) # run using FINN-based execution input_dict = {"0": nph.to_array(input_tensor)} diff --git a/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py b/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py index e8b50efef..20751a587 100644 --- a/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py +++ b/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py @@ -73,7 +73,7 @@ def test_convert_to_hls_layers_cnv_w1a1(fused_activation): model = model.transform(InferDataLayouts()) # model.save("golden.onnx") # load one of the test vectors - fn = pk.resource_filename("finn", "data/cifar10/cifar10-test-data-class3.npz") + fn = pk.resource_filename("finn.qnn-data", "cifar10/cifar10-test-data-class3.npz") input_tensor = np.load(fn)["arr_0"].astype(np.float32) input_tensor = input_tensor / 255 assert input_tensor.shape == (1, 3, 32, 32) diff --git a/tests/fpgadataflow/test_convert_to_hls_layers_fc.py b/tests/fpgadataflow/test_convert_to_hls_layers_fc.py index bd600c6c5..252ea05fb 100644 --- a/tests/fpgadataflow/test_convert_to_hls_layers_fc.py +++ b/tests/fpgadataflow/test_convert_to_hls_layers_fc.py @@ -110,7 +110,7 @@ def test_convert_to_hls_layers_tfc_w1a1(): model = model.transform(CompileCppSim()) model = model.transform(SetExecMode("cppsim")) - raw_i = get_data("finn", "data/onnx/mnist-conv/test_data_set_0/input_0.pb") + raw_i = get_data("finn.base-data", "onnx/mnist-conv/test_data_set_0/input_0.pb") input_tensor = onnx.load_tensor_from_string(raw_i) # run using FINN-based execution input_dict = {"global_in": nph.to_array(input_tensor)} @@ -175,7 +175,7 @@ def test_convert_to_hls_layers_tfc_w1a2(): model = model.transform(PrepareCppSim()) model = model.transform(CompileCppSim()) model = model.transform(SetExecMode("cppsim")) - raw_i = get_data("finn", "data/onnx/mnist-conv/test_data_set_0/input_0.pb") + raw_i = get_data("finn.base-data", "onnx/mnist-conv/test_data_set_0/input_0.pb") input_tensor = onnx.load_tensor_from_string(raw_i) # run using FINN-based execution input_dict = {"global_in": nph.to_array(input_tensor)} diff --git a/tests/fpgadataflow/test_create_dataflow_partition.py b/tests/fpgadataflow/test_create_dataflow_partition.py index c4f748051..6732b92ae 100644 --- a/tests/fpgadataflow/test_create_dataflow_partition.py +++ b/tests/fpgadataflow/test_create_dataflow_partition.py @@ -45,7 +45,7 @@ build_dir = make_build_dir("test_dataflow_partition_") def test_dataflow_partition_create(): # load the onnx model raw_m = get_data( - "finn", "data/onnx/finn-hls-model/tfc_w1_a1_after_conv_to_hls.onnx" + "finn.qnn-data", "onnx/finn-hls-model/tfc_w1_a1_after_conv_to_hls.onnx" ) model = ModelWrapper(raw_m) model = model.transform(CreateDataflowPartition()) diff --git a/tests/transformation/streamline/test_streamline_cnv.py b/tests/transformation/streamline/test_streamline_cnv.py index 82a38636e..ca8cf3b1c 100644 --- a/tests/transformation/streamline/test_streamline_cnv.py +++ b/tests/transformation/streamline/test_streamline_cnv.py @@ -67,7 +67,7 @@ def test_streamline_cnv(size, wbits, abits): model = model.transform(GiveReadableTensorNames()) model = model.transform(RemoveStaticGraphInputs()) # load one of the test vectors - fn = pk.resource_filename("finn", "data/cifar10/cifar10-test-data-class3.npz") + fn = pk.resource_filename("finn.qnn-data", "cifar10/cifar10-test-data-class3.npz") input_tensor = np.load(fn)["arr_0"].astype(np.float32) input_tensor = input_tensor / 255 assert input_tensor.shape == (1, 3, 32, 32) diff --git a/tests/transformation/streamline/test_streamline_fc.py b/tests/transformation/streamline/test_streamline_fc.py index 9ce98066c..008ea6f1b 100644 --- a/tests/transformation/streamline/test_streamline_fc.py +++ b/tests/transformation/streamline/test_streamline_fc.py @@ -72,7 +72,7 @@ def test_streamline_fc(size, wbits, abits): model = model.transform(GiveReadableTensorNames()) model = model.transform(RemoveStaticGraphInputs()) # load one of the test vectors - raw_i = get_data("finn", "data/onnx/mnist-conv/test_data_set_0/input_0.pb") + raw_i = get_data("finn.base-data", "onnx/mnist-conv/test_data_set_0/input_0.pb") input_tensor = onnx.load_tensor_from_string(raw_i) # run using FINN-based execution input_dict = {"global_in": nph.to_array(input_tensor)} diff --git a/tests/transformation/test_batchnorm_to_affine.py b/tests/transformation/test_batchnorm_to_affine.py index a3df5ae9b..6cb6e35eb 100644 --- a/tests/transformation/test_batchnorm_to_affine.py +++ b/tests/transformation/test_batchnorm_to_affine.py @@ -51,7 +51,7 @@ def test_batchnorm_to_affine_cnv_w1a1(): model = ModelWrapper(export_onnx_path) model = model.transform(InferShapes()) model = model.transform(FoldConstants()) - fn = pk.resource_filename("finn", "data/cifar10/cifar10-test-data-class3.npz") + fn = pk.resource_filename("finn.qnn-data", "cifar10/cifar10-test-data-class3.npz") input_tensor = np.load(fn)["arr_0"].astype(np.float32) input_tensor = input_tensor / 255 assert input_tensor.shape == (1, 3, 32, 32) @@ -77,7 +77,7 @@ def test_batchnorm_to_affine_lfc_w1a1(): model = model.transform(FoldConstants()) new_model = model.transform(BatchNormToAffine()) # load one of the test vectors - raw_i = get_data("finn", "data/onnx/mnist-conv/test_data_set_0/input_0.pb") + raw_i = get_data("finn.base-data", "onnx/mnist-conv/test_data_set_0/input_0.pb") input_tensor = onnx.load_tensor_from_string(raw_i) input_dict = {"0": nph.to_array(input_tensor)} assert oxe.compare_execution(model, new_model, input_dict) diff --git a/tests/transformation/test_conv_lowering.py b/tests/transformation/test_conv_lowering.py index b6ab634b3..9cfc45d0b 100644 --- a/tests/transformation/test_conv_lowering.py +++ b/tests/transformation/test_conv_lowering.py @@ -54,7 +54,7 @@ def test_conv_lowering_cnv_w1a1(): model = ModelWrapper(export_onnx_path) model = model.transform(InferShapes()) model = model.transform(FoldConstants()) - fn = pk.resource_filename("finn", "data/cifar10/cifar10-test-data-class3.npz") + fn = pk.resource_filename("finn.qnn-data", "cifar10/cifar10-test-data-class3.npz") input_tensor = np.load(fn)["arr_0"].astype(np.float32) input_tensor = input_tensor / 255 assert input_tensor.shape == (1, 3, 32, 32) diff --git a/tests/transformation/test_fold_constants.py b/tests/transformation/test_fold_constants.py index a976ffd62..34d7d8016 100644 --- a/tests/transformation/test_fold_constants.py +++ b/tests/transformation/test_fold_constants.py @@ -44,12 +44,12 @@ export_onnx_path = "test_fold_constants.onnx" def test_const_folding(): - raw_m = get_data("finn", "data/onnx/mnist-conv/model.onnx") + raw_m = get_data("finn.base-data", "onnx/mnist-conv/model.onnx") model = ModelWrapper(raw_m) model = model.transform(InferShapes()) model = model.transform(FoldConstants()) - raw_i = get_data("finn", "data/onnx/mnist-conv/test_data_set_0/input_0.pb") - raw_o = get_data("finn", "data/onnx/mnist-conv/test_data_set_0/output_0.pb") + raw_i = get_data("finn.base-data", "onnx/mnist-conv/test_data_set_0/input_0.pb") + raw_o = get_data("finn.base-data", "onnx/mnist-conv/test_data_set_0/output_0.pb") input_tensor = onnx.load_tensor_from_string(raw_i) output_tensor = onnx.load_tensor_from_string(raw_o) input_dict = {"Input3": np_helper.to_array(input_tensor)} diff --git a/tests/transformation/test_sign_to_thres.py b/tests/transformation/test_sign_to_thres.py index a92f839e5..aecaf0cca 100644 --- a/tests/transformation/test_sign_to_thres.py +++ b/tests/transformation/test_sign_to_thres.py @@ -52,7 +52,7 @@ def test_sign_to_thres(): new_model = model.transform(ConvertSignToThres()) assert new_model.graph.node[3].op_type == "MultiThreshold" # load one of the test vectors - raw_i = get_data("finn", "data/onnx/mnist-conv/test_data_set_0/input_0.pb") + raw_i = get_data("finn.base-data", "onnx/mnist-conv/test_data_set_0/input_0.pb") input_tensor = onnx.load_tensor_from_string(raw_i) input_dict = {"0": nph.to_array(input_tensor)} assert oxe.compare_execution(model, new_model, input_dict) diff --git a/tests/transformation/test_topk_insert.py b/tests/transformation/test_topk_insert.py index a9faac4df..bed9372db 100644 --- a/tests/transformation/test_topk_insert.py +++ b/tests/transformation/test_topk_insert.py @@ -36,7 +36,7 @@ def test_topk_insert(k): # verification: generate random input, run through net, streamline, # run again, check that output is top-k - raw_i = get_data("finn", "data/onnx/mnist-conv/test_data_set_0/input_0.pb") + raw_i = get_data("finn.base-data", "onnx/mnist-conv/test_data_set_0/input_0.pb") input_tensor = onnx.load_tensor_from_string(raw_i) input_brevitas = torch.from_numpy(nph.to_array(input_tensor)).float() output_golden = tfc.forward(input_brevitas).detach().numpy() diff --git a/tests/util/test_data_packing.py b/tests/util/test_data_packing.py index 7b77c4be2..f96ce276e 100644 --- a/tests/util/test_data_packing.py +++ b/tests/util/test_data_packing.py @@ -95,7 +95,7 @@ def test_npy2apintstream(test_shape, dtype): f.write("\n".join(test_app_string)) cmd_compile = """ g++ -o test_npy2apintstream test.cpp /workspace/cnpy/cnpy.cpp \ --I/workspace/cnpy/ -I{}/include -I/workspace/finn/src/finn/data/cpp \ +-I/workspace/cnpy/ -I{}/include -I/workspace/finn/src/finn/qnn-data/cpp \ --std=c++11 -lz""".format( os.environ["VIVADO_PATH"] ) -- GitLab