diff --git a/.github/workflows/quicktest-dev-pr.yml b/.github/workflows/quicktest-dev-pr.yml new file mode 100644 index 0000000000000000000000000000000000000000..cd59a629405c748187cdf478c0bdb0694c58c79f --- /dev/null +++ b/.github/workflows/quicktest-dev-pr.yml @@ -0,0 +1,21 @@ +name: QuicktestPRAgainstDev + +on: + pull_request: + branches: [ dev ] + push: + branches: [ dev ] + + +jobs: + + test: + name: Run quicktest on PR branch + runs-on: ubuntu-latest + + steps: + - name: checkout + uses: actions/checkout@v2 + + - name: DockerRunQuicktest + run: sh run-docker.sh quicktest diff --git a/run-docker.sh b/run-docker.sh index e1f17e728204217ff3caa6e486b2daae16d6d271..186efc322a8f437be0371b5a142a9dd524d1abf3 100755 --- a/run-docker.sh +++ b/run-docker.sh @@ -96,6 +96,8 @@ gecho "Port-forwarding for Netron $NETRON_PORT:$NETRON_PORT" gecho "Vivado IP cache dir is at $VIVADO_IP_CACHE" gecho "Using default PYNQ board $PYNQ_BOARD" +DOCKER_INTERACTIVE = "" + if [ "$1" = "test" ]; then gecho "Running test suite (all tests)" DOCKER_CMD="python setup.py test" @@ -108,6 +110,7 @@ elif [ "$1" = "notebook" ]; then else gecho "Running container only" DOCKER_CMD="bash" + DOCKER_INTERACTIVE="-it" fi # Build the FINN Docker image @@ -123,7 +126,7 @@ docker build -f docker/Dockerfile.finn_dev --tag=$DOCKER_TAG \ # Launch container with current directory mounted # important to pass the --init flag here for correct Vivado operation, see: # https://stackoverflow.com/questions/55733058/vivado-synthesis-hangs-in-docker-container-spawned-by-jenkins -docker run -t --rm --name $DOCKER_INST_NAME -it --init \ +docker run -t --rm --name $DOCKER_INST_NAME $DOCKER_INTERACTIVE --init \ --hostname $DOCKER_INST_NAME \ -e "XILINX_VIVADO=$VIVADO_PATH" \ -e "SHELL=/bin/bash" \ diff --git a/src/finn/custom_op/fpgadataflow/__init__.py b/src/finn/custom_op/fpgadataflow/__init__.py index a99d62fd18a958d37fef6b3e1939ef97e859b0b2..c77fd81c0bfaa77b458368807410b8bfec17abb7 100644 --- a/src/finn/custom_op/fpgadataflow/__init__.py +++ b/src/finn/custom_op/fpgadataflow/__init__.py @@ -109,6 +109,31 @@ class HLSCustomOp(CustomOp): ) return verilog_file + def get_all_verilog_paths(self): + "Return list of all folders containing Verilog code for this node." + + code_gen_dir = self.get_nodeattr("code_gen_dir_ipgen") + assert ( + code_gen_dir != "" + ), """Node attribute "code_gen_dir_ipgen" is + not set. Please run HLSSynthIP first.""" + verilog_path = "{}/project_{}/sol1/impl/verilog/".format( + code_gen_dir, self.onnx_node.name + ) + # default impl only returns the HLS verilog codegen dir + return [verilog_path] + + def get_all_verilog_filenames(self): + "Return list of all Verilog files used for this node." + + verilog_files = [] + verilog_paths = self.get_all_verilog_paths() + for verilog_path in verilog_paths: + for f in os.listdir(verilog_path): + if f.endswith(".v"): + verilog_files += [f] + return verilog_files + def prepare_rtlsim(self): """Creates a Verilator emulation library for the RTL code generated for this node, sets the rtlsim_so attribute to its path and returns @@ -116,24 +141,15 @@ class HLSCustomOp(CustomOp): if PyVerilator is None: raise ImportError("Installation of PyVerilator is required.") - # ensure that code is generated - code_gen_dir = self.get_nodeattr("code_gen_dir_ipgen") - assert ( - code_gen_dir != "" - ), """Node attribute "code_gen_dir_ipgen" is - not set. Please run HLSSynthIP first.""" - verilog_file = self.get_verilog_top_filename() - assert os.path.isfile(verilog_file), "Cannot find top-level Verilog file." + verilog_paths = self.get_all_verilog_paths() + verilog_files = self.get_all_verilog_filenames() # build the Verilator emu library sim = PyVerilator.build( - verilog_file, + verilog_files, build_dir=make_build_dir("pyverilator_" + self.onnx_node.name + "_"), - verilog_path=[ - "{}/project_{}/sol1/impl/verilog/".format( - code_gen_dir, self.onnx_node.name - ) - ], + verilog_path=verilog_paths, trace_depth=get_rtlsim_trace_depth(), + top_module_name=self.get_verilog_top_module_name(), ) # save generated lib filename in attribute self.set_nodeattr("rtlsim_so", sim.lib._name) diff --git a/src/finn/util/fpgadataflow.py b/src/finn/util/fpgadataflow.py index 9a2708439c0fed1e25c0d955af21cd2e9e705446..7b66d092107c27decca68926a0667333bebedbe0 100644 --- a/src/finn/util/fpgadataflow.py +++ b/src/finn/util/fpgadataflow.py @@ -83,14 +83,27 @@ def pyverilate_stitched_ip(model): def file_to_dir(x): return os.path.dirname(os.path.realpath(x)) + def file_to_basename(x): + return os.path.basename(os.path.realpath(x)) + all_verilog_dirs = list(map(file_to_dir, all_verilog_srcs)) - top_verilog = model.get_metadata_prop("wrapper_filename") + all_verilog_files = list( + set( + filter( + lambda x: x.endswith(".v"), + list(map(file_to_basename, all_verilog_srcs)), + ) + ) + ) + top_module_name = model.get_metadata_prop("wrapper_filename") + top_module_name = file_to_basename(top_module_name).strip(".v") build_dir = make_build_dir("pyverilator_ipstitched_") sim = PyVerilator.build( - top_verilog, + all_verilog_files, verilog_path=all_verilog_dirs, build_dir=build_dir, trace_depth=get_rtlsim_trace_depth(), + top_module_name=top_module_name, ) return sim