diff --git a/tests/scripts/.gitignore b/tests/scripts/.gitignore new file mode 100644 index 000000000..8a84f1935 --- /dev/null +++ b/tests/scripts/.gitignore @@ -0,0 +1 @@ +/plugin.so diff --git a/tests/scripts/file name.v b/tests/scripts/file name.v new file mode 100644 index 000000000..dc95c3d21 --- /dev/null +++ b/tests/scripts/file name.v @@ -0,0 +1,2 @@ +module top(); +endmodule diff --git a/tests/scripts/file name.ys b/tests/scripts/file name.ys new file mode 100644 index 000000000..41ab1c375 --- /dev/null +++ b/tests/scripts/file name.ys @@ -0,0 +1 @@ +log Hello! diff --git a/tests/scripts/plugin.cc b/tests/scripts/plugin.cc new file mode 100644 index 000000000..b06fee189 --- /dev/null +++ b/tests/scripts/plugin.cc @@ -0,0 +1,57 @@ +#include "kernel/yosys.h" + +USING_YOSYS_NAMESPACE +PRIVATE_NAMESPACE_BEGIN + +struct TestArgsPass : public Pass { + TestArgsPass() : Pass("test_args", "dummy pass to test arg parsing") { + internal(); + } + void execute(std::vector args, RTLIL::Design*) override { + int argidx; + for (argidx = 0; argidx < GetSize(args); argidx++) + { + log("%s\n", args[argidx]); + } + } +} TestArgsPass; + +struct TestArgsFrontend : public Frontend { + TestArgsFrontend() : Frontend("test_args", "dummy frontend to test arg parsing") { + internal(); + } + void execute(std::istream *&f, std::string filename, std::vector args, RTLIL::Design *) override { + int argidx; + log("pass: %s\n", args[0]); + for (argidx = 1; argidx < GetSize(args); argidx++) { + if (args[argidx] == "-arg" && argidx+1 < GetSize(args)) { + log("arg: %s\n", args[++argidx]); + continue; + } + break; + } + extra_args(f, filename, args, argidx); + log("filename: %s\n", filename); + } +} TestArgsFrontend; + +struct TestArgsBackend : public Backend { + TestArgsBackend() : Backend("test_args", "dummy backend to test arg parsing") { + internal(); + } + void execute(std::ostream *&f, std::string filename, std::vector args, RTLIL::Design *) override { + int argidx; + log("pass: %s\n", args[0]); + for (argidx = 1; argidx < GetSize(args); argidx++) { + if (args[argidx] == "-arg" && argidx+1 < GetSize(args)) { + log("arg: %s\n", args[++argidx]); + continue; + } + break; + } + extra_args(f, filename, args, argidx); + log("filename: %s\n", filename); + } +} TestArgsBackend; + +PRIVATE_NAMESPACE_END diff --git a/tests/scripts/run-test.sh b/tests/scripts/run-test.sh new file mode 100755 index 000000000..70b282a9a --- /dev/null +++ b/tests/scripts/run-test.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -eu +source ../gen-tests-makefile.sh +generate_mk --bash diff --git a/tests/scripts/space_in_name.sh b/tests/scripts/space_in_name.sh new file mode 100755 index 000000000..01954d0ae --- /dev/null +++ b/tests/scripts/space_in_name.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +set -eu + +yosys="$PWD/../../yosys" + +# these ones are fine because bash handles it +$yosys "file name.ys" +$yosys file\ name.ys + +$yosys "file name.v" -o "file name.out" -b verilog +$yosys file\ name.v -o file\ name.out -b verilog + +# these already have special handling in Yosys thanks to `extra_args` +$yosys -p 'read_verilog "file name.v"' +$yosys -p 'write_verilog "file name.out"' + +# this one isn't a normal frontend so doesn't +# $yosys -p 'script "file name.ys"' + +# these get split by space and treated as two separate filenames +# $yosys -p script\ "file name.ys" +# $yosys -p script\ file\ name.ys +# $yosys -p read_verilog\ "file name.v" +# $yosys -p read_verilog\ file\ name.v +# $yosys -p write_verilog\ file\ name.out +# $yosys -p write_verilog\ "file name.out" + +# what does test_args say +rm -f plugin.so +CXXFLAGS=$(../../yosys-config --cxxflags) +DATDIR=$(../../yosys-config --datdir) +DATDIR=${DATDIR//\//\\\/} +CXXFLAGS=${CXXFLAGS//$DATDIR/..\/..\/share} +../../yosys-config --exec --cxx ${CXXFLAGS} --ldflags -shared -o plugin.so plugin.cc +yosys_plugin="$yosys -m ./plugin.so" + +$yosys_plugin -p test_args\ "quoted spaces" +$yosys_plugin -p test_args\ escaped\ spaces +$yosys_plugin -p test_args\ \"escaped\ quotes\" +$yosys_plugin -p 'test_args "inner quotes"' +$yosys_plugin -p 'test_args "inner \"escaped quotes\""' + +$yosys_plugin -p 'read_test_args "file name.v" "file name.ys"' +$yosys_plugin -p 'write_test_args "file name.out"' + +# and as a script +$yosys_plugin space_in_name.ys diff --git a/tests/scripts/space_in_name.ys b/tests/scripts/space_in_name.ys new file mode 100755 index 000000000..cc4f0e4e2 --- /dev/null +++ b/tests/scripts/space_in_name.ys @@ -0,0 +1,14 @@ +echo on + +# pass +test_args "quoted spaces" +test_args escaped\ spaces +test_args \"escaped quotes\" +test_args "inner \"escaped quotes\"" +test_args -opt "some value here" -b "some other \"escaped value\"" + +# frontend/backend +read_test_args -arg "inner \"escaped quotes\"" "file name.v" "file name.ys" +write_test_args -arg "inner \"escaped quotes\"" "file name.out" +read_test_args -arg no_quotes plugin.cc +write_test_args -arg no_quotes