Compare commits
71 Commits
3ebc07bfc8
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
961a2f02c5
|
|||
|
e3be326c42
|
|||
|
1d1ed3581a
|
|||
|
b9ff08db16
|
|||
|
59736fb576
|
|||
|
b10233439f
|
|||
|
4ba417ebdf
|
|||
|
b344c55eee
|
|||
|
797c9512b4
|
|||
|
08c2e9c13d
|
|||
|
30daa8a00c
|
|||
|
b0cb01a7e4
|
|||
|
4b0a4b175b
|
|||
|
f999b01538
|
|||
|
7dec717e03
|
|||
|
f14d4f8d36
|
|||
|
6f3d11128c
|
|||
|
47f3132859
|
|||
|
93d911a09e
|
|||
|
170a4487c1
|
|||
|
c4bcae753b
|
|||
|
8fc755372f
|
|||
|
6042b2a145
|
|||
|
7a3a23b4d6
|
|||
|
454a85043f
|
|||
|
c5c5172f65
|
|||
|
a07cd4913c
|
|||
|
b6355a67f3
|
|||
|
7284849684
|
|||
|
bd6df6b4e9
|
|||
|
9c42618028
|
|||
|
78733403f5
|
|||
|
b1821cabd6
|
|||
|
ac6297643f
|
|||
|
c57ae5fced
|
|||
|
05a4aa18e4
|
|||
|
d7548a19ab
|
|||
|
d1c618443c
|
|||
|
25e10511e1
|
|||
|
ebaf128d92
|
|||
|
d0166f32a6
|
|||
|
a77d0782bf
|
|||
|
928719db7c
|
|||
|
dd87df37c1
|
|||
|
2c43e630f0
|
|||
|
0cb829ccf4
|
|||
|
4bd3a9d7a4
|
|||
|
ca6801edd6
|
|||
|
1e3dfa2504
|
|||
|
30f09a276f
|
|||
|
7846a2f3b6
|
|||
|
8f5e6f35b4
|
|||
|
8ac7cf8a70
|
|||
|
5c874f4cbc
|
|||
|
635a625e7c
|
|||
|
b61ee93a3e
|
|||
|
e6d2e736ff
|
|||
|
a0ac7fa7e9
|
|||
|
612aad911b
|
|||
|
ddbd6fa8d1
|
|||
|
99e8c80dc7
|
|||
|
54ec5ef63e
|
|||
|
494e06bcb1
|
|||
|
67a36aa7f8
|
|||
|
31e8f9d093
|
|||
|
156ce50116
|
|||
|
34d89b23fa
|
|||
|
eefabbd043
|
|||
|
beadbae5bf
|
|||
|
40b8ba078a
|
|||
|
e0624a10f7
|
9
.gitmodules
vendored
Normal file
9
.gitmodules
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
[submodule "fail/src"]
|
||||
path = fail/src
|
||||
url = git@gitos.rrze.fau.de:wasm-hardening/fail.git
|
||||
[submodule "wamr"]
|
||||
path = wamr
|
||||
url = ssh://git@gitea.local.chriphost.de:222/christoph/wamr.git
|
||||
[submodule "tacle-converter"]
|
||||
path = tacle-converter
|
||||
url = https://gitos.rrze.fau.de/i4/openaccess/tacle-bench-wasm-converter
|
||||
72
.vscode/launch.json
vendored
Normal file
72
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,72 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "AOT Linux sum0_base",
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"program": "/home/christoph/Notes/TU/MastersThesis/FailNix/injections/2026-05-11T19:19:39_sum0_base-linux-aot/system.elf",
|
||||
"args": [],
|
||||
"cwd": "/home/christoph/Notes/TU/MastersThesis/FailNix/injections/2026-05-11T19:19:39_sum0_base-linux-aot",
|
||||
"initCommands": [
|
||||
"settings set target.x86-disassembly-flavor intel",
|
||||
"breakpoint set -b main",
|
||||
"breakpoint set -b fail_start_trace",
|
||||
"breakpoint set -b fail_stop_trace",
|
||||
"breakpoint set -b fail_marker_positive",
|
||||
"breakpoint set -b fail_marker_negative",
|
||||
"breakpoint set -b invokeNative_Void",
|
||||
],
|
||||
"sourceMap": {
|
||||
"/build/source/core": "/home/christoph/Notes/TU/MastersThesis/05 WAMR/core",
|
||||
"/home/christoph/Notes/TU/MastersThesis/FailNix/build-sum0_base": "/home/christoph/Notes/TU/MastersThesis/FailNix/injections/2026-05-11T19:19:39_sum0_base-linux-aot",
|
||||
},
|
||||
},
|
||||
{
|
||||
"name": "AOT Fail sum0_base (QEMU)",
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "Launch QEMU (sum0_base fail-aot)",
|
||||
"initCommands": ["settings set target.x86-disassembly-flavor intel"],
|
||||
"processCreateCommands": ["gdb-remote localhost:9000", "continue"],
|
||||
"targetCreateCommands": [
|
||||
"target create /home/christoph/Notes/TU/MastersThesis/FailNix/injections/2026-04-27T21-42-42_sum0_base-fail-aot/system.elf",
|
||||
],
|
||||
"preRunCommands": [
|
||||
"breakpoint set -b os_main",
|
||||
"breakpoint set -b fail_start_trace",
|
||||
"breakpoint set -b fail_stop_trace",
|
||||
"breakpoint set -b fail_marker_positive",
|
||||
"breakpoint set -b fail_marker_negative",
|
||||
"breakpoint set -b invokeNative_Void",
|
||||
],
|
||||
"sourceMap": {
|
||||
"/build/source/core": "/home/christoph/Notes/TU/MastersThesis/05 WAMR/core",
|
||||
"/home/christoph/Notes/TU/MastersThesis/FailNix/build-sum0_base": "/home/christoph/Notes/TU/MastersThesis/FailNix/injections/2026-04-27T21-42-42_sum0_base-fail-aot",
|
||||
},
|
||||
},
|
||||
{
|
||||
"name": "fail-x86-tracing-dbg",
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"program": "/nix/store/z3cyzvdz8pbxccp9jyxgp57ccjjppi1j-fail-1.0.0/bin/fail-x86-tracing",
|
||||
"args": [
|
||||
"-q", "-f", "./bochs.rc",
|
||||
"-Wf,--start-symbol=fail_start_trace",
|
||||
"-Wf,--save-symbol=fail_start_trace",
|
||||
"-Wf,--end-symbol=fail_stop_trace",
|
||||
"-Wf,--state-file=./state",
|
||||
"-Wf,--trace-file=./trace.pb",
|
||||
"-Wf,--elf-file=./system.elf",
|
||||
],
|
||||
"cwd": "/home/christoph/Notes/TU/MastersThesis/FailNix/injections/2026-05-17T23-00-56_sum0_base-fail-aot",
|
||||
"initCommands": [
|
||||
"settings set target.x86-disassembly-flavor intel",
|
||||
"breakpoint set -n GenericTracing::run()",
|
||||
],
|
||||
"sourceMap": {
|
||||
"/home/fail/work": "/home/christoph/Notes/TU/MastersThesis/FailNix/fail/src",
|
||||
},
|
||||
}
|
||||
],
|
||||
}
|
||||
25
.vscode/tasks.json
vendored
Normal file
25
.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "Launch QEMU (sum0_base fail-aot)",
|
||||
"type": "shell",
|
||||
"command": "qemu-system-i386 -drive file=system.iso,media=cdrom -boot d -m 32 -S -gdb tcp::9000",
|
||||
"options": {
|
||||
"cwd": "/home/christoph/Notes/TU/MastersThesis/FailNix/injections/2026-04-27T21-42-42_sum0_base-fail-aot",
|
||||
},
|
||||
"isBackground": true,
|
||||
"problemMatcher": {
|
||||
"pattern": {
|
||||
"regexp": "^(.*)$",
|
||||
"message": 1,
|
||||
},
|
||||
"background": {
|
||||
"activeOnStart": true,
|
||||
"beginsPattern": ".",
|
||||
"endsPattern": "^NEVER_MATCH$",
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
BIN
fail/bin/fail-x86-tracing
(Stored with Git LFS)
BIN
fail/bin/fail-x86-tracing
(Stored with Git LFS)
Binary file not shown.
BIN
fail/bin/generic-experiment-client
(Stored with Git LFS)
BIN
fail/bin/generic-experiment-client
(Stored with Git LFS)
Binary file not shown.
BIN
fail/bin/generic-experiment-server
(Stored with Git LFS)
BIN
fail/bin/generic-experiment-server
(Stored with Git LFS)
Binary file not shown.
BIN
fail/bin/import-trace
(Stored with Git LFS)
BIN
fail/bin/import-trace
(Stored with Git LFS)
Binary file not shown.
BIN
fail/bin/prune-trace
(Stored with Git LFS)
BIN
fail/bin/prune-trace
(Stored with Git LFS)
Binary file not shown.
1
fail/src
Submodule
1
fail/src
Submodule
Submodule fail/src added at dda6da2a50
822
flake.nix
822
flake.nix
@ -12,529 +12,387 @@ rec {
|
||||
flake-utils,
|
||||
}:
|
||||
# Create a shell (and possibly package) for each possible system, not only x86_64-linux
|
||||
flake-utils.lib.eachDefaultSystem (system: let
|
||||
# =========================================================================================
|
||||
# Define pkgs/stdenvs
|
||||
# =========================================================================================
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
config.allowUnfree = true;
|
||||
overlays = [];
|
||||
};
|
||||
|
||||
i386_pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
config.allowUnfree = true;
|
||||
overlays = [];
|
||||
|
||||
# Build crosscompiler
|
||||
crossSystem = {
|
||||
config = "i386-elf";
|
||||
libc = "newlib";
|
||||
};
|
||||
};
|
||||
|
||||
boost_pkgs =
|
||||
import (builtins.fetchTarball {
|
||||
url = "https://github.com/NixOS/nixpkgs/archive/824421b1796332ad1bcb35bc7855da832c43305f.tar.gz";
|
||||
sha256 = "sha256:1w6cjnakz1yi66rs8c6nmhymsr7bj82vs2hz200ipi1sfiq8dy4y";
|
||||
}) {
|
||||
flake-utils.lib.eachDefaultSystem (
|
||||
system: let
|
||||
# =========================================================================================
|
||||
# Define pkgs/stdenvs
|
||||
# =========================================================================================
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
config.allowUnfree = true;
|
||||
overlays = [];
|
||||
};
|
||||
|
||||
libdwarf_pkgs =
|
||||
import (builtins.fetchTarball {
|
||||
url = "https://github.com/NixOS/nixpkgs/archive/f597e7e9fcf37d8ed14a12835ede0a7d362314bd.tar.gz";
|
||||
sha256 = "sha256:1l79hh7jh7m8yc5mvc8dbg6s8rf30bgm994kf07xriqbzwfn158r";
|
||||
}) {
|
||||
i386_pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
config.allowUnfree = true;
|
||||
overlays = [];
|
||||
|
||||
# Build crosscompiler
|
||||
crossSystem = {
|
||||
config = "i386-elf";
|
||||
libc = "newlib";
|
||||
};
|
||||
};
|
||||
|
||||
inherit (pkgs) lib stdenv;
|
||||
boost_pkgs =
|
||||
import
|
||||
(builtins.fetchTarball {
|
||||
url = "https://github.com/NixOS/nixpkgs/archive/824421b1796332ad1bcb35bc7855da832c43305f.tar.gz";
|
||||
sha256 = "sha256:1w6cjnakz1yi66rs8c6nmhymsr7bj82vs2hz200ipi1sfiq8dy4y";
|
||||
})
|
||||
{
|
||||
inherit system;
|
||||
};
|
||||
|
||||
# =========================================================================================
|
||||
# Define shell environment
|
||||
# =========================================================================================
|
||||
libdwarf_pkgs =
|
||||
import
|
||||
(builtins.fetchTarball {
|
||||
url = "https://github.com/NixOS/nixpkgs/archive/f597e7e9fcf37d8ed14a12835ede0a7d362314bd.tar.gz";
|
||||
sha256 = "sha256:1l79hh7jh7m8yc5mvc8dbg6s8rf30bgm994kf07xriqbzwfn158r";
|
||||
})
|
||||
{
|
||||
inherit system;
|
||||
};
|
||||
|
||||
# Setup the shell when entering the "nix develop" environment (bash script).
|
||||
shellHook = let
|
||||
mkCmakeScript = type: let
|
||||
typeLower = lib.toLower type;
|
||||
in
|
||||
pkgs.writers.writeFish "cmake-${typeLower}.fish" ''
|
||||
cd $FLAKE_PROJECT_ROOT
|
||||
inherit (pkgs) lib stdenv;
|
||||
|
||||
echo "Removing build directory ./cmake-build-${typeLower}/"
|
||||
rm -rf ./cmake-build-${typeLower}
|
||||
# =========================================================================================
|
||||
# Define shell environment
|
||||
# =========================================================================================
|
||||
|
||||
echo "Creating build directory"
|
||||
mkdir cmake-build-${typeLower}
|
||||
cd cmake-build-${typeLower}
|
||||
# Setup the shell when entering the "nix develop" environment (bash script).
|
||||
shellHook = let
|
||||
# Add project-local fish abbrs here
|
||||
abbrs = {
|
||||
fail = "perl ./scripts/menu.pl";
|
||||
|
||||
echo "Running cmake"
|
||||
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE="${type}" -DCMAKE_EXPORT_COMPILE_COMMANDS="On" ..
|
||||
# C/C++:
|
||||
# cmake-debug = "${cmakeDebug}";
|
||||
# cmake-release = "${cmakeRelease}";
|
||||
# build-debug = "${buildDebug}";
|
||||
# build-release = "${buildRelease}";
|
||||
};
|
||||
|
||||
echo "Linking compile_commands.json"
|
||||
cd ..
|
||||
ln -sf ./cmake-build-${typeLower}/compile_commands.json ./compile_commands.json
|
||||
eraseAbbr = name: value: "abbr --erase ${name} 2>/dev/null";
|
||||
createAbbr = name: value: ''abbr -a ${name} "${value}"'';
|
||||
|
||||
# This will be sourced by the global fish config if INIT_PROJECT_SHELL gets unset
|
||||
unloadProjectShell = pkgs.writers.writeFish "unload-shell.fish" ''
|
||||
echo "Unloading \"${description}\" environment..."
|
||||
|
||||
${builtins.concatStringsSep "\n" (lib.mapAttrsToList eraseAbbr abbrs)}
|
||||
'';
|
||||
|
||||
cmakeDebug = mkCmakeScript "Debug";
|
||||
cmakeRelease = mkCmakeScript "Release";
|
||||
# This will be sourced by the global fish config if INIT_PROJECT_SHELL gets set
|
||||
initProjectShell = pkgs.writers.writeFish "init-shell.fish" ''
|
||||
# Unload just in case, to not have redefinition errors
|
||||
source ${unloadProjectShell}
|
||||
|
||||
mkBuildScript = type: let
|
||||
typeLower = lib.toLower type;
|
||||
in
|
||||
pkgs.writers.writeFish "cmake-build.fish" ''
|
||||
cd $FLAKE_PROJECT_ROOT/cmake-build-${typeLower}
|
||||
echo "Sourcing \"${description}\" environment..."
|
||||
|
||||
echo "Running cmake"
|
||||
cmake --build .
|
||||
${builtins.concatStringsSep "\n" (lib.mapAttrsToList createAbbr abbrs)}
|
||||
'';
|
||||
|
||||
buildDebug = mkBuildScript "Debug";
|
||||
buildRelease = mkBuildScript "Release";
|
||||
|
||||
# Add project-local fish abbrs here
|
||||
abbrs = {
|
||||
fail = "perl ./scripts/menu.pl";
|
||||
|
||||
# C/C++:
|
||||
# cmake-debug = "${cmakeDebug}";
|
||||
# cmake-release = "${cmakeRelease}";
|
||||
# build-debug = "${buildDebug}";
|
||||
# build-release = "${buildRelease}";
|
||||
};
|
||||
|
||||
eraseAbbr = name: value: ''abbr --erase ${name} 2>/dev/null'';
|
||||
createAbbr = name: value: ''abbr -a ${name} "${value}"'';
|
||||
|
||||
# This will be sourced by the global fish config if INIT_PROJECT_SHELL gets unset
|
||||
unloadProjectShell = pkgs.writers.writeFish "unload-shell.fish" ''
|
||||
echo "Unloading \"${description}\" environment..."
|
||||
|
||||
${builtins.concatStringsSep "\n" (lib.mapAttrsToList eraseAbbr abbrs)}
|
||||
'';
|
||||
|
||||
# This will be sourced by the global fish config if INIT_PROJECT_SHELL gets set
|
||||
initProjectShell = pkgs.writers.writeFish "init-shell.fish" ''
|
||||
# Unload just in case, to not have redefinition errors
|
||||
source ${unloadProjectShell}
|
||||
|
||||
echo "Sourcing \"${description}\" environment..."
|
||||
|
||||
${builtins.concatStringsSep "\n" (lib.mapAttrsToList createAbbr abbrs)}
|
||||
'';
|
||||
in
|
||||
builtins.concatStringsSep "\n" [
|
||||
# Launch into pure fish shell
|
||||
''
|
||||
# Can't do the "exec" with nix-direnv
|
||||
# - The "exec fish" would call direnv again => Infinite loop
|
||||
# - The shellHook is Bash/POSIX, so fish syntax doesn't work
|
||||
# exec "$(type -p fish)" -C "source ${initProjectShell} && abbr -a menu '${pkgs.bat}/bin/bat "${initProjectShell}"'"
|
||||
|
||||
# Determine the project root, used e.g. in cmake scripts
|
||||
export FLAKE_PROJECT_ROOT="$(git rev-parse --show-toplevel)"
|
||||
export INIT_PROJECT_SHELL="${initProjectShell}"
|
||||
export UNLOAD_PROJECT_SHELL="${unloadProjectShell}"
|
||||
''
|
||||
];
|
||||
|
||||
# ===========================================================================================
|
||||
# Define custom dependencies
|
||||
# ===========================================================================================
|
||||
|
||||
python = pkgs.python314.withPackages (p:
|
||||
with p; [
|
||||
setuptools
|
||||
flask
|
||||
flask-mysqldb
|
||||
pyyaml
|
||||
]);
|
||||
|
||||
# perl = pkgs.perl.withPackages (p:
|
||||
# with p; [
|
||||
# # Those are already installed system-wide
|
||||
# # PLS
|
||||
# # PerlTidy
|
||||
#
|
||||
# NetOpenSSH
|
||||
# ]);
|
||||
|
||||
libpcl = stdenv.mkDerivation rec {
|
||||
pname = "libpcl1";
|
||||
version = "1.12-2";
|
||||
|
||||
src = pkgs.fetchurl {
|
||||
url = "http://launchpadlibrarian.net/521269537/${pname}_${version}_amd64.deb";
|
||||
hash = "sha256-GL3mjPAccAtRMAJPnDMCHiDf6xNvGi4oUWylOIqBjP0=";
|
||||
};
|
||||
|
||||
dontBuild = true;
|
||||
nativeBuildInputs = with pkgs; [
|
||||
dpkg
|
||||
autoPatchelfHook
|
||||
];
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out/lib
|
||||
cp -rv usr/lib/x86_64-linux-gnu/* $out/lib/
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
|
||||
wasi-sdk = stdenv.mkDerivation rec {
|
||||
pname = "wasi-sdk";
|
||||
version = "29";
|
||||
|
||||
src = let
|
||||
baseurl = "https://github.com/WebAssembly/wasi-sdk/releases/download";
|
||||
in
|
||||
builtins.fetchTarball {
|
||||
url = "${baseurl}/${pname}-${version}/${pname}-${version}.0-x86_64-linux.tar.gz";
|
||||
sha256 = "sha256:16afis71iqfvwiny4dz0lk9f7wbary0wa67ybwyhywr8g57ss6hq";
|
||||
builtins.concatStringsSep "\n" [
|
||||
# Launch into pure fish shell
|
||||
''
|
||||
# Can't do the "exec" with nix-direnv
|
||||
# - The "exec fish" would call direnv again => Infinite loop
|
||||
# - The shellHook is Bash/POSIX, so fish syntax doesn't work
|
||||
# exec "$(type -p fish)" -C "source ${initProjectShell} && abbr -a menu '${pkgs.bat}/bin/bat "${initProjectShell}"'"
|
||||
|
||||
# Determine the project root, used e.g. in cmake scripts
|
||||
export FLAKE_PROJECT_ROOT="$(git rev-parse --show-toplevel)"
|
||||
export INIT_PROJECT_SHELL="${initProjectShell}"
|
||||
export UNLOAD_PROJECT_SHELL="${unloadProjectShell}"
|
||||
''
|
||||
];
|
||||
|
||||
# ===========================================================================================
|
||||
# Define custom dependencies
|
||||
# ===========================================================================================
|
||||
|
||||
python = pkgs.python314.withPackages (
|
||||
p:
|
||||
with p; [
|
||||
setuptools
|
||||
flask
|
||||
flask-mysqldb
|
||||
pyyaml
|
||||
tabulate
|
||||
]
|
||||
);
|
||||
|
||||
# perl = pkgs.perl.withPackages (p:
|
||||
# with p; [
|
||||
# # Those are already installed system-wide
|
||||
# # PLS
|
||||
# # PerlTidy
|
||||
#
|
||||
# NetOpenSSH
|
||||
# ]);
|
||||
|
||||
libpcl = stdenv.mkDerivation rec {
|
||||
pname = "libpcl1";
|
||||
version = "1.12-2";
|
||||
|
||||
src = pkgs.fetchurl {
|
||||
url = "http://launchpadlibrarian.net/521269537/${pname}_${version}_amd64.deb";
|
||||
hash = "sha256-GL3mjPAccAtRMAJPnDMCHiDf6xNvGi4oUWylOIqBjP0=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = with pkgs; [
|
||||
autoPatchelfHook
|
||||
];
|
||||
dontBuild = true;
|
||||
nativeBuildInputs = with pkgs; [
|
||||
dpkg
|
||||
autoPatchelfHook
|
||||
];
|
||||
|
||||
buildInputs = with pkgs; [
|
||||
libgcc.lib
|
||||
];
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
dontBuild = true;
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
mkdir -p $out/lib
|
||||
cp -rv usr/lib/x86_64-linux-gnu/* $out/lib/
|
||||
|
||||
mkdir -p $out
|
||||
cp -rv ./* $out/
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
|
||||
iwasm = stdenv.mkDerivation rec {
|
||||
pname = "iwasm";
|
||||
version = "2.4.4";
|
||||
|
||||
src = let
|
||||
baseurl = "https://github.com/bytecodealliance/wasm-micro-runtime/releases/download";
|
||||
in
|
||||
builtins.fetchTarball {
|
||||
url = "${baseurl}/WAMR-${version}/${pname}-${version}-x86_64-ubuntu-22.04.tar.gz";
|
||||
sha256 = "sha256:05irihz3yf7hpc0a59qz9i62imhrsni9xy9nxwsn6b8s92c1yzrp";
|
||||
};
|
||||
|
||||
nativeBuildInputs = with pkgs; [
|
||||
autoPatchelfHook
|
||||
];
|
||||
|
||||
buildInputs = with pkgs; [
|
||||
libz
|
||||
zstd
|
||||
libgcc.lib
|
||||
];
|
||||
|
||||
dontBuild = true;
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out/bin
|
||||
cp -rv ./* $out/bin/
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
|
||||
wamrc = stdenv.mkDerivation rec {
|
||||
pname = "wamrc";
|
||||
version = "2.4.4";
|
||||
|
||||
src = let
|
||||
baseurl = "https://github.com/bytecodealliance/wasm-micro-runtime/releases/download";
|
||||
in
|
||||
builtins.fetchTarball {
|
||||
url = "${baseurl}/WAMR-${version}/${pname}-${version}-x86_64-ubuntu-22.04.tar.gz";
|
||||
sha256 = "sha256:0264arh03gc35z0zdvw07qdvqgfvsxr3qgl1aszghwicmdmh4sqj";
|
||||
};
|
||||
|
||||
nativeBuildInputs = with pkgs; [
|
||||
autoPatchelfHook
|
||||
];
|
||||
|
||||
buildInputs = with pkgs; [
|
||||
libz
|
||||
zstd
|
||||
libgcc.lib
|
||||
];
|
||||
|
||||
dontBuild = true;
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out/bin
|
||||
cp -rv ./* $out/bin/
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
|
||||
wamr = stdenv.mkDerivation {
|
||||
pname = "wamr";
|
||||
version = "2.4.4";
|
||||
|
||||
src = pkgs.fetchFromGitea {
|
||||
domain = "gitea.local.chriphost.de";
|
||||
owner = "christoph";
|
||||
repo = "wamr";
|
||||
rev = "fd69a4e76ec0d384bd79f514772b7dfa240fc0d7";
|
||||
hash = "sha256-rlCx4isI0k6rC9E0hWIA9LeinqiACug7zxj9z/e4SBQ=";
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
|
||||
dontBuild = true;
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
# Provides clang to compile C++ to Wasm
|
||||
wasi-sdk = stdenv.mkDerivation rec {
|
||||
pname = "wasi-sdk";
|
||||
version = "29";
|
||||
|
||||
mkdir -p $out
|
||||
cp -rv ./* $out/
|
||||
src = let
|
||||
baseurl = "https://github.com/WebAssembly/wasi-sdk/releases/download";
|
||||
in
|
||||
builtins.fetchTarball {
|
||||
url = "${baseurl}/${pname}-${version}/${pname}-${version}.0-x86_64-linux.tar.gz";
|
||||
sha256 = "sha256:16afis71iqfvwiny4dz0lk9f7wbary0wa67ybwyhywr8g57ss6hq";
|
||||
};
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
nativeBuildInputs = with pkgs; [
|
||||
autoPatchelfHook
|
||||
];
|
||||
|
||||
mkLibiwasm = {
|
||||
buildenv,
|
||||
platform,
|
||||
buildtype,
|
||||
cflags,
|
||||
extraCmakeFlags ? [],
|
||||
}:
|
||||
buildenv.mkDerivation {
|
||||
pname = "libiwasm";
|
||||
buildInputs = with pkgs; [
|
||||
libgcc.lib
|
||||
];
|
||||
|
||||
dontBuild = true;
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out
|
||||
cp -rv ./* $out/
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
|
||||
# Provides the iwasm interpreter
|
||||
iwasm = stdenv.mkDerivation rec {
|
||||
pname = "iwasm";
|
||||
version = "2.4.4";
|
||||
|
||||
src = pkgs.fetchFromGitea {
|
||||
domain = "gitea.local.chriphost.de";
|
||||
owner = "christoph";
|
||||
# domain = "git.cs.tu-dortmund.de";
|
||||
# owner = "christoph.urlacher";
|
||||
repo = "wamr";
|
||||
src = let
|
||||
baseurl = "https://github.com/bytecodealliance/wasm-micro-runtime/releases/download";
|
||||
in
|
||||
builtins.fetchTarball {
|
||||
url = "${baseurl}/WAMR-${version}/${pname}-${version}-x86_64-ubuntu-22.04.tar.gz";
|
||||
sha256 = "sha256:05irihz3yf7hpc0a59qz9i62imhrsni9xy9nxwsn6b8s92c1yzrp";
|
||||
};
|
||||
|
||||
# With mmap_space in .text.wamr_aot
|
||||
rev = "cda2009deb85511089b04b0ac736ad4da2d07e58";
|
||||
hash = "sha256-CN6xTiwzF4Jbrpf21TF5c/C03Xb3urwkibRuIXjoU/w=";
|
||||
nativeBuildInputs = with pkgs; [
|
||||
autoPatchelfHook
|
||||
];
|
||||
|
||||
# Without mmap_space in .text.wamr_aot
|
||||
# rev = "4e7aed33fe53bf3ee4a3f2fe582c74816f850759";
|
||||
# hash = "sha256-/4BKwoFDRfkA+DmbWagxdtkCDAED5rxbz5e4xvjvVWU=";
|
||||
};
|
||||
buildInputs = with pkgs; [
|
||||
libz
|
||||
zstd
|
||||
libgcc.lib
|
||||
];
|
||||
|
||||
nativeBuildInputs = with pkgs; [cmake];
|
||||
dontBuild = true;
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out/bin
|
||||
cp -rv ./* $out/bin/
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
|
||||
# Provides the wamrc compiler
|
||||
wamrc = stdenv.mkDerivation rec {
|
||||
pname = "wamrc";
|
||||
version = "2.4.4";
|
||||
|
||||
src = let
|
||||
baseurl = "https://github.com/bytecodealliance/wasm-micro-runtime/releases/download";
|
||||
in
|
||||
builtins.fetchTarball {
|
||||
url = "${baseurl}/WAMR-${version}/${pname}-${version}-x86_64-ubuntu-22.04.tar.gz";
|
||||
sha256 = "sha256:0264arh03gc35z0zdvw07qdvqgfvsxr3qgl1aszghwicmdmh4sqj";
|
||||
};
|
||||
|
||||
nativeBuildInputs = with pkgs; [
|
||||
autoPatchelfHook
|
||||
];
|
||||
|
||||
buildInputs = with pkgs; [
|
||||
libz
|
||||
zstd
|
||||
libgcc.lib
|
||||
];
|
||||
|
||||
dontBuild = true;
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out/bin
|
||||
cp -rv ./* $out/bin/
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
|
||||
# ===========================================================================================
|
||||
# Specify dependencies
|
||||
# https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-dependencies-overview
|
||||
# Just for a "nix develop" shell, buildInputs can be used for everything.
|
||||
# ===========================================================================================
|
||||
|
||||
# Add dependencies to nativeBuildInputs if they are executed during the build:
|
||||
# - Those which are needed on $PATH during the build, for example cmake and pkg-config
|
||||
# - Setup hooks, for example makeWrapper/autoPatchelfHook
|
||||
# - Interpreters needed by patchShebangs for build scripts (with the --build flag), which can be the case for e.g. perl
|
||||
nativeBuildInputs = with pkgs; [
|
||||
cmake
|
||||
gdb
|
||||
xxd
|
||||
wabt
|
||||
grub2
|
||||
xorriso
|
||||
mariadb.client
|
||||
# dbeaver-bin
|
||||
# beekeeper-studio
|
||||
# tableplus
|
||||
lazysql
|
||||
iwasm
|
||||
wamrc
|
||||
fail-bin
|
||||
php
|
||||
|
||||
# perl
|
||||
|
||||
# Don't install to not pollute our PATH. Just export as environment variable.
|
||||
# wasi-sdk
|
||||
# libiwasm_debug
|
||||
# libiwasm_release
|
||||
];
|
||||
|
||||
# Add dependencies to buildInputs if they will end up copied or linked into the final output or otherwise used at runtime:
|
||||
# - Libraries used by compilers, for example zlib
|
||||
# - Interpreters needed by patchShebangs for scripts which are installed, which can be the case for e.g. perl
|
||||
buildInputs = with pkgs; [];
|
||||
|
||||
# ===========================================================================================
|
||||
# Define buildable + installable packages
|
||||
# ===========================================================================================
|
||||
|
||||
fail-bin = stdenv.mkDerivation {
|
||||
pname = "fail";
|
||||
version = "1.0.0";
|
||||
src = ./.;
|
||||
|
||||
dontStrip = true;
|
||||
cmakeBuildType = buildtype;
|
||||
cmakeFlags =
|
||||
extraCmakeFlags
|
||||
++ [
|
||||
"-DCMAKE_VERBOSE_MAKEFILE=ON"
|
||||
"-DCMAKE_COLOR_DIAGNOSTICS=ON"
|
||||
|
||||
"-DWAMR_BUILD_PLATFORM=${platform}"
|
||||
"-DWAMR_BUILD_TARGET=X86_32"
|
||||
"-DWAMR_BUILD_AOT=1"
|
||||
"-DWAMR_BUILD_WAMR_COMPILER=0"
|
||||
"-DWAMR_BUILD_INTERP=1"
|
||||
"-DWAMR_BUILD_FAST_INTERP=0"
|
||||
"-DWAMR_BUILD_JIT=0"
|
||||
"-DWAMR_BUILD_FAST_JIT=0"
|
||||
"-DWAMR_BUILD_LIBC_BUILTIN=1"
|
||||
"-DWAMR_BUILD_LIBC_WASI=0"
|
||||
"-DWAMR_BUILD_SIMD=0"
|
||||
];
|
||||
nativeBuildInputs = with pkgs; [
|
||||
autoPatchelfHook
|
||||
];
|
||||
|
||||
# Since GCC 15, implicit declarations are an error. Disable this.
|
||||
NIX_CFLAGS_COMPILE = "-Wno-error=implicit-function-declaration " + cflags;
|
||||
buildInputs = with pkgs; [
|
||||
# FAIL runtime dependencies
|
||||
python # bochs-experiment-runner.py, resultbrowser.py
|
||||
|
||||
# For old VSS FAIL
|
||||
# alsa-lib # libasound.so.2
|
||||
# boost_pkgs.boost174 # libboost_coroutine.so.1.74.0, libboost_regex.so.1.74.0, libboost_thread.so.1.74.0
|
||||
# capstone_4 # libcapstone.so.4
|
||||
# libdwarf_pkgs.libdwarf # libdwarf.so.1
|
||||
# elfutils # libelf.so.1
|
||||
# mariadb # libmariadb.so.3
|
||||
# libpcl # libpcl.so.1
|
||||
# protobuf_21 # libprotobuf.so.32
|
||||
# SDL # libSDL-1.2.so.0
|
||||
# libx11 # libX11.so.6
|
||||
# libxrandr # libXrandr.so.2
|
||||
# libz # libz.so.1
|
||||
|
||||
# For current FAIL
|
||||
boost183
|
||||
capstone # libcapstone.so.5
|
||||
libdwarf_pkgs.libdwarf # libdwarf.so.1
|
||||
elfutils # libelf.so.1
|
||||
mariadb # libmariadb.so.3
|
||||
protobuf_21 # libprotobuf.so.32
|
||||
libz # libz.so.1
|
||||
];
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out
|
||||
cp -rv ./fail/bin $out/bin
|
||||
cp -rv ./fail/share $out/share
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
in {
|
||||
# Provide package for "nix build"
|
||||
packages = {
|
||||
default = fail-bin;
|
||||
fail = fail-bin;
|
||||
wasi-sdk = wasi-sdk;
|
||||
iwasm = iwasm;
|
||||
wamrc = wamrc;
|
||||
};
|
||||
apps = {
|
||||
default = flake-utils.lib.mkApp {drv = fail-bin;};
|
||||
fail = fail-bin;
|
||||
wasi-sdk = wasi-sdk;
|
||||
iwasm = iwasm;
|
||||
wamrc = wamrc;
|
||||
};
|
||||
|
||||
libiwasm-baremetal-debug = mkLibiwasm {
|
||||
buildenv = i386_pkgs.stdenv;
|
||||
platform = "baremetal";
|
||||
buildtype = "Debug";
|
||||
cflags = "-O0 -ggdb3";
|
||||
extraCmakeFlags = [
|
||||
"-DCMAKE_SYSTEM_NAME=Generic"
|
||||
"-DCMAKE_SYSTEM_PROCESSOR=i386"
|
||||
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
|
||||
];
|
||||
};
|
||||
libiwasm-baremetal-release = mkLibiwasm {
|
||||
buildenv = i386_pkgs.stdenv;
|
||||
platform = "baremetal";
|
||||
buildtype = "MinSizeRel";
|
||||
cflags = "-O2 -ggdb3 -DNDEBUG";
|
||||
extraCmakeFlags = [
|
||||
"-DCMAKE_SYSTEM_NAME=Generic"
|
||||
"-DCMAKE_SYSTEM_PROCESSOR=i386"
|
||||
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
|
||||
];
|
||||
};
|
||||
devShells = {
|
||||
# Provide default environment for "nix develop".
|
||||
# Other environments can be added below.
|
||||
default = pkgs.mkShell {
|
||||
inherit nativeBuildInputs buildInputs shellHook;
|
||||
name = description;
|
||||
|
||||
libiwasm-linux-debug = mkLibiwasm {
|
||||
buildenv = pkgs.multiStdenv;
|
||||
platform = "linux";
|
||||
buildtype = "Debug";
|
||||
cflags = "-O0 -ggdb3";
|
||||
};
|
||||
libiwasm-linux-release = mkLibiwasm {
|
||||
buildenv = pkgs.multiStdenv;
|
||||
platform = "linux";
|
||||
buildtype = "MinSizeRel";
|
||||
cflags = "-O2 -ggdb3 -DNDEBUG";
|
||||
};
|
||||
# =========================================================================================
|
||||
# Define environment variables
|
||||
# =========================================================================================
|
||||
|
||||
# ===========================================================================================
|
||||
# Specify dependencies
|
||||
# https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-dependencies-overview
|
||||
# Just for a "nix develop" shell, buildInputs can be used for everything.
|
||||
# ===========================================================================================
|
||||
# Dynamic libraries from buildinputs:
|
||||
# LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs;
|
||||
|
||||
# Add dependencies to nativeBuildInputs if they are executed during the build:
|
||||
# - Those which are needed on $PATH during the build, for example cmake and pkg-config
|
||||
# - Setup hooks, for example makeWrapper/autoPatchelfHook
|
||||
# - Interpreters needed by patchShebangs for build scripts (with the --build flag), which can be the case for e.g. perl
|
||||
nativeBuildInputs = with pkgs; [
|
||||
just
|
||||
gdb
|
||||
xxd
|
||||
wabt
|
||||
grub2
|
||||
xorriso
|
||||
mariadb.client
|
||||
# dbeaver-bin
|
||||
# beekeeper-studio
|
||||
# tableplus
|
||||
lazysql
|
||||
iwasm
|
||||
wamrc
|
||||
fail-bin
|
||||
php
|
||||
|
||||
# perl
|
||||
|
||||
# Don't install to not pollute our PATH. Just export as environment variable.
|
||||
# wasi-sdk
|
||||
# libiwasm_debug
|
||||
# libiwasm_release
|
||||
];
|
||||
|
||||
# Add dependencies to buildInputs if they will end up copied or linked into the final output or otherwise used at runtime:
|
||||
# - Libraries used by compilers, for example zlib
|
||||
# - Interpreters needed by patchShebangs for scripts which are installed, which can be the case for e.g. perl
|
||||
buildInputs = with pkgs; [];
|
||||
|
||||
# ===========================================================================================
|
||||
# Define buildable + installable packages
|
||||
# ===========================================================================================
|
||||
|
||||
fail-bin = stdenv.mkDerivation {
|
||||
pname = "fail";
|
||||
version = "1.0.0";
|
||||
src = ./.;
|
||||
|
||||
nativeBuildInputs = with pkgs; [
|
||||
autoPatchelfHook
|
||||
];
|
||||
|
||||
buildInputs = with pkgs; [
|
||||
# FAIL runtime dependencies
|
||||
python # bochs-experiment-runner.py, resultbrowser.py
|
||||
|
||||
# For old VSS FAIL
|
||||
# alsa-lib # libasound.so.2
|
||||
# boost_pkgs.boost174 # libboost_coroutine.so.1.74.0, libboost_regex.so.1.74.0, libboost_thread.so.1.74.0
|
||||
# capstone_4 # libcapstone.so.4
|
||||
# libdwarf_pkgs.libdwarf # libdwarf.so.1
|
||||
# elfutils # libelf.so.1
|
||||
# mariadb # libmariadb.so.3
|
||||
# libpcl # libpcl.so.1
|
||||
# protobuf_21 # libprotobuf.so.32
|
||||
# SDL # libSDL-1.2.so.0
|
||||
# libx11 # libX11.so.6
|
||||
# libxrandr # libXrandr.so.2
|
||||
# libz # libz.so.1
|
||||
|
||||
# For current FAIL
|
||||
boost183
|
||||
capstone # libcapstone.so.5
|
||||
libdwarf_pkgs.libdwarf # libdwarf.so.1
|
||||
elfutils # libelf.so.1
|
||||
mariadb # libmariadb.so.3
|
||||
protobuf_21 # libprotobuf.so.32
|
||||
libz # libz.so.1
|
||||
];
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out
|
||||
cp -rv ./fail/bin $out/bin
|
||||
cp -rv ./fail/share $out/share
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
in {
|
||||
# Provide package for "nix build"
|
||||
packages = {
|
||||
default = fail-bin;
|
||||
fail = fail-bin;
|
||||
wasi-sdk = wasi-sdk;
|
||||
iwasm = iwasm;
|
||||
wamrc = wamrc;
|
||||
};
|
||||
apps = {
|
||||
default = flake-utils.lib.mkApp {drv = fail-bin;};
|
||||
fail = fail-bin;
|
||||
wasi-sdk = wasi-sdk;
|
||||
iwasm = iwasm;
|
||||
wamrc = wamrc;
|
||||
};
|
||||
|
||||
devShells = {
|
||||
# Provide default environment for "nix develop".
|
||||
# Other environments can be added below.
|
||||
default = pkgs.mkShell {
|
||||
inherit nativeBuildInputs buildInputs shellHook;
|
||||
name = description;
|
||||
|
||||
# =========================================================================================
|
||||
# Define environment variables
|
||||
# =========================================================================================
|
||||
|
||||
# Dynamic libraries from buildinputs:
|
||||
# LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs;
|
||||
|
||||
JUST_WORKING_DIRECTORY = "/home/christoph/Notes/TU/MastersThesis/FailNix";
|
||||
JUST_JUSTFILE = "/home/christoph/Notes/TU/MastersThesis/FailNix/scripts/nixos.just";
|
||||
|
||||
# Those are read by the justfile
|
||||
FAIL_SHARE = "${fail-bin}/share";
|
||||
WASI_ROOT = wasi-sdk;
|
||||
WAMR_ROOT = wamr;
|
||||
LIBIWASM_DEBUG = "${libiwasm-baremetal-debug}/lib";
|
||||
LIBIWASM_RELEASE = "${libiwasm-baremetal-release}/lib";
|
||||
LIBIWASM_LINUX_DEBUG = "${libiwasm-linux-debug}/lib";
|
||||
LIBIWASM_LINUX_RELEASE = "${libiwasm-linux-release}/lib";
|
||||
CROSS_CC = "${i386_pkgs.stdenv.cc}/bin/i386-elf-gcc";
|
||||
CROSS_CXX = "${i386_pkgs.stdenv.cc}/bin/i386-elf-g++";
|
||||
LINUX_CC = "${pkgs.multiStdenv.cc}/bin/gcc";
|
||||
LINUX_CXX = "${pkgs.multiStdenv.cc}/bin/g++";
|
||||
# Those are read by compile.pl / build.pl
|
||||
FAIL_SHARE = "${fail-bin}/share";
|
||||
FAIL_PYTHON = "${python}/bin/python";
|
||||
WASI_ROOT = wasi-sdk;
|
||||
WAMR_ROOT = "/home/christoph/Notes/TU/MastersThesis/FailNix/wamr";
|
||||
CROSS_CC = "${i386_pkgs.stdenv.cc}/bin/i386-elf-gcc";
|
||||
CROSS_CXX = "${i386_pkgs.stdenv.cc}/bin/i386-elf-g++";
|
||||
LINUX_CC = "${pkgs.multiStdenv.cc}/bin/gcc";
|
||||
LINUX_CXX = "${pkgs.multiStdenv.cc}/bin/g++";
|
||||
};
|
||||
};
|
||||
};
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
1430
just-bin/Cargo.lock
generated
1430
just-bin/Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -1,108 +0,0 @@
|
||||
[package]
|
||||
name = "just"
|
||||
version = "1.46.0"
|
||||
authors = ["Casey Rodarmor <casey@rodarmor.com>"]
|
||||
autotests = false
|
||||
categories = ["command-line-utilities", "development-tools"]
|
||||
description = "🤖 Just a command runner"
|
||||
edition = "2021"
|
||||
exclude = ["/book", "/icon.png", "/screenshot.png", "/www"]
|
||||
homepage = "https://github.com/casey/just"
|
||||
keywords = ["command-line", "task", "runner", "development", "utility"]
|
||||
license = "CC0-1.0"
|
||||
readme = "crates-io-readme.md"
|
||||
repository = "https://github.com/casey/just"
|
||||
rust-version = "1.82.0"
|
||||
|
||||
[workspace]
|
||||
members = [".", "crates/*"]
|
||||
|
||||
[dependencies]
|
||||
ansi_term = "0.12.0"
|
||||
blake3 = { version = "1.5.0", features = ["rayon", "mmap"] }
|
||||
camino = "1.0.4"
|
||||
chrono = "0.4.38"
|
||||
clap = { version = "4.0.0", features = ["derive", "env", "wrap_help"] }
|
||||
clap_mangen = "0.2.20"
|
||||
derive-where = "1.2.7"
|
||||
dirs = "6.0.0"
|
||||
dotenvy = "0.15"
|
||||
edit-distance = "2.0.0"
|
||||
heck = "0.5.0"
|
||||
is_executable = "1.0.4"
|
||||
lexiclean = "0.0.1"
|
||||
libc = "0.2.0"
|
||||
num_cpus = "1.15.0"
|
||||
percent-encoding = "2.3.1"
|
||||
rand = "0.9.0"
|
||||
regex = "1.10.4"
|
||||
rustversion = "1.0.18"
|
||||
semver = "1.0.20"
|
||||
serde = { version = "1.0.130", features = ["derive", "rc"] }
|
||||
serde_json = "1.0.68"
|
||||
sha2 = "0.10"
|
||||
shellexpand = "3.1.0"
|
||||
similar = { version = "2.1.0", features = ["unicode"] }
|
||||
snafu = "0.8.0"
|
||||
strum = { version = "0.27.1", features = ["derive"] }
|
||||
target = "2.0.0"
|
||||
tempfile = "3.0.0"
|
||||
typed-arena = "2.0.1"
|
||||
unicode-width = "0.2.0"
|
||||
uuid = { version = "1.0.0", features = ["v4"] }
|
||||
|
||||
[target.'cfg(unix)'.dependencies]
|
||||
nix = { version = "0.30.1", features = ["signal", "user", "fs"] }
|
||||
|
||||
[target.'cfg(windows)'.dependencies]
|
||||
ctrlc = { version = "3.1.1", features = ["termination"] }
|
||||
|
||||
[dev-dependencies]
|
||||
clap_complete = "=4.5.48"
|
||||
executable-path = "1.0.0"
|
||||
pretty_assertions = "1.0.0"
|
||||
temptree = "0.2.0"
|
||||
which = "8.0.0"
|
||||
|
||||
[lints.rust]
|
||||
mismatched_lifetime_syntaxes = "allow"
|
||||
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(fuzzing)'] }
|
||||
|
||||
[lints.clippy]
|
||||
all = { level = "deny", priority = -1 }
|
||||
arbitrary-source-item-ordering = "deny"
|
||||
enum_glob_use = "allow"
|
||||
ignore_without_reason = "allow"
|
||||
needless_pass_by_value = "allow"
|
||||
pedantic = { level = "deny", priority = -1 }
|
||||
similar_names = "allow"
|
||||
struct_excessive_bools = "allow"
|
||||
struct_field_names = "allow"
|
||||
too_many_arguments = "allow"
|
||||
too_many_lines = "allow"
|
||||
type_complexity = "allow"
|
||||
undocumented_unsafe_blocks = "deny"
|
||||
unnecessary_wraps = "allow"
|
||||
wildcard_imports = "allow"
|
||||
|
||||
[lib]
|
||||
doctest = false
|
||||
|
||||
[[bin]]
|
||||
path = "src/main.rs"
|
||||
name = "just"
|
||||
test = false
|
||||
|
||||
# The public documentation is minimal and doesn't change between
|
||||
# platforms, so we only build them for linux on docs.rs to save
|
||||
# their build machines some cycles.
|
||||
[package.metadata.docs.rs]
|
||||
targets = ["x86_64-unknown-linux-gnu"]
|
||||
|
||||
[profile.release]
|
||||
lto = true
|
||||
codegen-units = 1
|
||||
|
||||
[[test]]
|
||||
name = "integration"
|
||||
path = "tests/lib.rs"
|
||||
@ -1,152 +0,0 @@
|
||||
justfile grammar
|
||||
================
|
||||
|
||||
Justfiles are processed by a mildly context-sensitive tokenizer
|
||||
and a recursive descent parser. The grammar is LL(k), for an
|
||||
unknown but hopefully reasonable value of k.
|
||||
|
||||
tokens
|
||||
------
|
||||
|
||||
```
|
||||
BACKTICK = `[^`]*`
|
||||
INDENTED_BACKTICK = ```[^(```)]*```
|
||||
COMMENT = #([^!].*)?$
|
||||
DEDENT = emitted when indentation decreases
|
||||
EOF = emitted at the end of the file
|
||||
INDENT = emitted when indentation increases
|
||||
LINE = emitted before a recipe line
|
||||
NAME = [a-zA-Z_][a-zA-Z0-9_-]*
|
||||
NEWLINE = \n|\r\n
|
||||
RAW_STRING = '[^']*'
|
||||
INDENTED_RAW_STRING = '''[^(''')]*'''
|
||||
STRING = "[^"]*" # also processes \n \r \t \" \\ escapes
|
||||
INDENTED_STRING = """[^(""")]*""" # also processes \n \r \t \" \\ escapes
|
||||
LINE_PREFIX = @-|-@|@|-
|
||||
TEXT = recipe text, only matches in a recipe body
|
||||
```
|
||||
|
||||
grammar syntax
|
||||
--------------
|
||||
|
||||
```
|
||||
| alternation
|
||||
() grouping
|
||||
_? option (0 or 1 times)
|
||||
_* repetition (0 or more times)
|
||||
_+ repetition (1 or more times)
|
||||
```
|
||||
|
||||
grammar
|
||||
-------
|
||||
|
||||
```
|
||||
justfile : item* EOF
|
||||
|
||||
item : alias
|
||||
| assignment
|
||||
| eol
|
||||
| export
|
||||
| import
|
||||
| module
|
||||
| recipe
|
||||
| set
|
||||
|
||||
eol : NEWLINE
|
||||
| COMMENT NEWLINE
|
||||
|
||||
alias : 'alias' NAME ':=' target eol
|
||||
|
||||
target : NAME ('::' NAME)*
|
||||
|
||||
assignment : NAME ':=' expression eol
|
||||
|
||||
export : 'export' assignment
|
||||
|
||||
set : 'set' setting eol
|
||||
|
||||
setting : 'allow-duplicate-recipes' boolean?
|
||||
| 'allow-duplicate-variables' boolean?
|
||||
| 'dotenv-filename' ':=' string
|
||||
| 'dotenv-load' boolean?
|
||||
| 'dotenv-path' ':=' string
|
||||
| 'dotenv-required' boolean?
|
||||
| 'export' boolean?
|
||||
| 'fallback' boolean?
|
||||
| 'ignore-comments' boolean?
|
||||
| 'positional-arguments' boolean?
|
||||
| 'script-interpreter' ':=' string_list
|
||||
| 'quiet' boolean?
|
||||
| 'shell' ':=' string_list
|
||||
| 'tempdir' ':=' string
|
||||
| 'unstable' boolean?
|
||||
| 'windows-powershell' boolean?
|
||||
| 'windows-shell' ':=' string_list
|
||||
| 'working-directory' ':=' string
|
||||
|
||||
boolean : ':=' ('true' | 'false')
|
||||
|
||||
string_list : '[' string (',' string)* ','? ']'
|
||||
|
||||
import : 'import' '?'? string? eol
|
||||
|
||||
module : 'mod' '?'? NAME string? eol
|
||||
|
||||
expression : disjunct || expression
|
||||
| disjunct
|
||||
|
||||
disjunct : conjunct && disjunct
|
||||
| conjunct
|
||||
|
||||
conjunct : 'if' condition '{' expression '}' 'else' '{' expression '}'
|
||||
| 'assert' '(' condition ',' expression ')'
|
||||
| '/' expression
|
||||
| value '/' expression
|
||||
| value '+' expression
|
||||
| value
|
||||
|
||||
condition : expression '==' expression
|
||||
| expression '!=' expression
|
||||
| expression '=~' expression
|
||||
|
||||
value : NAME '(' sequence? ')'
|
||||
| BACKTICK
|
||||
| INDENTED_BACKTICK
|
||||
| NAME
|
||||
| string
|
||||
| '(' expression ')'
|
||||
|
||||
string : 'x'? STRING
|
||||
| 'x'? INDENTED_STRING
|
||||
| 'x'? RAW_STRING
|
||||
| 'x'? INDENTED_RAW_STRING
|
||||
|
||||
sequence : expression ',' sequence
|
||||
| expression ','?
|
||||
|
||||
recipe : attributes* '@'? NAME parameter* variadic? ':' dependencies eol body?
|
||||
|
||||
attributes : '[' attribute (',' attribute)* ']' eol
|
||||
|
||||
attribute : NAME
|
||||
| NAME ':' string
|
||||
| NAME '(' string (',' string)* ')'
|
||||
|
||||
parameter : '$'? NAME
|
||||
| '$'? NAME '=' value
|
||||
|
||||
variadic : '*' parameter
|
||||
| '+' parameter
|
||||
|
||||
dependencies : dependency* ('&&' dependency+)?
|
||||
|
||||
dependency : target
|
||||
| '(' target expression* ')'
|
||||
|
||||
body : INDENT line+ DEDENT
|
||||
|
||||
line : LINE LINE_PREFIX? (TEXT | interpolation)+ NEWLINE
|
||||
| NEWLINE
|
||||
|
||||
interpolation : '{{' expression '}}'
|
||||
```
|
||||
121
just-bin/LICENSE
121
just-bin/LICENSE
@ -1,121 +0,0 @@
|
||||
Creative Commons Legal Code
|
||||
|
||||
CC0 1.0 Universal
|
||||
|
||||
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
|
||||
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
|
||||
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
|
||||
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
|
||||
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
|
||||
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
|
||||
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
|
||||
HEREUNDER.
|
||||
|
||||
Statement of Purpose
|
||||
|
||||
The laws of most jurisdictions throughout the world automatically confer
|
||||
exclusive Copyright and Related Rights (defined below) upon the creator
|
||||
and subsequent owner(s) (each and all, an "owner") of an original work of
|
||||
authorship and/or a database (each, a "Work").
|
||||
|
||||
Certain owners wish to permanently relinquish those rights to a Work for
|
||||
the purpose of contributing to a commons of creative, cultural and
|
||||
scientific works ("Commons") that the public can reliably and without fear
|
||||
of later claims of infringement build upon, modify, incorporate in other
|
||||
works, reuse and redistribute as freely as possible in any form whatsoever
|
||||
and for any purposes, including without limitation commercial purposes.
|
||||
These owners may contribute to the Commons to promote the ideal of a free
|
||||
culture and the further production of creative, cultural and scientific
|
||||
works, or to gain reputation or greater distribution for their Work in
|
||||
part through the use and efforts of others.
|
||||
|
||||
For these and/or other purposes and motivations, and without any
|
||||
expectation of additional consideration or compensation, the person
|
||||
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
|
||||
is an owner of Copyright and Related Rights in the Work, voluntarily
|
||||
elects to apply CC0 to the Work and publicly distribute the Work under its
|
||||
terms, with knowledge of his or her Copyright and Related Rights in the
|
||||
Work and the meaning and intended legal effect of CC0 on those rights.
|
||||
|
||||
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||
protected by copyright and related or neighboring rights ("Copyright and
|
||||
Related Rights"). Copyright and Related Rights include, but are not
|
||||
limited to, the following:
|
||||
|
||||
i. the right to reproduce, adapt, distribute, perform, display,
|
||||
communicate, and translate a Work;
|
||||
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||
iii. publicity and privacy rights pertaining to a person's image or
|
||||
likeness depicted in a Work;
|
||||
iv. rights protecting against unfair competition in regards to a Work,
|
||||
subject to the limitations in paragraph 4(a), below;
|
||||
v. rights protecting the extraction, dissemination, use and reuse of data
|
||||
in a Work;
|
||||
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||
European Parliament and of the Council of 11 March 1996 on the legal
|
||||
protection of databases, and under any national implementation
|
||||
thereof, including any amended or successor version of such
|
||||
directive); and
|
||||
vii. other similar, equivalent or corresponding rights throughout the
|
||||
world based on applicable law or treaty, and any national
|
||||
implementations thereof.
|
||||
|
||||
2. Waiver. To the greatest extent permitted by, but not in contravention
|
||||
of, applicable law, Affirmer hereby overtly, fully, permanently,
|
||||
irrevocably and unconditionally waives, abandons, and surrenders all of
|
||||
Affirmer's Copyright and Related Rights and associated claims and causes
|
||||
of action, whether now known or unknown (including existing as well as
|
||||
future claims and causes of action), in the Work (i) in all territories
|
||||
worldwide, (ii) for the maximum duration provided by applicable law or
|
||||
treaty (including future time extensions), (iii) in any current or future
|
||||
medium and for any number of copies, and (iv) for any purpose whatsoever,
|
||||
including without limitation commercial, advertising or promotional
|
||||
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
|
||||
member of the public at large and to the detriment of Affirmer's heirs and
|
||||
successors, fully intending that such Waiver shall not be subject to
|
||||
revocation, rescission, cancellation, termination, or any other legal or
|
||||
equitable action to disrupt the quiet enjoyment of the Work by the public
|
||||
as contemplated by Affirmer's express Statement of Purpose.
|
||||
|
||||
3. Public License Fallback. Should any part of the Waiver for any reason
|
||||
be judged legally invalid or ineffective under applicable law, then the
|
||||
Waiver shall be preserved to the maximum extent permitted taking into
|
||||
account Affirmer's express Statement of Purpose. In addition, to the
|
||||
extent the Waiver is so judged Affirmer hereby grants to each affected
|
||||
person a royalty-free, non transferable, non sublicensable, non exclusive,
|
||||
irrevocable and unconditional license to exercise Affirmer's Copyright and
|
||||
Related Rights in the Work (i) in all territories worldwide, (ii) for the
|
||||
maximum duration provided by applicable law or treaty (including future
|
||||
time extensions), (iii) in any current or future medium and for any number
|
||||
of copies, and (iv) for any purpose whatsoever, including without
|
||||
limitation commercial, advertising or promotional purposes (the
|
||||
"License"). The License shall be deemed effective as of the date CC0 was
|
||||
applied by Affirmer to the Work. Should any part of the License for any
|
||||
reason be judged legally invalid or ineffective under applicable law, such
|
||||
partial invalidity or ineffectiveness shall not invalidate the remainder
|
||||
of the License, and in such case Affirmer hereby affirms that he or she
|
||||
will not (i) exercise any of his or her remaining Copyright and Related
|
||||
Rights in the Work or (ii) assert any associated claims and causes of
|
||||
action with respect to the Work, in either case contrary to Affirmer's
|
||||
express Statement of Purpose.
|
||||
|
||||
4. Limitations and Disclaimers.
|
||||
|
||||
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||
surrendered, licensed or otherwise affected by this document.
|
||||
b. Affirmer offers the Work as-is and makes no representations or
|
||||
warranties of any kind concerning the Work, express, implied,
|
||||
statutory or otherwise, including without limitation warranties of
|
||||
title, merchantability, fitness for a particular purpose, non
|
||||
infringement, or the absence of latent or other defects, accuracy, or
|
||||
the present or absence of errors, whether or not discoverable, all to
|
||||
the greatest extent permissible under applicable law.
|
||||
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||
that may apply to the Work or any use thereof, including without
|
||||
limitation any person's Copyright and Related Rights in the Work.
|
||||
Further, Affirmer disclaims responsibility for obtaining any necessary
|
||||
consents, permissions or other rights required for any use of the
|
||||
Work.
|
||||
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||
party to this document and has no duty or obligation with respect to
|
||||
this CC0 or use of the Work.
|
||||
4882
just-bin/README.md
4882
just-bin/README.md
File diff suppressed because it is too large
Load Diff
@ -1,189 +0,0 @@
|
||||
_just() {
|
||||
local i cur prev words cword opts cmd
|
||||
COMPREPLY=()
|
||||
|
||||
# Modules use "::" as the separator, which is considered a wordbreak character in bash.
|
||||
# The _get_comp_words_by_ref function is a hack to allow for exceptions to this rule without
|
||||
# modifying the global COMP_WORDBREAKS environment variable.
|
||||
if type _get_comp_words_by_ref &>/dev/null; then
|
||||
_get_comp_words_by_ref -n : cur prev words cword
|
||||
else
|
||||
cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||
words=$COMP_WORDS
|
||||
cword=$COMP_CWORD
|
||||
fi
|
||||
|
||||
cmd=""
|
||||
opts=""
|
||||
|
||||
for i in ${words[@]}
|
||||
do
|
||||
case "${cmd},${i}" in
|
||||
",$1")
|
||||
cmd="just"
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
case "${cmd}" in
|
||||
just)
|
||||
opts="-E -n -g -f -q -u -v -d -c -e -l -s -h -V --alias-style --ceiling --check --chooser --clear-shell-args --color --command-color --cygpath --dotenv-filename --dotenv-path --dry-run --dump-format --explain --global-justfile --highlight --justfile --list-heading --list-prefix --list-submodules --no-aliases --no-deps --no-dotenv --no-highlight --one --quiet --allow-missing --set --shell --shell-arg --shell-command --tempdir --timestamp --timestamp-format --unsorted --unstable --verbose --working-directory --yes --changelog --choose --command --completions --dump --edit --evaluate --fmt --groups --init --list --man --request --show --summary --usage --variables --help --version [ARGUMENTS]..."
|
||||
if [[ ${cur} == -* ]] ; then
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
|
||||
return 0
|
||||
else
|
||||
local recipes=$(just --summary 2> /dev/null)
|
||||
|
||||
if echo "${cur}" | \grep -qF '/'; then
|
||||
local path_prefix=$(echo "${cur}" | sed 's/[/][^/]*$/\//')
|
||||
local recipes=$(just --summary 2> /dev/null -- "${path_prefix}")
|
||||
local recipes=$(printf "${path_prefix}%s\t" $recipes)
|
||||
fi
|
||||
|
||||
if [[ $? -eq 0 ]]; then
|
||||
COMPREPLY=( $(compgen -W "${recipes}" -- "${cur}") )
|
||||
if type __ltrim_colon_completions &>/dev/null; then
|
||||
__ltrim_colon_completions "$cur"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
case "${prev}" in
|
||||
--alias-style)
|
||||
COMPREPLY=($(compgen -W "left right separate" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--ceiling)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--chooser)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--color)
|
||||
COMPREPLY=($(compgen -W "always auto never" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--command-color)
|
||||
COMPREPLY=($(compgen -W "black blue cyan green purple red yellow" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--cygpath)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--dotenv-filename)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--dotenv-path)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-E)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--dump-format)
|
||||
COMPREPLY=($(compgen -W "json just" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--justfile)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-f)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--list-heading)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--list-prefix)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--set)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--shell)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--shell-arg)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--tempdir)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--timestamp-format)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--working-directory)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-d)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--command)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-c)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--completions)
|
||||
COMPREPLY=($(compgen -W "bash elvish fish nushell powershell zsh" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--list)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-l)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--request)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--show)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-s)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--usage)
|
||||
COMPREPLY=($(compgen -f "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
COMPREPLY=()
|
||||
;;
|
||||
esac
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
if [[ "${BASH_VERSINFO[0]}" -eq 4 && "${BASH_VERSINFO[1]}" -ge 4 || "${BASH_VERSINFO[0]}" -gt 4 ]]; then
|
||||
complete -F _just -o nosort -o bashdefault -o default just
|
||||
else
|
||||
complete -F _just -o bashdefault -o default just
|
||||
fi
|
||||
@ -1,94 +0,0 @@
|
||||
use builtin;
|
||||
use str;
|
||||
|
||||
set edit:completion:arg-completer[just] = {|@words|
|
||||
fn spaces {|n|
|
||||
builtin:repeat $n ' ' | str:join ''
|
||||
}
|
||||
fn cand {|text desc|
|
||||
edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc
|
||||
}
|
||||
var command = 'just'
|
||||
for word $words[1..-1] {
|
||||
if (str:has-prefix $word '-') {
|
||||
break
|
||||
}
|
||||
set command = $command';'$word
|
||||
}
|
||||
var completions = [
|
||||
&'just'= {
|
||||
cand --alias-style 'Set list command alias display style'
|
||||
cand --ceiling 'Do not ascend above <CEILING> directory when searching for a justfile.'
|
||||
cand --chooser 'Override binary invoked by `--choose`'
|
||||
cand --color 'Print colorful output'
|
||||
cand --command-color 'Echo recipe lines in <COMMAND-COLOR>'
|
||||
cand --cygpath 'Use binary at <CYGPATH> to convert between unix and Windows paths.'
|
||||
cand --dotenv-filename 'Search for environment file named <DOTENV-FILENAME> instead of `.env`'
|
||||
cand -E 'Load <DOTENV-PATH> as environment file instead of searching for one'
|
||||
cand --dotenv-path 'Load <DOTENV-PATH> as environment file instead of searching for one'
|
||||
cand --dump-format 'Dump justfile as <FORMAT>'
|
||||
cand -f 'Use <JUSTFILE> as justfile'
|
||||
cand --justfile 'Use <JUSTFILE> as justfile'
|
||||
cand --list-heading 'Print <TEXT> before list'
|
||||
cand --list-prefix 'Print <TEXT> before each list item'
|
||||
cand --set 'Override <VARIABLE> with <VALUE>'
|
||||
cand --shell 'Invoke <SHELL> to run recipes'
|
||||
cand --shell-arg 'Invoke shell with <SHELL-ARG> as an argument'
|
||||
cand --tempdir 'Save temporary files to <TEMPDIR>.'
|
||||
cand --timestamp-format 'Timestamp format string'
|
||||
cand -d 'Use <WORKING-DIRECTORY> as working directory. --justfile must also be set'
|
||||
cand --working-directory 'Use <WORKING-DIRECTORY> as working directory. --justfile must also be set'
|
||||
cand -c 'Run an arbitrary command with the working directory, `.env`, overrides, and exports set'
|
||||
cand --command 'Run an arbitrary command with the working directory, `.env`, overrides, and exports set'
|
||||
cand --completions 'Print shell completion script for <SHELL>'
|
||||
cand -l 'List available recipes in <MODULE> or root if omitted'
|
||||
cand --list 'List available recipes in <MODULE> or root if omitted'
|
||||
cand --request 'Execute <REQUEST>. For internal testing purposes only. May be changed or removed at any time.'
|
||||
cand -s 'Show recipe at <PATH>'
|
||||
cand --show 'Show recipe at <PATH>'
|
||||
cand --usage 'Print recipe usage information'
|
||||
cand --check 'Run `--fmt` in ''check'' mode. Exits with 0 if justfile is formatted correctly. Exits with 1 and prints a diff if formatting is required.'
|
||||
cand --clear-shell-args 'Clear shell arguments'
|
||||
cand -n 'Print what just would do without doing it'
|
||||
cand --dry-run 'Print what just would do without doing it'
|
||||
cand --explain 'Print recipe doc comment before running it'
|
||||
cand -g 'Use global justfile'
|
||||
cand --global-justfile 'Use global justfile'
|
||||
cand --highlight 'Highlight echoed recipe lines in bold'
|
||||
cand --list-submodules 'List recipes in submodules'
|
||||
cand --no-aliases 'Don''t show aliases in list'
|
||||
cand --no-deps 'Don''t run recipe dependencies'
|
||||
cand --no-dotenv 'Don''t load `.env` file'
|
||||
cand --no-highlight 'Don''t highlight echoed recipe lines in bold'
|
||||
cand --one 'Forbid multiple recipes from being invoked on the command line'
|
||||
cand -q 'Suppress all output'
|
||||
cand --quiet 'Suppress all output'
|
||||
cand --allow-missing 'Ignore missing recipe and module errors'
|
||||
cand --shell-command 'Invoke <COMMAND> with the shell used to run recipe lines and backticks'
|
||||
cand --timestamp 'Print recipe command timestamps'
|
||||
cand -u 'Return list and summary entries in source order'
|
||||
cand --unsorted 'Return list and summary entries in source order'
|
||||
cand --unstable 'Enable unstable features'
|
||||
cand -v 'Use verbose output'
|
||||
cand --verbose 'Use verbose output'
|
||||
cand --yes 'Automatically confirm all recipes.'
|
||||
cand --changelog 'Print changelog'
|
||||
cand --choose 'Select one or more recipes to run using a binary chooser. If `--chooser` is not passed the chooser defaults to the value of $JUST_CHOOSER, falling back to `fzf`'
|
||||
cand --dump 'Print justfile'
|
||||
cand -e 'Edit justfile with editor given by $VISUAL or $EDITOR, falling back to `vim`'
|
||||
cand --edit 'Edit justfile with editor given by $VISUAL or $EDITOR, falling back to `vim`'
|
||||
cand --evaluate 'Evaluate and print all variables. If a variable name is given as an argument, only print that variable''s value.'
|
||||
cand --fmt 'Format and overwrite justfile'
|
||||
cand --groups 'List recipe groups'
|
||||
cand --init 'Initialize new justfile in project root'
|
||||
cand --man 'Print man page'
|
||||
cand --summary 'List names of available recipes'
|
||||
cand --variables 'List names of variables'
|
||||
cand -h 'Print help'
|
||||
cand --help 'Print help'
|
||||
cand -V 'Print version'
|
||||
cand --version 'Print version'
|
||||
}
|
||||
]
|
||||
$completions[$command]
|
||||
}
|
||||
@ -1,87 +0,0 @@
|
||||
function __fish_just_complete_recipes
|
||||
if string match -rq '(-f|--justfile)\s*=?(?<justfile>[^\s]+)' -- (string split -- ' -- ' (commandline -pc))[1]
|
||||
set -fx JUST_JUSTFILE "$justfile"
|
||||
end
|
||||
printf "%s\n" (string split " " (just --summary))
|
||||
end
|
||||
|
||||
# don't suggest files right off
|
||||
complete -c just -n "__fish_is_first_arg" --no-files
|
||||
|
||||
# complete recipes
|
||||
complete -c just -a '(__fish_just_complete_recipes)'
|
||||
|
||||
# autogenerated completions
|
||||
complete -c just -l alias-style -d 'Set list command alias display style' -r -f -a "left\t''
|
||||
right\t''
|
||||
separate\t''"
|
||||
complete -c just -l ceiling -d 'Do not ascend above <CEILING> directory when searching for a justfile.' -r -F
|
||||
complete -c just -l chooser -d 'Override binary invoked by `--choose`' -r
|
||||
complete -c just -l color -d 'Print colorful output' -r -f -a "always\t''
|
||||
auto\t''
|
||||
never\t''"
|
||||
complete -c just -l command-color -d 'Echo recipe lines in <COMMAND-COLOR>' -r -f -a "black\t''
|
||||
blue\t''
|
||||
cyan\t''
|
||||
green\t''
|
||||
purple\t''
|
||||
red\t''
|
||||
yellow\t''"
|
||||
complete -c just -l cygpath -d 'Use binary at <CYGPATH> to convert between unix and Windows paths.' -r -F
|
||||
complete -c just -l dotenv-filename -d 'Search for environment file named <DOTENV-FILENAME> instead of `.env`' -r
|
||||
complete -c just -s E -l dotenv-path -d 'Load <DOTENV-PATH> as environment file instead of searching for one' -r -F
|
||||
complete -c just -l dump-format -d 'Dump justfile as <FORMAT>' -r -f -a "json\t''
|
||||
just\t''"
|
||||
complete -c just -s f -l justfile -d 'Use <JUSTFILE> as justfile' -r -F
|
||||
complete -c just -l list-heading -d 'Print <TEXT> before list' -r
|
||||
complete -c just -l list-prefix -d 'Print <TEXT> before each list item' -r
|
||||
complete -c just -l set -d 'Override <VARIABLE> with <VALUE>' -r
|
||||
complete -c just -l shell -d 'Invoke <SHELL> to run recipes' -r
|
||||
complete -c just -l shell-arg -d 'Invoke shell with <SHELL-ARG> as an argument' -r
|
||||
complete -c just -l tempdir -d 'Save temporary files to <TEMPDIR>.' -r -F
|
||||
complete -c just -l timestamp-format -d 'Timestamp format string' -r
|
||||
complete -c just -s d -l working-directory -d 'Use <WORKING-DIRECTORY> as working directory. --justfile must also be set' -r -F
|
||||
complete -c just -s c -l command -d 'Run an arbitrary command with the working directory, `.env`, overrides, and exports set' -r
|
||||
complete -c just -l completions -d 'Print shell completion script for <SHELL>' -r -f -a "bash\t''
|
||||
elvish\t''
|
||||
fish\t''
|
||||
nushell\t''
|
||||
powershell\t''
|
||||
zsh\t''"
|
||||
complete -c just -s l -l list -d 'List available recipes in <MODULE> or root if omitted' -r
|
||||
complete -c just -l request -d 'Execute <REQUEST>. For internal testing purposes only. May be changed or removed at any time.' -r
|
||||
complete -c just -s s -l show -d 'Show recipe at <PATH>' -r
|
||||
complete -c just -l usage -d 'Print recipe usage information' -r
|
||||
complete -c just -l check -d 'Run `--fmt` in \'check\' mode. Exits with 0 if justfile is formatted correctly. Exits with 1 and prints a diff if formatting is required.'
|
||||
complete -c just -l clear-shell-args -d 'Clear shell arguments'
|
||||
complete -c just -s n -l dry-run -d 'Print what just would do without doing it'
|
||||
complete -c just -l explain -d 'Print recipe doc comment before running it'
|
||||
complete -c just -s g -l global-justfile -d 'Use global justfile'
|
||||
complete -c just -l highlight -d 'Highlight echoed recipe lines in bold'
|
||||
complete -c just -l list-submodules -d 'List recipes in submodules'
|
||||
complete -c just -l no-aliases -d 'Don\'t show aliases in list'
|
||||
complete -c just -l no-deps -d 'Don\'t run recipe dependencies'
|
||||
complete -c just -l no-dotenv -d 'Don\'t load `.env` file'
|
||||
complete -c just -l no-highlight -d 'Don\'t highlight echoed recipe lines in bold'
|
||||
complete -c just -l one -d 'Forbid multiple recipes from being invoked on the command line'
|
||||
complete -c just -s q -l quiet -d 'Suppress all output'
|
||||
complete -c just -l allow-missing -d 'Ignore missing recipe and module errors'
|
||||
complete -c just -l shell-command -d 'Invoke <COMMAND> with the shell used to run recipe lines and backticks'
|
||||
complete -c just -l timestamp -d 'Print recipe command timestamps'
|
||||
complete -c just -s u -l unsorted -d 'Return list and summary entries in source order'
|
||||
complete -c just -l unstable -d 'Enable unstable features'
|
||||
complete -c just -s v -l verbose -d 'Use verbose output'
|
||||
complete -c just -l yes -d 'Automatically confirm all recipes.'
|
||||
complete -c just -l changelog -d 'Print changelog'
|
||||
complete -c just -l choose -d 'Select one or more recipes to run using a binary chooser. If `--chooser` is not passed the chooser defaults to the value of $JUST_CHOOSER, falling back to `fzf`'
|
||||
complete -c just -l dump -d 'Print justfile'
|
||||
complete -c just -s e -l edit -d 'Edit justfile with editor given by $VISUAL or $EDITOR, falling back to `vim`'
|
||||
complete -c just -l evaluate -d 'Evaluate and print all variables. If a variable name is given as an argument, only print that variable\'s value.'
|
||||
complete -c just -l fmt -d 'Format and overwrite justfile'
|
||||
complete -c just -l groups -d 'List recipe groups'
|
||||
complete -c just -l init -d 'Initialize new justfile in project root'
|
||||
complete -c just -l man -d 'Print man page'
|
||||
complete -c just -l summary -d 'List names of available recipes'
|
||||
complete -c just -l variables -d 'List names of variables'
|
||||
complete -c just -s h -l help -d 'Print help'
|
||||
complete -c just -s V -l version -d 'Print version'
|
||||
@ -1,8 +0,0 @@
|
||||
def "nu-complete just" [] {
|
||||
(^just --dump --unstable --dump-format json | from json).recipes | transpose recipe data | flatten | where {|row| $row.private == false } | select recipe doc parameters | rename value description
|
||||
}
|
||||
|
||||
# Just: A Command Runner
|
||||
export extern "just" [
|
||||
...recipe: string@"nu-complete just", # Recipe(s) to run, may be with argument(s)
|
||||
]
|
||||
@ -1,120 +0,0 @@
|
||||
using namespace System.Management.Automation
|
||||
using namespace System.Management.Automation.Language
|
||||
|
||||
Register-ArgumentCompleter -Native -CommandName 'just' -ScriptBlock {
|
||||
param($wordToComplete, $commandAst, $cursorPosition)
|
||||
|
||||
$commandElements = $commandAst.CommandElements
|
||||
$command = @(
|
||||
'just'
|
||||
for ($i = 1; $i -lt $commandElements.Count; $i++) {
|
||||
$element = $commandElements[$i]
|
||||
if ($element -isnot [StringConstantExpressionAst] -or
|
||||
$element.StringConstantType -ne [StringConstantType]::BareWord -or
|
||||
$element.Value.StartsWith('-') -or
|
||||
$element.Value -eq $wordToComplete) {
|
||||
break
|
||||
}
|
||||
$element.Value
|
||||
}) -join ';'
|
||||
|
||||
$completions = @(switch ($command) {
|
||||
'just' {
|
||||
[CompletionResult]::new('--alias-style', '--alias-style', [CompletionResultType]::ParameterName, 'Set list command alias display style')
|
||||
[CompletionResult]::new('--ceiling', '--ceiling', [CompletionResultType]::ParameterName, 'Do not ascend above <CEILING> directory when searching for a justfile.')
|
||||
[CompletionResult]::new('--chooser', '--chooser', [CompletionResultType]::ParameterName, 'Override binary invoked by `--choose`')
|
||||
[CompletionResult]::new('--color', '--color', [CompletionResultType]::ParameterName, 'Print colorful output')
|
||||
[CompletionResult]::new('--command-color', '--command-color', [CompletionResultType]::ParameterName, 'Echo recipe lines in <COMMAND-COLOR>')
|
||||
[CompletionResult]::new('--cygpath', '--cygpath', [CompletionResultType]::ParameterName, 'Use binary at <CYGPATH> to convert between unix and Windows paths.')
|
||||
[CompletionResult]::new('--dotenv-filename', '--dotenv-filename', [CompletionResultType]::ParameterName, 'Search for environment file named <DOTENV-FILENAME> instead of `.env`')
|
||||
[CompletionResult]::new('-E', '-E ', [CompletionResultType]::ParameterName, 'Load <DOTENV-PATH> as environment file instead of searching for one')
|
||||
[CompletionResult]::new('--dotenv-path', '--dotenv-path', [CompletionResultType]::ParameterName, 'Load <DOTENV-PATH> as environment file instead of searching for one')
|
||||
[CompletionResult]::new('--dump-format', '--dump-format', [CompletionResultType]::ParameterName, 'Dump justfile as <FORMAT>')
|
||||
[CompletionResult]::new('-f', '-f', [CompletionResultType]::ParameterName, 'Use <JUSTFILE> as justfile')
|
||||
[CompletionResult]::new('--justfile', '--justfile', [CompletionResultType]::ParameterName, 'Use <JUSTFILE> as justfile')
|
||||
[CompletionResult]::new('--list-heading', '--list-heading', [CompletionResultType]::ParameterName, 'Print <TEXT> before list')
|
||||
[CompletionResult]::new('--list-prefix', '--list-prefix', [CompletionResultType]::ParameterName, 'Print <TEXT> before each list item')
|
||||
[CompletionResult]::new('--set', '--set', [CompletionResultType]::ParameterName, 'Override <VARIABLE> with <VALUE>')
|
||||
[CompletionResult]::new('--shell', '--shell', [CompletionResultType]::ParameterName, 'Invoke <SHELL> to run recipes')
|
||||
[CompletionResult]::new('--shell-arg', '--shell-arg', [CompletionResultType]::ParameterName, 'Invoke shell with <SHELL-ARG> as an argument')
|
||||
[CompletionResult]::new('--tempdir', '--tempdir', [CompletionResultType]::ParameterName, 'Save temporary files to <TEMPDIR>.')
|
||||
[CompletionResult]::new('--timestamp-format', '--timestamp-format', [CompletionResultType]::ParameterName, 'Timestamp format string')
|
||||
[CompletionResult]::new('-d', '-d', [CompletionResultType]::ParameterName, 'Use <WORKING-DIRECTORY> as working directory. --justfile must also be set')
|
||||
[CompletionResult]::new('--working-directory', '--working-directory', [CompletionResultType]::ParameterName, 'Use <WORKING-DIRECTORY> as working directory. --justfile must also be set')
|
||||
[CompletionResult]::new('-c', '-c', [CompletionResultType]::ParameterName, 'Run an arbitrary command with the working directory, `.env`, overrides, and exports set')
|
||||
[CompletionResult]::new('--command', '--command', [CompletionResultType]::ParameterName, 'Run an arbitrary command with the working directory, `.env`, overrides, and exports set')
|
||||
[CompletionResult]::new('--completions', '--completions', [CompletionResultType]::ParameterName, 'Print shell completion script for <SHELL>')
|
||||
[CompletionResult]::new('-l', '-l', [CompletionResultType]::ParameterName, 'List available recipes in <MODULE> or root if omitted')
|
||||
[CompletionResult]::new('--list', '--list', [CompletionResultType]::ParameterName, 'List available recipes in <MODULE> or root if omitted')
|
||||
[CompletionResult]::new('--request', '--request', [CompletionResultType]::ParameterName, 'Execute <REQUEST>. For internal testing purposes only. May be changed or removed at any time.')
|
||||
[CompletionResult]::new('-s', '-s', [CompletionResultType]::ParameterName, 'Show recipe at <PATH>')
|
||||
[CompletionResult]::new('--show', '--show', [CompletionResultType]::ParameterName, 'Show recipe at <PATH>')
|
||||
[CompletionResult]::new('--usage', '--usage', [CompletionResultType]::ParameterName, 'Print recipe usage information')
|
||||
[CompletionResult]::new('--check', '--check', [CompletionResultType]::ParameterName, 'Run `--fmt` in ''check'' mode. Exits with 0 if justfile is formatted correctly. Exits with 1 and prints a diff if formatting is required.')
|
||||
[CompletionResult]::new('--clear-shell-args', '--clear-shell-args', [CompletionResultType]::ParameterName, 'Clear shell arguments')
|
||||
[CompletionResult]::new('-n', '-n', [CompletionResultType]::ParameterName, 'Print what just would do without doing it')
|
||||
[CompletionResult]::new('--dry-run', '--dry-run', [CompletionResultType]::ParameterName, 'Print what just would do without doing it')
|
||||
[CompletionResult]::new('--explain', '--explain', [CompletionResultType]::ParameterName, 'Print recipe doc comment before running it')
|
||||
[CompletionResult]::new('-g', '-g', [CompletionResultType]::ParameterName, 'Use global justfile')
|
||||
[CompletionResult]::new('--global-justfile', '--global-justfile', [CompletionResultType]::ParameterName, 'Use global justfile')
|
||||
[CompletionResult]::new('--highlight', '--highlight', [CompletionResultType]::ParameterName, 'Highlight echoed recipe lines in bold')
|
||||
[CompletionResult]::new('--list-submodules', '--list-submodules', [CompletionResultType]::ParameterName, 'List recipes in submodules')
|
||||
[CompletionResult]::new('--no-aliases', '--no-aliases', [CompletionResultType]::ParameterName, 'Don''t show aliases in list')
|
||||
[CompletionResult]::new('--no-deps', '--no-deps', [CompletionResultType]::ParameterName, 'Don''t run recipe dependencies')
|
||||
[CompletionResult]::new('--no-dotenv', '--no-dotenv', [CompletionResultType]::ParameterName, 'Don''t load `.env` file')
|
||||
[CompletionResult]::new('--no-highlight', '--no-highlight', [CompletionResultType]::ParameterName, 'Don''t highlight echoed recipe lines in bold')
|
||||
[CompletionResult]::new('--one', '--one', [CompletionResultType]::ParameterName, 'Forbid multiple recipes from being invoked on the command line')
|
||||
[CompletionResult]::new('-q', '-q', [CompletionResultType]::ParameterName, 'Suppress all output')
|
||||
[CompletionResult]::new('--quiet', '--quiet', [CompletionResultType]::ParameterName, 'Suppress all output')
|
||||
[CompletionResult]::new('--allow-missing', '--allow-missing', [CompletionResultType]::ParameterName, 'Ignore missing recipe and module errors')
|
||||
[CompletionResult]::new('--shell-command', '--shell-command', [CompletionResultType]::ParameterName, 'Invoke <COMMAND> with the shell used to run recipe lines and backticks')
|
||||
[CompletionResult]::new('--timestamp', '--timestamp', [CompletionResultType]::ParameterName, 'Print recipe command timestamps')
|
||||
[CompletionResult]::new('-u', '-u', [CompletionResultType]::ParameterName, 'Return list and summary entries in source order')
|
||||
[CompletionResult]::new('--unsorted', '--unsorted', [CompletionResultType]::ParameterName, 'Return list and summary entries in source order')
|
||||
[CompletionResult]::new('--unstable', '--unstable', [CompletionResultType]::ParameterName, 'Enable unstable features')
|
||||
[CompletionResult]::new('-v', '-v', [CompletionResultType]::ParameterName, 'Use verbose output')
|
||||
[CompletionResult]::new('--verbose', '--verbose', [CompletionResultType]::ParameterName, 'Use verbose output')
|
||||
[CompletionResult]::new('--yes', '--yes', [CompletionResultType]::ParameterName, 'Automatically confirm all recipes.')
|
||||
[CompletionResult]::new('--changelog', '--changelog', [CompletionResultType]::ParameterName, 'Print changelog')
|
||||
[CompletionResult]::new('--choose', '--choose', [CompletionResultType]::ParameterName, 'Select one or more recipes to run using a binary chooser. If `--chooser` is not passed the chooser defaults to the value of $JUST_CHOOSER, falling back to `fzf`')
|
||||
[CompletionResult]::new('--dump', '--dump', [CompletionResultType]::ParameterName, 'Print justfile')
|
||||
[CompletionResult]::new('-e', '-e', [CompletionResultType]::ParameterName, 'Edit justfile with editor given by $VISUAL or $EDITOR, falling back to `vim`')
|
||||
[CompletionResult]::new('--edit', '--edit', [CompletionResultType]::ParameterName, 'Edit justfile with editor given by $VISUAL or $EDITOR, falling back to `vim`')
|
||||
[CompletionResult]::new('--evaluate', '--evaluate', [CompletionResultType]::ParameterName, 'Evaluate and print all variables. If a variable name is given as an argument, only print that variable''s value.')
|
||||
[CompletionResult]::new('--fmt', '--fmt', [CompletionResultType]::ParameterName, 'Format and overwrite justfile')
|
||||
[CompletionResult]::new('--groups', '--groups', [CompletionResultType]::ParameterName, 'List recipe groups')
|
||||
[CompletionResult]::new('--init', '--init', [CompletionResultType]::ParameterName, 'Initialize new justfile in project root')
|
||||
[CompletionResult]::new('--man', '--man', [CompletionResultType]::ParameterName, 'Print man page')
|
||||
[CompletionResult]::new('--summary', '--summary', [CompletionResultType]::ParameterName, 'List names of available recipes')
|
||||
[CompletionResult]::new('--variables', '--variables', [CompletionResultType]::ParameterName, 'List names of variables')
|
||||
[CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')
|
||||
[CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')
|
||||
[CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')
|
||||
[CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')
|
||||
break
|
||||
}
|
||||
})
|
||||
|
||||
function Get-JustFileRecipes([string[]]$CommandElements) {
|
||||
$justFileIndex = $commandElements.IndexOf("--justfile");
|
||||
|
||||
if ($justFileIndex -ne -1 -and $justFileIndex + 1 -le $commandElements.Length) {
|
||||
$justFileLocation = $commandElements[$justFileIndex + 1]
|
||||
}
|
||||
|
||||
$justArgs = @("--summary")
|
||||
|
||||
if (Test-Path $justFileLocation) {
|
||||
$justArgs += @("--justfile", $justFileLocation)
|
||||
}
|
||||
|
||||
$recipes = $(just @justArgs) -split ' '
|
||||
return $recipes | ForEach-Object { [CompletionResult]::new($_) }
|
||||
}
|
||||
|
||||
$elementValues = $commandElements | Select-Object -ExpandProperty Value
|
||||
$recipes = Get-JustFileRecipes -CommandElements $elementValues
|
||||
$completions += $recipes
|
||||
$completions.Where{ $_.CompletionText -like "$wordToComplete*" } |
|
||||
Sort-Object -Property ListItemText
|
||||
}
|
||||
@ -1,181 +0,0 @@
|
||||
#compdef just
|
||||
|
||||
autoload -U is-at-least
|
||||
|
||||
_just() {
|
||||
typeset -A opt_args
|
||||
typeset -a _arguments_options
|
||||
local ret=1
|
||||
|
||||
if is-at-least 5.2; then
|
||||
_arguments_options=(-s -S -C)
|
||||
else
|
||||
_arguments_options=(-s -C)
|
||||
fi
|
||||
|
||||
local context curcontext="$curcontext" state line
|
||||
local common=(
|
||||
'(--no-aliases)--alias-style=[Set list command alias display style]: :(left right separate)' \
|
||||
'--ceiling=[Do not ascend above <CEILING> directory when searching for a justfile.]: :_files' \
|
||||
'--chooser=[Override binary invoked by \`--choose\`]: :_default' \
|
||||
'--color=[Print colorful output]: :(always auto never)' \
|
||||
'--command-color=[Echo recipe lines in <COMMAND-COLOR>]: :(black blue cyan green purple red yellow)' \
|
||||
'--cygpath=[Use binary at <CYGPATH> to convert between unix and Windows paths.]: :_files' \
|
||||
'(-E --dotenv-path)--dotenv-filename=[Search for environment file named <DOTENV-FILENAME> instead of \`.env\`]: :_default' \
|
||||
'-E+[Load <DOTENV-PATH> as environment file instead of searching for one]: :_files' \
|
||||
'--dotenv-path=[Load <DOTENV-PATH> as environment file instead of searching for one]: :_files' \
|
||||
'--dump-format=[Dump justfile as <FORMAT>]:FORMAT:(json just)' \
|
||||
'-f+[Use <JUSTFILE> as justfile]: :_files' \
|
||||
'--justfile=[Use <JUSTFILE> as justfile]: :_files' \
|
||||
'--list-heading=[Print <TEXT> before list]:TEXT:_default' \
|
||||
'--list-prefix=[Print <TEXT> before each list item]:TEXT:_default' \
|
||||
'*--set=[Override <VARIABLE> with <VALUE>]: :(_just_variables)' \
|
||||
'--shell=[Invoke <SHELL> to run recipes]: :_default' \
|
||||
'*--shell-arg=[Invoke shell with <SHELL-ARG> as an argument]: :_default' \
|
||||
'--tempdir=[Save temporary files to <TEMPDIR>.]: :_files' \
|
||||
'--timestamp-format=[Timestamp format string]: :_default' \
|
||||
'-d+[Use <WORKING-DIRECTORY> as working directory. --justfile must also be set]: :_files' \
|
||||
'--working-directory=[Use <WORKING-DIRECTORY> as working directory. --justfile must also be set]: :_files' \
|
||||
'*-c+[Run an arbitrary command with the working directory, \`.env\`, overrides, and exports set]: :_default' \
|
||||
'*--command=[Run an arbitrary command with the working directory, \`.env\`, overrides, and exports set]: :_default' \
|
||||
'--completions=[Print shell completion script for <SHELL>]:SHELL:(bash elvish fish nushell powershell zsh)' \
|
||||
'()-l+[List available recipes in <MODULE> or root if omitted]' \
|
||||
'()--list=[List available recipes in <MODULE> or root if omitted]' \
|
||||
'--request=[Execute <REQUEST>. For internal testing purposes only. May be changed or removed at any time.]: :_default' \
|
||||
'-s+[Show recipe at <PATH>]: :(_just_commands)' \
|
||||
'--show=[Show recipe at <PATH>]: :(_just_commands)' \
|
||||
'()--usage=[Print recipe usage information]:PATH:_default' \
|
||||
'--check[Run \`--fmt\` in '\''check'\'' mode. Exits with 0 if justfile is formatted correctly. Exits with 1 and prints a diff if formatting is required.]' \
|
||||
'--clear-shell-args[Clear shell arguments]' \
|
||||
'(-q --quiet)-n[Print what just would do without doing it]' \
|
||||
'(-q --quiet)--dry-run[Print what just would do without doing it]' \
|
||||
'--explain[Print recipe doc comment before running it]' \
|
||||
'(-f --justfile -d --working-directory)-g[Use global justfile]' \
|
||||
'(-f --justfile -d --working-directory)--global-justfile[Use global justfile]' \
|
||||
'--highlight[Highlight echoed recipe lines in bold]' \
|
||||
'--list-submodules[List recipes in submodules]' \
|
||||
'--no-aliases[Don'\''t show aliases in list]' \
|
||||
'--no-deps[Don'\''t run recipe dependencies]' \
|
||||
'--no-dotenv[Don'\''t load \`.env\` file]' \
|
||||
'--no-highlight[Don'\''t highlight echoed recipe lines in bold]' \
|
||||
'--one[Forbid multiple recipes from being invoked on the command line]' \
|
||||
'(-n --dry-run)-q[Suppress all output]' \
|
||||
'(-n --dry-run)--quiet[Suppress all output]' \
|
||||
'--allow-missing[Ignore missing recipe and module errors]' \
|
||||
'--shell-command[Invoke <COMMAND> with the shell used to run recipe lines and backticks]' \
|
||||
'--timestamp[Print recipe command timestamps]' \
|
||||
'-u[Return list and summary entries in source order]' \
|
||||
'--unsorted[Return list and summary entries in source order]' \
|
||||
'--unstable[Enable unstable features]' \
|
||||
'*-v[Use verbose output]' \
|
||||
'*--verbose[Use verbose output]' \
|
||||
'--yes[Automatically confirm all recipes.]' \
|
||||
'--changelog[Print changelog]' \
|
||||
'--choose[Select one or more recipes to run using a binary chooser. If \`--chooser\` is not passed the chooser defaults to the value of \$JUST_CHOOSER, falling back to \`fzf\`]' \
|
||||
'--dump[Print justfile]' \
|
||||
'-e[Edit justfile with editor given by \$VISUAL or \$EDITOR, falling back to \`vim\`]' \
|
||||
'--edit[Edit justfile with editor given by \$VISUAL or \$EDITOR, falling back to \`vim\`]' \
|
||||
'--evaluate[Evaluate and print all variables. If a variable name is given as an argument, only print that variable'\''s value.]' \
|
||||
'--fmt[Format and overwrite justfile]' \
|
||||
'--groups[List recipe groups]' \
|
||||
'--init[Initialize new justfile in project root]' \
|
||||
'--man[Print man page]' \
|
||||
'--summary[List names of available recipes]' \
|
||||
'--variables[List names of variables]' \
|
||||
'-h[Print help]' \
|
||||
'--help[Print help]' \
|
||||
'-V[Print version]' \
|
||||
'--version[Print version]' \
|
||||
)
|
||||
|
||||
_arguments "${_arguments_options[@]}" $common \
|
||||
'1: :_just_commands' \
|
||||
'*: :->args' \
|
||||
&& ret=0
|
||||
|
||||
case $state in
|
||||
args)
|
||||
curcontext="${curcontext%:*}-${words[2]}:"
|
||||
|
||||
local lastarg=${words[${#words}]}
|
||||
local recipe
|
||||
|
||||
local cmds; cmds=(
|
||||
${(s: :)$(_call_program commands just --summary)}
|
||||
)
|
||||
|
||||
# Find first recipe name
|
||||
for ((i = 2; i < $#words; i++ )) do
|
||||
if [[ ${cmds[(I)${words[i]}]} -gt 0 ]]; then
|
||||
recipe=${words[i]}
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ $lastarg = */* ]]; then
|
||||
# Arguments contain slash would be recognised as a file
|
||||
_arguments -s -S $common '*:: :_files'
|
||||
elif [[ $lastarg = *=* ]]; then
|
||||
# Arguments contain equal would be recognised as a variable
|
||||
_message "value"
|
||||
elif [[ $recipe ]]; then
|
||||
# Show usage message
|
||||
_message "`just --show $recipe`"
|
||||
# Or complete with other commands
|
||||
#_arguments -s -S $common '*:: :_just_commands'
|
||||
else
|
||||
_arguments -s -S $common '*:: :_just_commands'
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
return ret
|
||||
|
||||
}
|
||||
|
||||
(( $+functions[_just_commands] )) ||
|
||||
_just_commands() {
|
||||
[[ $PREFIX = -* ]] && return 1
|
||||
integer ret=1
|
||||
local variables; variables=(
|
||||
${(s: :)$(_call_program commands just --variables)}
|
||||
)
|
||||
local commands; commands=(
|
||||
${${${(M)"${(f)$(_call_program commands just --list)}":# *}/ ##/}/ ##/:Args: }
|
||||
)
|
||||
|
||||
if compset -P '*='; then
|
||||
case "${${words[-1]%=*}#*=}" in
|
||||
*) _message 'value' && ret=0 ;;
|
||||
esac
|
||||
else
|
||||
_describe -t variables 'variables' variables -qS "=" && ret=0
|
||||
_describe -t commands 'just commands' commands "$@"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
if [ "$funcstack[1]" = "_just" ]; then
|
||||
(( $+functions[_just_variables] )) ||
|
||||
_just_variables() {
|
||||
[[ $PREFIX = -* ]] && return 1
|
||||
integer ret=1
|
||||
local variables; variables=(
|
||||
${(s: :)$(_call_program commands just --variables)}
|
||||
)
|
||||
|
||||
if compset -P '*='; then
|
||||
case "${${words[-1]%=*}#*=}" in
|
||||
*) _message 'value' && ret=0 ;;
|
||||
esac
|
||||
else
|
||||
_describe -t variables 'variables' variables && ret=0
|
||||
fi
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
_just "$@"
|
||||
else
|
||||
compdef _just just
|
||||
fi
|
||||
BIN
just-bin/just
(Stored with Git LFS)
BIN
just-bin/just
(Stored with Git LFS)
Binary file not shown.
294
just-bin/just.1
294
just-bin/just.1
@ -1,294 +0,0 @@
|
||||
.ie \n(.g .ds Aq \(aq
|
||||
.el .ds Aq '
|
||||
.TH just 1 "just 1.46.0"
|
||||
.SH NAME
|
||||
just \- 🤖 Just a command runner \- https://github.com/casey/just
|
||||
.SH SYNOPSIS
|
||||
\fBjust\fR [\fB\-\-alias\-style\fR] [\fB\-\-ceiling\fR] [\fB\-\-check\fR] [\fB\-\-chooser\fR] [\fB\-\-clear\-shell\-args\fR] [\fB\-\-color\fR] [\fB\-\-command\-color\fR] [\fB\-\-cygpath\fR] [\fB\-\-dotenv\-filename\fR] [\fB\-E\fR|\fB\-\-dotenv\-path\fR] [\fB\-n\fR|\fB\-\-dry\-run\fR] [\fB\-\-dump\-format\fR] [\fB\-\-explain\fR] [\fB\-g\fR|\fB\-\-global\-justfile\fR] [\fB\-\-highlight\fR] [\fB\-f\fR|\fB\-\-justfile\fR] [\fB\-\-list\-heading\fR] [\fB\-\-list\-prefix\fR] [\fB\-\-list\-submodules\fR] [\fB\-\-no\-aliases\fR] [\fB\-\-no\-deps\fR] [\fB\-\-no\-dotenv\fR] [\fB\-\-no\-highlight\fR] [\fB\-\-one\fR] [\fB\-q\fR|\fB\-\-quiet\fR] [\fB\-\-allow\-missing\fR] [\fB\-\-set\fR] [\fB\-\-shell\fR] [\fB\-\-shell\-arg\fR] [\fB\-\-shell\-command\fR] [\fB\-\-tempdir\fR] [\fB\-\-timestamp\fR] [\fB\-\-timestamp\-format\fR] [\fB\-u\fR|\fB\-\-unsorted\fR] [\fB\-\-unstable\fR] [\fB\-v\fR|\fB\-\-verbose\fR]... [\fB\-d\fR|\fB\-\-working\-directory\fR] [\fB\-\-yes\fR] [\fB\-\-changelog\fR] [\fB\-\-choose\fR] [\fB\-c\fR|\fB\-\-command\fR] [\fB\-\-completions\fR] [\fB\-\-dump\fR] [\fB\-e\fR|\fB\-\-edit\fR] [\fB\-\-evaluate\fR] [\fB\-\-fmt\fR] [\fB\-\-groups\fR] [\fB\-\-init\fR] [\fB\-l\fR|\fB\-\-list\fR] [\fB\-\-man\fR] [\fB\-s\fR|\fB\-\-show\fR] [\fB\-\-summary\fR] [\fB\-\-usage\fR] [\fB\-\-variables\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] [\fIARGUMENTS\fR]
|
||||
.SH DESCRIPTION
|
||||
🤖 Just a command runner \- https://github.com/casey/just
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
\fB\-\-alias\-style\fR [default: right]
|
||||
Set list command alias display style
|
||||
.br
|
||||
|
||||
.br
|
||||
[\fIpossible values: \fRleft, right, separate]
|
||||
.RS
|
||||
May also be specified with the \fBJUST_ALIAS_STYLE\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-ceiling\fR
|
||||
Do not ascend above <CEILING> directory when searching for a justfile.
|
||||
.RS
|
||||
May also be specified with the \fBJUST_CEILING\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-check\fR
|
||||
Run `\-\-fmt` in \*(Aqcheck\*(Aq mode. Exits with 0 if justfile is formatted correctly. Exits with 1 and prints a diff if formatting is required.
|
||||
.TP
|
||||
\fB\-\-chooser\fR
|
||||
Override binary invoked by `\-\-choose`
|
||||
.RS
|
||||
May also be specified with the \fBJUST_CHOOSER\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-clear\-shell\-args\fR
|
||||
Clear shell arguments
|
||||
.TP
|
||||
\fB\-\-color\fR [default: auto]
|
||||
Print colorful output
|
||||
.br
|
||||
|
||||
.br
|
||||
[\fIpossible values: \fRalways, auto, never]
|
||||
.RS
|
||||
May also be specified with the \fBJUST_COLOR\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-command\-color\fR
|
||||
Echo recipe lines in <COMMAND\-COLOR>
|
||||
.br
|
||||
|
||||
.br
|
||||
[\fIpossible values: \fRblack, blue, cyan, green, purple, red, yellow]
|
||||
.RS
|
||||
May also be specified with the \fBJUST_COMMAND_COLOR\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-cygpath\fR [default: cygpath]
|
||||
Use binary at <CYGPATH> to convert between unix and Windows paths.
|
||||
.RS
|
||||
May also be specified with the \fBJUST_CYGPATH\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-dotenv\-filename\fR
|
||||
Search for environment file named <DOTENV\-FILENAME> instead of `.env`
|
||||
.TP
|
||||
\fB\-E\fR, \fB\-\-dotenv\-path\fR
|
||||
Load <DOTENV\-PATH> as environment file instead of searching for one
|
||||
.TP
|
||||
\fB\-n\fR, \fB\-\-dry\-run\fR
|
||||
Print what just would do without doing it
|
||||
.RS
|
||||
May also be specified with the \fBJUST_DRY_RUN\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-dump\-format\fR \fI<FORMAT>\fR [default: just]
|
||||
Dump justfile as <FORMAT>
|
||||
.br
|
||||
|
||||
.br
|
||||
[\fIpossible values: \fRjson, just]
|
||||
.RS
|
||||
May also be specified with the \fBJUST_DUMP_FORMAT\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-explain\fR
|
||||
Print recipe doc comment before running it
|
||||
.RS
|
||||
May also be specified with the \fBJUST_EXPLAIN\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-g\fR, \fB\-\-global\-justfile\fR
|
||||
Use global justfile
|
||||
.TP
|
||||
\fB\-\-highlight\fR
|
||||
Highlight echoed recipe lines in bold
|
||||
.RS
|
||||
May also be specified with the \fBJUST_HIGHLIGHT\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-f\fR, \fB\-\-justfile\fR
|
||||
Use <JUSTFILE> as justfile
|
||||
.RS
|
||||
May also be specified with the \fBJUST_JUSTFILE\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-list\-heading\fR \fI<TEXT>\fR [default: Available recipes:
|
||||
]
|
||||
Print <TEXT> before list
|
||||
.RS
|
||||
May also be specified with the \fBJUST_LIST_HEADING\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-list\-prefix\fR \fI<TEXT>\fR [default: ]
|
||||
Print <TEXT> before each list item
|
||||
.RS
|
||||
May also be specified with the \fBJUST_LIST_PREFIX\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-list\-submodules\fR
|
||||
List recipes in submodules
|
||||
.RS
|
||||
May also be specified with the \fBJUST_LIST_SUBMODULES\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-no\-aliases\fR
|
||||
Don\*(Aqt show aliases in list
|
||||
.RS
|
||||
May also be specified with the \fBJUST_NO_ALIASES\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-no\-deps\fR
|
||||
Don\*(Aqt run recipe dependencies
|
||||
.RS
|
||||
May also be specified with the \fBJUST_NO_DEPS\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-no\-dotenv\fR
|
||||
Don\*(Aqt load `.env` file
|
||||
.RS
|
||||
May also be specified with the \fBJUST_NO_DOTENV\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-no\-highlight\fR
|
||||
Don\*(Aqt highlight echoed recipe lines in bold
|
||||
.RS
|
||||
May also be specified with the \fBJUST_NO_HIGHLIGHT\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-one\fR
|
||||
Forbid multiple recipes from being invoked on the command line
|
||||
.RS
|
||||
May also be specified with the \fBJUST_ONE\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-q\fR, \fB\-\-quiet\fR
|
||||
Suppress all output
|
||||
.RS
|
||||
May also be specified with the \fBJUST_QUIET\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-allow\-missing\fR
|
||||
Ignore missing recipe and module errors
|
||||
.RS
|
||||
May also be specified with the \fBJUST_ALLOW_MISSING\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-set\fR \fI<VARIABLE>\fR\fI \fR\fI<VALUE>\fR
|
||||
Override <VARIABLE> with <VALUE>
|
||||
.TP
|
||||
\fB\-\-shell\fR
|
||||
Invoke <SHELL> to run recipes
|
||||
.TP
|
||||
\fB\-\-shell\-arg\fR
|
||||
Invoke shell with <SHELL\-ARG> as an argument
|
||||
.TP
|
||||
\fB\-\-shell\-command\fR
|
||||
Invoke <COMMAND> with the shell used to run recipe lines and backticks
|
||||
.TP
|
||||
\fB\-\-tempdir\fR
|
||||
Save temporary files to <TEMPDIR>.
|
||||
.RS
|
||||
May also be specified with the \fBJUST_TEMPDIR\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-timestamp\fR
|
||||
Print recipe command timestamps
|
||||
.RS
|
||||
May also be specified with the \fBJUST_TIMESTAMP\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-timestamp\-format\fR [default: %H:%M:%S]
|
||||
Timestamp format string
|
||||
.RS
|
||||
May also be specified with the \fBJUST_TIMESTAMP_FORMAT\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-u\fR, \fB\-\-unsorted\fR
|
||||
Return list and summary entries in source order
|
||||
.RS
|
||||
May also be specified with the \fBJUST_UNSORTED\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-unstable\fR
|
||||
Enable unstable features
|
||||
.RS
|
||||
May also be specified with the \fBJUST_UNSTABLE\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-v\fR, \fB\-\-verbose\fR
|
||||
Use verbose output
|
||||
.RS
|
||||
May also be specified with the \fBJUST_VERBOSE\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-d\fR, \fB\-\-working\-directory\fR
|
||||
Use <WORKING\-DIRECTORY> as working directory. \-\-justfile must also be set
|
||||
.RS
|
||||
May also be specified with the \fBJUST_WORKING_DIRECTORY\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-\-yes\fR
|
||||
Automatically confirm all recipes.
|
||||
.RS
|
||||
May also be specified with the \fBJUST_YES\fR environment variable.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-h\fR, \fB\-\-help\fR
|
||||
Print help
|
||||
.TP
|
||||
\fB\-V\fR, \fB\-\-version\fR
|
||||
Print version
|
||||
.TP
|
||||
[\fIARGUMENTS\fR]
|
||||
Overrides and recipe(s) to run, defaulting to the first recipe in the justfile
|
||||
.SH COMMANDS
|
||||
.TP
|
||||
\fB\-\-changelog\fR
|
||||
Print changelog
|
||||
.TP
|
||||
\fB\-\-choose\fR
|
||||
Select one or more recipes to run using a binary chooser. If `\-\-chooser` is not passed the chooser defaults to the value of $JUST_CHOOSER, falling back to `fzf`
|
||||
.TP
|
||||
\fB\-c\fR, \fB\-\-command\fR
|
||||
Run an arbitrary command with the working directory, `.env`, overrides, and exports set
|
||||
.TP
|
||||
\fB\-\-completions\fR \fI<SHELL>\fR
|
||||
Print shell completion script for <SHELL>
|
||||
.br
|
||||
|
||||
.br
|
||||
[\fIpossible values: \fRbash, elvish, fish, nushell, powershell, zsh]
|
||||
.TP
|
||||
\fB\-\-dump\fR
|
||||
Print justfile
|
||||
.TP
|
||||
\fB\-e\fR, \fB\-\-edit\fR
|
||||
Edit justfile with editor given by $VISUAL or $EDITOR, falling back to `vim`
|
||||
.TP
|
||||
\fB\-\-evaluate\fR
|
||||
Evaluate and print all variables. If a variable name is given as an argument, only print that variable\*(Aqs value.
|
||||
.TP
|
||||
\fB\-\-fmt\fR
|
||||
Format and overwrite justfile
|
||||
.TP
|
||||
\fB\-\-groups\fR
|
||||
List recipe groups
|
||||
.TP
|
||||
\fB\-\-init\fR
|
||||
Initialize new justfile in project root
|
||||
.TP
|
||||
\fB\-l\fR, \fB\-\-list\fR [\fI<MODULE>...\fR]
|
||||
List available recipes in <MODULE> or root if omitted
|
||||
.TP
|
||||
\fB\-\-man\fR
|
||||
Print man page
|
||||
.TP
|
||||
\fB\-s\fR, \fB\-\-show\fR \fI<PATH>...\fR
|
||||
Show recipe at <PATH>
|
||||
.TP
|
||||
\fB\-\-summary\fR
|
||||
List names of available recipes
|
||||
.TP
|
||||
\fB\-\-usage\fR \fI<PATH>...\fR
|
||||
Print recipe usage information
|
||||
.TP
|
||||
\fB\-\-variables\fR
|
||||
List names of variables
|
||||
.SH VERSION
|
||||
v1.46.0
|
||||
.SH AUTHORS
|
||||
Casey Rodarmor <casey@rodarmor.com>
|
||||
72
schema.sql
Normal file
72
schema.sql
Normal file
@ -0,0 +1,72 @@
|
||||
CREATE TABLE `fspmethod` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`method` varchar(100) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `method` (`method`)
|
||||
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE `fsppilot` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`known_outcome` tinyint(4) NOT NULL,
|
||||
`variant_id` int(11) NOT NULL,
|
||||
`instr2` int(10) unsigned NOT NULL,
|
||||
`injection_instr` int(10) unsigned NOT NULL,
|
||||
`injection_instr_absolute` bigint(10) unsigned DEFAULT NULL,
|
||||
`data_physical_address` bigint(10) unsigned NOT NULL,
|
||||
`bit_pos` tinyint(3) unsigned DEFAULT NULL,
|
||||
`data_width` int(10) unsigned NOT NULL,
|
||||
`fspmethod_id` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `fspmethod_id` (`fspmethod_id`,`variant_id`,`data_physical_address`,`instr2`)
|
||||
) ENGINE=MyISAM AUTO_INCREMENT=6327 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE `fspgroup` (
|
||||
`variant_id` int(11) NOT NULL,
|
||||
`instr2` int(11) unsigned NOT NULL,
|
||||
`data_physical_address` bigint(10) unsigned NOT NULL,
|
||||
`bit_pos` tinyint(3) unsigned DEFAULT NULL,
|
||||
`fspmethod_id` int(11) NOT NULL,
|
||||
`pilot_id` int(11) NOT NULL,
|
||||
`weight` int(11) unsigned DEFAULT NULL,
|
||||
PRIMARY KEY (`pilot_id`),
|
||||
KEY `joinresults` (`pilot_id`,`fspmethod_id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE `variant` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`variant` varchar(100) NOT NULL,
|
||||
`benchmark` varchar(100) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `variant` (`variant`,`benchmark`)
|
||||
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE `trace` (
|
||||
`variant_id` int(11) NOT NULL,
|
||||
`instr1` int(10) unsigned NOT NULL,
|
||||
`instr1_absolute` bigint(10) unsigned DEFAULT NULL,
|
||||
`instr2` int(10) unsigned NOT NULL,
|
||||
`instr2_absolute` bigint(10) unsigned DEFAULT NULL,
|
||||
`time1` bigint(10) unsigned NOT NULL,
|
||||
`time2` bigint(10) unsigned NOT NULL,
|
||||
`data_linear_address` bigint(10) unsigned NOT NULL,
|
||||
`data_physical_address` bigint(10) unsigned NOT NULL,
|
||||
`width` tinyint(3) unsigned NOT NULL,
|
||||
`accesstype` enum('R','W') NOT NULL,
|
||||
`cr3` int(10) unsigned NOT NULL,
|
||||
PRIMARY KEY (`variant_id`,`data_physical_address`,`instr2`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE `result_GenericExperimentMessage` (
|
||||
`pilot_id` int(10) unsigned NOT NULL,
|
||||
`inject_bursts` tinyint(4) NOT NULL,
|
||||
`inject_single_bit` tinyint(4) NOT NULL,
|
||||
`register_injection_mode` enum('OFF','AUTO','FORCE','RANDOMJUMP') DEFAULT NULL,
|
||||
`data_physical_address` bigint(20) unsigned NOT NULL,
|
||||
`bitoffset` int(10) unsigned NOT NULL,
|
||||
`original_value` int(10) unsigned NOT NULL,
|
||||
`injection_width` int(10) unsigned NOT NULL,
|
||||
`resulttype` enum('OK_MARKER','FAIL_MARKER','DETECTED_MARKER','GROUP1_MARKER','GROUP2_MARKER','GROUP3_MARKER','GROUP4_MARKER','TIMEOUT','TRAP','WRITE_TEXTSEGMENT','ACCESS_OUTERSPACE','SDC','UNKNOWN') NOT NULL,
|
||||
`crash_time` bigint(20) unsigned NOT NULL,
|
||||
`details` bigint(20) unsigned DEFAULT NULL,
|
||||
PRIMARY KEY (`pilot_id`,`data_physical_address`,`bitoffset`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
133
scripts/Modules/Filters.pm
Normal file
133
scripts/Modules/Filters.pm
Normal file
@ -0,0 +1,133 @@
|
||||
package Filters;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use diagnostics;
|
||||
|
||||
use FindBin;
|
||||
use lib $FindBin::Bin;
|
||||
use Util;
|
||||
|
||||
my %CONFIGS = (
|
||||
no_aot_instr => {
|
||||
label => "Exclude WAMR AOT array (instr)",
|
||||
regions => [
|
||||
[
|
||||
'_wamr_aot_start', '_wamr_aot_end',
|
||||
'p.injection_instr_absolute'
|
||||
]
|
||||
],
|
||||
},
|
||||
no_aot_data => {
|
||||
label => "Exclude WAMR AOT array (data)",
|
||||
regions =>
|
||||
[ [ '_wamr_aot_start', '_wamr_aot_end', 'g.data_physical_address' ] ],
|
||||
},
|
||||
no_mmap_instr => {
|
||||
label => "Exclude WAMR mmap (instr)",
|
||||
regions => [
|
||||
[
|
||||
'_wamr_mmap_start', '_wamr_mmap_end',
|
||||
'p.injection_instr_absolute'
|
||||
]
|
||||
],
|
||||
},
|
||||
no_mmap_data => {
|
||||
label => "Exclude WAMR mmap (data)",
|
||||
regions => [
|
||||
[ '_wamr_mmap_start', '_wamr_mmap_end', 'g.data_physical_address' ]
|
||||
],
|
||||
},
|
||||
no_runtime_pool_instr => {
|
||||
label => "Exclude WAMR runtime pool (instr)",
|
||||
regions => [
|
||||
[
|
||||
'_wamr_runtime_pool_start', '_wamr_runtime_pool_end',
|
||||
'p.injection_instr_absolute'
|
||||
]
|
||||
],
|
||||
},
|
||||
no_runtime_pool_data => {
|
||||
label => "Exclude WAMR runtime pool (data)",
|
||||
regions => [
|
||||
[
|
||||
'_wamr_runtime_pool_start', '_wamr_runtime_pool_end',
|
||||
'g.data_physical_address'
|
||||
]
|
||||
],
|
||||
},
|
||||
no_linear_pool_instr => {
|
||||
label => "Exclude WAMR linear pool (instr)",
|
||||
regions => [
|
||||
[
|
||||
'_wamr_linear_pool_start', '_wamr_linear_pool_end',
|
||||
'p.injection_instr_absolute'
|
||||
]
|
||||
],
|
||||
},
|
||||
no_linear_pool_data => {
|
||||
label => "Exclude WAMR linear pool (data)",
|
||||
regions => [
|
||||
[
|
||||
'_wamr_linear_pool_start', '_wamr_linear_pool_end',
|
||||
'g.data_physical_address'
|
||||
]
|
||||
],
|
||||
},
|
||||
no_global_heap_instr => {
|
||||
label => "Exclude WAMR global heap (instr)",
|
||||
regions => [
|
||||
[
|
||||
'_wamr_global_heap_start', '_wamr_global_heap_end',
|
||||
'p.injection_instr_absolute'
|
||||
]
|
||||
],
|
||||
},
|
||||
no_global_heap_data => {
|
||||
label => "Exclude WAMR global heap (data)",
|
||||
regions => [
|
||||
[
|
||||
'_wamr_global_heap_start', '_wamr_global_heap_end',
|
||||
'g.data_physical_address'
|
||||
]
|
||||
],
|
||||
},
|
||||
);
|
||||
|
||||
# Those will be executed automatically by runner.pl (+ no filter at all)
|
||||
my @DEFAULT_CONFIGS = ('no_aot_data');
|
||||
|
||||
sub get_configs {
|
||||
return \%CONFIGS;
|
||||
}
|
||||
|
||||
sub get_default_configs {
|
||||
return @DEFAULT_CONFIGS;
|
||||
}
|
||||
|
||||
sub build_filter_clause {
|
||||
my ( $experiment_dir, $config_name ) = @_;
|
||||
|
||||
return "" unless defined $config_name && length($config_name) > 0;
|
||||
|
||||
my $regions = $CONFIGS{$config_name}{regions};
|
||||
return "" unless defined $regions;
|
||||
|
||||
return ""
|
||||
unless defined $experiment_dir && -f "$experiment_dir/system.elf";
|
||||
|
||||
my @filters;
|
||||
for my $pair (@$regions) {
|
||||
my ( $start_sym, $end_sym, $col ) = @$pair;
|
||||
my $start =
|
||||
Util::elf_sym_addr( "$experiment_dir/system.elf", $start_sym );
|
||||
my $end = Util::elf_sym_addr( "$experiment_dir/system.elf", $end_sym );
|
||||
next unless defined $start && defined $end && $end > $start;
|
||||
push @filters, "$col NOT BETWEEN $start AND @{[$end - 1]}";
|
||||
}
|
||||
|
||||
return "" unless @filters;
|
||||
return "\nAND " . join( "\nAND ", @filters );
|
||||
}
|
||||
|
||||
1;
|
||||
@ -33,11 +33,13 @@ sub select_from_list {
|
||||
: map { $_ => $_ } @items;
|
||||
|
||||
my @selection;
|
||||
my @selection_order; # multiselect only: items in toggle order
|
||||
|
||||
my $cui = init_cui();
|
||||
my $win = $cui->add( 'root', 'Window', );
|
||||
|
||||
my $listbox = $win->add(
|
||||
my $listbox;
|
||||
$listbox = $win->add(
|
||||
'item_list',
|
||||
'Listbox',
|
||||
-title => $title,
|
||||
@ -47,7 +49,20 @@ sub select_from_list {
|
||||
-multi => $multiselect == 1,
|
||||
-radio => $multiselect == 0,
|
||||
-padbottom => 1,
|
||||
-onchange => sub {
|
||||
return unless $multiselect;
|
||||
my %now = map { $_ => 1 } $listbox->get();
|
||||
|
||||
# Append newly selected items in toggle order
|
||||
for my $item (@items) {
|
||||
if ( $now{$item} && !grep { $_ eq $item } @selection_order ) {
|
||||
push @selection_order, $item;
|
||||
}
|
||||
}
|
||||
|
||||
# Drop deselected items
|
||||
@selection_order = grep { $now{$_} } @selection_order;
|
||||
},
|
||||
);
|
||||
|
||||
$win->add(
|
||||
@ -64,6 +79,9 @@ sub select_from_list {
|
||||
if ( $multiselect && grep { $_ eq '__ALL__' } @picked ) {
|
||||
@selection = @items;
|
||||
}
|
||||
elsif ($multiselect) {
|
||||
@selection = @selection_order;
|
||||
}
|
||||
else {
|
||||
@selection = @picked;
|
||||
}
|
||||
@ -5,6 +5,13 @@ use warnings;
|
||||
use diagnostics;
|
||||
|
||||
use DateTime;
|
||||
use FindBin;
|
||||
|
||||
# Include this for running from runner.pl
|
||||
use lib "$FindBin::Bin/../../scripts/Queries";
|
||||
|
||||
# Include this for running from menu.pl
|
||||
use lib "$FindBin::Bin/Queries";
|
||||
|
||||
use feature 'say';
|
||||
|
||||
@ -49,6 +56,29 @@ sub date_now {
|
||||
return $date;
|
||||
}
|
||||
|
||||
sub run {
|
||||
my @cmd = @_;
|
||||
say "Running: @cmd";
|
||||
system(@cmd) == 0
|
||||
or die "Command failed (exit " . ( $? >> 8 ) . "): @cmd\n";
|
||||
}
|
||||
|
||||
sub read_file {
|
||||
my ($file) = @_;
|
||||
open( my $readhandle, '<', $file ) or die "failed to open $file: $!";
|
||||
local $/;
|
||||
my $content = <$readhandle> // die "failed to read $file: $!";
|
||||
close($readhandle) or die "failed to close $file: $!";
|
||||
return $content;
|
||||
}
|
||||
|
||||
sub write_file {
|
||||
my ( $file, $content ) = @_;
|
||||
open( my $writehandle, '>', $file ) or die "failed to open $file: $!";
|
||||
print $writehandle $content or die "failed to write $file: $!";
|
||||
close($writehandle) or die "failed to close $file: $!";
|
||||
}
|
||||
|
||||
sub rewrite_file {
|
||||
my ( $file, $matches, $replacement ) = @_;
|
||||
|
||||
@ -103,23 +133,26 @@ sub find_subdirs {
|
||||
}
|
||||
|
||||
sub execute_query {
|
||||
my ( $experiment, $queryname, $db_conf, $builds_dir, $do_notify_file ) = @_;
|
||||
my ( $experiment, $queryname, $db_conf, $builds_dir, $do_notify_file,
|
||||
$filter_config_name )
|
||||
= @_;
|
||||
|
||||
my $module = "Queries::$queryname";
|
||||
my $module = "$queryname";
|
||||
my $file = "$module.pm";
|
||||
$file =~ s/::/\//g;
|
||||
|
||||
require $file;
|
||||
|
||||
my $query = $module->can('query') or die "$module can't query()";
|
||||
my $args = $module->can('args') or die "$module can't args()";
|
||||
my $filename = $module->can('filename') or die "$module can't filanem()";
|
||||
my $query = $module->can('query') or die "$module can't query()";
|
||||
my $args = $module->can('args') or die "$module can't args()";
|
||||
my $filename = $module->can('filename') or die "$module can't filename()";
|
||||
my $postprocess = $module->can('postprocess')
|
||||
or die "$module can't postprocess()";
|
||||
|
||||
my $querystring = $query->($experiment);
|
||||
my $querystring =
|
||||
$query->( $experiment, "$builds_dir/$experiment", $filter_config_name );
|
||||
my $argsstring = $args->();
|
||||
my $filenamestring = $filename->();
|
||||
my $filenamestring = $filename->($filter_config_name);
|
||||
|
||||
# TODO: Pass the values instead of rewriting db.conf.
|
||||
# Can also use DBI's database handle directly.
|
||||
@ -148,6 +181,13 @@ sub format_number_sep {
|
||||
return $number;
|
||||
}
|
||||
|
||||
sub elf_sym_addr {
|
||||
my ( $elffile, $sym ) = @_;
|
||||
my $line = qx{nm "$elffile" 2>/dev/null | grep " $sym\$"};
|
||||
return undef unless $line =~ /^([0-9a-f]+)/i;
|
||||
return hex($1);
|
||||
}
|
||||
|
||||
sub elf_read_sections {
|
||||
my ($elffile) = @_;
|
||||
|
||||
@ -241,6 +281,27 @@ sub delete_marker_info {
|
||||
"$local_archive_dir/$experiment/markers/$benchmark-$address.info" );
|
||||
}
|
||||
|
||||
sub pick_data_file {
|
||||
my ( $dir, $prefix ) = @_;
|
||||
|
||||
# \Q...\E treats ... as literal string
|
||||
my @files = sort grep { /^\Q$prefix\E.*\.csv$/ } find_files($dir);
|
||||
|
||||
return "$prefix.csv" unless @files > 1;
|
||||
|
||||
# Make sure the unfiltered file is at the top
|
||||
my @sorted = sort {
|
||||
( $a eq "$prefix.csv" ) ? -1
|
||||
: ( $b eq "$prefix.csv" ) ? 1
|
||||
: $a cmp $b
|
||||
} @files;
|
||||
|
||||
my @selected =
|
||||
TUI::select_from_list( "Select $prefix CSV file", 0, @sorted );
|
||||
die "No $prefix CSV file selected" unless @selected;
|
||||
return $selected[0];
|
||||
}
|
||||
|
||||
sub select_experiment {
|
||||
my ($multi) = @_;
|
||||
|
||||
@ -260,7 +321,8 @@ sub select_experiment {
|
||||
TUI::select_from_list( "Select Experiment", $multi, @exp_with_notes );
|
||||
die "No experiment selected" unless @selected_experiments;
|
||||
|
||||
map { s/(.*?)\s+\(.+\)$/$1/ } @selected_experiments;
|
||||
@selected_experiments =
|
||||
map { s/(.*?)\s+\(.+\)$/$1/r } @selected_experiments;
|
||||
|
||||
return $multi == 1 ? @selected_experiments : $selected_experiments[0];
|
||||
}
|
||||
@ -1,13 +1,23 @@
|
||||
package Queries::Faults;
|
||||
package Faults;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use diagnostics;
|
||||
|
||||
sub query {
|
||||
my ($experiment) = @_;
|
||||
use FindBin;
|
||||
use lib "$FindBin::Bin/../Modules";
|
||||
use Filters;
|
||||
|
||||
return "SELECT
|
||||
use feature 'say';
|
||||
|
||||
sub query {
|
||||
my ( $experiment, $experiment_dir, $filter_config_name ) = @_;
|
||||
$filter_config_name //= '';
|
||||
|
||||
my $filters =
|
||||
Filters::build_filter_clause( $experiment_dir, $filter_config_name );
|
||||
|
||||
my $querystring = "SELECT
|
||||
benchmark, resulttype, SUM(t.time2 - t.time1 + 1) AS faults,
|
||||
CONCAT('0x', HEX(p.injection_instr_absolute)) AS fault_address
|
||||
FROM variant v
|
||||
@ -15,14 +25,23 @@ JOIN trace t ON v.id = t.variant_id
|
||||
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address
|
||||
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||
JOIN fsppilot p ON r.pilot_id = p.id
|
||||
WHERE v.variant = '$experiment'
|
||||
WHERE v.variant = '$experiment'$filters
|
||||
GROUP BY benchmark, resulttype, p.injection_instr_absolute
|
||||
ORDER BY benchmark, resulttype, SUM(t.time2 - t.time1 + 1) DESC;";
|
||||
|
||||
say $querystring;
|
||||
|
||||
return $querystring;
|
||||
}
|
||||
|
||||
sub args { return "--batch --raw"; }
|
||||
|
||||
sub filename { return "faults.csv"; }
|
||||
sub filename {
|
||||
my ($filter_config_name) = @_;
|
||||
$filter_config_name //= '';
|
||||
my $suffix = length($filter_config_name) ? "_$filter_config_name" : "";
|
||||
return "faults${suffix}.csv";
|
||||
}
|
||||
|
||||
sub postprocess { $_[0] =~ s/\t/,/g; }
|
||||
|
||||
|
||||
@ -1,27 +1,46 @@
|
||||
package Queries::Results;
|
||||
package Results;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use diagnostics;
|
||||
|
||||
sub query {
|
||||
my ($experiment) = @_;
|
||||
use FindBin;
|
||||
use lib "$FindBin::Bin/../Modules";
|
||||
use Filters;
|
||||
|
||||
return "SELECT
|
||||
use feature 'say';
|
||||
|
||||
sub query {
|
||||
my ( $experiment, $experiment_dir, $filter_config_name ) = @_;
|
||||
$filter_config_name //= '';
|
||||
|
||||
my $extra =
|
||||
Filters::build_filter_clause( $experiment_dir, $filter_config_name );
|
||||
|
||||
my $querystring = "SELECT
|
||||
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
||||
FROM variant v
|
||||
JOIN trace t ON v.id = t.variant_id
|
||||
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address
|
||||
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||
JOIN fsppilot p ON r.pilot_id = p.id
|
||||
WHERE v.variant = '$experiment'
|
||||
WHERE v.variant = '$experiment'$extra
|
||||
GROUP BY v.id, resulttype
|
||||
ORDER BY variant, benchmark, resulttype;";
|
||||
|
||||
say $querystring;
|
||||
|
||||
return $querystring;
|
||||
}
|
||||
|
||||
sub args { return "-t"; }
|
||||
|
||||
sub filename { return "results.txt"; }
|
||||
sub filename {
|
||||
my ($filter_config_name) = @_;
|
||||
$filter_config_name //= '';
|
||||
my $suffix = length($filter_config_name) ? "_$filter_config_name" : "";
|
||||
return "results${suffix}.txt";
|
||||
}
|
||||
|
||||
sub postprocess { }
|
||||
|
||||
|
||||
@ -1,27 +1,46 @@
|
||||
package Queries::ResultsData;
|
||||
package ResultsData;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use diagnostics;
|
||||
|
||||
sub query {
|
||||
my ($experiment) = @_;
|
||||
use FindBin;
|
||||
use lib "$FindBin::Bin/../Modules";
|
||||
use Filters;
|
||||
|
||||
return "SELECT
|
||||
use feature 'say';
|
||||
|
||||
sub query {
|
||||
my ( $experiment, $experiment_dir, $filter_config_name ) = @_;
|
||||
$filter_config_name //= '';
|
||||
|
||||
my $extra =
|
||||
Filters::build_filter_clause( $experiment_dir, $filter_config_name );
|
||||
|
||||
my $querystring = "SELECT
|
||||
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
||||
FROM variant v
|
||||
JOIN trace t ON v.id = t.variant_id
|
||||
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address
|
||||
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||
JOIN fsppilot p ON r.pilot_id = p.id
|
||||
WHERE v.variant = '$experiment'
|
||||
WHERE v.variant = '$experiment'$extra
|
||||
GROUP BY v.id, resulttype
|
||||
ORDER BY variant, benchmark, resulttype;";
|
||||
|
||||
say $querystring;
|
||||
|
||||
return $querystring;
|
||||
}
|
||||
|
||||
sub args { return "--batch --raw"; }
|
||||
|
||||
sub filename { return "resultsdata.csv"; }
|
||||
sub filename {
|
||||
my ($filter_config_name) = @_;
|
||||
$filter_config_name //= '';
|
||||
my $suffix = length($filter_config_name) ? "_$filter_config_name" : "";
|
||||
return "resultsdata${suffix}.csv";
|
||||
}
|
||||
|
||||
sub postprocess { $_[0] =~ s/\t/,/g; }
|
||||
|
||||
|
||||
270
scripts/build.pl
270
scripts/build.pl
@ -5,28 +5,35 @@ use warnings;
|
||||
use diagnostics;
|
||||
|
||||
use FindBin;
|
||||
use lib $FindBin::Bin;
|
||||
use lib "$FindBin::Bin/Modules";
|
||||
|
||||
use Util;
|
||||
use TUI;
|
||||
|
||||
use POSIX qw(strftime);
|
||||
use feature 'say';
|
||||
|
||||
my $date = Util::date_now;
|
||||
|
||||
my $local_root = '/home/christoph/Notes/TU/MastersThesis/FailNix';
|
||||
my $local_builds_dir = "$local_root/builds";
|
||||
my $local_experiments_dir = "$local_root/targets/wasm-module";
|
||||
my $justbin = "$local_root/just-bin/just";
|
||||
my $justfile = "$local_root/scripts/nixos.just";
|
||||
my $compile_pl = "$local_root/scripts/compile.pl";
|
||||
|
||||
my @targets = ( "fail", "linux", "linux-baremetal" );
|
||||
my @modes = ( "c", "aot", "interp" );
|
||||
sub compile {
|
||||
my ( $module, $target, $mode ) = @_;
|
||||
say "Running: WAMR_USE_AOT_IN_TEXT=$ENV{WAMR_USE_AOT_IN_TEXT}",
|
||||
" WAMR_USE_MMAP_IN_TEXT=$ENV{WAMR_USE_MMAP_IN_TEXT}",
|
||||
" WAMR_USE_XIP=$ENV{WAMR_USE_XIP}",
|
||||
" WAMR_USE_ALLOCATOR=$ENV{WAMR_USE_ALLOCATOR}",
|
||||
" WAMR_USE_GLOBAL_HEAP_IN_TEXT=$ENV{WAMR_USE_GLOBAL_HEAP_IN_TEXT}",
|
||||
" WAMR_USE_RUNTIME_POOL_IN_TEXT=$ENV{WAMR_USE_RUNTIME_POOL_IN_TEXT}",
|
||||
" WAMR_USE_LINEAR_POOL_IN_TEXT=$ENV{WAMR_USE_LINEAR_POOL_IN_TEXT}",
|
||||
" compile.pl $module $target $mode";
|
||||
|
||||
sub just {
|
||||
say "Running: just @_...";
|
||||
system("$justbin -d $local_root -f $justfile @_")
|
||||
and die "Build failed";
|
||||
system(
|
||||
"perl $compile_pl $module $target $mode > $local_root/build.log 2>&1")
|
||||
== 0
|
||||
or die "Build failed\n";
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
# Find and select experiments
|
||||
@ -36,28 +43,263 @@ my @selected_experiments =
|
||||
die "No experiment selected" unless @selected_experiments;
|
||||
|
||||
# Select targets
|
||||
my @targets = ( "fail", "linux", "linux-baremetal" );
|
||||
my @selected_targets =
|
||||
TUI::select_from_list( "Select Targets Platforms", 1, @targets );
|
||||
TUI::select_from_list( "Select Target Platforms", 1, @targets );
|
||||
die "No target selected" unless @selected_targets;
|
||||
|
||||
# Select modes
|
||||
my @modes = ( "c", "aot", "interp" );
|
||||
my @selected_modes =
|
||||
TUI::select_from_list( "Select Execution Modes", 1, @modes );
|
||||
die "No mode selected" unless @selected_modes;
|
||||
|
||||
# ========================================================================================= #
|
||||
# Select WAMR allocator variant
|
||||
# ========================================================================================= #
|
||||
|
||||
my @allocator_variants = (
|
||||
"Pool allocator (Alloc_With_Pool)",
|
||||
"Allocator with usage (Alloc_With_Allocator)",
|
||||
);
|
||||
my $selected_allocator_variant = $allocator_variants[1];
|
||||
if ( grep { $_ eq "aot" or $_ eq "interp" } @selected_modes ) {
|
||||
($selected_allocator_variant) =
|
||||
TUI::select_from_list( "Select WAMR Allocator Variant",
|
||||
0, @allocator_variants );
|
||||
die "No allocator variant selected" unless $selected_allocator_variant;
|
||||
}
|
||||
local $ENV{WAMR_USE_ALLOCATOR} =
|
||||
( $selected_allocator_variant eq $allocator_variants[1] )
|
||||
? "true"
|
||||
: "false";
|
||||
|
||||
# ========================================================================================= #
|
||||
# Select XIP variant
|
||||
# ========================================================================================= #
|
||||
|
||||
my @xip_variants = ( "Compile AOT with --xip", "Compile AOT without --xip" );
|
||||
my $selected_xip_variant = $xip_variants[0];
|
||||
if ( grep { $_ eq "aot" } @selected_modes ) {
|
||||
($selected_xip_variant) =
|
||||
TUI::select_from_list( "Select WAMRC XIP Variant", 0, @xip_variants );
|
||||
die "No XIP variant selected" unless $selected_xip_variant;
|
||||
}
|
||||
local $ENV{WAMR_USE_XIP} =
|
||||
( $selected_xip_variant eq $xip_variants[0] )
|
||||
? "true"
|
||||
: "false";
|
||||
|
||||
# ========================================================================================= #
|
||||
# Select .text.wamr_mmap variant
|
||||
# ========================================================================================= #
|
||||
|
||||
my @mmap_variants = (
|
||||
"Place mmap_space in .text.wamr_mmap",
|
||||
"Let the linker decide where mmap_space is located"
|
||||
);
|
||||
my $selected_mmap_variant = $mmap_variants[1];
|
||||
if ( grep { $_ eq "aot" or $_ eq "interp" } @selected_modes ) {
|
||||
($selected_mmap_variant) =
|
||||
TUI::select_from_list( "Select WAMR Mmap.Text Variant",
|
||||
0, @mmap_variants );
|
||||
die "No variant selected" unless $selected_mmap_variant;
|
||||
}
|
||||
local $ENV{WAMR_USE_MMAP_IN_TEXT} =
|
||||
( $selected_mmap_variant eq $mmap_variants[0] )
|
||||
? "true"
|
||||
: "false";
|
||||
|
||||
# ========================================================================================= #
|
||||
# Select .text.wamr_aot variant
|
||||
# ========================================================================================= #
|
||||
|
||||
my @aot_section_variants = (
|
||||
"Place AOT array in .text.wamr_aot",
|
||||
"Let the linker decide where the AOT array is located",
|
||||
);
|
||||
my $selected_aot_variant = $aot_section_variants[1];
|
||||
if ( grep { $_ eq "aot" } @selected_modes ) {
|
||||
($selected_aot_variant) =
|
||||
TUI::select_from_list( "Select WAMR Array.Text Variant",
|
||||
0, @aot_section_variants );
|
||||
die "No AOT section variant selected" unless $selected_aot_variant;
|
||||
}
|
||||
local $ENV{WAMR_USE_AOT_IN_TEXT} =
|
||||
( $selected_aot_variant eq $aot_section_variants[0] )
|
||||
? "true"
|
||||
: "false";
|
||||
|
||||
# ========================================================================================= #
|
||||
# Select .text.wamr_global_heap variant
|
||||
# ========================================================================================= #
|
||||
|
||||
my @global_heap_variants = (
|
||||
"Place pool allocator's global_heap in .text.wamr_global_heap",
|
||||
"Let the linker decide where global_heap is located"
|
||||
);
|
||||
my $selected_global_heap_variant = $global_heap_variants[1];
|
||||
if ( grep { $_ eq "aot" or $_ eq "interp" } @selected_modes
|
||||
and $selected_allocator_variant eq $allocator_variants[0] )
|
||||
{
|
||||
($selected_global_heap_variant) =
|
||||
TUI::select_from_list( "Select WAMR Global Heap Variant",
|
||||
0, @global_heap_variants );
|
||||
die "No global heap variant selected" unless $selected_global_heap_variant;
|
||||
}
|
||||
local $ENV{WAMR_USE_GLOBAL_HEAP_IN_TEXT} =
|
||||
( $selected_global_heap_variant eq $global_heap_variants[0] )
|
||||
? "true"
|
||||
: "false";
|
||||
|
||||
# ========================================================================================= #
|
||||
# Select .text.wamr_runtime_pool variant
|
||||
# ========================================================================================= #
|
||||
|
||||
my @runtime_pool_variants = (
|
||||
"Place usage allocator's runtime_pool in .text.wamr_runtime_pool",
|
||||
"Let the linker decide where runtime_pool is located"
|
||||
);
|
||||
my $selected_runtime_pool_variant = $runtime_pool_variants[1];
|
||||
if ( grep { $_ eq "aot" or $_ eq "interp" } @selected_modes
|
||||
and $selected_allocator_variant eq $allocator_variants[1] )
|
||||
{
|
||||
($selected_runtime_pool_variant) =
|
||||
TUI::select_from_list( "Select WAMR Runtime Pool Variant",
|
||||
0, @runtime_pool_variants );
|
||||
die "No runtime pool variant selected"
|
||||
unless $selected_runtime_pool_variant;
|
||||
}
|
||||
local $ENV{WAMR_USE_RUNTIME_POOL_IN_TEXT} =
|
||||
( $selected_runtime_pool_variant eq $runtime_pool_variants[0] )
|
||||
? "true"
|
||||
: "false";
|
||||
|
||||
# ========================================================================================= #
|
||||
# Select .text.wamr_linear_pool variant
|
||||
# ========================================================================================= #
|
||||
|
||||
my @linear_pool_variants = (
|
||||
"Place usage allocator's linear_pool in .text.wamr_linear_pool",
|
||||
"Let the linker decide where linear_pool is located"
|
||||
);
|
||||
my $selected_linear_pool_variant = $linear_pool_variants[1];
|
||||
if ( grep { $_ eq "aot" or $_ eq "interp" } @selected_modes
|
||||
and $selected_allocator_variant eq $allocator_variants[1] )
|
||||
{
|
||||
($selected_linear_pool_variant) =
|
||||
TUI::select_from_list( "Select WAMR Linear Pool Variant",
|
||||
0, @linear_pool_variants );
|
||||
die "No linear pool variant selected" unless $selected_linear_pool_variant;
|
||||
}
|
||||
local $ENV{WAMR_USE_LINEAR_POOL_IN_TEXT} =
|
||||
( $selected_linear_pool_variant eq $linear_pool_variants[0] )
|
||||
? "true"
|
||||
: "false";
|
||||
|
||||
# ========================================================================================= #
|
||||
# Select FAIL catch flags (written to runner_flags in each build dir)
|
||||
# ========================================================================================= #
|
||||
|
||||
# NOTE: The runner will prefix "-Wf," to each flag
|
||||
my %catch_flag_map = (
|
||||
"--catch-outer" => "--catch-outerspace",
|
||||
"--catch-text" => "--catch-write-textsegment",
|
||||
"--wamr-exceptions" => "--group1-marker=fail_marker_group1",
|
||||
);
|
||||
my @selected_catch_flags;
|
||||
if ( grep { $_ eq "fail" } @selected_targets ) {
|
||||
@selected_catch_flags =
|
||||
TUI::select_from_list( "Select FAIL Flags", 1,
|
||||
sort keys %catch_flag_map );
|
||||
}
|
||||
|
||||
# ========================================================================================= #
|
||||
# Build everything
|
||||
# ========================================================================================= #
|
||||
|
||||
# TODO: linux-baremetal target is broken
|
||||
system( "mkdir", "-p", "$local_builds_dir" );
|
||||
foreach my $experiment (@selected_experiments) {
|
||||
foreach my $target (@selected_targets) {
|
||||
foreach my $mode (@selected_modes) {
|
||||
just( "build", $experiment, $target, $mode );
|
||||
|
||||
my $allocator_info = "";
|
||||
if ( $mode eq "aot" || $mode eq "interp" ) {
|
||||
$allocator_info =
|
||||
$selected_allocator_variant eq $allocator_variants[0]
|
||||
? "alloc_pool"
|
||||
: "alloc_usage";
|
||||
}
|
||||
my $xip_info =
|
||||
( $mode eq "aot"
|
||||
&& $selected_xip_variant
|
||||
&& $selected_xip_variant eq $xip_variants[0] )
|
||||
? "xip"
|
||||
: "";
|
||||
my $aot_info =
|
||||
( $mode eq "aot"
|
||||
&& $selected_aot_variant
|
||||
&& $selected_aot_variant eq $aot_section_variants[0] )
|
||||
? "wamr_aot"
|
||||
: "";
|
||||
my $mmap_info =
|
||||
( ( $mode eq "aot" || $mode eq "interp" )
|
||||
&& $selected_mmap_variant eq $mmap_variants[0] )
|
||||
? "wamr_mmap"
|
||||
: "";
|
||||
my $global_heap_info =
|
||||
( ( $mode eq "aot" || $mode eq "interp" )
|
||||
&& $selected_global_heap_variant
|
||||
&& $selected_global_heap_variant eq $global_heap_variants[0] )
|
||||
? "wamr_global_heap"
|
||||
: "";
|
||||
my $runtime_pool_info =
|
||||
( ( $mode eq "aot" || $mode eq "interp" )
|
||||
&& $selected_runtime_pool_variant
|
||||
&& $selected_runtime_pool_variant eq
|
||||
$runtime_pool_variants[0] )
|
||||
? "wamr_runtime_pool"
|
||||
: "";
|
||||
my $linear_pool_info =
|
||||
( ( $mode eq "aot" || $mode eq "interp" )
|
||||
&& $selected_linear_pool_variant
|
||||
&& $selected_linear_pool_variant eq $linear_pool_variants[0] )
|
||||
? "wamr_linear_pool"
|
||||
: "";
|
||||
my $flags_info = join " ", @selected_catch_flags;
|
||||
|
||||
my $info_str = join " ",
|
||||
grep { length } (
|
||||
$mode, $aot_info, $mmap_info,
|
||||
$allocator_info, $global_heap_info, $runtime_pool_info,
|
||||
$linear_pool_info, $xip_info, $flags_info
|
||||
);
|
||||
|
||||
# Build experiment
|
||||
my $date = strftime( "%m-%d_%H-%M-%S", localtime );
|
||||
compile( $experiment, $target, $mode );
|
||||
|
||||
# Write extra info for the menu
|
||||
system("echo '$info_str' > $local_root/build-$experiment/0.info");
|
||||
|
||||
# Write runner_flags so runner.pl knows which FAIL flags to use
|
||||
my $runner_flags_path =
|
||||
"$local_root/build-$experiment/runner_flags";
|
||||
open( my $fhandle, '>', $runner_flags_path )
|
||||
or die "Cannot write $runner_flags_path: $!";
|
||||
print $fhandle "$catch_flag_map{$_}\n" for @selected_catch_flags;
|
||||
close($fhandle);
|
||||
|
||||
system( "mv", "$local_root/build.log",
|
||||
"$local_root/build-$experiment/build.log" );
|
||||
|
||||
system(
|
||||
join " ",
|
||||
(
|
||||
"mv",
|
||||
"$local_root/build-$experiment",
|
||||
"$local_builds_dir/${date}_$experiment-$target-$mode",
|
||||
"$local_builds_dir/${date}_${experiment}_${mode}_${target}",
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@ -6,13 +6,16 @@ library(ggalluvial)
|
||||
args <- commandArgs(trailingOnly = TRUE)
|
||||
argc <- length(args)
|
||||
|
||||
if (argc != 2) {
|
||||
print("Expecting two input files")
|
||||
if (argc < 2 || argc > 3) {
|
||||
print("Expecting two or three arguments: exp1 exp2 [faults_file]")
|
||||
stop()
|
||||
}
|
||||
|
||||
for (experiment in args) {
|
||||
datafile <- paste(experiment, "/faults.csv", sep = "")
|
||||
faults_file <- if (argc == 3) args[3] else "faults.csv"
|
||||
suffix <- gsub("^faults|\\.csv$", "", faults_file)
|
||||
|
||||
for (experiment in args[1:2]) {
|
||||
datafile <- file.path(experiment, faults_file)
|
||||
if (!file.exists(datafile)) {
|
||||
print(paste("Input file", datafile, "is missing"))
|
||||
stop()
|
||||
@ -30,13 +33,13 @@ resulttype_labels <- c(
|
||||
)
|
||||
|
||||
# Read data
|
||||
datafile1 <- paste(args[1], "/faults.csv", sep = "")
|
||||
datafile1 <- file.path(args[1], faults_file)
|
||||
data1 <- readr::read_csv(datafile1)
|
||||
data1$fault_address <- strtoi(data1$fault_address)
|
||||
data1$resulttype <- resulttype_labels[data1$resulttype]
|
||||
# tibble::glimpse(data1)
|
||||
|
||||
datafile2 <- paste(args[2], "/faults.csv", sep = "")
|
||||
datafile2 <- file.path(args[2], faults_file)
|
||||
data2 <- readr::read_csv(datafile2)
|
||||
data2$fault_address <- strtoi(data2$fault_address)
|
||||
data2$resulttype <- resulttype_labels[data2$resulttype]
|
||||
@ -75,6 +78,6 @@ plot <- ggplot(
|
||||
|
||||
# TODO: Name the file according to the benchmarks
|
||||
ggsave(
|
||||
paste(args[2], "/../sankey.svg", sep = ""),
|
||||
paste0(args[2], "/../sankey", suffix, ".svg"),
|
||||
plot = plot,
|
||||
)
|
||||
511
scripts/charts/single_heatmap.r
Normal file
511
scripts/charts/single_heatmap.r
Normal file
@ -0,0 +1,511 @@
|
||||
library(ggplot2)
|
||||
library(readr) # read_csv
|
||||
library(dplyr) # filter, mutate
|
||||
library(tidyr) # complete
|
||||
library(scales)
|
||||
|
||||
# Usage: Rscript single_heatmap.r exp_abspath
|
||||
|
||||
# =============================================================================
|
||||
# CONFIG
|
||||
# =============================================================================
|
||||
|
||||
# Starting row width (might be scaled up)
|
||||
row_width_init <- 16L
|
||||
|
||||
# Max number of occupied rows before row_width is doubled
|
||||
max_rows <- 64L
|
||||
|
||||
# How many x-axis tick labels to show
|
||||
n_x_ticks <- 16L
|
||||
|
||||
# Target size (inches, no margins)
|
||||
target_w <- 10.0
|
||||
target_h <- 6.0
|
||||
|
||||
# Max size so small grids don't produce huge tiles
|
||||
max_tile <- 0.5
|
||||
|
||||
# Generate all heatmaps with crossproduct of this
|
||||
benchmarks <- c("ip", "mem", "regs")
|
||||
markers <- c(
|
||||
"OK_MARKER",
|
||||
"FAIL_MARKER",
|
||||
"DETECTED_MARKER",
|
||||
"ACCESS_OUTERSPACE",
|
||||
"WRITE_TEXTSEGMENT",
|
||||
"GROUP1_MARKER",
|
||||
"TRAP",
|
||||
"TIMEOUT"
|
||||
)
|
||||
|
||||
# Labels for _start/_end symbols from linker.ld
|
||||
regions <- list(
|
||||
list(label = "WAMR AOT", start = "_wamr_aot_start", end = "_wamr_aot_end"),
|
||||
list(
|
||||
label = "WAMR os_mmap",
|
||||
start = "_wamr_mmap_start",
|
||||
end = "_wamr_mmap_end"
|
||||
),
|
||||
list(
|
||||
label = "WAMR runtime mem",
|
||||
start = "_wamr_runtime_pool_start",
|
||||
end = "_wamr_runtime_pool_end"
|
||||
),
|
||||
list(
|
||||
label = "WAMR linear mem",
|
||||
start = "_wamr_linear_pool_start",
|
||||
end = "_wamr_linear_pool_end"
|
||||
),
|
||||
list(
|
||||
label = "WAMR global heap",
|
||||
start = "_wamr_global_heap_start",
|
||||
end = "_wamr_global_heap_end"
|
||||
),
|
||||
list(
|
||||
label = "IWASM AOT runtime",
|
||||
start = "_iwasm_aot_runtime_start",
|
||||
end = "_iwasm_aot_runtime_end"
|
||||
),
|
||||
list(
|
||||
label = "IWASM bh/util",
|
||||
start = "_iwasm_bh_start",
|
||||
end = "_iwasm_bh_end"
|
||||
),
|
||||
list(
|
||||
label = "IWASM mem_alloc",
|
||||
start = "_iwasm_mem_alloc_start",
|
||||
end = "_iwasm_mem_alloc_end"
|
||||
),
|
||||
list(
|
||||
label = "IWASM platform",
|
||||
start = "_iwasm_platform_init_start",
|
||||
end = "_iwasm_platform_init_end"
|
||||
),
|
||||
list(
|
||||
label = "IWASM exec_env",
|
||||
start = "_iwasm_exec_env_start",
|
||||
end = "_iwasm_exec_env_end"
|
||||
),
|
||||
list(
|
||||
label = "IWASM interp",
|
||||
start = "_iwasm_interp_classic_start",
|
||||
end = "_iwasm_interp_classic_end"
|
||||
),
|
||||
list(
|
||||
label = "IWASM memory",
|
||||
start = "_iwasm_memory_start",
|
||||
end = "_iwasm_memory_end"
|
||||
),
|
||||
list(
|
||||
label = "IWASM native",
|
||||
start = "_iwasm_native_start",
|
||||
end = "_iwasm_native_end"
|
||||
),
|
||||
list(
|
||||
label = "IWASM runtime",
|
||||
start = "_iwasm_runtime_start",
|
||||
end = "_iwasm_runtime_end"
|
||||
),
|
||||
list(label = "TEXT", start = "_text_start", end = "_text_end"),
|
||||
list(label = "BSS", start = "_sbss", end = "_ebss")
|
||||
)
|
||||
|
||||
# =============================================================================
|
||||
# HELPER
|
||||
# =============================================================================
|
||||
|
||||
# Count the number of unique row base-addresses
|
||||
# - %/% to sort to bins
|
||||
# - * to map to base address
|
||||
n_occupied_rows <- function(addr_ints, rw) {
|
||||
length(unique((addr_ints %/% rw) * rw))
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# CLI
|
||||
# =============================================================================
|
||||
|
||||
args <- commandArgs(trailingOnly = TRUE)
|
||||
if (length(args) < 1) {
|
||||
stop("Usage: Rscript single_heatmap.r <experiment_dir>")
|
||||
}
|
||||
|
||||
experiment <- args[1]
|
||||
faults_file <- if (length(args) >= 2) args[2] else "faults.csv"
|
||||
suffix <- gsub("^faults|\\.csv$", "", faults_file)
|
||||
|
||||
# =============================================================================
|
||||
# INPUT DATA (read once)
|
||||
# =============================================================================
|
||||
|
||||
datafile <- file.path(experiment, faults_file)
|
||||
if (!file.exists(datafile)) {
|
||||
stop(paste("Input file not found:", datafile))
|
||||
}
|
||||
|
||||
raw <- read_csv(
|
||||
datafile,
|
||||
col_types = cols(
|
||||
benchmark = col_character(),
|
||||
resulttype = col_character(),
|
||||
faults = col_double(),
|
||||
fault_address = col_character() # hex string "0x10001A"; converted below
|
||||
)
|
||||
)
|
||||
|
||||
# =============================================================================
|
||||
# ELF SYMBOLS (parsed once)
|
||||
# =============================================================================
|
||||
|
||||
# Names vector: sym_addr["_text_start"] = 0x10001a
|
||||
sym_addr <- setNames(integer(0), character(0))
|
||||
|
||||
elf_file <- file.path(experiment, "system.elf")
|
||||
|
||||
if (!file.exists(elf_file)) {
|
||||
message("system.elf not found")
|
||||
} else {
|
||||
# Parse elf regions
|
||||
nm_lines <- tryCatch(
|
||||
system2("nm", args = elf_file, stdout = TRUE, stderr = FALSE),
|
||||
error = function(e) {
|
||||
message("nm failed (", conditionMessage(e), ")")
|
||||
NULL
|
||||
}
|
||||
)
|
||||
|
||||
if (!is.null(nm_lines) && length(nm_lines) > 0) {
|
||||
# Each nm line: "0010001a T _text_start"
|
||||
# Groups: 1 = hex address, 2 = symbol name
|
||||
pattern <- "^([0-9a-fA-F]+)\\s+\\S+\\s+(\\S+)"
|
||||
matches <- regmatches(nm_lines, regexec(pattern, nm_lines))
|
||||
valid <- Filter(function(m) length(m) == 3, matches)
|
||||
sym_addr <- setNames(
|
||||
strtoi(sapply(valid, `[[`, 2), 16L),
|
||||
sapply(valid, `[[`, 3)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# HEATMAP
|
||||
# =============================================================================
|
||||
|
||||
make_heatmap <- function(target_resulttype, target_benchmark) {
|
||||
# ===========================================================================
|
||||
# FILTER
|
||||
# ===========================================================================
|
||||
|
||||
filtered <- raw |>
|
||||
filter(
|
||||
.data$resulttype == target_resulttype,
|
||||
.data$benchmark == target_benchmark
|
||||
)
|
||||
|
||||
# Nothing to draw — skip without error
|
||||
if (nrow(filtered) == 0) {
|
||||
return(invisible(NULL))
|
||||
}
|
||||
|
||||
aggregated <- filtered |>
|
||||
select(fault_address, faults)
|
||||
|
||||
# ===========================================================================
|
||||
# ADDRESS HEX -> INT
|
||||
# ===========================================================================
|
||||
|
||||
# "0x10001A" -> substr strips "0x" -> strtoi parses base-16 -> integer
|
||||
aggregated <- aggregated |>
|
||||
mutate(
|
||||
addr_int = strtoi(
|
||||
substr(.data$fault_address, 3L, nchar(.data$fault_address)),
|
||||
16L
|
||||
)
|
||||
)
|
||||
|
||||
# ===========================================================================
|
||||
# SCALE ROWS
|
||||
# ===========================================================================
|
||||
|
||||
# Local copy so different combinations can scale independently.
|
||||
row_width <- row_width_init
|
||||
|
||||
# Double row_width until occupied rows <= max_rows
|
||||
while (
|
||||
row_width < 65536L &&
|
||||
n_occupied_rows(
|
||||
aggregated$addr_int,
|
||||
row_width
|
||||
) >
|
||||
max_rows
|
||||
) {
|
||||
row_width <- row_width * 2L
|
||||
}
|
||||
|
||||
if (row_width > row_width_init) {
|
||||
message(sprintf(
|
||||
"Note: [%s/%s] row_width auto-scaled to %d (%d occupied rows)",
|
||||
target_resulttype,
|
||||
target_benchmark,
|
||||
row_width,
|
||||
n_occupied_rows(aggregated$addr_int, row_width)
|
||||
))
|
||||
}
|
||||
|
||||
# ===========================================================================
|
||||
# GRID COORDINATES
|
||||
# ===========================================================================
|
||||
|
||||
# col = addr %% row_width -> byte offset within the row (0 ... row_width-1)
|
||||
# row = (addr %/% row_width) * row_width -> base address of the row
|
||||
grid_data <- aggregated |>
|
||||
mutate(
|
||||
col = .data$addr_int %% row_width,
|
||||
row = (.data$addr_int %/% row_width) * row_width
|
||||
)
|
||||
|
||||
# ===========================================================================
|
||||
# GAPS
|
||||
# ===========================================================================
|
||||
|
||||
rows_sorted <- sort(unique(grid_data$row))
|
||||
n_data_rows <- length(rows_sorted)
|
||||
|
||||
# - diff() returns the successive differences between consecutive elements
|
||||
# - has_gap_before[i] = TRUE when that distance > row_width
|
||||
# - First row never has a predecessor, so it's FALSE
|
||||
has_gap_before <- c(FALSE, diff(rows_sorted) > row_width)
|
||||
|
||||
# - cumsum(has_gap_before) counts how many gaps precede each row
|
||||
# - Adding that offset to 1...n gives the row_idx values with gap slots
|
||||
cumulative_gaps <- cumsum(has_gap_before)
|
||||
row_order <- tibble(
|
||||
row = rows_sorted,
|
||||
row_idx = seq_len(n_data_rows) + cumulative_gaps,
|
||||
has_gap_before = has_gap_before
|
||||
)
|
||||
|
||||
gap_marker_indices <- row_order$row_idx[has_gap_before] - 1L
|
||||
total_slots <- n_data_rows + sum(has_gap_before)
|
||||
|
||||
# ===========================================================================
|
||||
# FILL EMPTY CELLS
|
||||
# ===========================================================================
|
||||
|
||||
# - complete() adds a row for every missing (row, col) tuple
|
||||
# - left_join attaches row_idx to every cell
|
||||
grid_complete <- grid_data |>
|
||||
complete(row, col = 0L:(row_width - 1L)) |>
|
||||
left_join(row_order, by = "row")
|
||||
|
||||
# ===========================================================================
|
||||
# GAP TILES
|
||||
# ===========================================================================
|
||||
|
||||
gap_markers <- data.frame(row_idx = gap_marker_indices)
|
||||
|
||||
# ===========================================================================
|
||||
# ELF REGION RECTANGLES
|
||||
# ===========================================================================
|
||||
|
||||
region_rects <- data.frame(
|
||||
label = character(0),
|
||||
ymin = numeric(0),
|
||||
ymax = numeric(0)
|
||||
)
|
||||
|
||||
if (length(sym_addr) > 0) {
|
||||
rects_list <- lapply(regions, function(reg) {
|
||||
s <- sym_addr[reg$start]
|
||||
e <- sym_addr[reg$end]
|
||||
|
||||
if (is.na(s) || is.na(e) || s >= e) {
|
||||
return(NULL)
|
||||
}
|
||||
|
||||
# Row with base address r covers bytes r ... r + row_width - 1.
|
||||
# Overlap if r < e && r + row_width > s
|
||||
overlapping <- row_order[
|
||||
row_order$row < e & (row_order$row + row_width) > s,
|
||||
,
|
||||
drop = FALSE
|
||||
]
|
||||
|
||||
if (nrow(overlapping) == 0) {
|
||||
return(NULL)
|
||||
}
|
||||
|
||||
data.frame(
|
||||
label = reg$label,
|
||||
ymin = min(overlapping$row_idx) - 0.5,
|
||||
ymax = max(overlapping$row_idx) + 0.5
|
||||
)
|
||||
})
|
||||
|
||||
rects_list <- Filter(Negate(is.null), rects_list)
|
||||
if (length(rects_list) > 0) {
|
||||
region_rects <- do.call(rbind, rects_list)
|
||||
}
|
||||
}
|
||||
|
||||
# ===========================================================================
|
||||
# TILE SIZE
|
||||
# ===========================================================================
|
||||
|
||||
tile_size <- min(target_w / row_width, target_h / total_slots, max_tile)
|
||||
|
||||
# ===========================================================================
|
||||
# X-AXIS TICKS
|
||||
# ===========================================================================
|
||||
|
||||
# Minimum step to keep labels from overlapping at this tile size
|
||||
min_tick_step <- as.integer(ceiling(0.25 / tile_size))
|
||||
|
||||
# Snap to a power of 2 so labels stay round
|
||||
x_tick_step <- max(1L, row_width %/% n_x_ticks)
|
||||
x_tick_step <- 2L^as.integer(
|
||||
ceiling(log2(max(x_tick_step, min_tick_step, 1L)))
|
||||
)
|
||||
col_tick_values <- seq(0L, row_width - 1L, by = x_tick_step)
|
||||
col_tick_labels <- sprintf("+0x%X", col_tick_values)
|
||||
|
||||
# ===========================================================================
|
||||
# Y-AXIS TICKS
|
||||
# ===========================================================================
|
||||
|
||||
# Show 15 labels max (gaps are ignored)
|
||||
label_step <- max(1L, ceiling(n_data_rows / 15L))
|
||||
label_at <- row_order[seq(1L, n_data_rows, by = label_step), ]
|
||||
|
||||
# ===========================================================================
|
||||
# PLOT
|
||||
# ===========================================================================
|
||||
|
||||
plot <- ggplot(
|
||||
grid_complete,
|
||||
aes(
|
||||
x = col,
|
||||
y = .data$row_idx,
|
||||
fill = .data$faults
|
||||
)
|
||||
) +
|
||||
|
||||
# One rectangle per (col, row_idx) tuple
|
||||
geom_tile(width = 1, height = 1, colour = NA) +
|
||||
|
||||
# Separators at address gaps
|
||||
geom_rect(
|
||||
data = gap_markers,
|
||||
aes(ymin = .data$row_idx - 0.5, ymax = .data$row_idx + 0.5),
|
||||
xmin = -0.5,
|
||||
xmax = row_width - 0.5,
|
||||
fill = "grey40",
|
||||
colour = NA,
|
||||
inherit.aes = FALSE
|
||||
) +
|
||||
|
||||
# Heatmap color ramp
|
||||
scale_fill_viridis_c(
|
||||
name = "Faults",
|
||||
trans = "log1p",
|
||||
na.value = "grey85",
|
||||
option = "viridis"
|
||||
) +
|
||||
|
||||
# X-axis hex labels
|
||||
scale_x_continuous(
|
||||
breaks = col_tick_values,
|
||||
labels = col_tick_labels,
|
||||
limits = c(-0.5, row_width - 0.5),
|
||||
expand = c(0, 0)
|
||||
) +
|
||||
|
||||
# Y-axis hex labels, lowest address at the top
|
||||
scale_y_reverse(
|
||||
breaks = label_at$row_idx,
|
||||
labels = sprintf("0x%X", label_at$row),
|
||||
limits = c(total_slots + 0.5, 0.5), # includes gaps
|
||||
expand = c(0, 0)
|
||||
) +
|
||||
|
||||
# Title + axis labels
|
||||
labs(
|
||||
title = paste(target_resulttype, "/", target_benchmark),
|
||||
subtitle = paste(
|
||||
"Total:",
|
||||
format(
|
||||
sum(aggregated$faults, na.rm = TRUE),
|
||||
big.mark = ","
|
||||
)
|
||||
),
|
||||
x = "Byte Offset",
|
||||
y = "Base Address"
|
||||
) +
|
||||
|
||||
# Theme
|
||||
theme_minimal() +
|
||||
theme(
|
||||
axis.text.x = element_text(
|
||||
family = "mono",
|
||||
angle = 45,
|
||||
hjust = 1,
|
||||
size = 9
|
||||
),
|
||||
axis.text.y = element_text(family = "mono", size = 9),
|
||||
panel.grid = element_blank(),
|
||||
panel.border = element_rect(colour = "grey50", fill = NA, linewidth = 0.5)
|
||||
) +
|
||||
|
||||
# Force square tiles
|
||||
coord_fixed(ratio = 1)
|
||||
|
||||
# ELF region borders
|
||||
if (nrow(region_rects) > 0) {
|
||||
plot <- plot +
|
||||
geom_rect(
|
||||
data = region_rects,
|
||||
aes(ymin = .data$ymin, ymax = .data$ymax, colour = .data$label),
|
||||
xmin = -0.5,
|
||||
xmax = row_width - 0.5,
|
||||
fill = NA,
|
||||
linewidth = 1.5,
|
||||
inherit.aes = FALSE
|
||||
) +
|
||||
scale_colour_brewer(name = "Region", palette = "Dark2")
|
||||
}
|
||||
|
||||
# ===========================================================================
|
||||
# SAVE
|
||||
# ===========================================================================
|
||||
|
||||
fig_w <- row_width * tile_size + 4.5
|
||||
fig_h <- total_slots * tile_size + 2.5
|
||||
|
||||
outfile <- file.path(
|
||||
experiment,
|
||||
paste0(
|
||||
"heatmap_",
|
||||
target_resulttype,
|
||||
"_",
|
||||
target_benchmark,
|
||||
suffix,
|
||||
".svg"
|
||||
)
|
||||
)
|
||||
|
||||
ggsave(outfile, plot = plot, width = fig_w, height = fig_h, units = "in")
|
||||
message(sprintf("Saved: %s", basename(outfile)))
|
||||
invisible(NULL)
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# GENERATE HEATMAPS
|
||||
# =============================================================================
|
||||
|
||||
# Combinations with missing data are skipped
|
||||
for (bm in benchmarks) {
|
||||
for (marker in markers) {
|
||||
make_heatmap(marker, bm)
|
||||
}
|
||||
}
|
||||
@ -1,10 +1,12 @@
|
||||
library(ggplot2)
|
||||
|
||||
# Usage: Rscript single_result.r exp_abspath
|
||||
# Usage: Rscript single_result.r exp_abspath [resultsdata_file]
|
||||
|
||||
args <- commandArgs(trailingOnly = TRUE)
|
||||
experiment <- args[1]
|
||||
datafile <- paste(experiment, "/resultsdata.csv", sep = "")
|
||||
resultsdata_file <- if (length(args) >= 2) args[2] else "resultsdata.csv"
|
||||
suffix <- gsub("^resultsdata|\\.csv$", "", resultsdata_file)
|
||||
datafile <- file.path(experiment, resultsdata_file)
|
||||
|
||||
if (!file.exists(datafile)) {
|
||||
print(paste("Input file", datafile, "is missing"))
|
||||
@ -21,6 +23,6 @@ plot <- ggplot(data, aes(x = benchmark, y = faults, fill = resulttype)) +
|
||||
theme_minimal()
|
||||
|
||||
ggsave(
|
||||
paste(experiment, "/single_result.svg", sep = ""),
|
||||
paste0(experiment, "/single_result", suffix, ".svg"),
|
||||
plot = plot,
|
||||
)
|
||||
@ -6,7 +6,9 @@ library(ggplot2)
|
||||
|
||||
args <- commandArgs(trailingOnly = TRUE)
|
||||
experiment <- args[1]
|
||||
datafile <- paste(experiment, "/faults.csv", sep = "")
|
||||
faults_file <- if (length(args) >= 2) args[2] else "faults.csv"
|
||||
suffix <- gsub("^faults|\\.csv$", "", faults_file)
|
||||
datafile <- file.path(experiment, faults_file)
|
||||
|
||||
if (!file.exists(datafile)) {
|
||||
print(paste("Input file", datafile, "is missing"))
|
||||
@ -27,6 +29,6 @@ plot <- ggplot(data, aes(x = fault_address, y = faults)) +
|
||||
theme_minimal()
|
||||
|
||||
ggsave(
|
||||
paste(experiment, "/scatter.svg", sep = ""),
|
||||
paste0(experiment, "/scatter", suffix, ".svg"),
|
||||
plot = plot,
|
||||
)
|
||||
441
scripts/compile.pl
Normal file
441
scripts/compile.pl
Normal file
@ -0,0 +1,441 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use feature 'say';
|
||||
use File::Copy qw(copy);
|
||||
use File::Path qw(rmtree make_path);
|
||||
use Cwd qw(abs_path);
|
||||
use FindBin;
|
||||
use lib "$FindBin::Bin/Modules";
|
||||
use Util;
|
||||
|
||||
# ========================================================================================= #
|
||||
# Project root
|
||||
# ========================================================================================= #
|
||||
|
||||
my $root = abs_path("$FindBin::Bin/..");
|
||||
chdir($root) or die "Cannot chdir to $root: $!\n";
|
||||
|
||||
# ========================================================================================= #
|
||||
# Environment set by "nix develop"
|
||||
# ========================================================================================= #
|
||||
|
||||
sub require_env {
|
||||
my ($name) = @_;
|
||||
return $ENV{$name}
|
||||
// die "$name is not set (run from 'nix develop' shell)\n";
|
||||
}
|
||||
|
||||
my $wasi_root = require_env('WASI_ROOT');
|
||||
my $wamr_root = require_env('WAMR_ROOT');
|
||||
my $cross_cc = require_env('CROSS_CC');
|
||||
my $linux_cc = require_env('LINUX_CC');
|
||||
|
||||
my $use_aot_in_text = ( $ENV{WAMR_USE_AOT_IN_TEXT} // 'false' ) eq 'true';
|
||||
my $use_mmap_in_text = ( $ENV{WAMR_USE_MMAP_IN_TEXT} // 'false' ) eq 'true';
|
||||
my $use_xip = ( $ENV{WAMR_USE_XIP} // 'false' ) eq 'true';
|
||||
my $use_allocator = ( $ENV{WAMR_USE_ALLOCATOR} // 'false' ) eq 'true';
|
||||
my $use_global_heap_in_text =
|
||||
( $ENV{WAMR_USE_GLOBAL_HEAP_IN_TEXT} // 'false' ) eq 'true';
|
||||
my $use_runtime_pool_in_text =
|
||||
( $ENV{WAMR_USE_RUNTIME_POOL_IN_TEXT} // 'false' ) eq 'true';
|
||||
my $use_linear_pool_in_text =
|
||||
( $ENV{WAMR_USE_LINEAR_POOL_IN_TEXT} // 'false' ) eq 'true';
|
||||
|
||||
# ========================================================================================= #
|
||||
# WAMR cmake configuration
|
||||
# ========================================================================================= #
|
||||
|
||||
# Flags common to all platforms
|
||||
my @wamr_cmake_base = (
|
||||
'-DCMAKE_BUILD_TYPE=Debug', '-DWAMR_BUILD_TARGET=X86_32',
|
||||
'-DWAMR_BUILD_AOT=1', '-DWAMR_BUILD_WAMR_COMPILER=0',
|
||||
'-DWAMR_BUILD_INTERP=1', '-DWAMR_BUILD_FAST_INTERP=0',
|
||||
'-DWAMR_BUILD_JIT=0', '-DWAMR_BUILD_FAST_JIT=0',
|
||||
'-DWAMR_BUILD_LIBC_BUILTIN=1', '-DWAMR_BUILD_LIBC_WASI=0',
|
||||
'-DWAMR_BUILD_SIMD=0',
|
||||
);
|
||||
|
||||
my @wamr_cmake_baremetal = (
|
||||
'-DWAMR_BUILD_PLATFORM=baremetal',
|
||||
'-DCMAKE_SYSTEM_NAME=Generic',
|
||||
'-DCMAKE_SYSTEM_PROCESSOR=i386',
|
||||
'-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY',
|
||||
);
|
||||
|
||||
my @wamr_cmake_linux = ( '-DWAMR_BUILD_PLATFORM=linux', );
|
||||
|
||||
# Variant defines passed as CMAKE_C_FLAGS
|
||||
my @variant_cflags =
|
||||
( '-Wno-error=implicit-function-declaration', '-O0', '-ggdb3' );
|
||||
push @variant_cflags,
|
||||
$use_mmap_in_text ? '-DWAMR_MMAP_IN_TEXT=1' : '-DWAMR_MMAP_IN_TEXT=0';
|
||||
push @variant_cflags, '-DWASM_MEM_ALLOC_WITH_USAGE=1' if $use_allocator;
|
||||
my $cmake_c_flags = join( ' ', @variant_cflags );
|
||||
|
||||
# Variant options passed as cmake variables
|
||||
my @variant_cmake_flags;
|
||||
push @variant_cmake_flags, '-DWAMR_BUILD_ALLOC_WITH_USAGE=1' if $use_allocator;
|
||||
|
||||
# Defines forwarded to the host compilation so wasm_host.c sees the same
|
||||
# WASM_MEM_ALLOC_WITH_USAGE value as libiwasm.a was built with.
|
||||
my @host_variant_cflags;
|
||||
push @host_variant_cflags, '-DWASM_MEM_ALLOC_WITH_USAGE=1' if $use_allocator;
|
||||
push @host_variant_cflags,
|
||||
$use_global_heap_in_text
|
||||
? '-DWAMR_GLOBAL_HEAP_IN_TEXT=1'
|
||||
: '-DWAMR_GLOBAL_HEAP_IN_TEXT=0';
|
||||
push @host_variant_cflags,
|
||||
$use_runtime_pool_in_text
|
||||
? '-DWAMR_RUNTIME_POOL_IN_TEXT=1'
|
||||
: '-DWAMR_RUNTIME_POOL_IN_TEXT=0';
|
||||
push @host_variant_cflags,
|
||||
$use_linear_pool_in_text
|
||||
? '-DWAMR_LINEAR_POOL_IN_TEXT=1'
|
||||
: '-DWAMR_LINEAR_POOL_IN_TEXT=0';
|
||||
|
||||
# ========================================================================================= #
|
||||
# Compiler / linker flags
|
||||
# ========================================================================================= #
|
||||
|
||||
my @wasi_cflags = (
|
||||
'--target=wasm32', "--sysroot=$wasi_root/share/wasi-sysroot",
|
||||
'-z', 'stack-size=4096',
|
||||
'-O0', '-nostdlib',
|
||||
'-Wl,--no-entry', '-Wl,--export=wasm_module',
|
||||
'-Wl,--no-gc-sections', '-Wl,--initial-memory=65536',
|
||||
'-Wl,--export=__heap_base', '-Wl,--export=__data_end',
|
||||
);
|
||||
|
||||
my @cross_cflags =
|
||||
qw(-O0 -m32 -ffunction-sections -fdata-sections -ffreestanding -fpermissive -ggdb3);
|
||||
my @linux_cflags =
|
||||
qw(-O0 -m32 -ffunction-sections -fdata-sections -fpermissive -ggdb3);
|
||||
my @linux_baremetal_cflags =
|
||||
qw(-O0 -m32 -ffunction-sections -fdata-sections -ffreestanding -ggdb3);
|
||||
|
||||
# libiwasm.a is passed as a direct file path (no -L/-liwasm)
|
||||
my @cross_ldflags_base = (
|
||||
'-Wl,--build-id=none', '-static', '-nostdlib', '-m32',
|
||||
'-lc', '-lgcc', '-lm'
|
||||
);
|
||||
my @linux_ldflags_base = ( '-Wl,--build-id=none', '-m32', '-lm' );
|
||||
my @baremetal_ldflags_base = (
|
||||
'-Wl,--build-id=none', '-static', '-nostdlib', '-m32',
|
||||
'-lc', '-lgcc', '-lm', '--entry',
|
||||
'main'
|
||||
);
|
||||
my @cross_ldflags_nowasm = (
|
||||
'-Wl,--build-id=none', '-static', '-nostdlib', '-m32',
|
||||
'-lc', '-lgcc', '-lm'
|
||||
);
|
||||
my @linux_ldflags_nowasm = ( '-Wl,--build-id=none', '-m32', '-lm' );
|
||||
|
||||
my @wamr_inc_baremetal = (
|
||||
"-I$wamr_root/core/iwasm/include",
|
||||
"-I$wamr_root/core/shared/utils",
|
||||
"-I$wamr_root/core/shared/platform/baremetal",
|
||||
);
|
||||
my @wamr_inc_linux = (
|
||||
"-I$wamr_root/core/iwasm/include",
|
||||
"-I$wamr_root/core/shared/utils",
|
||||
"-I$wamr_root/core/shared/platform/linux",
|
||||
);
|
||||
|
||||
my @cross_wamrcflags = ( '--target=i386', '--cpu=generic', '--opt-level=0' );
|
||||
push @cross_wamrcflags, '--xip' if $use_xip;
|
||||
my @linux_wamrcflags = ( '--target=i386', '--cpu=generic', '--opt-level=0' );
|
||||
|
||||
# ========================================================================================= #
|
||||
# Entry point
|
||||
# ========================================================================================= #
|
||||
|
||||
die "Usage: compile.pl <module> <target> <mode>\n"
|
||||
. " target: fail | linux | linux-baremetal\n"
|
||||
. " mode: aot | interp | c\n"
|
||||
unless @ARGV == 3;
|
||||
|
||||
my ( $module, $target, $mode ) = @ARGV;
|
||||
|
||||
build( $module, $target, $mode );
|
||||
|
||||
# ========================================================================================= #
|
||||
# Build
|
||||
# ========================================================================================= #
|
||||
|
||||
sub build {
|
||||
my ( $module, $target, $mode ) = @_;
|
||||
my $bd = "build-$module";
|
||||
|
||||
rmtree($bd);
|
||||
make_path($bd);
|
||||
copy_auxiliary( $module, $bd );
|
||||
|
||||
if ( $mode eq 'aot' || $mode eq 'interp' ) {
|
||||
build_libiwasm( $module, $bd, $target );
|
||||
compile_wasm_module( $module, $bd );
|
||||
if ( $mode eq 'aot' ) {
|
||||
compile_wasm_aot( $module, $bd, $target );
|
||||
make_aot_array( $module, $bd );
|
||||
}
|
||||
else {
|
||||
make_interp_array( $module, $bd );
|
||||
}
|
||||
prepare_wasm_host( $module, $bd, $mode );
|
||||
compile_wasm_host( $module, $bd, $target );
|
||||
compile_startup( $module, $bd, $target );
|
||||
compile_syscalls( $module, $bd, $target );
|
||||
link_wasm( $module, $bd, $target );
|
||||
}
|
||||
elsif ( $mode eq 'c' ) {
|
||||
compile_c_module( $module, $bd, $target );
|
||||
compile_c_host( $module, $bd, $target );
|
||||
compile_startup( $module, $bd, $target );
|
||||
link_c( $module, $bd, $target );
|
||||
}
|
||||
else {
|
||||
die "Unknown mode '$mode'; expected: aot, interp, c\n";
|
||||
}
|
||||
|
||||
build_iso( $module, $bd );
|
||||
}
|
||||
|
||||
# ========================================================================================= #
|
||||
# Steps
|
||||
# ========================================================================================= #
|
||||
|
||||
sub build_libiwasm {
|
||||
my ( $module, $bd, $target ) = @_;
|
||||
my $cmake_bd = "$bd/wamr-build";
|
||||
make_path($cmake_bd);
|
||||
|
||||
my ( $cmake_cc, @sys_flags ) =
|
||||
( $target eq 'linux' )
|
||||
? ( $linux_cc, @wamr_cmake_linux )
|
||||
: ( $cross_cc, @wamr_cmake_baremetal );
|
||||
|
||||
Util::run(
|
||||
'cmake', '-S',
|
||||
$wamr_root, '-B',
|
||||
$cmake_bd, "-DCMAKE_C_COMPILER=$cmake_cc",
|
||||
@wamr_cmake_base, @sys_flags,
|
||||
@variant_cmake_flags, "-DCMAKE_C_FLAGS=$cmake_c_flags",
|
||||
);
|
||||
Util::run( 'cmake', '--build', $cmake_bd );
|
||||
copy( "$cmake_bd/libiwasm.a", "$bd/libiwasm.a" )
|
||||
or die "failed to copy $cmake_bd/libiwasm.a: $!";
|
||||
rmtree($cmake_bd) or die "failed to remove $cmake_bd: $!";
|
||||
}
|
||||
|
||||
sub copy_auxiliary {
|
||||
my ( $module, $bd ) = @_;
|
||||
my @files = (
|
||||
[ 'flake.nix', "$bd/flake.nix" ],
|
||||
[ 'scripts/runner.pl', "$bd/runner.pl" ],
|
||||
[ 'scripts/compile.pl', "$bd/compile.pl" ],
|
||||
[ 'targets/lib.h', "$bd/lib.h" ],
|
||||
[ 'targets/linker.ld', "$bd/linker.ld" ],
|
||||
[ 'targets/startup.s', "$bd/startup.s" ],
|
||||
[ 'targets/syscalls.c', "$bd/syscalls.c" ],
|
||||
[ "targets/wasm-module/$module.cpp", "$bd/wasm-module.cpp" ],
|
||||
);
|
||||
for my $pair (@files) {
|
||||
copy( $pair->[0], $pair->[1] )
|
||||
or die "failed to copy $pair->[0] -> $pair->[1]: $!";
|
||||
}
|
||||
}
|
||||
|
||||
sub compile_wasm_module {
|
||||
my ( $module, $bd ) = @_;
|
||||
Util::run( "$wasi_root/bin/clang", @wasi_cflags,
|
||||
"targets/wasm-module/$module.cpp",
|
||||
'-o', "$bd/wasm_module.wasm" );
|
||||
}
|
||||
|
||||
sub compile_wasm_aot {
|
||||
my ( $module, $bd, $target ) = @_;
|
||||
my @flags = ( $target eq 'linux' ) ? @linux_wamrcflags : @cross_wamrcflags;
|
||||
Util::run( 'wamrc', @flags, '-o', "$bd/wasm_module.aot",
|
||||
"$bd/wasm_module.wasm" );
|
||||
}
|
||||
|
||||
sub make_aot_array {
|
||||
my ( $module, $bd ) = @_;
|
||||
open( my $xxd, '-|', 'xxd', '-i', "$bd/wasm_module.aot" )
|
||||
or die "failed to run xxd: $!";
|
||||
my $content = do { local $/; <$xxd> };
|
||||
close($xxd);
|
||||
|
||||
$content =
|
||||
qq{__attribute__((section(".text.wamr_aot"), aligned(4096)))\n}
|
||||
. $content
|
||||
if $use_aot_in_text;
|
||||
|
||||
Util::write_file( "$bd/wasm_aot_array.c", $content );
|
||||
}
|
||||
|
||||
sub make_interp_array {
|
||||
my ( $module, $bd ) = @_;
|
||||
open( my $xxd, '-|', 'xxd', '-i', "$bd/wasm_module.wasm" )
|
||||
or die "Cannot run xxd: $!\n";
|
||||
my $content = do { local $/; <$xxd> };
|
||||
close($xxd);
|
||||
Util::write_file( "$bd/wasm_interp_array.c", $content );
|
||||
}
|
||||
|
||||
sub prepare_wasm_host {
|
||||
my ( $module, $bd, $mode ) = @_;
|
||||
my $template = 'targets/wasm-host/wasm_host.c';
|
||||
|
||||
my $mod_c = ( $module =~ s/-/_/gr );
|
||||
my ( $array_file, $array_sym, $len_sym ) =
|
||||
( $mode eq 'aot' )
|
||||
? (
|
||||
'wasm_aot_array.c',
|
||||
"build_${mod_c}_wasm_module_aot",
|
||||
"build_${mod_c}_wasm_module_aot_len"
|
||||
)
|
||||
: (
|
||||
'wasm_interp_array.c',
|
||||
"build_${mod_c}_wasm_module_wasm",
|
||||
"build_${mod_c}_wasm_module_wasm_len"
|
||||
);
|
||||
|
||||
my $content = Util::read_file($template);
|
||||
$content =~ s/__WASM_ARRAY_FILE__/$array_file/g;
|
||||
$content =~ s/__WASM_ARRAY__/$array_sym/g;
|
||||
$content =~ s/__WASM_ARRAY_LEN__/$len_sym/g;
|
||||
Util::write_file( "$bd/module_host.c", $content );
|
||||
}
|
||||
|
||||
sub compile_wasm_host {
|
||||
my ( $module, $bd, $target ) = @_;
|
||||
if ( $target eq 'fail' ) {
|
||||
Util::run(
|
||||
$cross_cc, '-I./targets/wasm-host',
|
||||
@cross_cflags, @host_variant_cflags,
|
||||
@wamr_inc_baremetal, '-DTARGET_FAIL',
|
||||
'-c', "$bd/module_host.c",
|
||||
'-o', "$bd/system.o"
|
||||
);
|
||||
}
|
||||
elsif ( $target eq 'linux' ) {
|
||||
Util::run(
|
||||
$linux_cc, '-I./targets/wasm-host',
|
||||
@linux_cflags, @host_variant_cflags,
|
||||
@wamr_inc_linux, '-DTARGET_LINUX',
|
||||
'-c', "$bd/module_host.c",
|
||||
'-o', "$bd/system.o"
|
||||
);
|
||||
}
|
||||
elsif ( $target eq 'linux-baremetal' ) {
|
||||
Util::run(
|
||||
$cross_cc, '-I./targets/wasm-host',
|
||||
@linux_baremetal_cflags, @host_variant_cflags,
|
||||
@wamr_inc_baremetal, '-DTARGET_LINUX_BAREMETAL',
|
||||
'-c', "$bd/module_host.c",
|
||||
'-o', "$bd/system.o"
|
||||
);
|
||||
}
|
||||
else {
|
||||
die "Unknown target '$target'\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub compile_c_module {
|
||||
my ( $module, $bd, $target ) = @_;
|
||||
my ( $cc, @flags ) =
|
||||
( $target eq 'linux' )
|
||||
? ( $linux_cc, @linux_cflags )
|
||||
: ( $cross_cc, @cross_cflags );
|
||||
Util::run( $cc, @flags, '-c', "targets/wasm-module/$module.cpp",
|
||||
'-o', "$bd/c_module.o" );
|
||||
}
|
||||
|
||||
sub compile_c_host {
|
||||
my ( $module, $bd, $target ) = @_;
|
||||
my ( $cc, @flags ) =
|
||||
( $target eq 'linux' )
|
||||
? ( $linux_cc, @linux_cflags, '-DTARGET_LINUX' )
|
||||
: ( $cross_cc, @cross_cflags, '-DTARGET_FAIL' );
|
||||
Util::run( $cc, @flags, '-c', 'targets/c-host/c_host.c', '-o',
|
||||
"$bd/c_host.o" );
|
||||
copy( 'targets/c-host/c_host.c', "$bd/module_host.c" );
|
||||
}
|
||||
|
||||
sub compile_startup {
|
||||
my ( $module, $bd, $target ) = @_;
|
||||
return unless $target eq 'fail';
|
||||
Util::run( $cross_cc, 'targets/startup.s', '-I./targets/wasm-host',
|
||||
@cross_cflags, '-c', '-o', "$bd/startup.o" );
|
||||
}
|
||||
|
||||
sub compile_syscalls {
|
||||
my ( $module, $bd, $target ) = @_;
|
||||
if ( $target eq 'fail' ) {
|
||||
Util::run( $cross_cc, 'targets/syscalls.c',
|
||||
'-I./targets/wasm-host', @cross_cflags,
|
||||
'-c', '-o', "$bd/syscalls.o" );
|
||||
}
|
||||
elsif ( $target eq 'linux-baremetal' ) {
|
||||
Util::run( $cross_cc, 'targets/syscalls.c', @linux_baremetal_cflags,
|
||||
'-c', '-o', "$bd/syscalls.o" );
|
||||
}
|
||||
|
||||
# Linux needs neither startup nor syscall stubs
|
||||
}
|
||||
|
||||
sub link_wasm {
|
||||
my ( $module, $bd, $target ) = @_;
|
||||
if ( $target eq 'fail' ) {
|
||||
Util::run(
|
||||
$cross_cc, '-Wl,-T',
|
||||
'targets/linker.ld', "$bd/system.o",
|
||||
"$bd/startup.o", "$bd/syscalls.o",
|
||||
"$bd/libiwasm.a", @cross_ldflags_base,
|
||||
'-o', "$bd/system.elf"
|
||||
);
|
||||
}
|
||||
elsif ( $target eq 'linux' ) {
|
||||
Util::run( $linux_cc, "$bd/system.o", "$bd/libiwasm.a",
|
||||
@linux_ldflags_base, '-o', "$bd/system.elf" );
|
||||
}
|
||||
elsif ( $target eq 'linux-baremetal' ) {
|
||||
Util::run( $cross_cc, "$bd/system.o", "$bd/syscalls.o",
|
||||
"$bd/libiwasm.a", @baremetal_ldflags_base, '-o', "$bd/system.elf" );
|
||||
}
|
||||
else {
|
||||
die "Unknown target '$target'\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub link_c {
|
||||
my ( $module, $bd, $target ) = @_;
|
||||
if ( $target eq 'fail' ) {
|
||||
Util::run(
|
||||
$cross_cc, '-Wl,-T',
|
||||
'targets/linker.ld', "$bd/c_host.o",
|
||||
"$bd/startup.o", "$bd/c_module.o",
|
||||
@cross_ldflags_nowasm, '-o',
|
||||
"$bd/system.elf"
|
||||
);
|
||||
}
|
||||
elsif ( $target eq 'linux' ) {
|
||||
Util::run( $linux_cc, "$bd/c_host.o", "$bd/c_module.o",
|
||||
@linux_ldflags_nowasm, '-o', "$bd/system.elf" );
|
||||
}
|
||||
else {
|
||||
die "C mode is not supported for target '$target'\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub build_iso {
|
||||
my ( $module, $bd ) = @_;
|
||||
make_path("$bd/grub/boot/grub");
|
||||
copy( 'targets/grub.cfg', "$bd/grub/boot/grub/grub.cfg" )
|
||||
or die "failed to copy grub.cfg: $!\n";
|
||||
copy( "$bd/system.elf", "$bd/grub/boot/system.elf" )
|
||||
or die "failed to copy system.elf: $!\n";
|
||||
Util::run( 'grub-mkrescue', '-o', "$bd/system.iso", "$bd/grub" );
|
||||
}
|
||||
@ -5,7 +5,7 @@ use warnings;
|
||||
use diagnostics;
|
||||
|
||||
use FindBin;
|
||||
use lib $FindBin::Bin;
|
||||
use lib "$FindBin::Bin/Modules";
|
||||
|
||||
use Util;
|
||||
use Mars;
|
||||
@ -18,8 +18,8 @@ my $local_builds_dir = "$local_root/builds";
|
||||
|
||||
my $remote_root = '/home/lab/smchurla/Documents/failnix';
|
||||
my $remote_builds_dir = "$remote_root/builds";
|
||||
my $remote_runner = "$remote_root/scripts/runner.pl";
|
||||
my $remote_log = "$remote_root/runner.log";
|
||||
my $remote_runner = "$remote_root/scripts/multi_runner.pl";
|
||||
my $remote_log = "$remote_root/multi_runner.log";
|
||||
|
||||
# Upload new experiments
|
||||
my @experiments = grep { /fail/ } Util::find_subdirs($local_builds_dir);
|
||||
|
||||
@ -5,7 +5,7 @@ use warnings;
|
||||
use diagnostics;
|
||||
|
||||
use FindBin;
|
||||
use lib $FindBin::Bin;
|
||||
use lib "$FindBin::Bin/Modules";
|
||||
|
||||
use Util;
|
||||
use Mars;
|
||||
@ -23,6 +23,9 @@ my $local_archive_dir = "$local_root/injections";
|
||||
# Select experiment to open
|
||||
my $selected_experiment = Util::select_experiment(0);
|
||||
|
||||
my $selected_faults_csv =
|
||||
Util::pick_data_file( "$local_archive_dir/$selected_experiment", "faults" );
|
||||
|
||||
my $cui = TUI::init_cui();
|
||||
|
||||
# TODO: Add a TextEditor panel beside the experiment selection for notes.
|
||||
@ -51,10 +54,10 @@ my $source_text;
|
||||
|
||||
my @benchs = ( "ip", "mem", "regs" );
|
||||
my @markers = (
|
||||
"OK_MARKER", "DETECTED_MARKER",
|
||||
"FAIL_MARKER", "TRAP",
|
||||
"TIMEOUT", "ACCESS_OUTERSPACE",
|
||||
"WRITE_TEXTSEGMENT",
|
||||
"OK_MARKER", "DETECTED_MARKER",
|
||||
"FAIL_MARKER", "TRAP",
|
||||
"TIMEOUT", "ACCESS_OUTERSPACE",
|
||||
"WRITE_TEXTSEGMENT", "GROUP1_MARKER",
|
||||
);
|
||||
|
||||
# Filter popup state
|
||||
@ -95,7 +98,7 @@ sub load_faults_csv {
|
||||
|
||||
# Schema: benchmark, resulttype, faults, fault_address
|
||||
my $data = Text::CSV_XS::csv(
|
||||
in => "$local_archive_dir/$selected_experiment/faults.csv",
|
||||
in => "$local_archive_dir/$selected_experiment/$selected_faults_csv",
|
||||
headers => 'auto'
|
||||
);
|
||||
|
||||
|
||||
@ -1,134 +0,0 @@
|
||||
[doc("Trace a golden run using FAIL*")]
|
||||
[group("4: fail")]
|
||||
trace module:
|
||||
{{ BOCHS_RUNNER }} \
|
||||
-V {{ FAIL_SHARE }}/vgabios.bin \
|
||||
-b {{ FAIL_SHARE }}/BIOS-bochs-latest \
|
||||
-1 \
|
||||
-f {{ FAIL_TRACE }} \
|
||||
-e {{ BUILD_DIR }}-{{ module }}/system.elf \
|
||||
-i {{ BUILD_DIR }}-{{ module }}/system.iso \
|
||||
-- \
|
||||
-Wf,--start-symbol=fail_start_trace \
|
||||
-Wf,--save-symbol=fail_start_trace \
|
||||
-Wf,--end-symbol=fail_stop_trace \
|
||||
-Wf,--state-file={{ BUILD_DIR }}-{{ module }}/state \
|
||||
-Wf,--trace-file={{ BUILD_DIR }}-{{ module }}/trace.pb \
|
||||
-Wf,--elf-file={{ BUILD_DIR }}-{{ module }}/system.elf
|
||||
@echo "Next step: \"just import {{ module }}\""
|
||||
|
||||
# [doc("Dump a FAIL* golden run trace")]
|
||||
# [group("fail")]
|
||||
# dump module:
|
||||
# {{ FAIL_DUMP }} {{ BUILD_DIR }}-{{ module }}/trace.pb
|
||||
|
||||
[doc("Import a FAIL* golden run trace")]
|
||||
[group("4: fail")]
|
||||
import module:
|
||||
{{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
|
||||
-i MemoryImporter \
|
||||
-e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b mem
|
||||
{{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
|
||||
-i RegisterImporter \
|
||||
-e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b regs --flags
|
||||
{{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
|
||||
-i RegisterImporter \
|
||||
-e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b ip --no-gp --ip
|
||||
|
||||
{{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
|
||||
-i ElfImporter --objdump objdump \
|
||||
-e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b ip
|
||||
{{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
|
||||
-i ElfImporter --objdump objdump \
|
||||
-e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b mem
|
||||
{{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
|
||||
-i ElfImporter --objdump objdump \
|
||||
-e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b regs
|
||||
|
||||
# {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
|
||||
# -i ElfImporter --objdump objdump \
|
||||
# -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b ip --sources
|
||||
# {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
|
||||
# -i ElfImporter --objdump objdump \
|
||||
# -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b mem --sources
|
||||
# {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
|
||||
# -i ElfImporter --objdump objdump \
|
||||
# -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b regs --sources
|
||||
|
||||
{{ FAIL_PRUNE }} --database-option-file ./db.conf -v {{ module }} -b %% --overwrite
|
||||
@echo "Next step: \"just server {{ module }}\""
|
||||
|
||||
[doc("Start the FAIL* campaign server")]
|
||||
[group("4: fail")]
|
||||
server module:
|
||||
{{ FAIL_SERVER }} \
|
||||
--port {{ FAIL_SERVER_PORT }} \
|
||||
--database-option-file ./db.conf \
|
||||
-v {{ module }} \
|
||||
-b % \
|
||||
--inject-single-bit \
|
||||
--inject-registers \
|
||||
&
|
||||
@echo "Next step: \"just client {{ module }}\""
|
||||
|
||||
[doc("Stop the FAIL* campaign server")]
|
||||
[group("4: fail")]
|
||||
stop-server:
|
||||
pkill -f {{ FAIL_SERVER }}
|
||||
|
||||
[doc("Start a FAIL* campaign client")]
|
||||
[group("4: fail")]
|
||||
client module:
|
||||
# -Wf,--catch-write-textsegment
|
||||
# -Wf,--catch-outerspace
|
||||
{{ BOCHS_RUNNER }} \
|
||||
-V {{ FAIL_SHARE }}/vgabios.bin \
|
||||
-b {{ FAIL_SHARE }}/BIOS-bochs-latest \
|
||||
-f {{ FAIL_INJECT }} \
|
||||
-e {{ BUILD_DIR }}-{{ module }}/system.elf \
|
||||
-i {{ BUILD_DIR }}-{{ module }}/system.iso \
|
||||
-j {{ num_cpus() }} \
|
||||
-- \
|
||||
-Wf,--server-port={{ FAIL_SERVER_PORT }} \
|
||||
-Wf,--state-dir={{ BUILD_DIR }}-{{ module }}/state \
|
||||
-Wf,--trap \
|
||||
-Wf,--catch-outerspace \
|
||||
-Wf,--timeout=500000 \
|
||||
-Wf,--ok-marker=fail_marker_positive \
|
||||
-Wf,--fail-marker=fail_marker_negative \
|
||||
-Wf,--detected-marker=fail_marker_detected \
|
||||
> /dev/null
|
||||
@echo "Next step: \"just result {{ module }}\" or \"just resultbrowser\""
|
||||
|
||||
[doc("Query FAIL* marker statistics from the database")]
|
||||
[group("4: fail")]
|
||||
result module:
|
||||
@echo "select variant, benchmark, resulttype, sum(t.time2 - t.time1 + 1) as faults \
|
||||
FROM variant v \
|
||||
JOIN trace t ON v.id = t.variant_id \
|
||||
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address \
|
||||
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id \
|
||||
JOIN fsppilot p ON r.pilot_id = p.id \
|
||||
WHERE v.variant = \"{{ module }}\" \
|
||||
GROUP BY v.id, resulttype \
|
||||
ORDER BY variant, benchmark, resulttype;" | mariadb --defaults-file=./db.conf -t
|
||||
|
||||
[doc("Dump FAIL* markers to CSV")]
|
||||
[group("4: fail")]
|
||||
result-csv module:
|
||||
@echo "SELECT \
|
||||
CONCAT(\"0x\", HEX(p.injection_instr_absolute)) AS fault_address, \
|
||||
SUM(t.time2 - t.time1 + 1) AS total_fail_markers \
|
||||
FROM trace t \
|
||||
JOIN variant v ON v.id = t.variant_id \
|
||||
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address \
|
||||
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id \
|
||||
JOIN fsppilot p ON p.id = r.pilot_id \
|
||||
WHERE v.variant = \"{{ module }}\" AND r.resulttype = \"FAIL_MARKER\" \
|
||||
GROUP BY p.injection_instr_absolute \
|
||||
ORDER BY SUM(t.time2 - t.time1 + 1) DESC;" | mariadb --defaults-file=./db.conf --batch --raw | sed 's/\t/,/g'
|
||||
|
||||
[doc("Start the FAIL* resultbrowser")]
|
||||
[group("4: fail")]
|
||||
resultbrowser:
|
||||
{{ RESULT_BROWSER }} -c ./db.conf --host=0.0.0.0 --port={{ RESULTBROWSER_PORT }}
|
||||
@ -1,35 +0,0 @@
|
||||
import "fail.just"
|
||||
|
||||
BUILD_DIR := "build"
|
||||
|
||||
# FAIL* variables
|
||||
|
||||
FAIL_SERVER_PORT := "22941"
|
||||
RESULTBROWSER_PORT := "22941"
|
||||
FAIL_BIN := "fail/bin"
|
||||
FAIL_SHARE := "fail/share"
|
||||
BOCHS_RUNNER := f"{{FAIL_BIN}}/bochs-experiment-runner.py"
|
||||
FAIL_TRACE := f"{{FAIL_BIN}}/fail-x86-tracing"
|
||||
FAIL_DUMP := f"{{FAIL_BIN}}/dump-trace"
|
||||
FAIL_IMPORT := f"{{FAIL_BIN}}/import-trace"
|
||||
FAIL_PRUNE := f"{{FAIL_BIN}}/prune-trace"
|
||||
FAIL_SERVER := f"{{FAIL_BIN}}/generic-experiment-server"
|
||||
FAIL_INJECT := f"{{FAIL_BIN}}/generic-experiment-client"
|
||||
RESULT_BROWSER := f"{{FAIL_BIN}}/resultbrowser.py"
|
||||
|
||||
# =================================================================================================================== #
|
||||
# Helper recipes
|
||||
# =================================================================================================================== #
|
||||
|
||||
[default]
|
||||
[private]
|
||||
list:
|
||||
@./just --list --unsorted
|
||||
|
||||
# Create a database:
|
||||
# - mysql -u smchurla -p
|
||||
# - CREATE DATABASE database_name;
|
||||
# - SHOW DATABASES;
|
||||
|
||||
procs:
|
||||
ps -u smchurla
|
||||
188
scripts/menu.pl
188
scripts/menu.pl
@ -5,34 +5,30 @@ use warnings;
|
||||
use diagnostics;
|
||||
|
||||
use FindBin;
|
||||
use lib $FindBin::Bin;
|
||||
use lib "$FindBin::Bin/Modules";
|
||||
|
||||
use Util;
|
||||
use Mars;
|
||||
use TUI;
|
||||
use Filters;
|
||||
use Text::CSV_XS;
|
||||
|
||||
use feature 'say';
|
||||
|
||||
# TODO: Less navigation if the object is selected first, then the action
|
||||
# - Differentiate between local/remote object
|
||||
# - List all types in the same list?
|
||||
# - Select actions afterwards and apply fitting ones all in one go
|
||||
# - Hide unfeasible actions
|
||||
# TODO: Much can be extracted into utility functions
|
||||
|
||||
my $local_obsidian = '/home/christoph/Notes/Obsidian/Chriphost';
|
||||
my $local_obsidian_attach = "$local_obsidian/attach";
|
||||
|
||||
my $local_wamr = '/home/christoph/Notes/TU/MastersThesis/05 WAMR';
|
||||
my $local_newlib = '/home/christoph/Notes/TU/MastersThesis/07 NewLib';
|
||||
my $local_root = '/home/christoph/Notes/TU/MastersThesis/FailNix';
|
||||
my $local_wamr = "$local_root/wamr";
|
||||
my $local_scripts_dir = "$local_root/scripts";
|
||||
my $local_builds_dir = "$local_root/builds";
|
||||
my $local_archive_dir = "$local_root/injections";
|
||||
my $local_charts_dir = "$local_root/charts";
|
||||
my $local_ghidra_projects = "$local_root/ghidra/projects";
|
||||
my $local_ghidra_scripts = "$local_root/ghidra/scripts";
|
||||
my $local_charts_dir = "$local_root/scripts/charts";
|
||||
my $local_ghidra_projects = "$local_root/ghidra";
|
||||
my $local_ghidra_scripts = "$local_root/scripts/ghidra";
|
||||
my $local_db_conf = "$local_root/db.conf";
|
||||
|
||||
my $resultbrowser_port = '5000';
|
||||
@ -46,10 +42,10 @@ my $db_port = "3306";
|
||||
my $db_user = "smchurla";
|
||||
|
||||
my %handlers = (
|
||||
'01. Build Experiments' => sub { do "$local_scripts_dir/build.pl"; },
|
||||
'01. Build Experiments' => sub { do qq{$local_scripts_dir/build.pl}; },
|
||||
|
||||
'02. Deploy Experiments (Mars)' =>
|
||||
sub { do "$local_scripts_dir/deploy.pl"; },
|
||||
sub { do qq{$local_scripts_dir/deploy.pl}; },
|
||||
|
||||
'03. Archive Experiments (Downloads from Mars)' => sub {
|
||||
|
||||
@ -72,9 +68,6 @@ my %handlers = (
|
||||
Mars::download_dir( "$remote_builds_dir/$_",
|
||||
"$local_archive_dir/" . $_ =~ s/:/-/gr )
|
||||
for @selected_dirs;
|
||||
|
||||
system( 'touch', "$local_archive_dir/" . $_ =~ s/:/-/gr . "/0.info" )
|
||||
for @selected_dirs;
|
||||
},
|
||||
|
||||
'04. Query Databases (Mars)' => sub {
|
||||
@ -92,15 +85,43 @@ my %handlers = (
|
||||
TUI::select_from_list( "Select Queries to Run", 1, @queries );
|
||||
die "No query selected" unless @selected_queries;
|
||||
|
||||
# Select filter configs
|
||||
my @filter_choices = ("None");
|
||||
my %filter_label_name;
|
||||
my @filter_configs;
|
||||
my $configs = Filters::get_configs();
|
||||
foreach my $name ( sort keys %$configs ) {
|
||||
my $label = $configs->{$name}{label};
|
||||
push @filter_choices, $label;
|
||||
$filter_label_name{$label} = $name;
|
||||
}
|
||||
my @selected_filter_labels =
|
||||
TUI::select_from_list( "Select Filters to Apply", 1,
|
||||
@filter_choices );
|
||||
die "No filter selected" unless @selected_filter_labels;
|
||||
@filter_configs = ();
|
||||
foreach my $label (@selected_filter_labels) {
|
||||
if ( $label eq "None" ) {
|
||||
push @filter_configs, '';
|
||||
}
|
||||
else {
|
||||
push @filter_configs, $filter_label_name{$label};
|
||||
}
|
||||
}
|
||||
|
||||
# Run queries on databases
|
||||
foreach my $db (@selected_dbs) {
|
||||
foreach my $query (@selected_queries) {
|
||||
Util::rewrite_file( $local_db_conf, "database=",
|
||||
"database=$db\n" );
|
||||
foreach my $config (@filter_configs) {
|
||||
Util::rewrite_file( $local_db_conf, "database=",
|
||||
"database=$db\n" );
|
||||
|
||||
say "Running $query on $db...";
|
||||
Util::execute_query( $db =~ s/smchurla_//r,
|
||||
$query, $local_db_conf, $local_archive_dir, 0 );
|
||||
my $config_label = length($config) ? " ($config)" : "";
|
||||
say "Running $query$config_label on $db...";
|
||||
Util::execute_query( $db =~ s/smchurla_//r,
|
||||
$query, $local_db_conf, $local_archive_dir, 0,
|
||||
$config );
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -109,7 +130,8 @@ my %handlers = (
|
||||
|
||||
my @existing = Util::find_files($local_ghidra_projects);
|
||||
|
||||
my $is_old = sub {
|
||||
# Determine if an experiment was already imported
|
||||
my $project_exists = sub {
|
||||
my ($name) = @_;
|
||||
$name =~ s/:/-/g;
|
||||
|
||||
@ -118,23 +140,37 @@ my %handlers = (
|
||||
|
||||
# Import archived experiments into ghidra
|
||||
my @dirs =
|
||||
grep { !$is_old->($_) } Util::find_subdirs($local_archive_dir);
|
||||
grep { !$project_exists->($_) }
|
||||
Util::find_subdirs($local_archive_dir);
|
||||
|
||||
my @dirs_with_notes;
|
||||
foreach my $dir (@dirs) {
|
||||
my $info = Util::read_experiment_info($dir);
|
||||
|
||||
push @dirs_with_notes,
|
||||
( defined $info && length($info) > 0 )
|
||||
? sprintf( "%-50s (%s)", $dir, $info )
|
||||
: $dir;
|
||||
}
|
||||
|
||||
my @selected_dirs =
|
||||
TUI::select_from_list( "Select Experiments to Import into Ghidra",
|
||||
1, @dirs );
|
||||
1, @dirs_with_notes );
|
||||
|
||||
foreach (@selected_dirs) {
|
||||
say "Creating Ghidra project for $_...";
|
||||
my $experiment = $_ =~ s/(.*?)\s+\(.+\)$/$1/r;
|
||||
|
||||
say "Creating Ghidra project for $experiment...";
|
||||
system(
|
||||
'ghidra-analyzeHeadless',
|
||||
|
||||
$local_ghidra_projects, $_ =~ s/:/-/gr,
|
||||
'-import', "$local_archive_dir/$_/system.elf",
|
||||
'-scriptPath', $local_ghidra_scripts,
|
||||
'-postScript', 'DWARFLineInfoSourceMapScript',
|
||||
'-postScript', 'DWARFLineInfoCommentScript',
|
||||
'-postScript', 'ImportMarkersAsBookmarks',
|
||||
"$local_archive_dir/$_/faults.csv"
|
||||
$local_ghidra_projects, $experiment =~ s/:/-/gr,
|
||||
'-import', "$local_archive_dir/$experiment/system.elf",
|
||||
'-scriptPath', $local_ghidra_scripts,
|
||||
'-postScript', 'DWARFLineInfoSourceMapScript',
|
||||
'-postScript', 'DWARFLineInfoCommentScript',
|
||||
'-postScript', 'ImportMarkersAsBookmarks',
|
||||
"$local_archive_dir/$experiment/faults.csv"
|
||||
);
|
||||
}
|
||||
},
|
||||
@ -198,20 +234,25 @@ my %handlers = (
|
||||
}
|
||||
},
|
||||
|
||||
'10. Open Experiment In Explorer' =>
|
||||
sub { do "$local_scripts_dir/explore.pl" },
|
||||
'10. Explore Experiment Results' =>
|
||||
sub { do qq{$local_scripts_dir/explore.pl}; },
|
||||
|
||||
'11. Compare Experiment Results' => sub {
|
||||
|
||||
my @selected_experiments = Util::select_experiment(1);
|
||||
|
||||
# TODO: Fails silently if not every selected experiment has this datafile
|
||||
my $resultsdata_csv =
|
||||
Util::pick_data_file( "$local_archive_dir/$selected_experiments[0]",
|
||||
"resultsdata" );
|
||||
|
||||
# Read results
|
||||
my %all_results;
|
||||
foreach my $experiment (@selected_experiments) {
|
||||
|
||||
# Schema: benchmark, resulttype, faults
|
||||
my $data = Text::CSV_XS::csv(
|
||||
in => "$local_archive_dir/$experiment/resultsdata.csv",
|
||||
in => "$local_archive_dir/$experiment/$resultsdata_csv",
|
||||
headers => 'auto'
|
||||
);
|
||||
|
||||
@ -223,10 +264,10 @@ my %handlers = (
|
||||
|
||||
my @benchs = ( 'ip', 'mem', 'regs' );
|
||||
my @markers = (
|
||||
'OK_MARKER', 'FAIL_MARKER',
|
||||
'DETECTED_MARKER', 'TIMEOUT',
|
||||
'TRAP', 'WRITE_TEXTSEGMENT',
|
||||
'ACCESS_OUTERSPACE'
|
||||
'OK_MARKER', 'FAIL_MARKER',
|
||||
'DETECTED_MARKER', 'TIMEOUT',
|
||||
'TRAP', 'WRITE_TEXTSEGMENT',
|
||||
'ACCESS_OUTERSPACE', 'GROUP1_MARKER'
|
||||
);
|
||||
|
||||
my $heading = sprintf( "%5s %20s ", "BENCH", "TYPE" );
|
||||
@ -393,8 +434,7 @@ my %handlers = (
|
||||
my $selected_build = $selected_builds[0];
|
||||
|
||||
my $build_dir = "$local_builds_dir/$selected_build";
|
||||
my $build_name = $selected_build =~ s/.*-.*-.*:.*:.*?_(.*)-.*-.*/$1/r;
|
||||
my $module_source = "$local_root/build-$build_name";
|
||||
my $build_name = $selected_build =~ s/.*?_.*?_(.*?)_.*$/$1/r;
|
||||
|
||||
say "$build_name";
|
||||
|
||||
@ -404,7 +444,9 @@ my %handlers = (
|
||||
'-q',
|
||||
"$build_dir/system.elf",
|
||||
'-ex',
|
||||
"set substitute-path '$module_source' '$build_dir'",
|
||||
'set disassembly-flavor intel',
|
||||
'-ex',
|
||||
"set substitute-path 'build-$build_name' '$build_dir'",
|
||||
'-ex',
|
||||
"set substitute-path '/build/source/core' '$local_wamr/core'",
|
||||
'-ex',
|
||||
@ -419,6 +461,16 @@ my %handlers = (
|
||||
'break fail_marker_detected',
|
||||
'-ex',
|
||||
'break fail_marker_negative',
|
||||
'-ex',
|
||||
'break fail_marker_group1',
|
||||
'-ex',
|
||||
'break os_mmap',
|
||||
'-ex',
|
||||
'break wamr_malloc',
|
||||
'-ex',
|
||||
'break wamr_realloc',
|
||||
'-ex',
|
||||
'break wamr_free',
|
||||
);
|
||||
},
|
||||
|
||||
@ -432,15 +484,38 @@ my %handlers = (
|
||||
TUI::select_from_list( "Select Plots to Generate", 1, @charts );
|
||||
die "No plot selected" unless @selected_charts;
|
||||
|
||||
# Need to know which chart uses which datafile
|
||||
my @faults_charts = grep { /heatmap|scatter|sankey/ } @selected_charts;
|
||||
my @resultsdata_charts =
|
||||
grep { /result$|combined_comparison/ } @selected_charts;
|
||||
|
||||
my $faults_csv;
|
||||
my $resultsdata_csv;
|
||||
if (@faults_charts) {
|
||||
$faults_csv = Util::pick_data_file(
|
||||
"$local_archive_dir/$selected_experiments[0]", "faults" );
|
||||
}
|
||||
if (@resultsdata_charts) {
|
||||
$resultsdata_csv = Util::pick_data_file(
|
||||
"$local_archive_dir/$selected_experiments[0]",
|
||||
"resultsdata" );
|
||||
}
|
||||
|
||||
my @single_charts = grep { /single/ } @selected_charts;
|
||||
foreach my $experiment (@selected_experiments) {
|
||||
foreach my $chart (@single_charts) {
|
||||
say " - Generating plot $chart for $experiment...";
|
||||
system(
|
||||
my @r_args = (
|
||||
'Rscript',
|
||||
"$local_charts_dir/$chart.r",
|
||||
"$local_archive_dir/$experiment"
|
||||
);
|
||||
push @r_args, $faults_csv
|
||||
if defined $faults_csv && $chart =~ /heatmap|scatter|sankey/;
|
||||
push @r_args, $resultsdata_csv
|
||||
if defined $resultsdata_csv
|
||||
&& $chart =~ /result$|combined_comparison/;
|
||||
system(@r_args);
|
||||
}
|
||||
}
|
||||
|
||||
@ -450,8 +525,14 @@ my %handlers = (
|
||||
map { "$local_archive_dir/$_" } @selected_experiments;
|
||||
foreach my $chart (@combined_charts) {
|
||||
say " - Generating plot $chart for ($print_experiments)...";
|
||||
system( 'Rscript', "$local_charts_dir/$chart.r",
|
||||
@path_experiments );
|
||||
my @r_args =
|
||||
( 'Rscript', "$local_charts_dir/$chart.r", @path_experiments );
|
||||
push @r_args, $faults_csv
|
||||
if defined $faults_csv && $chart =~ /heatmap|scatter|sankey/;
|
||||
push @r_args, $resultsdata_csv
|
||||
if defined $resultsdata_csv
|
||||
&& $chart =~ /result$|combined_comparison/;
|
||||
system(@r_args);
|
||||
}
|
||||
},
|
||||
|
||||
@ -504,11 +585,26 @@ my %handlers = (
|
||||
'99. Drop Databases (Mars)' => sub {
|
||||
|
||||
# Drop databases on mars
|
||||
my @db_names = Mars::db_list();
|
||||
my @dbs = Mars::db_list();
|
||||
my @dbs_with_notes;
|
||||
foreach my $db (@dbs) {
|
||||
my $info =
|
||||
Util::read_experiment_info( $db =~ s/smchurla_//r =~ s/:/-/gr );
|
||||
|
||||
push @dbs_with_notes,
|
||||
( defined $info && length($info) > 0 )
|
||||
? sprintf( "%-60s (%s)", $db, $info )
|
||||
: $db;
|
||||
}
|
||||
|
||||
my @selected_dbs =
|
||||
TUI::select_from_list( "Select Databases to Drop from Mars",
|
||||
1, @db_names );
|
||||
1, @dbs_with_notes );
|
||||
die "No database selected" unless @selected_dbs;
|
||||
|
||||
@selected_dbs =
|
||||
map { s/(.*?)\s+\(.+\)$/$1/r } @selected_dbs;
|
||||
|
||||
Mars::db_drop($_) for @selected_dbs;
|
||||
},
|
||||
);
|
||||
|
||||
28
scripts/multi_runner.pl
Normal file
28
scripts/multi_runner.pl
Normal file
@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use diagnostics;
|
||||
|
||||
use FindBin;
|
||||
use lib "$FindBin::Bin/Modules";
|
||||
|
||||
use Util;
|
||||
|
||||
use feature 'say';
|
||||
|
||||
my $remote_root = '/home/lab/smchurla/Documents/failnix';
|
||||
my $remote_builds_dir = "$remote_root/builds";
|
||||
|
||||
# Run experiments
|
||||
my @experiments = Util::find_subdirs($remote_builds_dir);
|
||||
for my $experiment (@experiments) {
|
||||
say "Running experiment: $experiment";
|
||||
my $experiment_runner = "$remote_builds_dir/$experiment/runner.pl";
|
||||
system( "perl", $experiment_runner, $experiment,
|
||||
">", Util::shell_quote("$remote_builds_dir/$experiment/0_runner.log"),
|
||||
"2>&1" ) == 0
|
||||
or warn "runner.pl failed for $experiment: $?";
|
||||
}
|
||||
|
||||
Util::notify("Finished all experiments");
|
||||
@ -1,244 +0,0 @@
|
||||
import "wasm.just"
|
||||
import "fail.just"
|
||||
|
||||
BUILD_DIR := "build"
|
||||
|
||||
# Load environment variables set by "nix develop"-shell
|
||||
|
||||
FAIL_SHARE := env("FAIL_SHARE")
|
||||
WASI_ROOT := env("WASI_ROOT")
|
||||
WAMR_ROOT := env("WAMR_ROOT")
|
||||
LIBIWASM_DEBUG := env("LIBIWASM_DEBUG")
|
||||
LIBIWASM_RELEASE := env("LIBIWASM_RELEASE")
|
||||
LIBIWASM_LINUX_DEBUG := env("LIBIWASM_LINUX_DEBUG")
|
||||
LIBIWASM_LINUX_RELEASE := env("LIBIWASM_LINUX_RELEASE")
|
||||
CROSS_CC := env("CROSS_CC")
|
||||
LINUX_CC := env("LINUX_CC")
|
||||
|
||||
# FAIL* variables
|
||||
|
||||
FAIL_SERVER_PORT := "1111"
|
||||
RESULTBROWSER_PORT := "5000"
|
||||
BOCHS_RUNNER := "bochs-experiment-runner.py"
|
||||
FAIL_TRACE := "fail-x86-tracing"
|
||||
FAIL_DUMP := "dump-trace"
|
||||
FAIL_IMPORT := "import-trace"
|
||||
FAIL_PRUNE := "prune-trace"
|
||||
FAIL_SERVER := "generic-experiment-server"
|
||||
FAIL_INJECT := "generic-experiment-client"
|
||||
RESULT_BROWSER := "resultbrowser.py"
|
||||
|
||||
# =================================================================================================================== #
|
||||
# Helper recipes
|
||||
# =================================================================================================================== #
|
||||
|
||||
[default]
|
||||
[private]
|
||||
list:
|
||||
@just --list
|
||||
|
||||
[private]
|
||||
create-build-dir module:
|
||||
mkdir -p {{ BUILD_DIR }}-{{ module }}
|
||||
|
||||
[doc("Delete the build directory")]
|
||||
clean module:
|
||||
rm -rf {{ BUILD_DIR }}-{{ module }}
|
||||
|
||||
# =================================================================================================================== #
|
||||
# MySQL recipes
|
||||
# =================================================================================================================== #
|
||||
|
||||
[doc("Start MySQL container to receive FAIL* trace/campaign results")]
|
||||
[group("3: fail db")]
|
||||
start-db:
|
||||
docker run -d \
|
||||
--name fail-db \
|
||||
-e MYSQL_ROOT_PASSWORD=fail \
|
||||
-e MYSQL_USER=fail \
|
||||
-e MYSQL_PASSWORD=fail \
|
||||
-e MYSQL_DATABASE=fail \
|
||||
-p 3306:3306 \
|
||||
mysql
|
||||
|
||||
[doc("Connect to MySQL database using DBeaver")]
|
||||
[group("3: fail db")]
|
||||
connect-db:
|
||||
dbeaver -con "name=fail|driver=mysql|host=localhost|port=3306|database=fail|user=fail|password=fail"
|
||||
|
||||
[doc("Stop MySQL container")]
|
||||
[group("3: fail db")]
|
||||
stop-db:
|
||||
docker stop fail-db
|
||||
|
||||
[doc("Remove MySQL container")]
|
||||
[group("3: fail db")]
|
||||
remove-db:
|
||||
docker container rm fail-db
|
||||
|
||||
# =================================================================================================================== #
|
||||
# Debugging recipes
|
||||
# =================================================================================================================== #
|
||||
|
||||
[doc("Launch gdb")]
|
||||
[group("debug")]
|
||||
gdb module:
|
||||
gdb --tui {{ BUILD_DIR }}-{{ module }}/system.elf
|
||||
|
||||
# [doc("Launch radare2 at address and disassemble")]
|
||||
# [group("debug")]
|
||||
# r2 module addr="dbg.os_main":
|
||||
# # -e asm.section=true
|
||||
# # -e asm.bytes=true
|
||||
# radare2 -AA \
|
||||
# -c "f TARGET @ {{ addr }}; s {{ addr }}; pd-- 30" \
|
||||
# -e asm.syntax=intel \
|
||||
# -e asm.lines=false \
|
||||
# -e asm.xrefs=true \
|
||||
# -e asm.flags=true \
|
||||
# -e asm.comments=true \
|
||||
# -e asm.functions=true \
|
||||
# -e asm.var=true \
|
||||
# -e asm.cmt.right=true \
|
||||
# -e asm.dwarf=true \
|
||||
# -e asm.pseudo=false \
|
||||
# -e asm.describe=false \
|
||||
# -e bin.relocs.apply=true \
|
||||
# {{ BUILD_DIR }}-{{ module }}/system.elf
|
||||
|
||||
[doc("Disassemble with objdump at address")]
|
||||
[group("debug")]
|
||||
dump dir addr="0x100000" saddr="0x100100":
|
||||
objdump {{ dir }}/system.elf \
|
||||
--disassemble-all \
|
||||
--disassembler-options=intel \
|
||||
--disassembler-color=terminal \
|
||||
--source \
|
||||
--demangle \
|
||||
--section=.text \
|
||||
--start-address={{ addr }} \
|
||||
--stop-address={{ saddr }} \
|
||||
--prefix={{ dir }} \
|
||||
--prefix-strip=7
|
||||
|
||||
[doc("Launch radare2 at address (interactive)")]
|
||||
[group("debug")]
|
||||
r2i module addr="dbg.os_main":
|
||||
# -e asm.section=true
|
||||
# -e asm.bytes=true
|
||||
radare2 -AA \
|
||||
-c "s {{ addr }}" \
|
||||
-e scr.color=3 \
|
||||
-e scr.scrollbar=0 \
|
||||
-e scr.responsive=true \
|
||||
-e scr.interactive=true \
|
||||
-e scr.utf8=true \
|
||||
-e scr.utf8.curvy=true \
|
||||
-e asm.syntax=intel \
|
||||
-e asm.lines=false \
|
||||
-e asm.xrefs=true \
|
||||
-e asm.flags=true \
|
||||
-e asm.comments=true \
|
||||
-e asm.functions=true \
|
||||
-e asm.var=true \
|
||||
-e asm.cmt.right=true \
|
||||
-e asm.dwarf=true \
|
||||
-e asm.pseudo=false \
|
||||
-e asm.describe=false \
|
||||
-e bin.relocs.apply=true \
|
||||
{{ BUILD_DIR }}-{{ module }}/system.elf
|
||||
|
||||
# =================================================================================================================== #
|
||||
# Just do it
|
||||
# =================================================================================================================== #
|
||||
|
||||
[arg("mode", pattern="c|aot|interp", help="Which WASM mode to use")]
|
||||
[arg("target", pattern="fail|linux|linux-baremetal", help="Which platform to compile for")]
|
||||
[doc("Perform all steps for a fail/linux/linux-bm build with aot/interp WASM")]
|
||||
[group("5: just do it")]
|
||||
build module="__help" target="fail" mode="aot":
|
||||
#!/usr/bin/env sh
|
||||
|
||||
if [ "{{ module }}" = "__help" ]; then
|
||||
just --usage build
|
||||
exit 0
|
||||
fi
|
||||
|
||||
just clean {{ module }}
|
||||
just create-build-dir {{ module }}
|
||||
just copy-auxiliary {{ module }}
|
||||
|
||||
if [ "{{ mode }}" = "aot" ]; then
|
||||
just build-wasm-module {{ module }}
|
||||
just build-wasm-aot {{ module }} {{ target }}
|
||||
just build-wasm-aot-array {{ module }}
|
||||
|
||||
just prepare-aot-host {{ module }}
|
||||
just build-wasm-host {{ module }} {{ target }}
|
||||
|
||||
just build-system-startup {{ module }} {{ target }}
|
||||
just build-system-syscalls {{ module }} {{ target }}
|
||||
just link-system {{ module }} {{ target }}
|
||||
elif [ "{{ mode }}" = "interp" ]; then
|
||||
just build-wasm-module {{ module }}
|
||||
just build-wasm-interp-array {{ module }}
|
||||
|
||||
just prepare-interp-host {{ module }}
|
||||
just build-wasm-host {{ module }} {{ target }}
|
||||
|
||||
just build-system-startup {{ module }} {{ target }}
|
||||
just build-system-syscalls {{ module }} {{ target }}
|
||||
just link-system {{ module }} {{ target }}
|
||||
elif [ "{{ mode }}" = "c" ]; then
|
||||
just build-c-module {{ module }} {{ target }}
|
||||
|
||||
just build-c-host {{ module }} {{ target }}
|
||||
|
||||
just build-system-startup {{ module }} {{ target }}
|
||||
just link-c-system {{ module }} {{ target }}
|
||||
else
|
||||
echo "unknown mode: {{ mode }}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
just build-iso {{ module }}
|
||||
|
||||
[doc("Run binary")]
|
||||
[group("5: just do it")]
|
||||
run module:
|
||||
@echo "Running {{ module }}:"
|
||||
@{{ BUILD_DIR }}-{{ module }}/system.elf
|
||||
|
||||
[arg("mode", pattern="c|aot|interp", help="Which WASM mode to use")]
|
||||
[arg("target", pattern="fail|linux|linux-baremetal", help="Which platform to compile for")]
|
||||
[doc("Perform all steps for a fail/linux/linux-bm build with aot/interp WASM")]
|
||||
[group("5: just do it")]
|
||||
build-run module="__help" target="fail" mode="aot": (build module target mode) (run module)
|
||||
|
||||
[doc("Send binaries to mars")]
|
||||
[group("5: just do it")]
|
||||
upload module:
|
||||
scp -r {{ BUILD_DIR }}-{{ module }} mars:~/Documents/failnix/{{ BUILD_DIR }}-{{ module }}
|
||||
|
||||
[doc("Send markers to local")]
|
||||
[group("5: just do it")]
|
||||
download-markers:
|
||||
scp mars:~/Documents/failnix/markers.csv ./markers.csv
|
||||
|
||||
[doc("Perform all steps for a FAIL* campaign")]
|
||||
[group("5: just do it")]
|
||||
inject module:
|
||||
just start-db
|
||||
@echo "Waiting for database..."
|
||||
sleep 20
|
||||
|
||||
just trace {{ module }}
|
||||
just import {{ module }}
|
||||
just server {{ module }}
|
||||
just client {{ module }}
|
||||
just result {{ module }}
|
||||
|
||||
[doc("Copy build directory to injections/ with timestamp")]
|
||||
[group("5: just do it")]
|
||||
archive module suffix:
|
||||
cp -rv {{ BUILD_DIR }}-{{ module }} ./injections/`date +%Y-%m-%d_%H-%M`_{{ module }}_"{{ suffix }}"
|
||||
@ -5,8 +5,12 @@ use warnings;
|
||||
use diagnostics;
|
||||
|
||||
use FindBin;
|
||||
use lib $FindBin::Bin;
|
||||
|
||||
# runner.pl is executed from the build dir
|
||||
use lib "$FindBin::Bin/../../scripts/Modules";
|
||||
use lib "$FindBin::Bin/Modules";
|
||||
|
||||
use Filters;
|
||||
use Util;
|
||||
|
||||
use feature 'say';
|
||||
@ -55,7 +59,7 @@ sub trace {
|
||||
|
||||
# "-Wf,--full-trace",
|
||||
# "-Wf,--check-bounds",
|
||||
">$remote_builds_dir/$experiment/1_trace.log"
|
||||
">$remote_builds_dir/$experiment/1_trace.log 2>&1"
|
||||
);
|
||||
say "Trace command: $trace_command";
|
||||
|
||||
@ -78,10 +82,9 @@ sub import_trace {
|
||||
"-b ip",
|
||||
"--no-gp", # Don't inject general purpose registers
|
||||
"--ip", # Inject instruction pointer
|
||||
">$remote_builds_dir/$experiment/2_import_ip.log"
|
||||
">$remote_builds_dir/$experiment/2_import_ip.log 2>&1"
|
||||
);
|
||||
say "Import IP command: $import_ip_command";
|
||||
|
||||
system($import_ip_command);
|
||||
|
||||
# Benchmark: mem
|
||||
@ -94,10 +97,9 @@ sub import_trace {
|
||||
"-e $remote_builds_dir/$experiment/system.elf",
|
||||
"-v $experiment",
|
||||
"-b mem",
|
||||
">$remote_builds_dir/$experiment/2_import_mem.log"
|
||||
">$remote_builds_dir/$experiment/2_import_mem.log 2>&1"
|
||||
);
|
||||
say "Import MEM command: $import_mem_command";
|
||||
|
||||
system($import_mem_command);
|
||||
|
||||
# Benchmark: regs
|
||||
@ -110,10 +112,9 @@ sub import_trace {
|
||||
"-v $experiment",
|
||||
"-b regs",
|
||||
"--flags", # Inject flags register
|
||||
">$remote_builds_dir/$experiment/2_import_regs.log"
|
||||
">$remote_builds_dir/$experiment/2_import_regs.log 2>&1"
|
||||
);
|
||||
say "Import REGS command: $import_regs_command";
|
||||
|
||||
system($import_regs_command);
|
||||
|
||||
# Import fulltrace for VisualFAIL
|
||||
@ -129,61 +130,64 @@ sub import_trace {
|
||||
# )
|
||||
# );
|
||||
|
||||
# Import objdump disassembly + source files
|
||||
# system(
|
||||
# join " ",
|
||||
# (
|
||||
# "$fail_import",
|
||||
# "--database-option-file $remote_db_conf",
|
||||
# "-t $remote_builds_dir/$experiment/trace.pb",
|
||||
# "-i ElfImporter",
|
||||
# "-e $remote_builds_dir/$experiment/system.elf",
|
||||
# "-v $experiment",
|
||||
# "-b ip",
|
||||
# "--objdump objdump",
|
||||
#
|
||||
# # "--sources",
|
||||
# )
|
||||
# );
|
||||
# system(
|
||||
# join " ",
|
||||
# (
|
||||
# "$fail_import",
|
||||
# "--database-option-file $remote_db_conf",
|
||||
# "-t $remote_builds_dir/$experiment/trace.pb",
|
||||
# "-i ElfImporter",
|
||||
# "-e $remote_builds_dir/$experiment/system.elf",
|
||||
# "-v $experiment",
|
||||
# "-b mem",
|
||||
# "--objdump objdump",
|
||||
#
|
||||
# # "--sources",
|
||||
# )
|
||||
# );
|
||||
# system(
|
||||
# join " ",
|
||||
# (
|
||||
# "$fail_import",
|
||||
# "--database-option-file $remote_db_conf",
|
||||
# "-t $remote_builds_dir/$experiment/trace.pb",
|
||||
# "-i ElfImporter",
|
||||
# "-e $remote_builds_dir/$experiment/system.elf",
|
||||
# "-v $experiment",
|
||||
# "-b regs",
|
||||
# "--objdump objdump",
|
||||
#
|
||||
# # "--sources",
|
||||
# )
|
||||
# );
|
||||
# Import disassembly/sources
|
||||
my $import_ip_asm_command = join " ", (
|
||||
"$fail_import",
|
||||
"--database-option-file $remote_db_conf",
|
||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
||||
"-i ElfImporter",
|
||||
"-e $remote_builds_dir/$experiment/system.elf",
|
||||
"-v $experiment",
|
||||
"-b ip",
|
||||
"--objdump objdump",
|
||||
|
||||
my $prune_command = join " ",
|
||||
(
|
||||
# "--sources",
|
||||
">$remote_builds_dir/$experiment/2_import_ip_asm.log 2>&1"
|
||||
);
|
||||
say "Import IP Asm command: $import_ip_asm_command";
|
||||
system($import_ip_asm_command);
|
||||
|
||||
my $import_mem_asm_command = join " ", (
|
||||
"$fail_import",
|
||||
"--database-option-file $remote_db_conf",
|
||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
||||
"-i ElfImporter",
|
||||
"-e $remote_builds_dir/$experiment/system.elf",
|
||||
"-v $experiment",
|
||||
"-b mem",
|
||||
"--objdump objdump",
|
||||
|
||||
# "--sources",
|
||||
">$remote_builds_dir/$experiment/2_import_mem_asm.log 2>&1"
|
||||
);
|
||||
say "Import Mem Asm command: $import_mem_asm_command";
|
||||
system($import_mem_asm_command);
|
||||
|
||||
my $import_regs_asm_command = join " ", (
|
||||
"$fail_import",
|
||||
"--database-option-file $remote_db_conf",
|
||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
||||
"-i ElfImporter",
|
||||
"-e $remote_builds_dir/$experiment/system.elf",
|
||||
"-v $experiment",
|
||||
"-b regs",
|
||||
"--objdump objdump",
|
||||
|
||||
# "--sources",
|
||||
">$remote_builds_dir/$experiment/2_import_regs_asm.log 2>&1"
|
||||
);
|
||||
say "Import Regs Asm command: $import_regs_asm_command";
|
||||
system($import_regs_asm_command);
|
||||
|
||||
my $prune_command = join " ", (
|
||||
"$fail_prune", "--database-option-file $remote_db_conf",
|
||||
"-v $experiment", "-b %%",
|
||||
"--overwrite", ">$remote_builds_dir/$experiment/2_prune.log"
|
||||
);
|
||||
say "Prune command: $prune_command";
|
||||
|
||||
# '-p NoPruner',
|
||||
'-p BasicPruner',
|
||||
"--overwrite", ">$remote_builds_dir/$experiment/2_prune.log 2>&1"
|
||||
);
|
||||
say "Prune command: $prune_command";
|
||||
system($prune_command);
|
||||
}
|
||||
|
||||
@ -201,10 +205,20 @@ sub inject {
|
||||
"--database-option-file $remote_db_conf", "-v $experiment",
|
||||
"-b %", "--inject-single-bit",
|
||||
"--inject-registers",
|
||||
">$remote_builds_dir/$experiment/3_server.log"
|
||||
">$remote_builds_dir/$experiment/3_server.log 2>&1"
|
||||
);
|
||||
say "Server command: $server_command";
|
||||
|
||||
# Read catch flags written by build.pl into the experiment directory
|
||||
my $runner_flags_file = "$remote_builds_dir/$experiment/runner_flags";
|
||||
my @catch_flags = ();
|
||||
if ( -e $runner_flags_file ) {
|
||||
open( my $rfh, '<', $runner_flags_file )
|
||||
or die "Cannot open $runner_flags_file: $!";
|
||||
@catch_flags = map { chomp; "-Wf,$_" } grep { /\S/ } <$rfh>;
|
||||
close($rfh);
|
||||
}
|
||||
|
||||
my $client_command = join " ", (
|
||||
"nice $bochs_runner",
|
||||
"-V $fail_share/vgabios.bin",
|
||||
@ -218,16 +232,20 @@ sub inject {
|
||||
# "-Wf,--server-port=$fail_server_port",
|
||||
"-Wf,--state-dir=$remote_builds_dir/$experiment/state",
|
||||
"-Wf,--trap",
|
||||
"-Wf,--catch-outerspace",
|
||||
"-Wf,--catch-write-textsegment",
|
||||
|
||||
@catch_flags,
|
||||
|
||||
"-Wf,--timeout=500000",
|
||||
"-Wf,--ok-marker=fail_marker_positive",
|
||||
"-Wf,--fail-marker=fail_marker_negative",
|
||||
"-Wf,--detected-marker=fail_marker_detected",
|
||||
|
||||
">/dev/null"
|
||||
# Called in WAMR exception handler (disable for C compilation target!)
|
||||
# "-Wf,--group1-marker=fail_marker_group1",
|
||||
|
||||
# ">$remote_builds_dir/$experiment/4_client.log"
|
||||
">/dev/null 2>&1"
|
||||
|
||||
# ">$remote_builds_dir/$experiment/4_client.log 2>&1"
|
||||
);
|
||||
say "Client command: $client_command";
|
||||
|
||||
@ -257,29 +275,30 @@ sub inject {
|
||||
sub results {
|
||||
my ($experiment) = @_;
|
||||
|
||||
my @queries = Util::find_files("$remote_root/scripts/Queries");
|
||||
my @queries =
|
||||
map { s/\.pm//gr } Util::find_files("$remote_root/scripts/Queries");
|
||||
my @configs = ( '', Filters::get_default_configs() );
|
||||
|
||||
foreach (@queries) {
|
||||
my $query = $_;
|
||||
$query =~ s/\.pm//g;
|
||||
|
||||
# Util::notify("Running query $query for $experiment...");
|
||||
|
||||
Util::execute_query( $experiment, $query,
|
||||
$remote_db_conf, $remote_builds_dir, 1 );
|
||||
for my $query (@queries) {
|
||||
for my $config (@configs) {
|
||||
Util::execute_query( $experiment, $query,
|
||||
$remote_db_conf, $remote_builds_dir, 1, $config );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Run experiments
|
||||
my @experiments = Util::find_subdirs($remote_builds_dir);
|
||||
for my $experiment (@experiments) {
|
||||
Util::rewrite_file( $remote_db_conf, "database=",
|
||||
"database=${db_prefix}_$experiment\n" );
|
||||
# Run single experiment passed as argument
|
||||
my $experiment = $ARGV[0] or die "Usage: runner.pl <experiment>\n";
|
||||
Util::rewrite_file( $remote_db_conf, "database=",
|
||||
"database=${db_prefix}_$experiment\n" );
|
||||
|
||||
trace($experiment);
|
||||
import_trace($experiment);
|
||||
inject($experiment);
|
||||
results($experiment);
|
||||
}
|
||||
say "Killing generic-experiment-server process if it's running...";
|
||||
system( "pkill", "-u", $db_user, "-f", "generic-experiment-server" );
|
||||
sleep(10);
|
||||
|
||||
Util::notify("Finished all experiments");
|
||||
trace($experiment);
|
||||
import_trace($experiment);
|
||||
inject($experiment);
|
||||
results($experiment);
|
||||
|
||||
Util::notify("Finished experiment $experiment");
|
||||
|
||||
@ -1,390 +0,0 @@
|
||||
# =================================================================================================================== #
|
||||
# Build WASM module recipes
|
||||
# =================================================================================================================== #
|
||||
|
||||
WASI_CC := f"{{WASI_ROOT}}/bin/clang"
|
||||
WASI_CFLAGS := "\
|
||||
--target=wasm32 \
|
||||
--sysroot={{WASI_ROOT}}/share/wasi-sysroot \
|
||||
-z stack-size=4096 \
|
||||
-O0 \
|
||||
-nostdlib \
|
||||
-Wl,--no-entry \
|
||||
-Wl,--export=wasm_module \
|
||||
-Wl,--no-gc-sections \
|
||||
-Wl,--initial-memory=65536 \
|
||||
-Wl,--export=__heap_base \
|
||||
-Wl,--export=__data_end \
|
||||
"
|
||||
CROSS_CFLAGS_NOWASM := "\
|
||||
-O0 \
|
||||
-m32 \
|
||||
-ffunction-sections \
|
||||
-fdata-sections \
|
||||
-ffreestanding \
|
||||
-fpermissive \
|
||||
-ggdb3 \
|
||||
"
|
||||
CROSS_LDFLAGS_NOWASM := "\
|
||||
-Wl,--build-id=none \
|
||||
-static \
|
||||
-nostdlib \
|
||||
-m32 \
|
||||
-lc \
|
||||
-lgcc \
|
||||
-lm \
|
||||
"
|
||||
LINUX_CFLAGS_NOWASM := "\
|
||||
-O0 \
|
||||
-m32 \
|
||||
-ffunction-sections \
|
||||
-fdata-sections \
|
||||
-fpermissive \
|
||||
-ggdb3 \
|
||||
"
|
||||
LINUX_LDFLAGS_NOWASM := "\
|
||||
-Wl,--build-id=none \
|
||||
-m32 \
|
||||
-lm \
|
||||
"
|
||||
WAMRC := "wamrc"
|
||||
CROSS_WAMRCFLAGS := "\
|
||||
--target=i386 \
|
||||
--cpu=generic \
|
||||
--opt-level=0 \
|
||||
--xip \
|
||||
"
|
||||
LINUX_WAMRCFLAGS := "\
|
||||
--target=i386 \
|
||||
--cpu=generic \
|
||||
--opt-level=0 \
|
||||
"
|
||||
XXD := "xxd"
|
||||
|
||||
[doc("C -> WASM: Compile a C function to a WASM module using WASI-SDK")]
|
||||
[group("1: build module")]
|
||||
build-wasm-module module:
|
||||
{{ WASI_CC }} {{ WASI_CFLAGS }} targets/wasm-module/{{ module }}.cpp -o {{ BUILD_DIR }}-{{ module }}/wasm_module.wasm
|
||||
|
||||
[private]
|
||||
build-wasm-aot-linux module:
|
||||
{{ WAMRC }} {{ LINUX_WAMRCFLAGS }} -o {{ BUILD_DIR }}-{{ module }}/wasm_module.aot {{ BUILD_DIR }}-{{ module }}/wasm_module.wasm
|
||||
|
||||
[private]
|
||||
build-wasm-aot-cross module:
|
||||
{{ WAMRC }} {{ CROSS_WAMRCFLAGS }} -o {{ BUILD_DIR }}-{{ module }}/wasm_module.aot {{ BUILD_DIR }}-{{ module }}/wasm_module.wasm
|
||||
|
||||
|
||||
[doc("WASM -> AOT: Compile a WASM module ahead-of-time using WAMR")]
|
||||
[group("1: build module")]
|
||||
build-wasm-aot module target="fail":
|
||||
#!/usr/bin/env sh
|
||||
if [ "{{ target }}" = "fail" ]; then
|
||||
just build-wasm-aot-cross "{{ module }}"
|
||||
elif [ "{{ target }}" = "linux" ]; then
|
||||
just build-wasm-aot-linux "{{ module }}"
|
||||
elif [ "{{ target }}" = "linux-baremetal" ]; then
|
||||
just build-wasm-aot-cross "{{ module }}"
|
||||
else
|
||||
echo "unknown target: {{ target }}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
[doc("AOT -> C-Array: Dump a WASM module compiled ahead-of-time to a binary array")]
|
||||
[group("1: build module")]
|
||||
build-wasm-aot-array module:
|
||||
{{ XXD }} -i {{ BUILD_DIR }}-{{ module }}/wasm_module.aot > {{ BUILD_DIR }}-{{ module }}/wasm_aot_array.c
|
||||
|
||||
# Add __attribute__((section...)) to this array, so it is located into the .text.wamr_aot segment...
|
||||
sed -i '1s/^/__attribute__((section(".text.wamr_aot"), aligned(4096)))\n/' {{ BUILD_DIR }}-{{ module }}/wasm_aot_array.c
|
||||
|
||||
[doc("WASM -> C-Array: Dump a WASM module to a binary array")]
|
||||
[group("1: build module")]
|
||||
build-wasm-interp-array module:
|
||||
{{ XXD }} -i {{ BUILD_DIR }}-{{ module }}/wasm_module.wasm > {{ BUILD_DIR }}-{{ module }}/wasm_interp_array.c
|
||||
|
||||
[private]
|
||||
build-c-module-fail module:
|
||||
{{ CROSS_CC }} {{ CROSS_CFLAGS_NOWASM }} \
|
||||
-c targets/wasm-module/{{ module }}.cpp \
|
||||
-o {{ BUILD_DIR }}-{{ module }}/c_module.o
|
||||
|
||||
[private]
|
||||
build-c-module-linux module:
|
||||
{{ LINUX_CC }} {{ LINUX_CFLAGS_NOWASM }} \
|
||||
-c targets/wasm-module/{{ module }}.cpp \
|
||||
-o {{ BUILD_DIR }}-{{ module }}/c_module.o
|
||||
|
||||
[doc("C -> Object: Compile a C function (no WASM)")]
|
||||
[group("1: build module")]
|
||||
build-c-module module target="fail":
|
||||
#!/usr/bin/env sh
|
||||
if [ "{{ target }}" = "fail" ]; then
|
||||
just build-c-module-fail "{{ module }}"
|
||||
elif [ "{{ target }}" = "linux" ]; then
|
||||
just build-c-module-linux "{{ module }}"
|
||||
else
|
||||
echo "unknown target: {{ target }}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
[private]
|
||||
copy-auxiliary module:
|
||||
cp flake.nix {{ BUILD_DIR }}-{{ module }}/flake.nix
|
||||
cp scripts/runner.pl {{ BUILD_DIR }}-{{ module }}/runner.pl
|
||||
cp scripts/wasm.just {{ BUILD_DIR }}-{{ module }}/wasm.just
|
||||
cp targets/lib.h {{ BUILD_DIR }}-{{ module }}/lib.h
|
||||
cp targets/linker.ld {{ BUILD_DIR }}-{{ module }}/linker.ld
|
||||
cp targets/startup.s {{ BUILD_DIR }}-{{ module }}/startup.s
|
||||
cp targets/syscalls.c {{ BUILD_DIR }}-{{ module }}/syscalls.c
|
||||
cp targets/wasm-module/{{ module }}.cpp {{ BUILD_DIR }}-{{ module }}/wasm-module.cpp
|
||||
|
||||
# =================================================================================================================== #
|
||||
# Host program recipes
|
||||
# =================================================================================================================== #
|
||||
# FAIL*
|
||||
|
||||
CROSS_CFLAGS := f"-I./targets/wasm-host {{CROSS_CFLAGS_NOWASM}}"
|
||||
CROSS_LDFLAGS := f"-L{{LIBIWASM_DEBUG}} -liwasm {{CROSS_LDFLAGS_NOWASM}}"
|
||||
CROSS_INCLUDES := f"\
|
||||
-I{{WAMR_ROOT}}/core/iwasm/include \
|
||||
-I{{WAMR_ROOT}}/core/shared/utils \
|
||||
-I{{WAMR_ROOT}}/core/shared/platform/baremetal \
|
||||
"
|
||||
|
||||
# LINUX-POSIX
|
||||
|
||||
LINUX_CFLAGS := f"-I./targets/wasm-host {{LINUX_CFLAGS_NOWASM}}"
|
||||
LINUX_LDFLAGS := f"-Wl,-rpath,{{LIBIWASM_LINUX_DEBUG}} -L{{LIBIWASM_LINUX_DEBUG}} -liwasm {{LINUX_LDFLAGS_NOWASM}}"
|
||||
LINUX_INCLUDES := f"\
|
||||
-I{{WAMR_ROOT}}/core/iwasm/include \
|
||||
-I{{WAMR_ROOT}}/core/shared/utils \
|
||||
-I{{WAMR_ROOT}}/core/shared/platform/linux \
|
||||
"
|
||||
|
||||
# LINUX-Baremetal
|
||||
|
||||
LINUX_BAREMETAL_CFLAGS := "\
|
||||
-I./targets/wasm-host \
|
||||
-O0 \
|
||||
-m32 \
|
||||
-ffunction-sections \
|
||||
-fdata-sections \
|
||||
-ffreestanding \
|
||||
-ggdb3 \
|
||||
"
|
||||
LINUX_BAREMETAL_LDFLAGS := f"\
|
||||
-Wl,--build-id=none \
|
||||
-static \
|
||||
-nostdlib \
|
||||
-m32 \
|
||||
-L{{LIBIWASM_DEBUG}} \
|
||||
-liwasm \
|
||||
-lc \
|
||||
-lgcc \
|
||||
-lm \
|
||||
--entry main \
|
||||
"
|
||||
LINUX_BAREMETAL_INCLUDES := f"\
|
||||
-I{{WAMR_ROOT}}/core/iwasm/include \
|
||||
-I{{WAMR_ROOT}}/core/shared/utils \
|
||||
-I{{WAMR_ROOT}}/core/shared/platform/baremetal \
|
||||
"
|
||||
|
||||
[doc("Insert the AOT array into the host program")]
|
||||
[group("2: build host")]
|
||||
prepare-aot-host module:
|
||||
cp targets/wasm-host/wasm_host.c {{ BUILD_DIR }}-{{ module }}/module_host.c
|
||||
sed -i \
|
||||
-e "s/__WASM_ARRAY_FILE__/wasm_aot_array.c/g" \
|
||||
-e "s/__WASM_ARRAY__/build_{{ module }}_wasm_module_aot/g" \
|
||||
-e "s/__WASM_ARRAY_LEN__/build_{{ module }}_wasm_module_aot_len/g" \
|
||||
{{ BUILD_DIR }}-{{ module }}/module_host.c
|
||||
|
||||
[doc("Insert the WASM array into the host program")]
|
||||
[group("2: build host")]
|
||||
prepare-interp-host module:
|
||||
cp targets/wasm-host/wasm_host.c {{ BUILD_DIR }}-{{ module }}/module_host.c
|
||||
sed -i \
|
||||
-e "s/__WASM_ARRAY_FILE__/wasm_interp_array.c/g" \
|
||||
-e "s/__WASM_ARRAY__/build_{{ module }}_wasm_module_wasm/g" \
|
||||
-e "s/__WASM_ARRAY_LEN__/build_{{ module }}_wasm_module_wasm_len/g" \
|
||||
{{ BUILD_DIR }}-{{ module }}/module_host.c
|
||||
|
||||
[private]
|
||||
build-wasm-host-fail module:
|
||||
{{ CROSS_CC }} {{ CROSS_CFLAGS }} {{ CROSS_INCLUDES }} \
|
||||
-DTARGET_FAIL \
|
||||
-c {{ BUILD_DIR }}-{{ module }}/module_host.c \
|
||||
-o {{ BUILD_DIR }}-{{ module }}/system.o
|
||||
|
||||
[private]
|
||||
build-wasm-host-linux module:
|
||||
{{ LINUX_CC }} {{ LINUX_CFLAGS }} {{ LINUX_INCLUDES }} \
|
||||
-DTARGET_LINUX \
|
||||
-c {{ BUILD_DIR }}-{{ module }}/module_host.c \
|
||||
-o {{ BUILD_DIR }}-{{ module }}/system.o
|
||||
|
||||
[private]
|
||||
build-wasm-host-linux-baremetal module:
|
||||
{{ CROSS_CC }} {{ LINUX_BAREMETAL_CFLAGS }} {{ LINUX_BAREMETAL_INCLUDES }} \
|
||||
-DTARGET_LINUX_BAREMETAL \
|
||||
-c {{ BUILD_DIR }}-{{ module }}/module_host.c \
|
||||
-o {{ BUILD_DIR }}-{{ module }}/system.o
|
||||
|
||||
[doc("Compile C-Host: The host uses WAMR to load the WASM/AOT module")]
|
||||
[group("2: build host")]
|
||||
build-wasm-host module target="fail":
|
||||
#!/usr/bin/env sh
|
||||
if [ "{{ target }}" = "fail" ]; then
|
||||
just build-wasm-host-fail "{{ module }}"
|
||||
elif [ "{{ target }}" = "linux" ]; then
|
||||
just build-wasm-host-linux "{{ module }}"
|
||||
elif [ "{{ target }}" = "linux-baremetal" ]; then
|
||||
just build-wasm-host-linux-baremetal "{{ module }}"
|
||||
else
|
||||
echo "unknown target: {{ target }}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
[private]
|
||||
build-c-host-fail module:
|
||||
{{ CROSS_CC }} {{ CROSS_CFLAGS_NOWASM }} \
|
||||
-DTARGET_FAIL \
|
||||
-c targets/c-host/c_host.c \
|
||||
-o {{ BUILD_DIR }}-{{ module }}/c_host.o
|
||||
|
||||
[private]
|
||||
build-c-host-linux module:
|
||||
{{ LINUX_CC }} {{ LINUX_CFLAGS_NOWASM }} \
|
||||
-DTARGET_LINUX \
|
||||
-c targets/c-host/c_host.c \
|
||||
-o {{ BUILD_DIR }}-{{ module }}/c_host.o
|
||||
|
||||
[doc("Insert the C function into the host program (no WASM)")]
|
||||
[group("2: build host")]
|
||||
build-c-host module target="fail":
|
||||
#!/usr/bin/env sh
|
||||
if [ "{{ target }}" = "fail" ]; then
|
||||
just build-c-host-fail "{{ module }}"
|
||||
elif [ "{{ target }}" = "linux" ]; then
|
||||
just build-c-host-linux "{{ module }}"
|
||||
else
|
||||
echo "unknown target: {{ target }}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cp targets/c-host/c_host.c {{ BUILD_DIR }}-{{ module }}/module_host.c
|
||||
|
||||
[private]
|
||||
build-system-startup-fail module:
|
||||
{{ CROSS_CC }} targets/startup.s {{ CROSS_CFLAGS }} -c -o {{ BUILD_DIR }}-{{ module }}/startup.o
|
||||
|
||||
[doc("Compile bootloader")]
|
||||
[group("2: build host")]
|
||||
build-system-startup module target="fail":
|
||||
#!/usr/bin/env sh
|
||||
if [ "{{ target }}" = "fail" ]; then
|
||||
just build-system-startup-fail "{{ module }}"
|
||||
else
|
||||
echo "{{ target }} doesn't need bootloader"
|
||||
fi
|
||||
|
||||
[private]
|
||||
build-system-syscalls-fail module:
|
||||
{{ CROSS_CC }} targets/syscalls.c {{ CROSS_CFLAGS }} -c -o {{ BUILD_DIR }}-{{ module }}/syscalls.o
|
||||
|
||||
[private]
|
||||
build-system-syscalls-linux-baremetal module:
|
||||
{{ CROSS_CC }} targets/syscalls.c {{ LINUX_BAREMETAL_CFLAGS }} -c -o {{ BUILD_DIR }}-{{ module }}/syscalls.o
|
||||
|
||||
[doc("Compile newlib syscall stubs")]
|
||||
[group("2: build host")]
|
||||
build-system-syscalls module target="fail":
|
||||
#!/usr/bin/env sh
|
||||
if [ "{{ target }}" = "fail" ]; then
|
||||
just build-system-syscalls-fail "{{ module }}"
|
||||
elif [ "{{ target }}" = "linux-baremetal" ]; then
|
||||
just build-system-syscalls-linux-baremetal "{{ module }}"
|
||||
else
|
||||
echo "{{ target }} doesn't require syscall stubs"
|
||||
fi
|
||||
|
||||
[private]
|
||||
link-system-fail module:
|
||||
{{ CROSS_CC }} \
|
||||
-Wl,-T targets/linker.ld \
|
||||
{{ BUILD_DIR }}-{{ module }}/system.o \
|
||||
{{ BUILD_DIR }}-{{ module }}/startup.o \
|
||||
{{ BUILD_DIR }}-{{ module }}/syscalls.o \
|
||||
{{ CROSS_LDFLAGS }} \
|
||||
-o {{ BUILD_DIR }}-{{ module }}/system.elf
|
||||
|
||||
[private]
|
||||
link-system-linux module:
|
||||
{{ LINUX_CC }} \
|
||||
{{ BUILD_DIR }}-{{ module }}/system.o \
|
||||
{{ LINUX_LDFLAGS }} \
|
||||
-o {{ BUILD_DIR }}-{{ module }}/system.elf
|
||||
|
||||
[private]
|
||||
link-system-linux-baremetal module:
|
||||
{{ CROSS_CC }} \
|
||||
{{ BUILD_DIR }}-{{ module }}/system.o \
|
||||
{{ BUILD_DIR }}-{{ module }}/syscalls.o \
|
||||
{{ LINUX_BAREMETAL_LDFLAGS }} \
|
||||
-o {{ BUILD_DIR }}-{{ module }}/system.elf
|
||||
|
||||
[doc("Link C-Host, syscall stubs and bootloader")]
|
||||
[group("2: build host")]
|
||||
link-system module target="fail":
|
||||
#!/usr/bin/env sh
|
||||
if [ "{{ target }}" = "fail" ]; then
|
||||
just link-system-fail "{{ module }}"
|
||||
elif [ "{{ target }}" = "linux" ]; then
|
||||
just link-system-linux "{{ module }}"
|
||||
elif [ "{{ target }}" = "linux-baremetal" ]; then
|
||||
just link-system-linux-baremetal "{{ module }}"
|
||||
else
|
||||
echo "unknown target: {{ target }}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
[private]
|
||||
link-c-system-fail module:
|
||||
{{ CROSS_CC }} \
|
||||
-Wl,-T targets/linker.ld \
|
||||
{{ BUILD_DIR }}-{{ module }}/c_host.o \
|
||||
{{ BUILD_DIR }}-{{ module }}/startup.o \
|
||||
{{ BUILD_DIR }}-{{ module }}/c_module.o \
|
||||
{{ CROSS_LDFLAGS_NOWASM }} \
|
||||
-o {{ BUILD_DIR }}-{{ module }}/system.elf
|
||||
|
||||
[private]
|
||||
link-c-system-linux module:
|
||||
{{ LINUX_CC }} \
|
||||
{{ BUILD_DIR }}-{{ module }}/c_host.o \
|
||||
{{ BUILD_DIR }}-{{ module }}/c_module.o \
|
||||
{{ LINUX_LDFLAGS_NOWASM }} \
|
||||
-o {{ BUILD_DIR }}-{{ module }}/system.elf
|
||||
|
||||
[doc("Link C-Host, C-function and bootloader")]
|
||||
[group("2: build host")]
|
||||
link-c-system module target="fail":
|
||||
#!/usr/bin/env sh
|
||||
if [ "{{ target }}" = "fail" ]; then
|
||||
just link-c-system-fail "{{ module }}"
|
||||
elif [ "{{ target }}" = "linux" ]; then
|
||||
just link-c-system-linux "{{ module }}"
|
||||
else
|
||||
echo "unknown target: {{ target }}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
[doc("Create bootdisk")]
|
||||
[group("2: build host")]
|
||||
build-iso module:
|
||||
mkdir -p {{ BUILD_DIR }}-{{ module }}/grub/boot/grub
|
||||
cp targets/grub.cfg {{ BUILD_DIR }}-{{ module }}/grub/boot/grub/
|
||||
cp {{ BUILD_DIR }}-{{ module }}/system.elf {{ BUILD_DIR }}-{{ module }}/grub/boot/
|
||||
grub-mkrescue -o {{ BUILD_DIR }}-{{ module }}/system.iso {{ BUILD_DIR }}-{{ module }}/grub
|
||||
1
tacle-converter
Submodule
1
tacle-converter
Submodule
Submodule tacle-converter added at ff9c74cae5
@ -45,7 +45,123 @@ SECTIONS {
|
||||
/* . += 16; /\* padding after data, workaround for import-trace *\/ */
|
||||
|
||||
KEEP (*(".text.startup"))
|
||||
|
||||
/* place before .text, otherwise they'll be caught by the wildcard */
|
||||
|
||||
/* AOT binary array */
|
||||
_wamr_aot_start = .;
|
||||
*(".text.wamr_aot")
|
||||
_wamr_aot_end = .;
|
||||
|
||||
/* The mmap_space memory used by os_mmap in baremetal platform */
|
||||
_wamr_mmap_start = .;
|
||||
*(".text.wamr_mmap")
|
||||
_wamr_mmap_end = .;
|
||||
|
||||
/* The runtime memory pool used by Alloc_With_Usage */
|
||||
_wamr_runtime_pool_start = .;
|
||||
*(".text.wamr_runtime_pool")
|
||||
_wamr_runtime_pool_end = .;
|
||||
|
||||
/* The linear memory pool used by Alloc_With_Usage */
|
||||
_wamr_linear_pool_start = .;
|
||||
*(".text.wamr_linear_pool")
|
||||
_wamr_linear_pool_end = .;
|
||||
|
||||
/* The memory pool used by Alloc_With_Pool */
|
||||
_wamr_global_heap_start = .;
|
||||
*(".text.wamr_global_heap")
|
||||
_wamr_global_heap_end = .;
|
||||
|
||||
/*
|
||||
The libiwasm.a contains the following objects:
|
||||
|
||||
aot_intrinsic.c.obj
|
||||
aot_loader.c.obj
|
||||
aot_reloc_x86_32.c.obj
|
||||
aot_runtime.c.obj
|
||||
bh_assert.c.obj
|
||||
bh_bitmap.c.obj
|
||||
bh_common.c.obj
|
||||
bh_hashmap.c.obj
|
||||
bh_leb128.c.obj
|
||||
bh_list.c.obj
|
||||
bh_log.c.obj
|
||||
bh_queue.c.obj
|
||||
bh_vector.c.obj
|
||||
ems_alloc.c.obj
|
||||
ems_gc.c.obj
|
||||
ems_hmu.c.obj
|
||||
ems_kfc.c.obj
|
||||
invokeNative_ia32.s.obj
|
||||
libc_builtin_wrapper.c.obj
|
||||
mem_alloc.c.obj
|
||||
platform_init.c.obj
|
||||
runtime_timer.c.obj
|
||||
wasm_application.c.obj
|
||||
wasm_blocking_op.c.obj
|
||||
wasm_c_api.c.obj
|
||||
wasm_exec_env.c.obj
|
||||
wasm_interp_classic.c.obj
|
||||
wasm_loader.c.obj
|
||||
wasm_loader_common.c.obj
|
||||
wasm_memory.c.obj
|
||||
wasm_native.c.obj
|
||||
wasm_runtime.c.obj
|
||||
wasm_runtime_common.c.obj
|
||||
wasm_shared_memory.c.obj
|
||||
*/
|
||||
|
||||
/* Put the .text section from aot_runtime.c.obj from libiwasm.a here */
|
||||
_iwasm_aot_runtime_start = .;
|
||||
*aot_runtime.c.obj(.text .text.*)
|
||||
_iwasm_aot_runtime_end = .;
|
||||
|
||||
/* Put the utility library here */
|
||||
_iwasm_bh_start = .;
|
||||
*bh_*.c.obj(.text .text.*)
|
||||
_iwasm_bh_end = .;
|
||||
|
||||
/* Put the allocator here */
|
||||
_iwasm_mem_alloc_start = .;
|
||||
*mem_alloc.c.obj(.text .text.*)
|
||||
_iwasm_mem_alloc_end = .;
|
||||
|
||||
/* Put the baremetal platform here */
|
||||
_iwasm_platform_init_start = .;
|
||||
*platform_init.c.obj(.text .text.*)
|
||||
_iwasm_platform_init_end = .;
|
||||
|
||||
/* Put the exec_env here */
|
||||
_iwasm_exec_env_start = .;
|
||||
*wasm_exec_env.c.obj(.text .text.*)
|
||||
_iwasm_exec_env_end = .;
|
||||
|
||||
/* Put the classic interpreter here */
|
||||
_iwasm_interp_classic_start = .;
|
||||
*wasm_interp_classic.c.obj(.text .text.*)
|
||||
_iwasm_interp_classic_end = .;
|
||||
|
||||
/* Put the wasm memory here */
|
||||
_iwasm_memory_start = .;
|
||||
*wasm_memory.c.obj(.text .text.*)
|
||||
_iwasm_memory_end = .;
|
||||
|
||||
/* Put the wasm native here */
|
||||
_iwasm_native_start = .;
|
||||
*wasm_native.c.obj(.text .text.*)
|
||||
_iwasm_native_end = .;
|
||||
|
||||
/* Put the wasm runtime here */
|
||||
_iwasm_runtime_start = .;
|
||||
*wasm_runtime.c.obj(.text .text.*)
|
||||
*wasm_runtime_common.c.obj(.text .text.*)
|
||||
_iwasm_runtime_end = .;
|
||||
|
||||
_text_start = .;
|
||||
*(".text*")
|
||||
_text_end = .;
|
||||
|
||||
*(".rodata*")
|
||||
}
|
||||
|
||||
|
||||
@ -55,4 +55,7 @@ _start:
|
||||
|
||||
# Set the size of the _start symbol to the current location '.' minus its start.
|
||||
# This is useful when debugging or when you implement call tracing.
|
||||
.size _start, . - _start
|
||||
|
||||
# If this is enabled, the linker.ld needs to define a symbol before the .text segment.
|
||||
# Otherwise, there's a gap that prevents FAIL from disassembling the AOT.
|
||||
# .size _start, . - _start
|
||||
|
||||
@ -3,7 +3,6 @@
|
||||
#include "bh_platform.h"
|
||||
|
||||
#include "__WASM_ARRAY_FILE__"
|
||||
|
||||
#ifdef TARGET_LINUX
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@ -34,7 +33,99 @@ void host_print(wasm_exec_env_t exec_env, const char *msg) {
|
||||
|
||||
#define STACK_SIZE (4 * 1024)
|
||||
#define HEAP_SIZE STACK_SIZE
|
||||
#define RUNTIME_POOL_SIZE 4 * STACK_SIZE
|
||||
|
||||
#if WASM_MEM_ALLOC_WITH_USAGE
|
||||
|
||||
// Another bump allocator
|
||||
#define WASM_LINEAR_MEMORY_SIZE (64 * 1024) // Need to match --initial-memory?
|
||||
#define RUNTIME_POOL_SIZE (2 * 1024 * 1024)
|
||||
#define LINEAR_POOL_SIZE (WASM_LINEAR_MEMORY_SIZE + 512 * 1024)
|
||||
#define ALIGNMENT 8
|
||||
|
||||
typedef struct {
|
||||
char *buf;
|
||||
size_t size;
|
||||
size_t offset;
|
||||
} BumpPool;
|
||||
|
||||
#if WAMR_RUNTIME_POOL_IN_TEXT
|
||||
__attribute__((section(".text.wamr_runtime_pool"), aligned(4096)))
|
||||
#endif
|
||||
static char runtime_pool_buf[RUNTIME_POOL_SIZE];
|
||||
|
||||
#if WAMR_LINEAR_POOL_IN_TEXT
|
||||
__attribute__((section(".text.wamr_linear_pool"), aligned(4096)))
|
||||
#endif
|
||||
static char linear_pool_buf[LINEAR_POOL_SIZE];
|
||||
|
||||
// mem_alloc_usage_t: 0 = Alloc_For_Runtime, 1 = Alloc_For_LinearMemory
|
||||
static BumpPool pools[] = {
|
||||
{ runtime_pool_buf, RUNTIME_POOL_SIZE, 0 },
|
||||
{ linear_pool_buf, LINEAR_POOL_SIZE, 0 },
|
||||
};
|
||||
|
||||
static size_t align_up(size_t x, size_t a) {
|
||||
return (x + a - 1) & ~(a - 1);
|
||||
}
|
||||
|
||||
static size_t alloc_size(void *ptr) {
|
||||
size_t header_size = align_up(sizeof(size_t), ALIGNMENT);
|
||||
return *(size_t *)((char *)ptr - header_size);
|
||||
}
|
||||
|
||||
static void *bump_alloc(BumpPool *pool, unsigned int size) {
|
||||
size_t header_size = align_up(sizeof(size_t), ALIGNMENT);
|
||||
size_t start = align_up(pool->offset, ALIGNMENT);
|
||||
size_t end = start + header_size + align_up(size, ALIGNMENT);
|
||||
|
||||
if (end > pool->size) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*(size_t *)&pool->buf[start] = size;
|
||||
void *ptr = &pool->buf[start + header_size];
|
||||
pool->offset = end;
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void *wamr_malloc(mem_alloc_usage_t usage, unsigned int size) {
|
||||
PRINT("wamr_malloc: usage=%d size=%u\n", usage, size);
|
||||
return bump_alloc(&pools[usage], size);
|
||||
}
|
||||
|
||||
void *wamr_realloc(mem_alloc_usage_t usage, bool full_size_mmaped, void *ptr,
|
||||
unsigned int new_size) {
|
||||
PRINT("wamr_realloc: usage=%d full_size_mmaped=%d ptr=%p new_size=%u\n",
|
||||
usage, full_size_mmaped, ptr, new_size);
|
||||
|
||||
void *new_addr = bump_alloc(&pools[usage], new_size);
|
||||
if (!new_addr) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (ptr) {
|
||||
size_t old_size = alloc_size(ptr);
|
||||
memcpy(new_addr, ptr, old_size < new_size ? old_size : new_size);
|
||||
}
|
||||
|
||||
return new_addr;
|
||||
}
|
||||
|
||||
void wamr_free(mem_alloc_usage_t usage, void *ptr) {
|
||||
// PRINT("wamr_free: usage=%d ptr=%p\n", usage, ptr);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define RUNTIME_POOL_SIZE (4 * STACK_SIZE)
|
||||
|
||||
#if WAMR_GLOBAL_HEAP_IN_TEXT
|
||||
__attribute__((section(".text.wamr_global_heap"), aligned(4096)))
|
||||
#endif
|
||||
static char global_heap_buf[RUNTIME_POOL_SIZE];
|
||||
|
||||
#endif // WASM_MEM_ALLOC_WITH_USAGE
|
||||
|
||||
MAIN {
|
||||
char error_buf[128];
|
||||
@ -42,11 +133,18 @@ MAIN {
|
||||
// Step 1: Initialize WAMR Runtime
|
||||
static RuntimeInitArgs init_args;
|
||||
memset(&init_args, 0, sizeof(RuntimeInitArgs));
|
||||
static char global_heap_buf[RUNTIME_POOL_SIZE];
|
||||
|
||||
#if WASM_MEM_ALLOC_WITH_USAGE
|
||||
init_args.mem_alloc_type = Alloc_With_Allocator;
|
||||
init_args.mem_alloc_option.allocator.malloc_func = (void *)wamr_malloc;
|
||||
init_args.mem_alloc_option.allocator.realloc_func = (void *)wamr_realloc;
|
||||
init_args.mem_alloc_option.allocator.free_func = (void *)wamr_free;
|
||||
#else
|
||||
init_args.mem_alloc_type = Alloc_With_Pool;
|
||||
init_args.mem_alloc_option.pool.heap_buf = global_heap_buf;
|
||||
init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf);
|
||||
#endif
|
||||
|
||||
init_args.max_thread_num = 1;
|
||||
if (!wasm_runtime_full_init(&init_args)) {
|
||||
PRINT_ERROR("wasm_runtime_full_init failed.\n");
|
||||
|
||||
@ -36,12 +36,15 @@ extern "C" EXPORT("wasm_module") int wasm_module(void) {
|
||||
YC = 0;
|
||||
ZC = 0;
|
||||
|
||||
fail_start_trace();
|
||||
// "early" starts trace here
|
||||
|
||||
sum<0>();
|
||||
sum<1>();
|
||||
sum<2>();
|
||||
|
||||
// "late" starts trace here
|
||||
fail_start_trace();
|
||||
|
||||
naive_vote();
|
||||
|
||||
fail_stop_trace();
|
||||
@ -69,10 +69,13 @@ extern "C" EXPORT("wasm_module") int wasm_module(void) {
|
||||
YC = 0;
|
||||
ZC = 0;
|
||||
|
||||
// "early" starts trace here
|
||||
|
||||
sum<0, SIG_X>();
|
||||
sum<1, SIG_Y>();
|
||||
sum<2, SIG_Z>();
|
||||
|
||||
// "late" starts trace here
|
||||
fail_start_trace();
|
||||
|
||||
sign_t static_sig = cored_vote();
|
||||
@ -36,11 +36,14 @@ extern "C" EXPORT("wasm_module") int wasm_module(void) {
|
||||
YC = 0;
|
||||
ZC = 0;
|
||||
|
||||
// "early" starts trace here
|
||||
fail_start_trace();
|
||||
|
||||
sum<0>();
|
||||
sum<1>();
|
||||
sum<2>();
|
||||
|
||||
fail_start_trace();
|
||||
// "late" starts trace here
|
||||
|
||||
naive_vote();
|
||||
|
||||
@ -69,12 +69,15 @@ extern "C" EXPORT("wasm_module") int wasm_module(void) {
|
||||
YC = 0;
|
||||
ZC = 0;
|
||||
|
||||
// "early" starts trace here
|
||||
fail_start_trace();
|
||||
|
||||
sum<0, SIG_X>();
|
||||
sum<1, SIG_Y>();
|
||||
sum<2, SIG_Z>();
|
||||
|
||||
// "late" starts trace here
|
||||
|
||||
sign_t static_sig = cored_vote();
|
||||
|
||||
fail_stop_trace();
|
||||
27
targets/wasm-tacle/app/lift/CMakeLists.txt
Normal file
27
targets/wasm-tacle/app/lift/CMakeLists.txt
Normal file
@ -0,0 +1,27 @@
|
||||
# ~~~
|
||||
# SPDX-License-Identifier: MIT
|
||||
# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU)
|
||||
# ~~~
|
||||
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
project(lift)
|
||||
|
||||
set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..")
|
||||
set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..")
|
||||
|
||||
set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}")
|
||||
|
||||
if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline")
|
||||
set(APP_SOURCE_FILE_PATH
|
||||
"generated/modified_sources/inline/lift.c")
|
||||
else()
|
||||
set(APP_SOURCE_FILE_PATH
|
||||
"generated/modified_sources/default/lift.c"
|
||||
"generated/modified_sources/default/liftlibcontrol.c"
|
||||
"generated/modified_sources/default/liftlibio.c")
|
||||
endif()
|
||||
|
||||
include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake)
|
||||
|
||||
|
||||
31
targets/wasm-tacle/app/lift/README
Executable file
31
targets/wasm-tacle/app/lift/README
Executable file
@ -0,0 +1,31 @@
|
||||
Lift Controller
|
||||
===============
|
||||
|
||||
This is a port of Martin Schoeberl's Lift Controller [1] to C. The orignal
|
||||
version is an embedded Java program that controls a lift in a factory in Turkey.
|
||||
Benedikt Huber has ported the controller to C and Lucid [3]. It has been used in
|
||||
various research projects, including T-CREST[3] and the F-Shell test generator
|
||||
[4].
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
The sensors of the system consist of several buttons, a load sensor (to detect
|
||||
if the lift is positioned at the load), sensors to detect bottom and top
|
||||
position, and an index sensor for the motor. The motor is controlled using two
|
||||
digital outputs, one for its direction and one to turn it off or on.
|
||||
|
||||
The controller itself consists of an initialization routine ctrl_init(), the
|
||||
controller step ctrl_loop(), which should be invoked every 10ms. Outside a test
|
||||
environment, ctrl_get_vals() should be called to read sensors before the
|
||||
controller runs, and ctrl_set_vals() should be called to set actuators after the
|
||||
controller ran.
|
||||
|
||||
The digital IO interface (9 digital inputs, 2 digital outputs and 14 LEDs are
|
||||
used) is realized as global volatile variables (simio_in, simio_out, simio_led),
|
||||
that can be modified and read by test drivers or by the runtime environment.
|
||||
|
||||
[1] http://www.jopdesign.com/doc/jembench.pdf
|
||||
[2] https://github.com/visq/99lifts
|
||||
[3] http://www.t-crest.org
|
||||
[4] http://forsyte.at/software/fshell/
|
||||
46
targets/wasm-tacle/app/lift/changeLog.txt
Executable file
46
targets/wasm-tacle/app/lift/changeLog.txt
Executable file
@ -0,0 +1,46 @@
|
||||
File: duff.c
|
||||
Original provenience: Lift Controller, see README file
|
||||
|
||||
|
||||
2015-12-21:
|
||||
- replaced defines, introduced 4 enums to replace #define statements
|
||||
(enum Direction, Sensor, Motor, Command)
|
||||
- renamed libs to fit general naming scheme: lift_io -> liftio
|
||||
- benchmark consisted of two benchmarks, test_lift and run_lift,
|
||||
only run_lift remains, i.e., test_lift.data.c/h and test_lift.c removed.
|
||||
- Makefile removed, file can now be compiled using 'gcc lift.c'
|
||||
- 'uint16_t' replaced by 'unsigned short int' to get rid of 'stdint.h;
|
||||
- changed LEVEL_POS_LENGTH from 14 to 16 (16 values were initialized).
|
||||
- added an additional global variable 'int checksum'
|
||||
- added function pre-fix 'lift_' to each function
|
||||
- added function int lift_return() returning the checksum and lift_init()
|
||||
- global variable checksum filled in function 'lift_ctrl_set_vals()'
|
||||
and initialized to 0 in 'lift_init()'
|
||||
- Added forward declarations of all functions before the declarations of global
|
||||
variables
|
||||
- in function lift_main, explicit initialization 'int i = 0' added.
|
||||
- Re-ordered functions to fit template-order
|
||||
- Applied code formatting according to the following rules
|
||||
(incomplete, to be discussed; I basically used astyle with the attached
|
||||
options file):
|
||||
- Lines shall not be wider than 80 characters; whenever possible, appropriate
|
||||
line breaks shall be inserted to keep lines below 80 characters
|
||||
- Indentation is done using whitespaces only, no tabs. Code is indented by
|
||||
two whitespaces
|
||||
- Two empty lines are put between any two functions
|
||||
- In non-empty lists or index expressions, opening '(' and '[' are followed by
|
||||
one whitespace, closing ')' and ']' are preceded by one whitespace
|
||||
- In comma- or colon-separated argument lists, one whitespace is put after
|
||||
each comma/colon
|
||||
- Names of functions and global variables all start with a benchmark-specific
|
||||
prefix (here: st_) followed by lowercase letter (e.g., st_square)
|
||||
- For pointer types, one whitespace is put before the '*'
|
||||
- Operators within expressions shall be preceded and followed by one
|
||||
whitespace
|
||||
- Code of then- and else-parts of if-then-else statements shall be put in
|
||||
separate lines, not in the same lines as the if-condition or the keyword
|
||||
"else"
|
||||
- Opening braces '{' denoting the beginning of code for some if-else or loop
|
||||
body shall be put at the end of the same line where the keywords "if",
|
||||
"else", "for", "while" etc. occur
|
||||
- Added general TACLeBench header to beginning of source code
|
||||
BIN
targets/wasm-tacle/app/lift/generated/default/lift.wasm
Executable file
BIN
targets/wasm-tacle/app/lift/generated/default/lift.wasm
Executable file
Binary file not shown.
2167
targets/wasm-tacle/app/lift/generated/default/lift.wat
Normal file
2167
targets/wasm-tacle/app/lift/generated/default/lift.wat
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,130 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 2.0
|
||||
|
||||
Name: lift
|
||||
|
||||
Author: Martin Schoeberl, Benedikt Huber
|
||||
|
||||
Function: Lift Controler
|
||||
|
||||
Source: C-Port from http://www.jopdesign.com/doc/jembench.pdf
|
||||
|
||||
Original name: run_lift.c
|
||||
|
||||
Changes: no major functional changes
|
||||
|
||||
License: GPL version 3 or later
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
Include section
|
||||
*/
|
||||
|
||||
#include "liftlibcontrol.h"
|
||||
#include "liftlibio.h"
|
||||
|
||||
/*
|
||||
Forward declaration of functions
|
||||
*/
|
||||
|
||||
// Wasm loop bounds
|
||||
|
||||
__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void
|
||||
__pragma_loopbound(unsigned int min_bound, unsigned int max_bound);
|
||||
|
||||
void lift_controller();
|
||||
void lift_init();
|
||||
__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void
|
||||
lift_main();
|
||||
int lift_return();
|
||||
|
||||
/*
|
||||
Declaration of global variables
|
||||
*/
|
||||
|
||||
int lift_checksum; /* Checksum */
|
||||
|
||||
/*
|
||||
Initialization- and return-value-related functions
|
||||
*/
|
||||
|
||||
void
|
||||
lift_init() {
|
||||
unsigned int i;
|
||||
unsigned char *p;
|
||||
volatile char bitmask = 0;
|
||||
|
||||
/*
|
||||
Apply volatile XOR-bitmask to entire input array.
|
||||
*/
|
||||
p = (unsigned char *) &lift_ctrl_io_in[0];
|
||||
__pragma_loopbound(40, 40);
|
||||
for (i = 0; i < sizeof(lift_ctrl_io_in); ++i, ++p)
|
||||
*p ^= bitmask;
|
||||
|
||||
p = (unsigned char *) &lift_ctrl_io_out[0];
|
||||
__pragma_loopbound(16, 16);
|
||||
for (i = 0; i < sizeof(lift_ctrl_io_out); ++i, ++p)
|
||||
*p ^= bitmask;
|
||||
|
||||
p = (unsigned char *) &lift_ctrl_io_analog[0];
|
||||
__pragma_loopbound(16, 16);
|
||||
for (i = 0; i < sizeof(lift_ctrl_io_analog); ++i, ++p)
|
||||
*p ^= bitmask;
|
||||
|
||||
p = (unsigned char *) &lift_ctrl_io_led[0];
|
||||
__pragma_loopbound(64, 64);
|
||||
for (i = 0; i < sizeof(lift_ctrl_io_led); ++i, ++p)
|
||||
*p ^= bitmask;
|
||||
|
||||
lift_checksum = 0;
|
||||
lift_ctrl_init();
|
||||
}
|
||||
|
||||
int
|
||||
lift_return() {
|
||||
return (lift_checksum - 4005888 != 0);
|
||||
}
|
||||
|
||||
/*
|
||||
Algorithm core functions
|
||||
*/
|
||||
|
||||
void
|
||||
lift_controller() {
|
||||
lift_ctrl_get_vals();
|
||||
lift_ctrl_loop();
|
||||
lift_ctrl_set_vals();
|
||||
}
|
||||
|
||||
/*
|
||||
Main functions
|
||||
*/
|
||||
|
||||
__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void
|
||||
lift_main() {
|
||||
int i = 0;
|
||||
__pragma_loopbound(1001, 1001);
|
||||
while (1) {
|
||||
/* zero input stimulus */
|
||||
lift_simio_in = 0;
|
||||
lift_simio_adc1 = 0;
|
||||
lift_simio_adc2 = 0;
|
||||
lift_simio_adc3 = 0;
|
||||
/* run lift_controller */
|
||||
lift_controller();
|
||||
if (i++ >= 1000)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
__attribute__((noinline)) __attribute__((export_name("main"))) int
|
||||
main(void) {
|
||||
lift_init();
|
||||
lift_main();
|
||||
|
||||
return (lift_return());
|
||||
}
|
||||
@ -0,0 +1,267 @@
|
||||
#include "liftlibcontrol.h"
|
||||
#include "liftlibio.h"
|
||||
|
||||
/* Global variables */
|
||||
int lift_levelPos[16];
|
||||
int lift_one_level;
|
||||
|
||||
/**
|
||||
Is the counter valid for level positioning?
|
||||
*/
|
||||
|
||||
// Wasm loop bounds
|
||||
|
||||
__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void
|
||||
__pragma_loopbound(unsigned int min_bound, unsigned int max_bound);
|
||||
|
||||
int lift_cntValid;
|
||||
|
||||
/**
|
||||
Position absolute or relative<.
|
||||
*/
|
||||
int lift_cnt;
|
||||
|
||||
/**
|
||||
Last stoped level (1..13) if position is absolute else 0.
|
||||
*/
|
||||
int lift_level;
|
||||
|
||||
/**
|
||||
load position in level, 0 means we don't know
|
||||
*/
|
||||
int lift_loadLevel;
|
||||
|
||||
/**
|
||||
we're going TOP or BOTTOM, but stop at load position.
|
||||
*/
|
||||
int lift_loadPending;
|
||||
|
||||
/**
|
||||
we're waiting for the load sensor to go.
|
||||
*/
|
||||
int lift_loadSensor;
|
||||
|
||||
/**
|
||||
cmd keeps the value of the command until the command is finished.
|
||||
It is only updated by the switches if it's current value is CMD_NONE.
|
||||
*/
|
||||
int lift_cmd;
|
||||
|
||||
int lift_timMotor;
|
||||
|
||||
int lift_timImp;
|
||||
|
||||
/**
|
||||
Remember last direction for impuls count after motor off;
|
||||
*/
|
||||
int lift_directionUp;
|
||||
|
||||
/**
|
||||
Last value of impuls sensor.
|
||||
*/
|
||||
int lift_lastImp;
|
||||
|
||||
int lift_dbgCnt;
|
||||
|
||||
/**
|
||||
stop value for the counter.
|
||||
*/
|
||||
int lift_endCnt;
|
||||
|
||||
void
|
||||
lift_ctrl_init() {
|
||||
int i;
|
||||
lift_checksum = 0;
|
||||
|
||||
lift_io_init();
|
||||
lift_cntValid = 0;
|
||||
lift_cnt = 0;
|
||||
lift_cmd = lift_CMD_NONE;
|
||||
lift_timMotor = 0;
|
||||
lift_timImp = 0;
|
||||
lift_directionUp = 1;
|
||||
lift_lastImp = 0;
|
||||
lift_loadLevel = 0;
|
||||
lift_loadPending = 0;
|
||||
lift_loadSensor = 0;
|
||||
i = 0;
|
||||
lift_levelPos[i++] = 0;
|
||||
lift_levelPos[i++] = 58;
|
||||
lift_levelPos[i++] = 115;
|
||||
lift_levelPos[i++] = 173;
|
||||
lift_levelPos[i++] = 230;
|
||||
lift_levelPos[i++] = 288;
|
||||
lift_levelPos[i++] = 346;
|
||||
lift_levelPos[i++] = 403;
|
||||
lift_levelPos[i++] = 461;
|
||||
lift_levelPos[i++] = 518;
|
||||
lift_levelPos[i++] = 576;
|
||||
lift_levelPos[i++] = 634;
|
||||
lift_levelPos[i++] = 691;
|
||||
lift_levelPos[i++] = 749;
|
||||
lift_levelPos[i++] = 806;
|
||||
lift_levelPos[i++] = 864;
|
||||
lift_one_level = lift_levelPos[1];
|
||||
}
|
||||
|
||||
void
|
||||
lift_ctrl_loop() {
|
||||
if (lift_cmd == lift_CMD_NONE)
|
||||
lift_check_cmd();
|
||||
else {
|
||||
lift_do_impulse(lift_ctrl_io_in[lift_SENS_IMPULS],
|
||||
lift_ctrl_io_out[lift_MOTOR_ON],
|
||||
lift_ctrl_io_in[lift_SENS_BOTTOM]);
|
||||
lift_do_cmd();
|
||||
}
|
||||
lift_check_level();
|
||||
lift_ctrl_io_led[13] = (lift_dbgCnt & 0x80) != 0;
|
||||
++lift_dbgCnt;
|
||||
}
|
||||
|
||||
void
|
||||
lift_check_level() {
|
||||
int i;
|
||||
int middle = lift_one_level >> 2;
|
||||
if (lift_cntValid) {
|
||||
__pragma_loopbound(14, 14);
|
||||
for (lift_level = 1; lift_level < 14; ++lift_level) {
|
||||
if (lift_cnt < lift_levelPos[lift_level] - middle)
|
||||
break;
|
||||
}
|
||||
} else
|
||||
lift_level = 0;
|
||||
__pragma_loopbound(14, 14);
|
||||
for (i = 0; i < 14; ++i)
|
||||
lift_ctrl_io_led[i] = (i == lift_level - 1);
|
||||
}
|
||||
|
||||
void
|
||||
lift_check_cmd() {
|
||||
if (lift_loadPending) {
|
||||
if (lift_ctrl_io_in[lift_SENS_BOTTOM])
|
||||
lift_cmd = lift_CMD_TOP;
|
||||
} else if (lift_ctrl_io_in[lift_GO_UP]) {
|
||||
if (!lift_ctrl_io_in[lift_SENS_TOP] && lift_level != 14)
|
||||
lift_cmd = lift_CMD_UP;
|
||||
} else if (lift_ctrl_io_in[lift_GO_DOWN]) {
|
||||
if (!lift_ctrl_io_in[lift_SENS_BOTTOM] && lift_level != 1)
|
||||
lift_cmd = lift_CMD_DOWN;
|
||||
} else if (lift_ctrl_io_in[lift_GO_LOAD]) {
|
||||
if (lift_loadLevel != 0 && lift_level < lift_loadLevel)
|
||||
lift_cmd = lift_CMD_TOP;
|
||||
else
|
||||
lift_cmd = lift_CMD_BOTTOM;
|
||||
lift_loadPending = 1;
|
||||
lift_loadSensor = 0;
|
||||
} else if (lift_ctrl_io_in[lift_GO_TOP]) {
|
||||
if (!lift_ctrl_io_in[lift_SENS_TOP])
|
||||
lift_cmd = lift_CMD_TOP;
|
||||
} else if (lift_ctrl_io_in[lift_GO_BOTTOM]) {
|
||||
if (!lift_ctrl_io_in[lift_SENS_BOTTOM])
|
||||
lift_cmd = lift_CMD_BOTTOM;
|
||||
}
|
||||
if (lift_cmd != lift_CMD_NONE)
|
||||
lift_timMotor = 50;
|
||||
}
|
||||
|
||||
void
|
||||
lift_do_impulse(int val, int motor, int reset) {
|
||||
if (val && !lift_lastImp) {
|
||||
if (motor || lift_timImp > 0) {
|
||||
if (lift_directionUp)
|
||||
++lift_cnt;
|
||||
else
|
||||
--lift_cnt;
|
||||
}
|
||||
}
|
||||
if (reset) {
|
||||
lift_cnt = 0;
|
||||
lift_cntValid = 1;
|
||||
}
|
||||
lift_lastImp = val;
|
||||
if (lift_timImp > 0) {
|
||||
--lift_timImp;
|
||||
if (lift_timImp == 0 && lift_cmd != lift_CMD_NONE)
|
||||
lift_cmd = lift_CMD_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
lift_do_cmd() {
|
||||
int run = 0;
|
||||
if (lift_timMotor > 0)
|
||||
lift_wait_for_motor_start();
|
||||
else {
|
||||
run = lift_check_run();
|
||||
if (lift_ctrl_io_out[lift_MOTOR_ON] && !run) {
|
||||
/* motor stopped: */
|
||||
lift_cmd = 99;
|
||||
lift_timImp = 50;
|
||||
}
|
||||
lift_ctrl_io_out[lift_MOTOR_ON] = run;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
lift_wait_for_motor_start() {
|
||||
int newLevel = 0;
|
||||
--lift_timMotor;
|
||||
lift_directionUp = (lift_cmd == lift_CMD_UP || lift_cmd == lift_CMD_TOP);
|
||||
lift_ctrl_io_out[lift_MOTOR_UP] = lift_directionUp;
|
||||
if (!lift_cntValid) {
|
||||
lift_cnt = 0; /* use relative counter */
|
||||
if (lift_cmd == lift_CMD_UP)
|
||||
lift_endCnt = lift_one_level;
|
||||
else
|
||||
lift_endCnt = -lift_one_level;
|
||||
} else {
|
||||
lift_endCnt = lift_cnt;
|
||||
newLevel = -99;
|
||||
if (lift_cmd == lift_CMD_UP)
|
||||
newLevel = lift_level + 1;
|
||||
else if (lift_cmd == lift_CMD_DOWN)
|
||||
newLevel = lift_level - 1;
|
||||
--newLevel; /* lift_level is one based */
|
||||
if (newLevel >= 0 && newLevel < 14)
|
||||
lift_endCnt = lift_levelPos[newLevel];
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
lift_check_run() {
|
||||
if (lift_cmd == lift_CMD_UP) {
|
||||
if (lift_cnt < lift_endCnt - 1 && !lift_ctrl_io_in[lift_SENS_TOP])
|
||||
return 1;
|
||||
} else if (lift_cmd == lift_CMD_DOWN) {
|
||||
if (lift_cnt > lift_endCnt + 1 && !lift_ctrl_io_in[lift_SENS_BOTTOM])
|
||||
return 1;
|
||||
} else if (lift_cmd == lift_CMD_TOP) {
|
||||
if (lift_loadPending && lift_ctrl_io_in[lift_SENS_LOAD]) {
|
||||
/* we are at lift_load position */
|
||||
lift_loadLevel = lift_level;
|
||||
lift_loadPending = 0;
|
||||
return 0;
|
||||
}
|
||||
if (!lift_ctrl_io_in[lift_SENS_TOP])
|
||||
return 1;
|
||||
/* safe fallback if lift_load sensor does not work */
|
||||
lift_loadPending = 0;
|
||||
} else if (lift_cmd == lift_CMD_BOTTOM) {
|
||||
if (lift_loadPending) {
|
||||
if (lift_loadSensor) {
|
||||
if (!lift_ctrl_io_in[lift_SENS_LOAD]) {
|
||||
lift_loadSensor = 0;
|
||||
/* we are at lift_load position */
|
||||
lift_loadPending = 0;
|
||||
lift_loadLevel = lift_level;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
lift_loadSensor = lift_ctrl_io_in[lift_SENS_LOAD];
|
||||
}
|
||||
if (!lift_ctrl_io_in[lift_SENS_BOTTOM])
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,62 @@
|
||||
|
||||
#ifndef LIFTLIBCONTROL_H
|
||||
#define LIFTLIBCONTROL_H
|
||||
|
||||
enum lift_Direction {
|
||||
lift_GO_LOAD = 8,
|
||||
lift_GO_TOP = 6,
|
||||
lift_GO_BOTTOM = 7,
|
||||
lift_GO_UP = 4,
|
||||
lift_GO_DOWN = 5
|
||||
};
|
||||
|
||||
enum lift_Sensor {
|
||||
lift_SENS_IMPULS = 0,
|
||||
lift_SENS_TOP = 1,
|
||||
lift_SENS_BOTTOM = 2,
|
||||
lift_SENS_LOAD = 3
|
||||
};
|
||||
|
||||
enum lift_Motor { lift_MOTOR_ON = 0, lift_MOTOR_UP = 1 };
|
||||
|
||||
enum lift_Command {
|
||||
lift_CMD_NONE = 0,
|
||||
lift_CMD_TOP = 1,
|
||||
lift_CMD_BOTTOM = 2,
|
||||
lift_CMD_UP = 3,
|
||||
lift_CMD_DOWN = 4
|
||||
};
|
||||
|
||||
/* Global variables */
|
||||
extern int lift_levelPos[16];
|
||||
extern int lift_one_level;
|
||||
extern int lift_cntValid;
|
||||
extern int lift_cnt;
|
||||
extern int lift_level;
|
||||
extern int lift_loadLevel;
|
||||
extern int lift_loadPending;
|
||||
extern int lift_loadSensor;
|
||||
extern int lift_cmd;
|
||||
extern int lift_timMotor;
|
||||
extern int lift_timImp;
|
||||
extern int lift_directionUp;
|
||||
extern int lift_lastImp;
|
||||
extern int lift_dbgCnt;
|
||||
extern int lift_endCnt;
|
||||
|
||||
/* Checksum */
|
||||
extern int lift_checksum;
|
||||
|
||||
/* prototypes */
|
||||
void lift_ctrl_init();
|
||||
void lift_ctrl_loop();
|
||||
|
||||
/* internal prototypes */
|
||||
int lift_check_run();
|
||||
void lift_wait_for_motor_start();
|
||||
void lift_do_cmd();
|
||||
void lift_do_impulse(int val, int motor, int reset);
|
||||
void lift_check_cmd();
|
||||
void lift_check_level();
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,69 @@
|
||||
#include "liftlibio.h"
|
||||
|
||||
/* Global variables */
|
||||
int lift_ctrl_io_in[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
int lift_ctrl_io_out[4] = {0, 0, 0, 0};
|
||||
int lift_ctrl_io_analog[4] = {0, 0, 0, 0};
|
||||
int lift_ctrl_io_led[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
int lift_ctrl_dly1;
|
||||
int lift_ctrl_dly2;
|
||||
|
||||
/* Simulated hardware */
|
||||
|
||||
// Wasm loop bounds
|
||||
|
||||
__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void
|
||||
__pragma_loopbound(unsigned int min_bound, unsigned int max_bound);
|
||||
|
||||
volatile int lift_simio_in;
|
||||
volatile int lift_simio_out;
|
||||
volatile int lift_simio_led;
|
||||
volatile int lift_simio_adc1;
|
||||
volatile int lift_simio_adc2;
|
||||
volatile int lift_simio_adc3;
|
||||
|
||||
void
|
||||
lift_io_init() {
|
||||
lift_ctrl_dly1 = 0;
|
||||
lift_ctrl_dly2 = 0;
|
||||
}
|
||||
|
||||
void
|
||||
lift_ctrl_set_vals() {
|
||||
int val = 0, i;
|
||||
__pragma_loopbound(4, 4);
|
||||
for (i = 4 - 1; i >= 0; --i) {
|
||||
val <<= 1;
|
||||
val |= lift_ctrl_io_out[i] ? 1 : 0;
|
||||
}
|
||||
lift_simio_out = val;
|
||||
__pragma_loopbound(14, 14);
|
||||
for (i = 14 - 1; i >= 0; --i) {
|
||||
val <<= 1;
|
||||
val |= lift_ctrl_io_led[i] ? 1 : 0;
|
||||
}
|
||||
lift_simio_led = val;
|
||||
lift_checksum += val;
|
||||
}
|
||||
|
||||
void
|
||||
lift_ctrl_get_vals() {
|
||||
int i;
|
||||
unsigned short int in0 = lift_simio_in;
|
||||
unsigned short int in1 = lift_ctrl_dly1;
|
||||
unsigned short int in2 = lift_ctrl_dly2;
|
||||
lift_ctrl_dly2 = lift_ctrl_dly1;
|
||||
lift_ctrl_dly1 = in0;
|
||||
/* majority voting for input values
|
||||
delays input value change by one period */
|
||||
__pragma_loopbound(10, 10);
|
||||
for (i = 0; i < 10; ++i) {
|
||||
lift_ctrl_io_in[i] = ((in0 & 1) + (in1 & 1) + (in2 & 1)) > 1;
|
||||
in0 >>= 1;
|
||||
in1 >>= 1;
|
||||
in2 >>= 1;
|
||||
}
|
||||
lift_ctrl_io_analog[0] = lift_simio_adc1;
|
||||
lift_ctrl_io_analog[1] = lift_simio_adc2;
|
||||
lift_ctrl_io_analog[2] = lift_simio_adc3;
|
||||
}
|
||||
@ -0,0 +1,28 @@
|
||||
|
||||
#ifndef LIFTLIBIO_H
|
||||
#define LIFTLIBIO_H
|
||||
|
||||
/* Global variables */
|
||||
extern int lift_ctrl_io_in[10];
|
||||
extern int lift_ctrl_io_out[4];
|
||||
extern int lift_ctrl_io_analog[4];
|
||||
extern int lift_ctrl_io_led[16];
|
||||
extern int lift_ctrl_dly1, lift_ctrl_dly2;
|
||||
|
||||
/* Simulated hardware */
|
||||
extern volatile int lift_simio_in;
|
||||
extern volatile int lift_simio_out;
|
||||
extern volatile int lift_simio_led;
|
||||
extern volatile int lift_simio_adc1;
|
||||
extern volatile int lift_simio_adc2;
|
||||
extern volatile int lift_simio_adc3;
|
||||
|
||||
/* Checksum */
|
||||
extern int lift_checksum;
|
||||
|
||||
/* prototypes */
|
||||
void lift_io_init(void);
|
||||
void lift_ctrl_get_vals(void);
|
||||
void lift_ctrl_set_vals(void);
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,138 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 2.0
|
||||
|
||||
Name: lift
|
||||
|
||||
Author: Martin Schoeberl, Benedikt Huber
|
||||
|
||||
Function: Lift Controler
|
||||
|
||||
Source: C-Port from http://www.jopdesign.com/doc/jembench.pdf
|
||||
|
||||
Original name: run_lift.c
|
||||
|
||||
Changes: no major functional changes
|
||||
|
||||
License: GPL version 3 or later
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
Include section
|
||||
*/
|
||||
|
||||
#include "liftlibcontrol.h"
|
||||
#include "liftlibio.h"
|
||||
|
||||
/*
|
||||
Forward declaration of functions
|
||||
*/
|
||||
|
||||
// Wasm loop bounds
|
||||
|
||||
|
||||
#include "liftlibcontrol.c"
|
||||
#include "liftlibio.c"
|
||||
|
||||
|
||||
__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void
|
||||
__pragma_loopbound(unsigned int min_bound, unsigned int max_bound);
|
||||
|
||||
__attribute__((always_inline)) static inline void lift_controller();
|
||||
__attribute__((always_inline)) static inline void lift_init();
|
||||
__attribute__((noinline)) __attribute__((export_name("entrypoint")))
|
||||
__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void
|
||||
lift_main();
|
||||
__attribute__((always_inline)) static inline int lift_return();
|
||||
|
||||
/*
|
||||
Declaration of global variables
|
||||
*/
|
||||
|
||||
int lift_checksum; /* Checksum */
|
||||
|
||||
/*
|
||||
Initialization- and return-value-related functions
|
||||
*/
|
||||
|
||||
__attribute__((always_inline)) static inline void
|
||||
lift_init() {
|
||||
unsigned int i;
|
||||
unsigned char *p;
|
||||
volatile char bitmask = 0;
|
||||
|
||||
/*
|
||||
Apply volatile XOR-bitmask to entire input array.
|
||||
*/
|
||||
p = (unsigned char *) &lift_ctrl_io_in[0];
|
||||
__pragma_loopbound(40, 40);
|
||||
for (i = 0; i < sizeof(lift_ctrl_io_in); ++i, ++p)
|
||||
*p ^= bitmask;
|
||||
|
||||
p = (unsigned char *) &lift_ctrl_io_out[0];
|
||||
__pragma_loopbound(16, 16);
|
||||
for (i = 0; i < sizeof(lift_ctrl_io_out); ++i, ++p)
|
||||
*p ^= bitmask;
|
||||
|
||||
p = (unsigned char *) &lift_ctrl_io_analog[0];
|
||||
__pragma_loopbound(16, 16);
|
||||
for (i = 0; i < sizeof(lift_ctrl_io_analog); ++i, ++p)
|
||||
*p ^= bitmask;
|
||||
|
||||
p = (unsigned char *) &lift_ctrl_io_led[0];
|
||||
__pragma_loopbound(64, 64);
|
||||
for (i = 0; i < sizeof(lift_ctrl_io_led); ++i, ++p)
|
||||
*p ^= bitmask;
|
||||
|
||||
lift_checksum = 0;
|
||||
lift_ctrl_init();
|
||||
}
|
||||
|
||||
__attribute__((always_inline)) static inline int
|
||||
lift_return() {
|
||||
return (lift_checksum - 4005888 != 0);
|
||||
}
|
||||
|
||||
/*
|
||||
Algorithm core functions
|
||||
*/
|
||||
|
||||
__attribute__((always_inline)) static inline void
|
||||
lift_controller() {
|
||||
lift_ctrl_get_vals();
|
||||
lift_ctrl_loop();
|
||||
lift_ctrl_set_vals();
|
||||
}
|
||||
|
||||
/*
|
||||
Main functions
|
||||
*/
|
||||
|
||||
__attribute__((noinline)) __attribute__((export_name("entrypoint")))
|
||||
__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void
|
||||
lift_main() {
|
||||
int i = 0;
|
||||
__pragma_loopbound(1001, 1001);
|
||||
while (1) {
|
||||
/* zero input stimulus */
|
||||
lift_simio_in = 0;
|
||||
lift_simio_adc1 = 0;
|
||||
lift_simio_adc2 = 0;
|
||||
lift_simio_adc3 = 0;
|
||||
/* run lift_controller */
|
||||
lift_controller();
|
||||
if (i++ >= 1000)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
__attribute__((noinline)) __attribute__((export_name("main")))
|
||||
__attribute__((noinline)) __attribute__((export_name("main"))) int
|
||||
main(void) {
|
||||
lift_init();
|
||||
lift_main();
|
||||
|
||||
return (lift_return());
|
||||
}
|
||||
@ -0,0 +1,267 @@
|
||||
#include "liftlibcontrol.h"
|
||||
#include "liftlibio.h"
|
||||
|
||||
/* Global variables */
|
||||
int lift_levelPos[16];
|
||||
int lift_one_level;
|
||||
|
||||
/**
|
||||
Is the counter valid for level positioning?
|
||||
*/
|
||||
|
||||
// Wasm loop bounds
|
||||
|
||||
__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void
|
||||
__pragma_loopbound(unsigned int min_bound, unsigned int max_bound);
|
||||
|
||||
int lift_cntValid;
|
||||
|
||||
/**
|
||||
Position absolute or relative<.
|
||||
*/
|
||||
int lift_cnt;
|
||||
|
||||
/**
|
||||
Last stoped level (1..13) if position is absolute else 0.
|
||||
*/
|
||||
int lift_level;
|
||||
|
||||
/**
|
||||
load position in level, 0 means we don't know
|
||||
*/
|
||||
int lift_loadLevel;
|
||||
|
||||
/**
|
||||
we're going TOP or BOTTOM, but stop at load position.
|
||||
*/
|
||||
int lift_loadPending;
|
||||
|
||||
/**
|
||||
we're waiting for the load sensor to go.
|
||||
*/
|
||||
int lift_loadSensor;
|
||||
|
||||
/**
|
||||
cmd keeps the value of the command until the command is finished.
|
||||
It is only updated by the switches if it's current value is CMD_NONE.
|
||||
*/
|
||||
int lift_cmd;
|
||||
|
||||
int lift_timMotor;
|
||||
|
||||
int lift_timImp;
|
||||
|
||||
/**
|
||||
Remember last direction for impuls count after motor off;
|
||||
*/
|
||||
int lift_directionUp;
|
||||
|
||||
/**
|
||||
Last value of impuls sensor.
|
||||
*/
|
||||
int lift_lastImp;
|
||||
|
||||
int lift_dbgCnt;
|
||||
|
||||
/**
|
||||
stop value for the counter.
|
||||
*/
|
||||
int lift_endCnt;
|
||||
|
||||
__attribute__((always_inline)) static inline void
|
||||
lift_ctrl_init() {
|
||||
int i;
|
||||
lift_checksum = 0;
|
||||
|
||||
lift_io_init();
|
||||
lift_cntValid = 0;
|
||||
lift_cnt = 0;
|
||||
lift_cmd = lift_CMD_NONE;
|
||||
lift_timMotor = 0;
|
||||
lift_timImp = 0;
|
||||
lift_directionUp = 1;
|
||||
lift_lastImp = 0;
|
||||
lift_loadLevel = 0;
|
||||
lift_loadPending = 0;
|
||||
lift_loadSensor = 0;
|
||||
i = 0;
|
||||
lift_levelPos[i++] = 0;
|
||||
lift_levelPos[i++] = 58;
|
||||
lift_levelPos[i++] = 115;
|
||||
lift_levelPos[i++] = 173;
|
||||
lift_levelPos[i++] = 230;
|
||||
lift_levelPos[i++] = 288;
|
||||
lift_levelPos[i++] = 346;
|
||||
lift_levelPos[i++] = 403;
|
||||
lift_levelPos[i++] = 461;
|
||||
lift_levelPos[i++] = 518;
|
||||
lift_levelPos[i++] = 576;
|
||||
lift_levelPos[i++] = 634;
|
||||
lift_levelPos[i++] = 691;
|
||||
lift_levelPos[i++] = 749;
|
||||
lift_levelPos[i++] = 806;
|
||||
lift_levelPos[i++] = 864;
|
||||
lift_one_level = lift_levelPos[1];
|
||||
}
|
||||
|
||||
__attribute__((always_inline)) static inline void
|
||||
lift_ctrl_loop() {
|
||||
if (lift_cmd == lift_CMD_NONE)
|
||||
lift_check_cmd();
|
||||
else {
|
||||
lift_do_impulse(lift_ctrl_io_in[lift_SENS_IMPULS],
|
||||
lift_ctrl_io_out[lift_MOTOR_ON],
|
||||
lift_ctrl_io_in[lift_SENS_BOTTOM]);
|
||||
lift_do_cmd();
|
||||
}
|
||||
lift_check_level();
|
||||
lift_ctrl_io_led[13] = (lift_dbgCnt & 0x80) != 0;
|
||||
++lift_dbgCnt;
|
||||
}
|
||||
|
||||
__attribute__((always_inline)) static inline void
|
||||
lift_check_level() {
|
||||
int i;
|
||||
int middle = lift_one_level >> 2;
|
||||
if (lift_cntValid) {
|
||||
__pragma_loopbound(14, 14);
|
||||
for (lift_level = 1; lift_level < 14; ++lift_level) {
|
||||
if (lift_cnt < lift_levelPos[lift_level] - middle)
|
||||
break;
|
||||
}
|
||||
} else
|
||||
lift_level = 0;
|
||||
__pragma_loopbound(14, 14);
|
||||
for (i = 0; i < 14; ++i)
|
||||
lift_ctrl_io_led[i] = (i == lift_level - 1);
|
||||
}
|
||||
|
||||
__attribute__((always_inline)) static inline void
|
||||
lift_check_cmd() {
|
||||
if (lift_loadPending) {
|
||||
if (lift_ctrl_io_in[lift_SENS_BOTTOM])
|
||||
lift_cmd = lift_CMD_TOP;
|
||||
} else if (lift_ctrl_io_in[lift_GO_UP]) {
|
||||
if (!lift_ctrl_io_in[lift_SENS_TOP] && lift_level != 14)
|
||||
lift_cmd = lift_CMD_UP;
|
||||
} else if (lift_ctrl_io_in[lift_GO_DOWN]) {
|
||||
if (!lift_ctrl_io_in[lift_SENS_BOTTOM] && lift_level != 1)
|
||||
lift_cmd = lift_CMD_DOWN;
|
||||
} else if (lift_ctrl_io_in[lift_GO_LOAD]) {
|
||||
if (lift_loadLevel != 0 && lift_level < lift_loadLevel)
|
||||
lift_cmd = lift_CMD_TOP;
|
||||
else
|
||||
lift_cmd = lift_CMD_BOTTOM;
|
||||
lift_loadPending = 1;
|
||||
lift_loadSensor = 0;
|
||||
} else if (lift_ctrl_io_in[lift_GO_TOP]) {
|
||||
if (!lift_ctrl_io_in[lift_SENS_TOP])
|
||||
lift_cmd = lift_CMD_TOP;
|
||||
} else if (lift_ctrl_io_in[lift_GO_BOTTOM]) {
|
||||
if (!lift_ctrl_io_in[lift_SENS_BOTTOM])
|
||||
lift_cmd = lift_CMD_BOTTOM;
|
||||
}
|
||||
if (lift_cmd != lift_CMD_NONE)
|
||||
lift_timMotor = 50;
|
||||
}
|
||||
|
||||
__attribute__((always_inline)) static inline void
|
||||
lift_do_impulse(int val, int motor, int reset) {
|
||||
if (val && !lift_lastImp) {
|
||||
if (motor || lift_timImp > 0) {
|
||||
if (lift_directionUp)
|
||||
++lift_cnt;
|
||||
else
|
||||
--lift_cnt;
|
||||
}
|
||||
}
|
||||
if (reset) {
|
||||
lift_cnt = 0;
|
||||
lift_cntValid = 1;
|
||||
}
|
||||
lift_lastImp = val;
|
||||
if (lift_timImp > 0) {
|
||||
--lift_timImp;
|
||||
if (lift_timImp == 0 && lift_cmd != lift_CMD_NONE)
|
||||
lift_cmd = lift_CMD_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
__attribute__((always_inline)) static inline void
|
||||
lift_do_cmd() {
|
||||
int run = 0;
|
||||
if (lift_timMotor > 0)
|
||||
lift_wait_for_motor_start();
|
||||
else {
|
||||
run = lift_check_run();
|
||||
if (lift_ctrl_io_out[lift_MOTOR_ON] && !run) {
|
||||
/* motor stopped: */
|
||||
lift_cmd = 99;
|
||||
lift_timImp = 50;
|
||||
}
|
||||
lift_ctrl_io_out[lift_MOTOR_ON] = run;
|
||||
}
|
||||
}
|
||||
|
||||
__attribute__((always_inline)) static inline void
|
||||
lift_wait_for_motor_start() {
|
||||
int newLevel = 0;
|
||||
--lift_timMotor;
|
||||
lift_directionUp = (lift_cmd == lift_CMD_UP || lift_cmd == lift_CMD_TOP);
|
||||
lift_ctrl_io_out[lift_MOTOR_UP] = lift_directionUp;
|
||||
if (!lift_cntValid) {
|
||||
lift_cnt = 0; /* use relative counter */
|
||||
if (lift_cmd == lift_CMD_UP)
|
||||
lift_endCnt = lift_one_level;
|
||||
else
|
||||
lift_endCnt = -lift_one_level;
|
||||
} else {
|
||||
lift_endCnt = lift_cnt;
|
||||
newLevel = -99;
|
||||
if (lift_cmd == lift_CMD_UP)
|
||||
newLevel = lift_level + 1;
|
||||
else if (lift_cmd == lift_CMD_DOWN)
|
||||
newLevel = lift_level - 1;
|
||||
--newLevel; /* lift_level is one based */
|
||||
if (newLevel >= 0 && newLevel < 14)
|
||||
lift_endCnt = lift_levelPos[newLevel];
|
||||
}
|
||||
}
|
||||
|
||||
__attribute__((always_inline)) static inline int
|
||||
lift_check_run() {
|
||||
if (lift_cmd == lift_CMD_UP) {
|
||||
if (lift_cnt < lift_endCnt - 1 && !lift_ctrl_io_in[lift_SENS_TOP])
|
||||
return 1;
|
||||
} else if (lift_cmd == lift_CMD_DOWN) {
|
||||
if (lift_cnt > lift_endCnt + 1 && !lift_ctrl_io_in[lift_SENS_BOTTOM])
|
||||
return 1;
|
||||
} else if (lift_cmd == lift_CMD_TOP) {
|
||||
if (lift_loadPending && lift_ctrl_io_in[lift_SENS_LOAD]) {
|
||||
/* we are at lift_load position */
|
||||
lift_loadLevel = lift_level;
|
||||
lift_loadPending = 0;
|
||||
return 0;
|
||||
}
|
||||
if (!lift_ctrl_io_in[lift_SENS_TOP])
|
||||
return 1;
|
||||
/* safe fallback if lift_load sensor does not work */
|
||||
lift_loadPending = 0;
|
||||
} else if (lift_cmd == lift_CMD_BOTTOM) {
|
||||
if (lift_loadPending) {
|
||||
if (lift_loadSensor) {
|
||||
if (!lift_ctrl_io_in[lift_SENS_LOAD]) {
|
||||
lift_loadSensor = 0;
|
||||
/* we are at lift_load position */
|
||||
lift_loadPending = 0;
|
||||
lift_loadLevel = lift_level;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
lift_loadSensor = lift_ctrl_io_in[lift_SENS_LOAD];
|
||||
}
|
||||
if (!lift_ctrl_io_in[lift_SENS_BOTTOM])
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,63 @@
|
||||
|
||||
#ifndef LIFTLIBCONTROL_H
|
||||
#define LIFTLIBCONTROL_H
|
||||
|
||||
enum lift_Direction {
|
||||
lift_GO_LOAD = 8,
|
||||
lift_GO_TOP = 6,
|
||||
lift_GO_BOTTOM = 7,
|
||||
lift_GO_UP = 4,
|
||||
lift_GO_DOWN = 5
|
||||
};
|
||||
|
||||
enum lift_Sensor {
|
||||
lift_SENS_IMPULS = 0,
|
||||
lift_SENS_TOP = 1,
|
||||
lift_SENS_BOTTOM = 2,
|
||||
lift_SENS_LOAD = 3
|
||||
};
|
||||
|
||||
enum lift_Motor { lift_MOTOR_ON = 0, lift_MOTOR_UP = 1 };
|
||||
|
||||
enum lift_Command {
|
||||
lift_CMD_NONE = 0,
|
||||
lift_CMD_TOP = 1,
|
||||
lift_CMD_BOTTOM = 2,
|
||||
lift_CMD_UP = 3,
|
||||
lift_CMD_DOWN = 4
|
||||
};
|
||||
|
||||
/* Global variables */
|
||||
extern int lift_levelPos[16];
|
||||
extern int lift_one_level;
|
||||
extern int lift_cntValid;
|
||||
extern int lift_cnt;
|
||||
extern int lift_level;
|
||||
extern int lift_loadLevel;
|
||||
extern int lift_loadPending;
|
||||
extern int lift_loadSensor;
|
||||
extern int lift_cmd;
|
||||
extern int lift_timMotor;
|
||||
extern int lift_timImp;
|
||||
extern int lift_directionUp;
|
||||
extern int lift_lastImp;
|
||||
extern int lift_dbgCnt;
|
||||
extern int lift_endCnt;
|
||||
|
||||
/* Checksum */
|
||||
extern int lift_checksum;
|
||||
|
||||
/* prototypes */
|
||||
__attribute__((always_inline)) static inline void lift_ctrl_init();
|
||||
__attribute__((always_inline)) static inline void lift_ctrl_loop();
|
||||
|
||||
/* internal prototypes */
|
||||
__attribute__((always_inline)) static inline int lift_check_run();
|
||||
__attribute__((always_inline)) static inline void lift_wait_for_motor_start();
|
||||
__attribute__((always_inline)) static inline void lift_do_cmd();
|
||||
__attribute__((always_inline)) static inline void
|
||||
lift_do_impulse(int val, int motor, int reset);
|
||||
__attribute__((always_inline)) static inline void lift_check_cmd();
|
||||
__attribute__((always_inline)) static inline void lift_check_level();
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,69 @@
|
||||
#include "liftlibio.h"
|
||||
|
||||
/* Global variables */
|
||||
int lift_ctrl_io_in[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
int lift_ctrl_io_out[4] = {0, 0, 0, 0};
|
||||
int lift_ctrl_io_analog[4] = {0, 0, 0, 0};
|
||||
int lift_ctrl_io_led[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
int lift_ctrl_dly1;
|
||||
int lift_ctrl_dly2;
|
||||
|
||||
/* Simulated hardware */
|
||||
|
||||
// Wasm loop bounds
|
||||
|
||||
__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void
|
||||
__pragma_loopbound(unsigned int min_bound, unsigned int max_bound);
|
||||
|
||||
volatile int lift_simio_in;
|
||||
volatile int lift_simio_out;
|
||||
volatile int lift_simio_led;
|
||||
volatile int lift_simio_adc1;
|
||||
volatile int lift_simio_adc2;
|
||||
volatile int lift_simio_adc3;
|
||||
|
||||
__attribute__((always_inline)) static inline void
|
||||
lift_io_init() {
|
||||
lift_ctrl_dly1 = 0;
|
||||
lift_ctrl_dly2 = 0;
|
||||
}
|
||||
|
||||
__attribute__((always_inline)) static inline void
|
||||
lift_ctrl_set_vals() {
|
||||
int val = 0, i;
|
||||
__pragma_loopbound(4, 4);
|
||||
for (i = 4 - 1; i >= 0; --i) {
|
||||
val <<= 1;
|
||||
val |= lift_ctrl_io_out[i] ? 1 : 0;
|
||||
}
|
||||
lift_simio_out = val;
|
||||
__pragma_loopbound(14, 14);
|
||||
for (i = 14 - 1; i >= 0; --i) {
|
||||
val <<= 1;
|
||||
val |= lift_ctrl_io_led[i] ? 1 : 0;
|
||||
}
|
||||
lift_simio_led = val;
|
||||
lift_checksum += val;
|
||||
}
|
||||
|
||||
__attribute__((always_inline)) static inline void
|
||||
lift_ctrl_get_vals() {
|
||||
int i;
|
||||
unsigned short int in0 = lift_simio_in;
|
||||
unsigned short int in1 = lift_ctrl_dly1;
|
||||
unsigned short int in2 = lift_ctrl_dly2;
|
||||
lift_ctrl_dly2 = lift_ctrl_dly1;
|
||||
lift_ctrl_dly1 = in0;
|
||||
/* majority voting for input values
|
||||
delays input value change by one period */
|
||||
__pragma_loopbound(10, 10);
|
||||
for (i = 0; i < 10; ++i) {
|
||||
lift_ctrl_io_in[i] = ((in0 & 1) + (in1 & 1) + (in2 & 1)) > 1;
|
||||
in0 >>= 1;
|
||||
in1 >>= 1;
|
||||
in2 >>= 1;
|
||||
}
|
||||
lift_ctrl_io_analog[0] = lift_simio_adc1;
|
||||
lift_ctrl_io_analog[1] = lift_simio_adc2;
|
||||
lift_ctrl_io_analog[2] = lift_simio_adc3;
|
||||
}
|
||||
@ -0,0 +1,28 @@
|
||||
|
||||
#ifndef LIFTLIBIO_H
|
||||
#define LIFTLIBIO_H
|
||||
|
||||
/* Global variables */
|
||||
extern int lift_ctrl_io_in[10];
|
||||
extern int lift_ctrl_io_out[4];
|
||||
extern int lift_ctrl_io_analog[4];
|
||||
extern int lift_ctrl_io_led[16];
|
||||
extern int lift_ctrl_dly1, lift_ctrl_dly2;
|
||||
|
||||
/* Simulated hardware */
|
||||
extern volatile int lift_simio_in;
|
||||
extern volatile int lift_simio_out;
|
||||
extern volatile int lift_simio_led;
|
||||
extern volatile int lift_simio_adc1;
|
||||
extern volatile int lift_simio_adc2;
|
||||
extern volatile int lift_simio_adc3;
|
||||
|
||||
/* Checksum */
|
||||
extern int lift_checksum;
|
||||
|
||||
/* prototypes */
|
||||
__attribute__((always_inline)) static inline void lift_io_init(void);
|
||||
__attribute__((always_inline)) static inline void lift_ctrl_get_vals(void);
|
||||
__attribute__((always_inline)) static inline void lift_ctrl_set_vals(void);
|
||||
|
||||
#endif
|
||||
132
targets/wasm-tacle/app/lift/lift.c
Executable file
132
targets/wasm-tacle/app/lift/lift.c
Executable file
@ -0,0 +1,132 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 2.0
|
||||
|
||||
Name: lift
|
||||
|
||||
Author: Martin Schoeberl, Benedikt Huber
|
||||
|
||||
Function: Lift Controler
|
||||
|
||||
Source: C-Port from http://www.jopdesign.com/doc/jembench.pdf
|
||||
|
||||
Original name: run_lift.c
|
||||
|
||||
Changes: no major functional changes
|
||||
|
||||
License: GPL version 3 or later
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
Include section
|
||||
*/
|
||||
|
||||
#include "liftlibio.h"
|
||||
#include "liftlibcontrol.h"
|
||||
|
||||
|
||||
/*
|
||||
Forward declaration of functions
|
||||
*/
|
||||
|
||||
void lift_controller();
|
||||
void lift_init();
|
||||
void lift_main();
|
||||
int lift_return();
|
||||
|
||||
|
||||
/*
|
||||
Declaration of global variables
|
||||
*/
|
||||
|
||||
int lift_checksum;/* Checksum */
|
||||
|
||||
|
||||
/*
|
||||
Initialization- and return-value-related functions
|
||||
*/
|
||||
|
||||
void lift_init()
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned char *p;
|
||||
volatile char bitmask = 0;
|
||||
|
||||
/*
|
||||
Apply volatile XOR-bitmask to entire input array.
|
||||
*/
|
||||
p = ( unsigned char * ) &lift_ctrl_io_in[ 0 ];
|
||||
_Pragma( "loopbound min 40 max 40" )
|
||||
for ( i = 0; i < sizeof( lift_ctrl_io_in ); ++i, ++p )
|
||||
*p ^= bitmask;
|
||||
|
||||
p = ( unsigned char * ) &lift_ctrl_io_out[ 0 ];
|
||||
_Pragma( "loopbound min 16 max 16" )
|
||||
for ( i = 0; i < sizeof( lift_ctrl_io_out ); ++i, ++p )
|
||||
*p ^= bitmask;
|
||||
|
||||
p = ( unsigned char * ) &lift_ctrl_io_analog[ 0 ];
|
||||
_Pragma( "loopbound min 16 max 16" )
|
||||
for ( i = 0; i < sizeof( lift_ctrl_io_analog ); ++i, ++p )
|
||||
*p ^= bitmask;
|
||||
|
||||
p = ( unsigned char * ) &lift_ctrl_io_led[ 0 ];
|
||||
_Pragma( "loopbound min 64 max 64" )
|
||||
for ( i = 0; i < sizeof( lift_ctrl_io_led ); ++i, ++p )
|
||||
*p ^= bitmask;
|
||||
|
||||
lift_checksum = 0;
|
||||
lift_ctrl_init();
|
||||
}
|
||||
|
||||
|
||||
int lift_return()
|
||||
{
|
||||
return ( lift_checksum - 4005888 != 0 );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Algorithm core functions
|
||||
*/
|
||||
|
||||
void lift_controller()
|
||||
{
|
||||
lift_ctrl_get_vals();
|
||||
lift_ctrl_loop();
|
||||
lift_ctrl_set_vals();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Main functions
|
||||
*/
|
||||
|
||||
void _Pragma( "entrypoint" ) lift_main()
|
||||
{
|
||||
int i = 0;
|
||||
_Pragma( "loopbound min 1001 max 1001" )
|
||||
while ( 1 ) {
|
||||
/* zero input stimulus */
|
||||
lift_simio_in = 0;
|
||||
lift_simio_adc1 = 0;
|
||||
lift_simio_adc2 = 0;
|
||||
lift_simio_adc3 = 0;
|
||||
/* run lift_controller */
|
||||
lift_controller();
|
||||
if ( i++ >= 1000 )
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main( void )
|
||||
{
|
||||
lift_init();
|
||||
lift_main();
|
||||
|
||||
return ( lift_return() );
|
||||
}
|
||||
277
targets/wasm-tacle/app/lift/liftlibcontrol.c
Executable file
277
targets/wasm-tacle/app/lift/liftlibcontrol.c
Executable file
@ -0,0 +1,277 @@
|
||||
#include "liftlibio.h"
|
||||
#include "liftlibcontrol.h"
|
||||
|
||||
/* Global variables */
|
||||
int lift_levelPos[ 16 ];
|
||||
int lift_one_level;
|
||||
|
||||
/**
|
||||
Is the counter valid for level positioning?
|
||||
*/
|
||||
int lift_cntValid;
|
||||
|
||||
/**
|
||||
Position absolute or relative<.
|
||||
*/
|
||||
int lift_cnt;
|
||||
|
||||
/**
|
||||
Last stoped level (1..13) if position is absolute else 0.
|
||||
*/
|
||||
int lift_level;
|
||||
|
||||
/**
|
||||
load position in level, 0 means we don't know
|
||||
*/
|
||||
int lift_loadLevel;
|
||||
|
||||
/**
|
||||
we're going TOP or BOTTOM, but stop at load position.
|
||||
*/
|
||||
int lift_loadPending;
|
||||
|
||||
/**
|
||||
we're waiting for the load sensor to go.
|
||||
*/
|
||||
int lift_loadSensor;
|
||||
|
||||
/**
|
||||
cmd keeps the value of the command until the command is finished.
|
||||
It is only updated by the switches if it's current value is CMD_NONE.
|
||||
*/
|
||||
int lift_cmd;
|
||||
|
||||
int lift_timMotor;
|
||||
|
||||
int lift_timImp;
|
||||
|
||||
/**
|
||||
Remember last direction for impuls count after motor off;
|
||||
*/
|
||||
int lift_directionUp;
|
||||
|
||||
/**
|
||||
Last value of impuls sensor.
|
||||
*/
|
||||
int lift_lastImp;
|
||||
|
||||
int lift_dbgCnt;
|
||||
|
||||
/**
|
||||
stop value for the counter.
|
||||
*/
|
||||
int lift_endCnt;
|
||||
|
||||
|
||||
void lift_ctrl_init()
|
||||
{
|
||||
int i;
|
||||
lift_checksum = 0;
|
||||
|
||||
lift_io_init();
|
||||
lift_cntValid = 0;
|
||||
lift_cnt = 0;
|
||||
lift_cmd = lift_CMD_NONE;
|
||||
lift_timMotor = 0;
|
||||
lift_timImp = 0;
|
||||
lift_directionUp = 1;
|
||||
lift_lastImp = 0;
|
||||
lift_loadLevel = 0;
|
||||
lift_loadPending = 0;
|
||||
lift_loadSensor = 0;
|
||||
i = 0;
|
||||
lift_levelPos[ i++ ] = 0;
|
||||
lift_levelPos[ i++ ] = 58;
|
||||
lift_levelPos[ i++ ] = 115;
|
||||
lift_levelPos[ i++ ] = 173;
|
||||
lift_levelPos[ i++ ] = 230;
|
||||
lift_levelPos[ i++ ] = 288;
|
||||
lift_levelPos[ i++ ] = 346;
|
||||
lift_levelPos[ i++ ] = 403;
|
||||
lift_levelPos[ i++ ] = 461;
|
||||
lift_levelPos[ i++ ] = 518;
|
||||
lift_levelPos[ i++ ] = 576;
|
||||
lift_levelPos[ i++ ] = 634;
|
||||
lift_levelPos[ i++ ] = 691;
|
||||
lift_levelPos[ i++ ] = 749;
|
||||
lift_levelPos[ i++ ] = 806;
|
||||
lift_levelPos[ i++ ] = 864;
|
||||
lift_one_level = lift_levelPos[ 1 ];
|
||||
}
|
||||
|
||||
void lift_ctrl_loop()
|
||||
{
|
||||
if ( lift_cmd == lift_CMD_NONE )
|
||||
lift_check_cmd();
|
||||
else {
|
||||
lift_do_impulse( lift_ctrl_io_in[ lift_SENS_IMPULS ],
|
||||
lift_ctrl_io_out[ lift_MOTOR_ON ],
|
||||
lift_ctrl_io_in[ lift_SENS_BOTTOM ] );
|
||||
lift_do_cmd();
|
||||
}
|
||||
lift_check_level();
|
||||
lift_ctrl_io_led[ 13 ] = ( lift_dbgCnt & 0x80 ) != 0;
|
||||
++lift_dbgCnt;
|
||||
}
|
||||
|
||||
|
||||
void lift_check_level()
|
||||
{
|
||||
int i;
|
||||
int middle = lift_one_level >> 2;
|
||||
if ( lift_cntValid ) {
|
||||
_Pragma( "loopbound min 14 max 14" )
|
||||
for ( lift_level = 1; lift_level < 14; ++lift_level ) {
|
||||
if ( lift_cnt < lift_levelPos[ lift_level ] - middle )
|
||||
break;
|
||||
}
|
||||
} else
|
||||
lift_level = 0;
|
||||
_Pragma( "loopbound min 14 max 14" )
|
||||
for ( i = 0; i < 14; ++i )
|
||||
lift_ctrl_io_led[ i ] = ( i == lift_level - 1 );
|
||||
}
|
||||
|
||||
|
||||
void lift_check_cmd()
|
||||
{
|
||||
if ( lift_loadPending ) {
|
||||
if ( lift_ctrl_io_in[ lift_SENS_BOTTOM ] )
|
||||
lift_cmd = lift_CMD_TOP;
|
||||
} else
|
||||
if ( lift_ctrl_io_in[ lift_GO_UP ] ) {
|
||||
if ( !lift_ctrl_io_in[ lift_SENS_TOP ] && lift_level != 14 )
|
||||
lift_cmd = lift_CMD_UP;
|
||||
} else
|
||||
if ( lift_ctrl_io_in[ lift_GO_DOWN ] ) {
|
||||
if ( !lift_ctrl_io_in[ lift_SENS_BOTTOM ] && lift_level != 1 )
|
||||
lift_cmd = lift_CMD_DOWN;
|
||||
} else
|
||||
if ( lift_ctrl_io_in[ lift_GO_LOAD ] ) {
|
||||
if ( lift_loadLevel != 0 && lift_level < lift_loadLevel )
|
||||
lift_cmd = lift_CMD_TOP;
|
||||
else
|
||||
lift_cmd = lift_CMD_BOTTOM;
|
||||
lift_loadPending = 1;
|
||||
lift_loadSensor = 0;
|
||||
} else
|
||||
if ( lift_ctrl_io_in[ lift_GO_TOP ] ) {
|
||||
if ( !lift_ctrl_io_in[ lift_SENS_TOP ] )
|
||||
lift_cmd = lift_CMD_TOP;
|
||||
} else
|
||||
if ( lift_ctrl_io_in[ lift_GO_BOTTOM ] ) {
|
||||
if ( !lift_ctrl_io_in[ lift_SENS_BOTTOM ] )
|
||||
lift_cmd = lift_CMD_BOTTOM;
|
||||
}
|
||||
if ( lift_cmd != lift_CMD_NONE )
|
||||
lift_timMotor = 50;
|
||||
}
|
||||
|
||||
|
||||
void lift_do_impulse( int val, int motor, int reset )
|
||||
{
|
||||
if ( val && !lift_lastImp ) {
|
||||
if ( motor || lift_timImp > 0 ) {
|
||||
if ( lift_directionUp )
|
||||
++lift_cnt;
|
||||
else
|
||||
--lift_cnt;
|
||||
}
|
||||
}
|
||||
if ( reset ) {
|
||||
lift_cnt = 0;
|
||||
lift_cntValid = 1;
|
||||
}
|
||||
lift_lastImp = val;
|
||||
if ( lift_timImp > 0 ) {
|
||||
--lift_timImp;
|
||||
if ( lift_timImp == 0 && lift_cmd != lift_CMD_NONE )
|
||||
lift_cmd = lift_CMD_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void lift_do_cmd()
|
||||
{
|
||||
int run = 0;
|
||||
if ( lift_timMotor > 0 )
|
||||
lift_wait_for_motor_start();
|
||||
else {
|
||||
run = lift_check_run();
|
||||
if ( lift_ctrl_io_out[ lift_MOTOR_ON ] && !run ) {
|
||||
/* motor stopped: */
|
||||
lift_cmd = 99;
|
||||
lift_timImp = 50;
|
||||
}
|
||||
lift_ctrl_io_out[ lift_MOTOR_ON ] = run;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void lift_wait_for_motor_start()
|
||||
{
|
||||
int newLevel = 0;
|
||||
--lift_timMotor;
|
||||
lift_directionUp = ( lift_cmd == lift_CMD_UP || lift_cmd == lift_CMD_TOP );
|
||||
lift_ctrl_io_out[ lift_MOTOR_UP ] = lift_directionUp;
|
||||
if ( !lift_cntValid ) {
|
||||
lift_cnt = 0; /* use relative counter */
|
||||
if ( lift_cmd == lift_CMD_UP )
|
||||
lift_endCnt = lift_one_level;
|
||||
else
|
||||
lift_endCnt = -lift_one_level;
|
||||
} else {
|
||||
lift_endCnt = lift_cnt;
|
||||
newLevel = -99;
|
||||
if ( lift_cmd == lift_CMD_UP )
|
||||
newLevel = lift_level + 1;
|
||||
else
|
||||
if ( lift_cmd == lift_CMD_DOWN )
|
||||
newLevel = lift_level - 1;
|
||||
--newLevel; /* lift_level is one based */
|
||||
if ( newLevel >= 0 && newLevel < 14 )
|
||||
lift_endCnt = lift_levelPos[ newLevel ];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int lift_check_run()
|
||||
{
|
||||
if ( lift_cmd == lift_CMD_UP ) {
|
||||
if ( lift_cnt < lift_endCnt - 1 && !lift_ctrl_io_in[ lift_SENS_TOP ] )
|
||||
return 1;
|
||||
} else
|
||||
if ( lift_cmd == lift_CMD_DOWN ) {
|
||||
if ( lift_cnt > lift_endCnt + 1 && !lift_ctrl_io_in[ lift_SENS_BOTTOM ] )
|
||||
return 1;
|
||||
} else
|
||||
if ( lift_cmd == lift_CMD_TOP ) {
|
||||
if ( lift_loadPending && lift_ctrl_io_in[ lift_SENS_LOAD ] ) {
|
||||
/* we are at lift_load position */
|
||||
lift_loadLevel = lift_level;
|
||||
lift_loadPending = 0;
|
||||
return 0;
|
||||
}
|
||||
if ( !lift_ctrl_io_in[ lift_SENS_TOP ] )
|
||||
return 1;
|
||||
/* safe fallback if lift_load sensor does not work */
|
||||
lift_loadPending = 0;
|
||||
} else
|
||||
if ( lift_cmd == lift_CMD_BOTTOM ) {
|
||||
if ( lift_loadPending ) {
|
||||
if ( lift_loadSensor ) {
|
||||
if ( !lift_ctrl_io_in[ lift_SENS_LOAD ] ) {
|
||||
lift_loadSensor = 0;
|
||||
/* we are at lift_load position */
|
||||
lift_loadPending = 0;
|
||||
lift_loadLevel = lift_level;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
lift_loadSensor = lift_ctrl_io_in[ lift_SENS_LOAD ];
|
||||
}
|
||||
if ( !lift_ctrl_io_in[ lift_SENS_BOTTOM ] )
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
64
targets/wasm-tacle/app/lift/liftlibcontrol.h
Executable file
64
targets/wasm-tacle/app/lift/liftlibcontrol.h
Executable file
@ -0,0 +1,64 @@
|
||||
#ifndef LIFTLIBCONTROL_H
|
||||
#define LIFTLIBCONTROL_H
|
||||
|
||||
enum lift_Direction {
|
||||
lift_GO_LOAD = 8,
|
||||
lift_GO_TOP = 6,
|
||||
lift_GO_BOTTOM = 7,
|
||||
lift_GO_UP = 4,
|
||||
lift_GO_DOWN = 5
|
||||
};
|
||||
|
||||
enum lift_Sensor {
|
||||
lift_SENS_IMPULS = 0,
|
||||
lift_SENS_TOP = 1,
|
||||
lift_SENS_BOTTOM = 2,
|
||||
lift_SENS_LOAD = 3
|
||||
};
|
||||
|
||||
enum lift_Motor {
|
||||
lift_MOTOR_ON = 0,
|
||||
lift_MOTOR_UP = 1
|
||||
};
|
||||
|
||||
enum lift_Command {
|
||||
lift_CMD_NONE = 0,
|
||||
lift_CMD_TOP = 1,
|
||||
lift_CMD_BOTTOM = 2,
|
||||
lift_CMD_UP = 3,
|
||||
lift_CMD_DOWN = 4
|
||||
};
|
||||
|
||||
/* Global variables */
|
||||
extern int lift_levelPos[ 16 ];
|
||||
extern int lift_one_level;
|
||||
extern int lift_cntValid;
|
||||
extern int lift_cnt;
|
||||
extern int lift_level;
|
||||
extern int lift_loadLevel;
|
||||
extern int lift_loadPending;
|
||||
extern int lift_loadSensor;
|
||||
extern int lift_cmd;
|
||||
extern int lift_timMotor;
|
||||
extern int lift_timImp;
|
||||
extern int lift_directionUp;
|
||||
extern int lift_lastImp;
|
||||
extern int lift_dbgCnt;
|
||||
extern int lift_endCnt;
|
||||
|
||||
/* Checksum */
|
||||
extern int lift_checksum;
|
||||
|
||||
/* prototypes */
|
||||
void lift_ctrl_init();
|
||||
void lift_ctrl_loop();
|
||||
|
||||
/* internal prototypes */
|
||||
int lift_check_run();
|
||||
void lift_wait_for_motor_start();
|
||||
void lift_do_cmd();
|
||||
void lift_do_impulse( int val, int motor, int reset );
|
||||
void lift_check_cmd();
|
||||
void lift_check_level();
|
||||
|
||||
#endif
|
||||
65
targets/wasm-tacle/app/lift/liftlibio.c
Executable file
65
targets/wasm-tacle/app/lift/liftlibio.c
Executable file
@ -0,0 +1,65 @@
|
||||
#include "liftlibio.h"
|
||||
|
||||
/* Global variables */
|
||||
int lift_ctrl_io_in[ 10 ] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
int lift_ctrl_io_out[ 4 ] = {0, 0, 0, 0};
|
||||
int lift_ctrl_io_analog[ 4 ] = {0, 0, 0, 0};
|
||||
int lift_ctrl_io_led[ 16 ] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
int lift_ctrl_dly1;
|
||||
int lift_ctrl_dly2;
|
||||
|
||||
/* Simulated hardware */
|
||||
volatile int lift_simio_in;
|
||||
volatile int lift_simio_out;
|
||||
volatile int lift_simio_led;
|
||||
volatile int lift_simio_adc1;
|
||||
volatile int lift_simio_adc2;
|
||||
volatile int lift_simio_adc3;
|
||||
|
||||
void lift_io_init()
|
||||
{
|
||||
lift_ctrl_dly1 = 0;
|
||||
lift_ctrl_dly2 = 0;
|
||||
}
|
||||
|
||||
|
||||
void lift_ctrl_set_vals()
|
||||
{
|
||||
int val = 0, i;
|
||||
_Pragma( "loopbound min 4 max 4" )
|
||||
for ( i = 4 - 1; i >= 0; --i ) {
|
||||
val <<= 1;
|
||||
val |= lift_ctrl_io_out[ i ] ? 1 : 0;
|
||||
}
|
||||
lift_simio_out = val;
|
||||
_Pragma( "loopbound min 14 max 14" )
|
||||
for ( i = 14 - 1; i >= 0; --i ) {
|
||||
val <<= 1;
|
||||
val |= lift_ctrl_io_led[ i ] ? 1 : 0;
|
||||
}
|
||||
lift_simio_led = val;
|
||||
lift_checksum += val;
|
||||
}
|
||||
|
||||
|
||||
void lift_ctrl_get_vals()
|
||||
{
|
||||
int i;
|
||||
unsigned short int in0 = lift_simio_in;
|
||||
unsigned short int in1 = lift_ctrl_dly1;
|
||||
unsigned short int in2 = lift_ctrl_dly2;
|
||||
lift_ctrl_dly2 = lift_ctrl_dly1;
|
||||
lift_ctrl_dly1 = in0;
|
||||
/* majority voting for input values
|
||||
delays input value change by one period */
|
||||
_Pragma( "loopbound min 10 max 10" )
|
||||
for ( i = 0; i < 10; ++i ) {
|
||||
lift_ctrl_io_in[ i ] = ( ( in0 & 1 ) + ( in1 & 1 ) + ( in2 & 1 ) ) > 1;
|
||||
in0 >>= 1;
|
||||
in1 >>= 1;
|
||||
in2 >>= 1;
|
||||
}
|
||||
lift_ctrl_io_analog[ 0 ] = lift_simio_adc1;
|
||||
lift_ctrl_io_analog[ 1 ] = lift_simio_adc2;
|
||||
lift_ctrl_io_analog[ 2 ] = lift_simio_adc3;
|
||||
}
|
||||
27
targets/wasm-tacle/app/lift/liftlibio.h
Executable file
27
targets/wasm-tacle/app/lift/liftlibio.h
Executable file
@ -0,0 +1,27 @@
|
||||
#ifndef LIFTLIBIO_H
|
||||
#define LIFTLIBIO_H
|
||||
|
||||
/* Global variables */
|
||||
extern int lift_ctrl_io_in[ 10 ];
|
||||
extern int lift_ctrl_io_out[ 4 ];
|
||||
extern int lift_ctrl_io_analog[ 4 ];
|
||||
extern int lift_ctrl_io_led[ 16 ];
|
||||
extern int lift_ctrl_dly1, lift_ctrl_dly2;
|
||||
|
||||
/* Simulated hardware */
|
||||
extern volatile int lift_simio_in;
|
||||
extern volatile int lift_simio_out;
|
||||
extern volatile int lift_simio_led;
|
||||
extern volatile int lift_simio_adc1;
|
||||
extern volatile int lift_simio_adc2;
|
||||
extern volatile int lift_simio_adc3;
|
||||
|
||||
/* Checksum */
|
||||
extern int lift_checksum;
|
||||
|
||||
/* prototypes */
|
||||
void lift_io_init( void );
|
||||
void lift_ctrl_get_vals( void );
|
||||
void lift_ctrl_set_vals( void );
|
||||
|
||||
#endif
|
||||
35
targets/wasm-tacle/app/powerwindow/CMakeLists.txt
Normal file
35
targets/wasm-tacle/app/powerwindow/CMakeLists.txt
Normal file
@ -0,0 +1,35 @@
|
||||
# ~~~
|
||||
# SPDX-License-Identifier: MIT
|
||||
# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU)
|
||||
# ~~~
|
||||
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
project(powerwindow)
|
||||
|
||||
set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..")
|
||||
set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..")
|
||||
|
||||
set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}")
|
||||
|
||||
if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline")
|
||||
set(APP_SOURCE_FILE_PATH
|
||||
"generated/modified_sources/inline/powerwindow.c")
|
||||
else()
|
||||
set(APP_SOURCE_FILE_PATH
|
||||
"generated/modified_sources/default/powerwindow.c"
|
||||
"generated/modified_sources/default/powerwindow_PW_Control_DRV.c"
|
||||
"generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL.c"
|
||||
"generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR.c"
|
||||
"generated/modified_sources/default/powerwindow_PW_Control_PSG_Front.c"
|
||||
"generated/modified_sources/default/powerwindow_const_params.c"
|
||||
"generated/modified_sources/default/powerwindow_controlexclusion.c"
|
||||
"generated/modified_sources/default/powerwindow_debounce.c"
|
||||
"generated/modified_sources/default/powerwindow_inputs.c"
|
||||
"generated/modified_sources/default/powerwindow_powerwindow_control.c"
|
||||
"generated/modified_sources/default/wcclib.c")
|
||||
endif()
|
||||
|
||||
include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake)
|
||||
|
||||
|
||||
42
targets/wasm-tacle/app/powerwindow/changeLog
Normal file
42
targets/wasm-tacle/app/powerwindow/changeLog
Normal file
@ -0,0 +1,42 @@
|
||||
Adjusted the original files to tacle benchmark requirements
|
||||
|
||||
Created the input serials in void powerwindow_input_initialize(void) to cover the real life scenarios
|
||||
|
||||
23-03-2016:
|
||||
Deleted folder powerwindow_SourceFiles moved all the contained c files to PowerWindow folder
|
||||
|
||||
Created headerfile powerwindow.h
|
||||
|
||||
Added
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL ((void *) 0)
|
||||
#endif
|
||||
|
||||
to header file powerwindow.h
|
||||
|
||||
Deleted #include <stdio.h> in all files replaced with headerfile powerwindow.h
|
||||
|
||||
Deleted function powerwindow_GetErrorStatus(void) and the related code
|
||||
|
||||
Commented
|
||||
long tic, toc, tictoc;
|
||||
tic = powerwindow_get_cycles();
|
||||
toc = powerwindow_get_cycles();
|
||||
tictoc = toc-tic;
|
||||
printf("%ld\n",tictoc );
|
||||
|
||||
in the int main(void). Uncomment can print the execution time of the powerwindow benchmark.
|
||||
|
||||
Adjusted the description of all the files
|
||||
|
||||
21-04-2016
|
||||
|
||||
Adjusted the author and license
|
||||
|
||||
18-04-2017:
|
||||
Annotated powerwindow_main as entry-point for timing analysis
|
||||
|
||||
10-07-2017
|
||||
- Fix changelog order so dates are correctly sorted.
|
||||
- Fix input array length to avoid possible buffer overflow.
|
||||
BIN
targets/wasm-tacle/app/powerwindow/generated/default/powerwindow.wasm
Executable file
BIN
targets/wasm-tacle/app/powerwindow/generated/default/powerwindow.wasm
Executable file
Binary file not shown.
2868
targets/wasm-tacle/app/powerwindow/generated/default/powerwindow.wat
Normal file
2868
targets/wasm-tacle/app/powerwindow/generated/default/powerwindow.wat
Normal file
File diff suppressed because one or more lines are too long
@ -0,0 +1,782 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: powerwindow implement the powerwindow that can be seen in cars
|
||||
nowadays. The window can be controlled by either driver or passenger. When an
|
||||
object is detected between the window frame and the glass during the raising
|
||||
of the glass, the glass will lower down for some distance. This benchmark
|
||||
contains 4 tasks which includes the driver side powerwindow, front passenger
|
||||
side powerwindow, back-left passenger side powerwindow, back-right passenger
|
||||
side powerwindow. These 4 tasks can be easily adjusted to execute in
|
||||
sequential order parallel on single or muti core.
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow.c
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
* 2023-12-07: Added loop bounds
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#include "powerwindow_HeaderFiles/powerwindow.h"
|
||||
#include "powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h"
|
||||
#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h"
|
||||
#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h"
|
||||
#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h"
|
||||
#include "powerwindow_HeaderFiles/powerwindow_controlexclusion.h" /* Control Model's header file */
|
||||
#include "powerwindow_HeaderFiles/powerwindow_debounce.h"
|
||||
#include "powerwindow_HeaderFiles/powerwindow_model_reference_types.h"
|
||||
#include "powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" /* PW passenger control Model's header file */
|
||||
#include "powerwindow_HeaderFiles/powerwindow_rtwtypes.h"
|
||||
/*
|
||||
Forward declaration of functions
|
||||
*/
|
||||
|
||||
// Wasm loop bounds
|
||||
|
||||
__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void
|
||||
__pragma_loopbound(unsigned int min_bound, unsigned int max_bound);
|
||||
|
||||
void powerwindow_Booleaninputarray_initialize(powerwindow_boolean_T *,
|
||||
powerwindow_boolean_T *);
|
||||
void powerwindow_Uint8inputarray_initialize(powerwindow_uint8_T *,
|
||||
powerwindow_uint8_T *);
|
||||
void powerwindow_init();
|
||||
__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void
|
||||
powerwindow_main();
|
||||
int powerwindow_return();
|
||||
__attribute__((noinline)) __attribute__((export_name("main"))) int main(void);
|
||||
|
||||
// DRV
|
||||
void powerwindow_init_DRV(int);
|
||||
void powerwindow_input_initialize_DRV(void);
|
||||
void powerwindow_initialize_DRV(void);
|
||||
void powerwindow_return_DRV(void);
|
||||
void powerwindow_DRV_main(void);
|
||||
|
||||
// PSG_Front
|
||||
void powerwindow_init_PSG_Front(int);
|
||||
void powerwindow_input_initialize_PSG_Front(void);
|
||||
void powerwindow_initialize_PSG_Front(void);
|
||||
void powerwindow_return_PSG_Front(void);
|
||||
void powerwindow_PSG_Front_main(void);
|
||||
|
||||
// PSG_BackL
|
||||
void powerwindow_init_PSG_BackL(int);
|
||||
void powerwindow_input_initialize_PSG_BackL(void);
|
||||
void powerwindow_initialize_PSG_BackL(void);
|
||||
void powerwindow_return_PSG_BackL(void);
|
||||
void powerwindow_PSG_BackL_main(void);
|
||||
|
||||
// PSG_BackR
|
||||
void powerwindow_init_PSG_BackR(int);
|
||||
void powerwindow_input_initialize_PSG_BackR(void);
|
||||
void powerwindow_initialize_PSG_BackR(void);
|
||||
void powerwindow_return_PSG_BackR(void);
|
||||
void powerwindow_PSG_BackR_main(void);
|
||||
|
||||
/*
|
||||
Declaration of global variables
|
||||
*/
|
||||
|
||||
/* External inputs (root inport signals with auto storage) */
|
||||
|
||||
extern powerwindow_ExternalInputs_powerwindow_PW_C powerwindow_PW_Control_DRV_U;
|
||||
extern powerwindow_ExternalOutputs_powerwindow_PW_ powerwindow_PW_Control_DRV_Y;
|
||||
extern powerwindow_ExternalInputs_PW_Control_PSG_Front
|
||||
powerwindow_PW_Control_PSG_Front_U;
|
||||
extern powerwindow_ExternalInputs_PW_Control_PSG_BackL
|
||||
powerwindow_PW_Control_PSG_BackL_U;
|
||||
extern powerwindow_ExternalInputs_PW_Control_PSG_BackR
|
||||
powerwindow_PW_Control_PSG_BackR_U;
|
||||
|
||||
powerwindow_boolean_T
|
||||
powerwindow_debounce_Driver_DRV_U_Up_Input_DRV[powerwindow_input_length];
|
||||
powerwindow_boolean_T
|
||||
powerwindow_debounce_Driver_DRV_U_Down_Input_DRV[powerwindow_input_length];
|
||||
powerwindow_boolean_T powerwindow_debounce_Driver_Front_U_Up_Input_Front
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T powerwindow_debounce_Driver_Front_U_Down_Input_Front
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T powerwindow_debounce_Driver_BackL_U_Up_Input_BackL
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T powerwindow_debounce_Driver_BackL_U_Down_Input_BackL
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T powerwindow_debounce_Driver_BackR_U_Up_Input_BackR
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T powerwindow_debounce_Driver_BackR_U_Down_Input_BackR
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Input_DRV
|
||||
[powerwindow_input_length];
|
||||
powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_Input_DRV
|
||||
[powerwindow_input_length];
|
||||
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_Driver_DRV_U_Up_Input_DRV_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_Driver_DRV_U_Down_Input_DRV_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_Driver_Front_U_Up_Input_Front_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_Driver_Front_U_Down_Input_Front_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_Driver_BackL_U_Up_Input_BackL_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_Driver_BackL_U_Down_Input_BackL_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_Driver_BackR_U_Up_Input_BackR_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_Driver_BackR_U_Down_Input_BackR_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_DRV_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_uint8_T
|
||||
powerwindow_powerwindow_control_U_currentsense_DRV_Array
|
||||
[powerwindow_input_length];
|
||||
|
||||
powerwindow_boolean_T powerwindow_controlexclusion_U_Up_DRV_Input_Front
|
||||
[powerwindow_input_length]; /* Here applied a push-down button, the signal
|
||||
is high when the button is not pressed. */
|
||||
powerwindow_boolean_T powerwindow_controlexclusion_U_Down_DRV_Input_Front
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T powerwindow_debounce_passenger_Front_U_Up_Input_Front
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T powerwindow_debounce_passenger_Front_U_Down_Input_Front
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Input_Front
|
||||
[powerwindow_input_length];
|
||||
powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_Input_Front
|
||||
[powerwindow_input_length];
|
||||
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_passenger_Front_U_Up_Front_Array
|
||||
[powerwindow_input_length]; /* Here applied a push-down button, the
|
||||
signal is high when the button is not
|
||||
pressed. */
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_passenger_Front_U_Down_Front_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Front_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_uint8_T
|
||||
powerwindow_powerwindow_control_U_currentsense_Front_Array
|
||||
[powerwindow_input_length];
|
||||
|
||||
powerwindow_boolean_T powerwindow_controlexclusion_U_Up_DRV_Input_BackL
|
||||
[powerwindow_input_length]; /* Here applied a push-down button, the signal
|
||||
is high when the button is not pressed. */
|
||||
powerwindow_boolean_T powerwindow_controlexclusion_U_Down_DRV_Input_BackL
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T powerwindow_debounce_passenger_BackL_U_Up_Input_BackL
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T powerwindow_debounce_passenger_BackL_U_Down_Input_BackL
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackL
|
||||
[powerwindow_input_length];
|
||||
powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_Input_BackL
|
||||
[powerwindow_input_length];
|
||||
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_passenger_BackL_U_Up_BackL_Array
|
||||
[powerwindow_input_length]; /* Here applied a push-down button, the
|
||||
signal is high when the button is not
|
||||
pressed. */
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_passenger_BackL_U_Down_BackL_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_BackL_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_uint8_T
|
||||
powerwindow_powerwindow_control_U_currentsense_BackL_Array
|
||||
[powerwindow_input_length];
|
||||
|
||||
powerwindow_boolean_T powerwindow_controlexclusion_U_Up_DRV_Input_BackR
|
||||
[powerwindow_input_length]; /* Here applied a push-down button, the signal
|
||||
is high when the button is not pressed. */
|
||||
powerwindow_boolean_T powerwindow_controlexclusion_U_Down_DRV_Input_BackR
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T powerwindow_debounce_passenger_BackR_U_Up_Input_BackR
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T powerwindow_debounce_passenger_BackR_U_Down_Input_BackR
|
||||
[powerwindow_input_length];
|
||||
powerwindow_boolean_T
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackR
|
||||
[powerwindow_input_length];
|
||||
powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_Input_BackR
|
||||
[powerwindow_input_length];
|
||||
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_passenger_BackR_U_Up_BackR_Array
|
||||
[powerwindow_input_length]; /* Here applied a push-down button, the
|
||||
signal is high when the button is not
|
||||
pressed. */
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_debounce_passenger_BackR_U_Down_BackR_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_boolean_T
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_BackR_Array
|
||||
[powerwindow_input_length];
|
||||
extern powerwindow_uint8_T
|
||||
powerwindow_powerwindow_control_U_currentsense_BackR_Array
|
||||
[powerwindow_input_length];
|
||||
|
||||
int powerwindow_main_inputcyclecounter;
|
||||
|
||||
/*
|
||||
Initialization- and return-value-related functions
|
||||
*/
|
||||
void
|
||||
powerwindow_init_DRV(int i) {
|
||||
powerwindow_PW_Control_DRV_U.In1 =
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Input_DRV
|
||||
[i]; /* The when the window reaches the end of the range, the
|
||||
endofdetectionrange changes to 0. */
|
||||
powerwindow_PW_Control_DRV_U.In3 =
|
||||
powerwindow_powerwindow_control_U_currentsense_Input_DRV
|
||||
[i]; /* When the currentsense is higher than 92 (based on
|
||||
experiments), one object is stuck between the window and the
|
||||
frame. Pinch is set to True.*/
|
||||
|
||||
powerwindow_PW_Control_DRV_U.In2 =
|
||||
powerwindow_debounce_Driver_DRV_U_Up_Input_DRV
|
||||
[i]; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lift the window. */
|
||||
powerwindow_PW_Control_DRV_U.In4 =
|
||||
powerwindow_debounce_Driver_DRV_U_Down_Input_DRV
|
||||
[i]; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lift the window. */
|
||||
|
||||
powerwindow_PW_Control_DRV_U.In5 =
|
||||
powerwindow_debounce_Driver_Front_U_Up_Input_Front
|
||||
[i]; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lift the window. */
|
||||
powerwindow_PW_Control_DRV_U.In6 =
|
||||
powerwindow_debounce_Driver_Front_U_Down_Input_Front
|
||||
[i]; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lift the window. */
|
||||
|
||||
powerwindow_PW_Control_DRV_U.In9 =
|
||||
powerwindow_debounce_Driver_BackL_U_Up_Input_BackL
|
||||
[i]; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lift the window. */
|
||||
powerwindow_PW_Control_DRV_U.In10 =
|
||||
powerwindow_debounce_Driver_BackL_U_Down_Input_BackL
|
||||
[i]; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lift the window. */
|
||||
|
||||
powerwindow_PW_Control_DRV_U.In7 =
|
||||
powerwindow_debounce_Driver_BackR_U_Up_Input_BackR
|
||||
[i]; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lift the window. */
|
||||
powerwindow_PW_Control_DRV_U.In8 =
|
||||
powerwindow_debounce_Driver_BackR_U_Down_Input_BackR
|
||||
[i]; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lift the window. */
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_init_PSG_Front(int i) {
|
||||
|
||||
powerwindow_PW_Control_PSG_Front_U.Up_DRV =
|
||||
powerwindow_PW_Control_DRV_Y
|
||||
.Out6; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lift the window. */
|
||||
powerwindow_PW_Control_PSG_Front_U.Down_DRV =
|
||||
powerwindow_PW_Control_DRV_Y
|
||||
.Out7; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lower the window. */
|
||||
|
||||
powerwindow_PW_Control_PSG_Front_U.Up_PSG_Front =
|
||||
powerwindow_debounce_passenger_Front_U_Up_Input_Front[i];
|
||||
powerwindow_PW_Control_PSG_Front_U.Down_PSG_Front =
|
||||
powerwindow_debounce_passenger_Front_U_Down_Input_Front
|
||||
[i]; /* '<Root>/Down'. Here applied a push-down button, the signal
|
||||
is high when the button is not pressed. Change to 0 to lower
|
||||
the window. */
|
||||
|
||||
powerwindow_PW_Control_PSG_Front_U.endofdetectionrange =
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Input_Front
|
||||
[i]; /* The when the window reaches the end of the range, the
|
||||
endofdetectionrange changes to 0. */
|
||||
|
||||
powerwindow_PW_Control_PSG_Front_U.currentsense =
|
||||
powerwindow_powerwindow_control_U_currentsense_Input_Front
|
||||
[i]; /* When the currentsense is higher than 92 (based on
|
||||
experiments), one object is stuck between the window and the
|
||||
frame. Pinch is set to True.*/
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_init_PSG_BackL(int i) {
|
||||
|
||||
powerwindow_PW_Control_PSG_BackL_U.Up_DRV =
|
||||
powerwindow_PW_Control_DRV_Y
|
||||
.Out10; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lift the window. */
|
||||
powerwindow_PW_Control_PSG_BackL_U.Down_DRV =
|
||||
powerwindow_PW_Control_DRV_Y
|
||||
.Out11; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lower the window.
|
||||
*/
|
||||
|
||||
powerwindow_PW_Control_PSG_BackL_U.Up_PSG_BackL =
|
||||
powerwindow_debounce_passenger_BackL_U_Up_Input_BackL[i];
|
||||
powerwindow_PW_Control_PSG_BackL_U.Down_PSG_BackL =
|
||||
powerwindow_debounce_passenger_BackL_U_Down_Input_BackL
|
||||
[i]; /* '<Root>/Down'. Here applied a push-down button, the signal
|
||||
is high when the button is not pressed. Change to 0 to lower
|
||||
the window. */
|
||||
|
||||
powerwindow_PW_Control_PSG_BackL_U.endofdetectionrange =
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackL
|
||||
[i]; /* The when the window reaches the end of the range, the
|
||||
endofdetectionrange changes to 0. */
|
||||
|
||||
powerwindow_PW_Control_PSG_BackL_U.currentsense =
|
||||
powerwindow_powerwindow_control_U_currentsense_Input_BackL
|
||||
[i]; /* When the currentsense is higher than 92 (based on
|
||||
experiments), one object is stuck between the window and the
|
||||
frame. Pinch is set to True.*/
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_init_PSG_BackR(int i) {
|
||||
|
||||
powerwindow_PW_Control_PSG_BackR_U.Up_DRV =
|
||||
powerwindow_PW_Control_DRV_Y
|
||||
.Out8; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lift the window. */
|
||||
powerwindow_PW_Control_PSG_BackR_U.Down_DRV =
|
||||
powerwindow_PW_Control_DRV_Y
|
||||
.Out9; /* The debounced control signal from the driver. 1 when the
|
||||
button is not pressed, change to 0 to lower the window. */
|
||||
|
||||
powerwindow_PW_Control_PSG_BackR_U.Up_PSG_BackR =
|
||||
powerwindow_debounce_passenger_BackR_U_Up_Input_BackR[i];
|
||||
powerwindow_PW_Control_PSG_BackR_U.Down_PSG_BackR =
|
||||
powerwindow_debounce_passenger_BackR_U_Down_Input_BackR
|
||||
[i]; /* '<Root>/Down'. Here applied a push-down button, the signal
|
||||
is high when the button is not pressed. Change to 0 to lower
|
||||
the window. */
|
||||
|
||||
powerwindow_PW_Control_PSG_BackR_U.endofdetectionrange =
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackR
|
||||
[i]; /* The when the window reaches the end of the range, the
|
||||
endofdetectionrange changes to 0. */
|
||||
|
||||
powerwindow_PW_Control_PSG_BackR_U.currentsense =
|
||||
powerwindow_powerwindow_control_U_currentsense_Input_BackR
|
||||
[i]; /* When the currentsense is higher than 92 (based on
|
||||
experiments), one object is stuck between the window and the
|
||||
frame. Pinch is set to True.*/
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_input_initialize_DRV(void) {
|
||||
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_Driver_DRV_U_Up_Input_DRV,
|
||||
powerwindow_debounce_Driver_DRV_U_Up_Input_DRV_Array);
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_Driver_DRV_U_Down_Input_DRV,
|
||||
powerwindow_debounce_Driver_DRV_U_Down_Input_DRV_Array);
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_Driver_Front_U_Up_Input_Front,
|
||||
powerwindow_debounce_Driver_Front_U_Up_Input_Front_Array);
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_Driver_Front_U_Down_Input_Front,
|
||||
powerwindow_debounce_Driver_Front_U_Down_Input_Front_Array);
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_Driver_BackL_U_Up_Input_BackL,
|
||||
powerwindow_debounce_Driver_BackL_U_Up_Input_BackL_Array);
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_Driver_BackL_U_Down_Input_BackL,
|
||||
powerwindow_debounce_Driver_BackL_U_Down_Input_BackL_Array);
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_Driver_BackL_U_Down_Input_BackL,
|
||||
powerwindow_debounce_Driver_BackR_U_Up_Input_BackR_Array);
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_Driver_BackR_U_Down_Input_BackR,
|
||||
powerwindow_debounce_Driver_BackR_U_Down_Input_BackR_Array);
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Input_DRV,
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_DRV_Array);
|
||||
powerwindow_Uint8inputarray_initialize(
|
||||
powerwindow_powerwindow_control_U_currentsense_DRV_Array,
|
||||
powerwindow_powerwindow_control_U_currentsense_DRV_Array);
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_input_initialize_PSG_Front(void) {
|
||||
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_passenger_Front_U_Up_Input_Front,
|
||||
powerwindow_debounce_passenger_Front_U_Up_Front_Array);
|
||||
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_passenger_Front_U_Down_Input_Front,
|
||||
powerwindow_debounce_passenger_Front_U_Down_Front_Array);
|
||||
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Input_Front,
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Front_Array);
|
||||
|
||||
powerwindow_Uint8inputarray_initialize(
|
||||
powerwindow_powerwindow_control_U_currentsense_Input_Front,
|
||||
powerwindow_powerwindow_control_U_currentsense_Front_Array);
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_input_initialize_PSG_BackL(void) {
|
||||
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_passenger_BackL_U_Up_Input_BackL,
|
||||
powerwindow_debounce_passenger_BackL_U_Up_BackL_Array);
|
||||
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_passenger_BackL_U_Down_Input_BackL,
|
||||
powerwindow_debounce_passenger_BackL_U_Down_BackL_Array);
|
||||
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackL,
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_BackL_Array);
|
||||
|
||||
powerwindow_Uint8inputarray_initialize(
|
||||
powerwindow_powerwindow_control_U_currentsense_Input_BackL,
|
||||
powerwindow_powerwindow_control_U_currentsense_BackL_Array);
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_input_initialize_PSG_BackR(void) {
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_passenger_BackR_U_Up_Input_BackR,
|
||||
powerwindow_debounce_passenger_BackR_U_Up_BackR_Array);
|
||||
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_debounce_passenger_BackR_U_Down_Input_BackR,
|
||||
powerwindow_debounce_passenger_BackR_U_Down_BackR_Array);
|
||||
|
||||
powerwindow_Booleaninputarray_initialize(
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackR,
|
||||
powerwindow_powerwindow_control_U_endofdetectionrange_BackR_Array);
|
||||
|
||||
powerwindow_Uint8inputarray_initialize(
|
||||
powerwindow_powerwindow_control_U_currentsense_Input_BackR,
|
||||
powerwindow_powerwindow_control_U_currentsense_BackR_Array);
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_Booleaninputarray_initialize(powerwindow_boolean_T *arrayA,
|
||||
powerwindow_boolean_T *arrayB) {
|
||||
|
||||
register int i;
|
||||
__pragma_loopbound(977, 977);
|
||||
for (i = 0; i < powerwindow_input_length; i++)
|
||||
arrayA[i] = arrayB[i];
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_Uint8inputarray_initialize(powerwindow_uint8_T *arrayA,
|
||||
powerwindow_uint8_T *arrayB) {
|
||||
|
||||
register int i;
|
||||
__pragma_loopbound(977, 977);
|
||||
for (i = 0; i < powerwindow_input_length; i++)
|
||||
arrayA[i] = arrayB[i];
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_initialize_DRV(void) {
|
||||
/* Initialize model */
|
||||
powerwindow_PW_Control_DRV_initialize();
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_initialize_PSG_Front(void) {
|
||||
/* Initialize model */
|
||||
powerwindow_PW_Control_PSG_Front_initialize();
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_initialize_PSG_BackL(void) {
|
||||
/* Initialize model */
|
||||
powerwindow_PW_Control_PSG_BackL_initialize();
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_initialize_PSG_BackR(void) {
|
||||
/* Initialize model */
|
||||
powerwindow_PW_Control_PSG_BackR_initialize();
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_return_DRV(void) {
|
||||
/* Terminate model */
|
||||
powerwindow_PW_Control_DRV_terminate();
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_return_PSG_Front(void) {
|
||||
/* Terminate model */
|
||||
powerwindow_PW_Control_PSG_Front_terminate();
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_return_PSG_BackL(void) {
|
||||
/* Terminate model */
|
||||
powerwindow_PW_Control_PSG_BackL_terminate();
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_return_PSG_BackR(void) {
|
||||
/* Terminate model */
|
||||
powerwindow_PW_Control_PSG_BackR_terminate();
|
||||
}
|
||||
|
||||
/*
|
||||
Main functions
|
||||
*/
|
||||
|
||||
/*
|
||||
Associating powerwindow_main with a real-time clock or interrupt service
|
||||
routine is what makes the generated code "real-time". The function
|
||||
powerwindow_main is always associated with the base rate of the model.
|
||||
Subrates are managed by the base rate from inside the generated code.
|
||||
Enabling/disabling interrupts and floating point context switches are target
|
||||
specific. This example code indicates where these should take place relative
|
||||
to executing the generated code step function. Overrun behavior should be
|
||||
tailored to your application needs. This example simply sets an error status
|
||||
in the real-time model and returns from powerwindow_main.
|
||||
*/
|
||||
|
||||
void
|
||||
powerwindow_DRV_main(void) {
|
||||
|
||||
static powerwindow_boolean_T OverrunFlag = 0;
|
||||
|
||||
/* Disable interrupts here */
|
||||
|
||||
/* Check for overrun */
|
||||
if (OverrunFlag) {
|
||||
powerwindow_PW_DRV_rtmSetErrorStatus(powerwindow_PW_Control_DRV_M,
|
||||
"Overrun"); //////////
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
OverrunFlag = true;
|
||||
|
||||
/* Save FPU context here (if necessary) */
|
||||
/* Re-enable timer or interrupt here */
|
||||
/* Set model inputs here */
|
||||
|
||||
powerwindow_PW_Control_DRV_main();
|
||||
|
||||
/* Get model outputs here */
|
||||
|
||||
/* Indicate task complete */
|
||||
OverrunFlag = false;
|
||||
|
||||
/* Disable interrupts here */
|
||||
/* Restore FPU context here (if necessary) */
|
||||
/* Enable interrupts here */
|
||||
}
|
||||
|
||||
/*
|
||||
The example "main" function illustrates what is required by your
|
||||
application code to initialize, execute, and terminate the generated code.
|
||||
Attaching powerwindow_main to a real-time clock is target specific. This
|
||||
example illustates how you do this relative to initializing the model.
|
||||
*/
|
||||
|
||||
void
|
||||
powerwindow_PSG_Front_main(void) {
|
||||
|
||||
static powerwindow_boolean_T OverrunFlag = 0;
|
||||
|
||||
/* Disable interrupts here */
|
||||
|
||||
/* Check for overrun */
|
||||
if (OverrunFlag) {
|
||||
powerwindow_PW_PSG_Front_rtmSetErrorStatus(
|
||||
powerwindow_PW_Control_PSG_Front_M, "Overrun");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
OverrunFlag = true;
|
||||
|
||||
/* Save FPU context here (if necessary) */
|
||||
/* Re-enable timer or interrupt here */
|
||||
/* Set model inputs here */
|
||||
|
||||
powerwindow_PW_Control_PSG_Front_main();
|
||||
|
||||
/* Get model outputs here */
|
||||
|
||||
/* Indicate task complete */
|
||||
OverrunFlag = false;
|
||||
|
||||
/* Disable interrupts here */
|
||||
/* Restore FPU context here (if necessary) */
|
||||
/* Enable interrupts here */
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_PSG_BackL_main(void) {
|
||||
|
||||
static powerwindow_boolean_T OverrunFlag = 0;
|
||||
|
||||
/* Disable interrupts here */
|
||||
|
||||
/* Check for overrun */
|
||||
if (OverrunFlag) {
|
||||
powerwindow_PW_PSG_BackL_rtmSetErrorStatus(
|
||||
powerwindow_PW_Control_PSG_BackL_M, "Overrun");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
OverrunFlag = true;
|
||||
|
||||
/* Save FPU context here (if necessary) */
|
||||
/* Re-enable timer or interrupt here */
|
||||
/* Set model inputs here */
|
||||
|
||||
powerwindow_PW_Control_PSG_BackL_main();
|
||||
|
||||
/* Get model outputs here */
|
||||
|
||||
/* Indicate task complete */
|
||||
OverrunFlag = false;
|
||||
|
||||
/* Disable interrupts here */
|
||||
/* Restore FPU context here (if necessary) */
|
||||
/* Enable interrupts here */
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_PSG_BackR_main(void) {
|
||||
|
||||
static powerwindow_boolean_T OverrunFlag = 0;
|
||||
|
||||
/* Disable interrupts here */
|
||||
|
||||
/* Check for overrun */
|
||||
if (OverrunFlag) {
|
||||
powerwindow_PW_PSG_BackR_rtmSetErrorStatus(
|
||||
powerwindow_PW_Control_PSG_BackR_M, "Overrun");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
OverrunFlag = true;
|
||||
|
||||
/* Save FPU context here (if necessary) */
|
||||
/* Re-enable timer or interrupt here */
|
||||
/* Set model inputs here */
|
||||
|
||||
powerwindow_PW_Control_PSG_BackR_main();
|
||||
|
||||
/* Get model outputs here */
|
||||
|
||||
/* Indicate task complete */
|
||||
OverrunFlag = false;
|
||||
|
||||
/* Disable interrupts here */
|
||||
/* Restore FPU context here (if necessary) */
|
||||
/* Enable interrupts here */
|
||||
}
|
||||
|
||||
void
|
||||
powerwindow_init(void) {
|
||||
powerwindow_initialize_DRV();
|
||||
powerwindow_initialize_PSG_Front();
|
||||
powerwindow_initialize_PSG_BackL();
|
||||
powerwindow_initialize_PSG_BackR();
|
||||
powerwindow_main_inputcyclecounter = 0;
|
||||
}
|
||||
|
||||
__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void
|
||||
powerwindow_main(void) {
|
||||
/* Attach powerwindow_main to a timer or interrupt service routine with
|
||||
period 0.005 seconds (the model's base sample time) here. The
|
||||
call syntax for powerwindow_main is
|
||||
|
||||
powerwindow_main();
|
||||
*/
|
||||
// Task 1: Driver side window
|
||||
|
||||
powerwindow_input_initialize_DRV();
|
||||
powerwindow_input_initialize_PSG_Front();
|
||||
powerwindow_input_initialize_PSG_BackL();
|
||||
powerwindow_input_initialize_PSG_BackR();
|
||||
|
||||
__pragma_loopbound(977, 977);
|
||||
while (powerwindow_main_inputcyclecounter < powerwindow_input_length) {
|
||||
|
||||
powerwindow_init_DRV(powerwindow_main_inputcyclecounter);
|
||||
powerwindow_DRV_main();
|
||||
|
||||
// Task 2: Front passenger side window
|
||||
|
||||
powerwindow_init_PSG_Front(powerwindow_main_inputcyclecounter);
|
||||
powerwindow_PSG_Front_main();
|
||||
|
||||
// Task 3: Back left passenger side window
|
||||
|
||||
powerwindow_init_PSG_BackL(powerwindow_main_inputcyclecounter);
|
||||
powerwindow_PSG_BackL_main();
|
||||
|
||||
// Task 4: Back right passenger side window
|
||||
|
||||
powerwindow_init_PSG_BackR(powerwindow_main_inputcyclecounter);
|
||||
powerwindow_PSG_BackR_main();
|
||||
|
||||
powerwindow_main_inputcyclecounter++;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
powerwindow_return(void) {
|
||||
powerwindow_return_DRV();
|
||||
powerwindow_return_PSG_Front();
|
||||
powerwindow_return_PSG_BackL();
|
||||
powerwindow_return_PSG_BackR();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
__attribute__((noinline)) __attribute__((export_name("main"))) int
|
||||
main(void) {
|
||||
powerwindow_init();
|
||||
powerwindow_main();
|
||||
return powerwindow_return();
|
||||
}
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,23 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow.h
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: headerfile
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow.h
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL ((viod *) 0)
|
||||
#endif
|
||||
@ -0,0 +1,328 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_DRV.c
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: PW_Control_DRV realizes the functionality of driver side
|
||||
powerwindow. It connects the 3 smaller modules together.
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#include "powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h"
|
||||
#include "powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_private.h"
|
||||
#include "wcclib.h"
|
||||
|
||||
/*
|
||||
Forward declaration of functions
|
||||
*/
|
||||
|
||||
void powerwindow_PW_Control_DRV_initialize(void);
|
||||
void powerwindow_PW_Control_DRV_terminate(void);
|
||||
void powerwindow_PW_Control_DRV_main(void);
|
||||
|
||||
/* Block states (auto storage) */
|
||||
powerwindow_D_Work_powerwindow_PW_Control_D powerwindow_PW_Control_DR_DWork;
|
||||
|
||||
/* External inputs (root inport signals with auto storage) */
|
||||
powerwindow_ExternalInputs_powerwindow_PW_C powerwindow_PW_Control_DRV_U;
|
||||
|
||||
/* External outputs (root outports fed by signals with auto storage) */
|
||||
powerwindow_ExternalOutputs_powerwindow_PW_ powerwindow_PW_Control_DRV_Y;
|
||||
|
||||
/* Real-time model */
|
||||
powerwindow_RT_MODEL_PW_Control_DRV powerwindow_PW_Control_DRV_M_;
|
||||
powerwindow_RT_MODEL_PW_Control_DRV *const powerwindow_PW_Control_DRV_M =
|
||||
&powerwindow_PW_Control_DRV_M_;
|
||||
|
||||
/* Model step function */
|
||||
void
|
||||
powerwindow_PW_Control_DRV_main(void) {
|
||||
/* local block i/o variables */
|
||||
powerwindow_boolean_T rtb_Debounce_Up_DRV;
|
||||
powerwindow_boolean_T rtb_Debounce_Down_DRV;
|
||||
|
||||
/* ModelReference: '<S2>/Debounce_Up_DRV' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_DRV_U.In2, &rtb_Debounce_Up_DRV,
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtzce));
|
||||
|
||||
/* ModelReference: '<S2>/Debounce_Down_DRV' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_DRV_U.In4, &rtb_Debounce_Down_DRV,
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtzce));
|
||||
|
||||
/* ModelReference: '<S2>/Debounce_Up_PSG_BackL' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_DRV_U.In9, &powerwindow_PW_Control_DRV_Y.Out10,
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtzce));
|
||||
|
||||
/* ModelReference: '<S2>/Debounce_Down_PSG_BackL' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_DRV_U.In10, &powerwindow_PW_Control_DRV_Y.Out11,
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1
|
||||
.rtzce));
|
||||
|
||||
/* ModelReference: '<S2>/Debounce_Up_PSG_Front' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_DRV_U.In5, &powerwindow_PW_Control_DRV_Y.Out6,
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtzce));
|
||||
|
||||
/* ModelReference: '<S2>/Debounce_Down_PSG_Front' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_DRV_U.In6, &powerwindow_PW_Control_DRV_Y.Out7,
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1
|
||||
.rtzce));
|
||||
|
||||
/* ModelReference: '<S2>/Debounce_Up_PSG_BackR' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_DRV_U.In7, &powerwindow_PW_Control_DRV_Y.Out8,
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtzce));
|
||||
|
||||
/* ModelReference: '<S2>/Debounce_Down_PSG_BackR' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_DRV_U.In8, &powerwindow_PW_Control_DRV_Y.Out9,
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1
|
||||
.rtzce));
|
||||
|
||||
/* ModelReference: '<S1>/PW_DRV' */
|
||||
powerwindow_powerwindow_control_main(
|
||||
&rtb_Debounce_Up_DRV, &rtb_Debounce_Down_DRV,
|
||||
&powerwindow_PW_Control_DRV_U.In1, &powerwindow_PW_Control_DRV_U.In3,
|
||||
&powerwindow_PW_Control_DRV_Y.Out1, &powerwindow_PW_Control_DRV_Y.Out2,
|
||||
&powerwindow_PW_Control_DRV_Y.Out3, &powerwindow_PW_Control_DRV_Y.Out4,
|
||||
&powerwindow_PW_Control_DRV_Y.Out5,
|
||||
&(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtzce));
|
||||
}
|
||||
|
||||
/* Model initialize function */
|
||||
void
|
||||
powerwindow_PW_Control_DRV_initialize(void) {
|
||||
/* Registration code */
|
||||
|
||||
/* states (dwork) */
|
||||
(void) wcclib_memset((void *) &powerwindow_PW_Control_DR_DWork, 0,
|
||||
sizeof(powerwindow_D_Work_powerwindow_PW_Control_D));
|
||||
|
||||
/* external inputs */
|
||||
(void) wcclib_memset((void *) &powerwindow_PW_Control_DRV_U, 0,
|
||||
sizeof(powerwindow_ExternalInputs_powerwindow_PW_C));
|
||||
|
||||
/* external outputs */
|
||||
(void) wcclib_memset((void *) &powerwindow_PW_Control_DRV_Y, 0,
|
||||
sizeof(powerwindow_ExternalOutputs_powerwindow_PW_));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S2>/Debounce_Down_DRV'
|
||||
*/
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_DRV_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_DRV_M),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block:
|
||||
* '<S2>/Debounce_Down_PSG_BackL' */
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_DRV_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_DRV_M),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1
|
||||
.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block:
|
||||
* '<S2>/Debounce_Down_PSG_BackR' */
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_DRV_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_DRV_M),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1
|
||||
.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block:
|
||||
* '<S2>/Debounce_Down_PSG_Front' */
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_DRV_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_DRV_M),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1
|
||||
.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S2>/Debounce_Up_DRV' */
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_DRV_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_DRV_M),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block:
|
||||
* '<S2>/Debounce_Up_PSG_BackL' */
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_DRV_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_DRV_M),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block:
|
||||
* '<S2>/Debounce_Up_PSG_BackR' */
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_DRV_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_DRV_M),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block:
|
||||
* '<S2>/Debounce_Up_PSG_Front' */
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_DRV_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_DRV_M),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S1>/PW_DRV' */
|
||||
powerwindow_powerwindow_control_initialize(
|
||||
powerwindow_PW_DRV_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_DRV_M),
|
||||
&(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtzce));
|
||||
|
||||
/* Start for ModelReference: '<S2>/Debounce_Up_DRV' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S2>/Debounce_Down_DRV' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S2>/Debounce_Up_PSG_BackL' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S2>/Debounce_Down_PSG_BackL' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S2>/Debounce_Up_PSG_Front' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S2>/Debounce_Down_PSG_Front' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S2>/Debounce_Up_PSG_BackR' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S2>/Debounce_Down_PSG_BackR' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S1>/PW_DRV' */
|
||||
powerwindow_powerwindow_control_Start(
|
||||
&(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw));
|
||||
|
||||
/* SystemInitialize for ModelReference: '<S2>/Debounce_Up_DRV' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw));
|
||||
|
||||
/* SystemInitialize for ModelReference: '<S2>/Debounce_Down_DRV' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw));
|
||||
|
||||
/* SystemInitialize for ModelReference: '<S2>/Debounce_Up_PSG_BackL' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw));
|
||||
|
||||
/* SystemInitialize for ModelReference: '<S2>/Debounce_Down_PSG_BackL' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw));
|
||||
|
||||
/* SystemInitialize for ModelReference: '<S2>/Debounce_Up_PSG_Front' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw));
|
||||
|
||||
/* SystemInitialize for ModelReference: '<S2>/Debounce_Down_PSG_Front' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw));
|
||||
|
||||
/* SystemInitialize for ModelReference: '<S2>/Debounce_Up_PSG_BackR' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw));
|
||||
|
||||
/* SystemInitialize for ModelReference: '<S2>/Debounce_Down_PSG_BackR' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw));
|
||||
|
||||
/* SystemInitialize for ModelReference: '<S1>/PW_DRV' */
|
||||
powerwindow_powerwindow_control_Init(
|
||||
&powerwindow_PW_Control_DRV_Y.Out1, &powerwindow_PW_Control_DRV_Y.Out2,
|
||||
&powerwindow_PW_Control_DRV_Y.Out3, &powerwindow_PW_Control_DRV_Y.Out4,
|
||||
&powerwindow_PW_Control_DRV_Y.Out5,
|
||||
&(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw));
|
||||
}
|
||||
|
||||
/* Model terminate function */
|
||||
void
|
||||
powerwindow_PW_Control_DRV_terminate(void) {
|
||||
/* (no terminate code required) */
|
||||
}
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,154 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_DRV.h
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: headerfile
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#ifndef powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_h_
|
||||
#define powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_h_
|
||||
#ifndef powerwindow_PW_Control_DRV_COMMON_INCLUDES_
|
||||
#define powerwindow_PW_Control_DRV_COMMON_INCLUDES_
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h"
|
||||
#endif /* powerwindow_PW_Control_DRV_COMMON_INCLUDES_ */
|
||||
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_types.h"
|
||||
|
||||
/* Shared type includes */
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h"
|
||||
|
||||
/* Child system includes */
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_debounce.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h"
|
||||
|
||||
/* Macros for accessing real-time model data structure */
|
||||
#ifndef powerwindow_PW_DRV_rtmGetErrorStatus
|
||||
#define powerwindow_PW_DRV_rtmGetErrorStatus(rtm) ((rtm)->errorStatus)
|
||||
#endif
|
||||
|
||||
#ifndef powerwindow_PW_DRV_rtmSetErrorStatus
|
||||
#define powerwindow_PW_DRV_rtmSetErrorStatus(rtm, val) \
|
||||
((rtm)->errorStatus = (val))
|
||||
#endif
|
||||
|
||||
#ifndef powerwindow_PW_DRV_rtmGetErrorStatusPointer
|
||||
#define powerwindow_PW_DRV_rtmGetErrorStatusPointer(rtm) \
|
||||
((const powerwindow_char_T **) (&((rtm)->errorStatus)))
|
||||
#endif
|
||||
|
||||
/* Block states (auto storage) for system '<Root>' */
|
||||
typedef struct {
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Up_DRV_DWORK1; /* '<S2>/Debounce_Up_DRV' */
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Down_DRV_DWORK1; /* '<S2>/Debounce_Down_DRV' */
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Up_PSG_BackL_DWORK1; /* '<S2>/Debounce_Up_PSG_BackL' */
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Down_PSG_BackL_DWORK1; /* '<S2>/Debounce_Down_PSG_BackL' */
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Up_PSG_Front_DWORK1; /* '<S2>/Debounce_Up_PSG_Front' */
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Down_PSG_Front_DWORK1; /* '<S2>/Debounce_Down_PSG_Front' */
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Up_PSG_BackR_DWORK1; /* '<S2>/Debounce_Up_PSG_BackR' */
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Down_PSG_BackR_DWORK1; /* '<S2>/Debounce_Down_PSG_BackR' */
|
||||
powerwindow_rtMdlrefDWork_PowerWindow_contr
|
||||
PW_DRV_DWORK1; /* '<S1>/PW_DRV' */
|
||||
} powerwindow_D_Work_powerwindow_PW_Control_D;
|
||||
|
||||
/* External inputs (root inport signals with auto storage) */
|
||||
typedef struct {
|
||||
powerwindow_boolean_T In1; /* '<Root>/In1' */
|
||||
powerwindow_boolean_T In2; /* '<Root>/In2' */
|
||||
powerwindow_uint8_T In3; /* '<Root>/In3' */
|
||||
powerwindow_boolean_T In4; /* '<Root>/In4' */
|
||||
powerwindow_boolean_T In5; /* '<Root>/In5' */
|
||||
powerwindow_boolean_T In6; /* '<Root>/In6' */
|
||||
powerwindow_boolean_T In7; /* '<Root>/In7' */
|
||||
powerwindow_boolean_T In8; /* '<Root>/In8' */
|
||||
powerwindow_boolean_T In9; /* '<Root>/In9' */
|
||||
powerwindow_boolean_T In10; /* '<Root>/In10' */
|
||||
} powerwindow_ExternalInputs_powerwindow_PW_C;
|
||||
|
||||
/* External outputs (root outports fed by signals with auto storage) */
|
||||
typedef struct {
|
||||
powerwindow_boolean_T Out1; /* '<Root>/Out1' */
|
||||
powerwindow_boolean_T Out2; /* '<Root>/Out2' */
|
||||
powerwindow_boolean_T Out3; /* '<Root>/Out3' */
|
||||
powerwindow_boolean_T Out4; /* '<Root>/Out4' */
|
||||
powerwindow_boolean_T Out5; /* '<Root>/Out5' */
|
||||
powerwindow_boolean_T Out6; /* '<Root>/Out6' */
|
||||
powerwindow_boolean_T Out7; /* '<Root>/Out7' */
|
||||
powerwindow_boolean_T Out8; /* '<Root>/Out8' */
|
||||
powerwindow_boolean_T Out9; /* '<Root>/Out9' */
|
||||
powerwindow_boolean_T Out10; /* '<Root>/Out10' */
|
||||
powerwindow_boolean_T Out11; /* '<Root>/Out11' */
|
||||
} powerwindow_ExternalOutputs_powerwindow_PW_;
|
||||
|
||||
struct powerwindow_tag_RTM_PW_Control_DRV {
|
||||
const powerwindow_char_T *volatile errorStatus;
|
||||
};
|
||||
|
||||
/* Block states (auto storage) */
|
||||
extern powerwindow_D_Work_powerwindow_PW_Control_D
|
||||
powerwindow_PW_Control_DR_DWork;
|
||||
|
||||
/* External inputs (root inport signals with auto storage) */
|
||||
extern powerwindow_ExternalInputs_powerwindow_PW_C powerwindow_PW_Control_DRV_U;
|
||||
|
||||
/* External outputs (root outports fed by signals with auto storage) */
|
||||
extern powerwindow_ExternalOutputs_powerwindow_PW_ powerwindow_PW_Control_DRV_Y;
|
||||
|
||||
/* Model entry point functions */
|
||||
void powerwindow_PW_Control_DRV_initialize(void);
|
||||
void powerwindow_PW_Control_DRV_main(void);
|
||||
void powerwindow_PW_Control_DRV_terminate(void);
|
||||
|
||||
/* Real-time Model object */
|
||||
extern powerwindow_RT_MODEL_PW_Control_DRV *const powerwindow_PW_Control_DRV_M;
|
||||
|
||||
/*-
|
||||
The generated code includes comments that allow you to trace directly
|
||||
back to the appropriate location in the model. The basic format
|
||||
is <system>/block_name, where system is the system number (uniquely
|
||||
assigned by Simulink) and block_name is the name of the block.
|
||||
|
||||
Note that this particular code originates from a subsystem build,
|
||||
and has its own system numbers different from the parent model.
|
||||
Refer to the system hierarchy for this subsystem below, and use the
|
||||
MATLAB hilite_system command to trace the generated code back
|
||||
to the parent model. For example,
|
||||
|
||||
hilite_system('PowerWindow/powerwindow_PW_Control_DRV') - opens subsystem
|
||||
PowerWindow/powerwindow_PW_Control_DRV
|
||||
hilite_system('PowerWindow/powerwindow_PW_Control_DRV/Kp') - opens and
|
||||
selects block Kp
|
||||
|
||||
Here is the system hierarchy for this model
|
||||
|
||||
'<Root>' : 'PowerWindow'
|
||||
'<S1>' : 'PowerWindow/powerwindow_PW_Control_DRV'
|
||||
'<S2>' : 'PowerWindow/powerwindow_PW_Control_DRV/Debounce_DRV'
|
||||
*/
|
||||
#endif /* RTW_HEADER_powerwindow_PW_Control_DRV_h_ */
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,31 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_DRV_private.h
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: headerfile
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_private.h
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#ifndef powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_private_h_
|
||||
#define powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_private_h_
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h"
|
||||
#endif /* RTW_HEADER_powerwindow_PW_Control_DRV_private_h_ */
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,34 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_DRV_types.h
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: headerfile
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_types.h
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#ifndef powerwindow_RTW_HEADER_PW_Control_DRV_types_h_
|
||||
#define powerwindow_RTW_HEADER_PW_Control_DRV_types_h_
|
||||
|
||||
/* Forward declaration for rtModel */
|
||||
typedef struct powerwindow_tag_RTM_PW_Control_DRV
|
||||
powerwindow_RT_MODEL_PW_Control_DRV;
|
||||
|
||||
#endif /* RTW_HEADER_PW_Control_DRV_types_h_ */
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,192 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_PSG_BackL.c
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: PW_Control_DRV realizes the functionality of back-left passenger
|
||||
side powerwindow. It connects the 3 smaller modules together.
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h"
|
||||
#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_private.h"
|
||||
#include "wcclib.h"
|
||||
|
||||
/*
|
||||
Forward declaration of functions
|
||||
*/
|
||||
|
||||
void powerwindow_PW_Control_PSG_BackL_initialize(void);
|
||||
void powerwindow_PW_Control_PSG_BackL_terminate(void);
|
||||
void powerwindow_PW_Control_PSG_BackL_main(void);
|
||||
|
||||
/* Block states (auto storage) */
|
||||
powerwindow_D_Work_PW_Control_PSG_BackL powerwindow_PW_Control_PSG_BackL_DWork;
|
||||
|
||||
/* External inputs (root inport signals with auto storage) */
|
||||
powerwindow_ExternalInputs_PW_Control_PSG_BackL
|
||||
powerwindow_PW_Control_PSG_BackL_U;
|
||||
|
||||
/* External outputs (root outports fed by signals with auto storage) */
|
||||
powerwindow_ExternalOutputs_PW_Control_PSG_BackL
|
||||
powerwindow_PW_Control_PSG_BackL_Y;
|
||||
|
||||
/* Real-time model */
|
||||
powerwindow_RT_MODEL_PW_Control_PSG_BackL powerwindow_PW_Control_PSG_BackL_M_;
|
||||
powerwindow_RT_MODEL_PW_Control_PSG_BackL *const
|
||||
powerwindow_PW_Control_PSG_BackL_M = &powerwindow_PW_Control_PSG_BackL_M_;
|
||||
|
||||
/* Model step function */
|
||||
void
|
||||
powerwindow_PW_Control_PSG_BackL_main(void) {
|
||||
/* local block i/o variables */
|
||||
powerwindow_boolean_T rtb_debounce_Up;
|
||||
powerwindow_boolean_T rtb_debounce_Down;
|
||||
powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackL_o1;
|
||||
powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackL_o2;
|
||||
|
||||
/* ModelReference: '<S2>/debounce_Up' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_PSG_BackL_U.Up_PSG_BackL, &rtb_debounce_Up,
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtzce));
|
||||
|
||||
/* ModelReference: '<S2>/debounce_Down' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_PSG_BackL_U.Down_PSG_BackL, &rtb_debounce_Down,
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtzce));
|
||||
|
||||
/* ModelReference: '<S1>/ControlEx_PSG_BackL' */
|
||||
powerwindow_controlexclusion_main(
|
||||
&powerwindow_PW_Control_PSG_BackL_U.Up_DRV,
|
||||
&powerwindow_PW_Control_PSG_BackL_U.Down_DRV, &rtb_debounce_Up,
|
||||
&rtb_debounce_Down, &powerwindow_rtb_ControlEx_PSG_BackL_o1,
|
||||
&powerwindow_rtb_ControlEx_PSG_BackL_o2);
|
||||
|
||||
/* ModelReference: '<S1>/PW_PSG_BackL' */
|
||||
powerwindow_powerwindow_control_main(
|
||||
&powerwindow_rtb_ControlEx_PSG_BackL_o1,
|
||||
&powerwindow_rtb_ControlEx_PSG_BackL_o2,
|
||||
&powerwindow_PW_Control_PSG_BackL_U.endofdetectionrange,
|
||||
&powerwindow_PW_Control_PSG_BackL_U.currentsense,
|
||||
&powerwindow_PW_Control_PSG_BackL_Y.window_up,
|
||||
&powerwindow_PW_Control_PSG_BackL_Y.window_down,
|
||||
&powerwindow_PW_Control_PSG_BackL_Y.overcurrent,
|
||||
&powerwindow_PW_Control_PSG_BackL_Y.pinch,
|
||||
&powerwindow_PW_Control_PSG_BackL_Y.wake,
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtzce));
|
||||
}
|
||||
|
||||
/* Model initialize function */
|
||||
void
|
||||
powerwindow_PW_Control_PSG_BackL_initialize(void) {
|
||||
/* Registration code */
|
||||
|
||||
/* initialize error status */
|
||||
powerwindow_PW_PSG_BackL_rtmSetErrorStatus(
|
||||
powerwindow_PW_Control_PSG_BackL_M, (NULL));
|
||||
|
||||
/* states (dwork) */
|
||||
(void) wcclib_memset((void *) &powerwindow_PW_Control_PSG_BackL_DWork, 0,
|
||||
sizeof(powerwindow_D_Work_PW_Control_PSG_BackL));
|
||||
|
||||
/* external inputs */
|
||||
(void) wcclib_memset(
|
||||
(void *) &powerwindow_PW_Control_PSG_BackL_U, 0,
|
||||
sizeof(powerwindow_ExternalInputs_PW_Control_PSG_BackL));
|
||||
|
||||
/* external outputs */
|
||||
(void) wcclib_memset(
|
||||
(void *) &powerwindow_PW_Control_PSG_BackL_Y, 0,
|
||||
sizeof(powerwindow_ExternalOutputs_PW_Control_PSG_BackL));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S1>/ControlEx_PSG_BackL'
|
||||
*/
|
||||
powerwindow_controlexclusion_initialize();
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S2>/debounce_Down' */
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_PSG_BackL_M),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S2>/debounce_Up' */
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_PSG_BackL_M),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S1>/PW_PSG_BackL' */
|
||||
powerwindow_powerwindow_control_initialize(
|
||||
powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_PSG_BackL_M),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtzce));
|
||||
|
||||
/* Start for ModelReference: '<S2>/debounce_Up' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S2>/debounce_Down' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S1>/PW_PSG_BackL' */
|
||||
powerwindow_powerwindow_control_Start(
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw));
|
||||
|
||||
/* InitializeConditions for ModelReference: '<S2>/debounce_Up' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw));
|
||||
|
||||
/* InitializeConditions for ModelReference: '<S2>/debounce_Down' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw));
|
||||
|
||||
/* InitializeConditions for ModelReference: '<S1>/PW_PSG_BackL' */
|
||||
powerwindow_powerwindow_control_Init(
|
||||
&powerwindow_PW_Control_PSG_BackL_Y.window_up,
|
||||
&powerwindow_PW_Control_PSG_BackL_Y.window_down,
|
||||
&powerwindow_PW_Control_PSG_BackL_Y.overcurrent,
|
||||
&powerwindow_PW_Control_PSG_BackL_Y.pinch,
|
||||
&powerwindow_PW_Control_PSG_BackL_Y.wake,
|
||||
&(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw));
|
||||
}
|
||||
|
||||
/* Model terminate function */
|
||||
void
|
||||
powerwindow_PW_Control_PSG_BackL_terminate(void) {
|
||||
/* (no terminate code required) */
|
||||
}
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,139 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_PSG_BackL.h
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: headerfile
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackL_h_
|
||||
#define powerwindow_RTW_HEADER_PW_Control_PSG_BackL_h_
|
||||
#ifndef powerwindow_PW_Control_PSG_BackL_COMMON_INCLUDES_
|
||||
#define powerwindow_PW_Control_PSG_BackL_COMMON_INCLUDES_
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h"
|
||||
#endif /* powerwindow_PW_Control_PSG_BackL_COMMON_INCLUDES_*/
|
||||
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_types.h"
|
||||
|
||||
/* Shared type includes */
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h"
|
||||
|
||||
/* Child system includes */
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_debounce.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h"
|
||||
|
||||
/* Macros for accessing real-time model data structure */
|
||||
#ifndef powerwindow_PW_PSG_BackL_BackL_rtmGetErrorStatus
|
||||
#define powerwindow_PW_PSG_BackL_rtmGetErrorStatus(rtm) ((rtm)->errorStatus)
|
||||
#endif
|
||||
|
||||
#ifndef powerwindow_PW_PSG_BackL_rtmSetErrorStatus
|
||||
#define powerwindow_PW_PSG_BackL_rtmSetErrorStatus(rtm, val) \
|
||||
((rtm)->errorStatus = (val))
|
||||
#endif
|
||||
|
||||
#ifndef powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer
|
||||
#define powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer(rtm) \
|
||||
((const powerwindow_char_T **) (&((rtm)->errorStatus)))
|
||||
#endif
|
||||
|
||||
/* Block states (auto storage) for system '<Root>' */
|
||||
typedef struct {
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Up_DWORK1; /* '<S2>/Debounce_Up' */
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Down_DWORK1; /* '<S2>/Debounce_Down' */
|
||||
powerwindow_rtMdlrefDWork_PowerWindow_contr
|
||||
PW_PSG_BackL_DWORK1; /* '<S1>/PW_PSG_BackL' */
|
||||
} powerwindow_D_Work_PW_Control_PSG_BackL;
|
||||
|
||||
/* External inputs (root inport signals with auto storage) */
|
||||
typedef struct {
|
||||
powerwindow_boolean_T Up_DRV; /* '<Root>/Up_DRV' */
|
||||
powerwindow_boolean_T Down_DRV; /* '<Root>/Down_DRV' */
|
||||
powerwindow_boolean_T
|
||||
endofdetectionrange; /* '<Root>/end of detection range' */
|
||||
powerwindow_uint8_T currentsense; /* '<Root>/current sense' */
|
||||
powerwindow_boolean_T Up_PSG_BackL; /* '<Root>/Up_PSG_BackL' */
|
||||
powerwindow_boolean_T Down_PSG_BackL; /* '<Root>/Down_PSG_BackL' */
|
||||
} powerwindow_ExternalInputs_PW_Control_PSG_BackL;
|
||||
|
||||
/* External outputs (root outports fed by signals with auto storage) */
|
||||
typedef struct {
|
||||
powerwindow_boolean_T window_up; /* '<Root>/window_up' */
|
||||
powerwindow_boolean_T window_down; /* '<Root>/window_down' */
|
||||
powerwindow_boolean_T overcurrent; /* '<Root>/overcurrent' */
|
||||
powerwindow_boolean_T pinch; /* '<Root>/pinch' */
|
||||
powerwindow_boolean_T wake; /* '<Root>/wake' */
|
||||
} powerwindow_ExternalOutputs_PW_Control_PSG_BackL;
|
||||
|
||||
/* Real-time Model Data Structure */
|
||||
struct powerwindow_tag_RTM_PW_Control_PSG_BackL {
|
||||
const powerwindow_char_T *volatile errorStatus;
|
||||
};
|
||||
|
||||
/* Block states (auto storage) */
|
||||
extern powerwindow_D_Work_PW_Control_PSG_BackL
|
||||
powerwindow_PW_Control_PSG_BackL_DWork;
|
||||
|
||||
/* External inputs (root inport signals with auto storage) */
|
||||
extern powerwindow_ExternalInputs_PW_Control_PSG_BackL
|
||||
powerwindow_PW_Control_PSG_BackL_U;
|
||||
|
||||
/* External outputs (root outports fed by signals with auto storage) */
|
||||
extern powerwindow_ExternalOutputs_PW_Control_PSG_BackL
|
||||
powerwindow_PW_Control_PSG_BackL_Y;
|
||||
|
||||
/* Model entry point functions */
|
||||
void powerwindow_PW_Control_PSG_BackL_initialize(void);
|
||||
void powerwindow_PW_Control_PSG_BackL_main(void);
|
||||
void powerwindow_PW_Control_PSG_BackL_terminate(void);
|
||||
|
||||
/* Real-time Model object */
|
||||
extern powerwindow_RT_MODEL_PW_Control_PSG_BackL
|
||||
*const powerwindow_PW_Control_PSG_BackL_M;
|
||||
|
||||
/*-
|
||||
The generated code includes comments that allow you to trace directly
|
||||
back to the appropriate location in the model. The basic format
|
||||
is <system>/block_name, where system is the system number (uniquely
|
||||
assigned by Simulink) and block_name is the name of the block.
|
||||
|
||||
Note that this particular code originates from a subsystem build,
|
||||
and has its own system numbers different from the parent model.
|
||||
Refer to the system hierarchy for this subsystem below, and use the
|
||||
MATLAB hilite_system command to trace the generated code back
|
||||
to the parent model. For example,
|
||||
|
||||
hilite_system('PowerWindow/PW_Control_PSG_BackL') - opens subsystem
|
||||
PowerWindow/PW_Control_PSG_BackL
|
||||
hilite_system('PowerWindow/PW_Control_PSG_BackL/Kp') - opens and selects
|
||||
block Kp
|
||||
|
||||
Here is the system hierarchy for this model
|
||||
|
||||
'<Root>' : 'PowerWindow'
|
||||
'<S1>' : 'PowerWindow/PW_Control_PSG_BackL'
|
||||
'<S2>' : 'PowerWindow/PW_Control_PSG_BackL/Debounce_PSG_BackL'
|
||||
*/
|
||||
#endif /* RTW_HEADER_PW_Control_PSG_BackL_h_*/
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,31 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_PSG_BackL_private.h
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: headerfile
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_private.h
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackL_private_h_
|
||||
#define powerwindow_RTW_HEADER_PW_Control_PSG_BackL_private_h_
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h"
|
||||
#endif /* RTW_HEADER_PW_Control_PSG_BackL_private_h_ */
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,34 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_PSG_BackL_types.h
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: headerfile
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_types.h
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackL_types_h_
|
||||
#define powerwindow_RTW_HEADER_PW_Control_PSG_BackL_types_h_
|
||||
|
||||
/* Forward declaration for rtModel */
|
||||
typedef struct powerwindow_tag_RTM_PW_Control_PSG_BackL
|
||||
powerwindow_RT_MODEL_PW_Control_PSG_BackL;
|
||||
|
||||
#endif /* RTW_HEADER_PW_Control_PSG_BackL_types_h_ */
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,192 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_PSG_BackR.c
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: PW_Control_DRV realizes the functionality of back-right passenger
|
||||
side powerwindow. It connects the 3 smaller modules together.
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_PW_Control_PSG_BackR.c
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h"
|
||||
#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_private.h"
|
||||
#include "wcclib.h"
|
||||
|
||||
/*
|
||||
Forward declaration of functions
|
||||
*/
|
||||
|
||||
void powerwindow_PW_Control_PSG_BackR_initialize(void);
|
||||
void powerwindow_PW_Control_PSG_BackR_terminate(void);
|
||||
void powerwindow_PW_Control_PSG_BackR_main(void);
|
||||
|
||||
/* Block states (auto storage) */
|
||||
powerwindow_D_Work_PW_Control_PSG_BackR powerwindow_PW_Control_PSG_BackR_DWork;
|
||||
|
||||
/* External inputs (root inport signals with auto storage) */
|
||||
powerwindow_ExternalInputs_PW_Control_PSG_BackR
|
||||
powerwindow_PW_Control_PSG_BackR_U;
|
||||
|
||||
/* External outputs (root outports fed by signals with auto storage) */
|
||||
powerwindow_ExternalOutputs_PW_Control_PSG_BackR
|
||||
powerwindow_PW_Control_PSG_BackR_Y;
|
||||
|
||||
/* Real-time model */
|
||||
powerwindow_RT_MODEL_PW_Control_PSG_BackR powerwindow_PW_Control_PSG_BackR_M_;
|
||||
powerwindow_RT_MODEL_PW_Control_PSG_BackR *const
|
||||
powerwindow_PW_Control_PSG_BackR_M = &powerwindow_PW_Control_PSG_BackR_M_;
|
||||
|
||||
/* Model step function */
|
||||
void
|
||||
powerwindow_PW_Control_PSG_BackR_main(void) {
|
||||
/* local block i/o variables */
|
||||
powerwindow_boolean_T rtb_debounce_Up;
|
||||
powerwindow_boolean_T rtb_debounce_Down;
|
||||
powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackR_o1;
|
||||
powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackR_o2;
|
||||
|
||||
/* ModelReference: '<S2>/debounce_Up' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_PSG_BackR_U.Up_PSG_BackR, &rtb_debounce_Up,
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtzce));
|
||||
|
||||
/* ModelReference: '<S2>/debounce_Down' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_PSG_BackR_U.Down_PSG_BackR, &rtb_debounce_Down,
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtzce));
|
||||
|
||||
/* ModelReference: '<S1>/ControlEx_PSG_BackR' */
|
||||
powerwindow_controlexclusion_main(
|
||||
&powerwindow_PW_Control_PSG_BackR_U.Up_DRV,
|
||||
&powerwindow_PW_Control_PSG_BackR_U.Down_DRV, &rtb_debounce_Up,
|
||||
&rtb_debounce_Down, &powerwindow_rtb_ControlEx_PSG_BackR_o1,
|
||||
&powerwindow_rtb_ControlEx_PSG_BackR_o2);
|
||||
|
||||
/* ModelReference: '<S1>/PW_PSG_BackR' */
|
||||
powerwindow_powerwindow_control_main(
|
||||
&powerwindow_rtb_ControlEx_PSG_BackR_o1,
|
||||
&powerwindow_rtb_ControlEx_PSG_BackR_o2,
|
||||
&powerwindow_PW_Control_PSG_BackR_U.endofdetectionrange,
|
||||
&powerwindow_PW_Control_PSG_BackR_U.currentsense,
|
||||
&powerwindow_PW_Control_PSG_BackR_Y.window_up,
|
||||
&powerwindow_PW_Control_PSG_BackR_Y.window_down,
|
||||
&powerwindow_PW_Control_PSG_BackR_Y.overcurrent,
|
||||
&powerwindow_PW_Control_PSG_BackR_Y.pinch,
|
||||
&powerwindow_PW_Control_PSG_BackR_Y.wake,
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtzce));
|
||||
}
|
||||
|
||||
/* Model initialize function */
|
||||
void
|
||||
powerwindow_PW_Control_PSG_BackR_initialize(void) {
|
||||
/* Registration code */
|
||||
|
||||
/* initialize error status */
|
||||
powerwindow_PW_PSG_BackR_rtmSetErrorStatus(
|
||||
powerwindow_PW_Control_PSG_BackR_M, (NULL));
|
||||
|
||||
/* states (dwork) */
|
||||
(void) wcclib_memset((void *) &powerwindow_PW_Control_PSG_BackR_DWork, 0,
|
||||
sizeof(powerwindow_D_Work_PW_Control_PSG_BackR));
|
||||
|
||||
/* external inputs */
|
||||
(void) wcclib_memset(
|
||||
(void *) &powerwindow_PW_Control_PSG_BackR_U, 0,
|
||||
sizeof(powerwindow_ExternalInputs_PW_Control_PSG_BackR));
|
||||
|
||||
/* external outputs */
|
||||
(void) wcclib_memset(
|
||||
(void *) &powerwindow_PW_Control_PSG_BackR_Y, 0,
|
||||
sizeof(powerwindow_ExternalOutputs_PW_Control_PSG_BackR));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S1>/ControlEx_PSG_BackR'
|
||||
*/
|
||||
powerwindow_controlexclusion_initialize();
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S2>/debounce_Down' */
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_PSG_BackR_M),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S2>/debounce_Up' */
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_PSG_BackR_M),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S1>/PW_PSG_BackR' */
|
||||
powerwindow_powerwindow_control_initialize(
|
||||
powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_PSG_BackR_M),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtzce));
|
||||
|
||||
/* Start for ModelReference: '<S2>/debounce_Up' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S2>/debounce_Down' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S1>/PW_PSG_BackR' */
|
||||
powerwindow_powerwindow_control_Start(
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw));
|
||||
|
||||
/* InitializeConditions for ModelReference: '<S2>/debounce_Up' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw));
|
||||
|
||||
/* InitializeConditions for ModelReference: '<S2>/debounce_Down' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw));
|
||||
|
||||
/* InitializeConditions for ModelReference: '<S1>/PW_PSG_BackR' */
|
||||
powerwindow_powerwindow_control_Init(
|
||||
&powerwindow_PW_Control_PSG_BackR_Y.window_up,
|
||||
&powerwindow_PW_Control_PSG_BackR_Y.window_down,
|
||||
&powerwindow_PW_Control_PSG_BackR_Y.overcurrent,
|
||||
&powerwindow_PW_Control_PSG_BackR_Y.pinch,
|
||||
&powerwindow_PW_Control_PSG_BackR_Y.wake,
|
||||
&(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw));
|
||||
}
|
||||
|
||||
/* Model terminate function */
|
||||
void
|
||||
powerwindow_PW_Control_PSG_BackR_terminate(void) {
|
||||
/* (no terminate code required) */
|
||||
}
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,139 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_PSG_BackR.h
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: headerfile
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackR_h_
|
||||
#define powerwindow_RTW_HEADER_PW_Control_PSG_BackR_h_
|
||||
#ifndef powerwindow_PW_Control_PSG_BackR_COMMON_INCLUDES_
|
||||
#define powerwindow_PW_Control_PSG_BackR_COMMON_INCLUDES_
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h"
|
||||
#endif /* powerwindow_PW_Control_PSG_BackR_COMMON_INCLUDES_*/
|
||||
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_types.h"
|
||||
|
||||
/* Shared type includes */
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h"
|
||||
|
||||
/* Child system includes */
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_debounce.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h"
|
||||
|
||||
/* Macros for accessing real-time model data structure */
|
||||
#ifndef powerwindow_PW_PSG_BackR_rtmGetErrorStatus
|
||||
#define powerwindow_PW_PSG_BackR_rtmGetErrorStatus(rtm) ((rtm)->errorStatus)
|
||||
#endif
|
||||
|
||||
#ifndef powerwindow_PW_PSG_BackR_rtmSetErrorStatus
|
||||
#define powerwindow_PW_PSG_BackR_rtmSetErrorStatus(rtm, val) \
|
||||
((rtm)->errorStatus = (val))
|
||||
#endif
|
||||
|
||||
#ifndef powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer
|
||||
#define powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer(rtm) \
|
||||
((const powerwindow_char_T **) (&((rtm)->errorStatus)))
|
||||
#endif
|
||||
|
||||
/* Block states (auto storage) for system '<Root>' */
|
||||
typedef struct {
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Up_DWORK1; /* '<S2>/Debounce_Up' */
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Down_DWORK1; /* '<S2>/Debounce_Down' */
|
||||
powerwindow_rtMdlrefDWork_PowerWindow_contr
|
||||
PW_PSG_BackR_DWORK1; /* '<S1>/PW_PSG_BackR' */
|
||||
} powerwindow_D_Work_PW_Control_PSG_BackR;
|
||||
|
||||
/* External inputs (root inport signals with auto storage) */
|
||||
typedef struct {
|
||||
powerwindow_boolean_T Up_DRV; /* '<Root>/Up_DRV' */
|
||||
powerwindow_boolean_T Down_DRV; /* '<Root>/Down_DRV' */
|
||||
powerwindow_boolean_T
|
||||
endofdetectionrange; /* '<Root>/end of detection range' */
|
||||
powerwindow_uint8_T currentsense; /* '<Root>/current sense' */
|
||||
powerwindow_boolean_T Up_PSG_BackR; /* '<Root>/Up_PSG_BackR' */
|
||||
powerwindow_boolean_T Down_PSG_BackR; /* '<Root>/Down_PSG_BackR' */
|
||||
} powerwindow_ExternalInputs_PW_Control_PSG_BackR;
|
||||
|
||||
/* External outputs (root outports fed by signals with auto storage) */
|
||||
typedef struct {
|
||||
powerwindow_boolean_T window_up; /* '<Root>/window_up' */
|
||||
powerwindow_boolean_T window_down; /* '<Root>/window_down' */
|
||||
powerwindow_boolean_T overcurrent; /* '<Root>/overcurrent' */
|
||||
powerwindow_boolean_T pinch; /* '<Root>/pinch' */
|
||||
powerwindow_boolean_T wake; /* '<Root>/wake' */
|
||||
} powerwindow_ExternalOutputs_PW_Control_PSG_BackR;
|
||||
|
||||
/* Real-time Model Data Structure */
|
||||
struct powerwindow_tag_RTM_PW_Control_PSG_BackR {
|
||||
const powerwindow_char_T *volatile errorStatus;
|
||||
};
|
||||
|
||||
/* Block states (auto storage) */
|
||||
extern powerwindow_D_Work_PW_Control_PSG_BackR
|
||||
powerwindow_PW_Control_PSG_BackR_DWork;
|
||||
|
||||
/* External inputs (root inport signals with auto storage) */
|
||||
extern powerwindow_ExternalInputs_PW_Control_PSG_BackR
|
||||
powerwindow_PW_Control_PSG_BackR_U;
|
||||
|
||||
/* External outputs (root outports fed by signals with auto storage) */
|
||||
extern powerwindow_ExternalOutputs_PW_Control_PSG_BackR
|
||||
powerwindow_PW_Control_PSG_BackR_Y;
|
||||
|
||||
/* Model entry point functions */
|
||||
void powerwindow_PW_Control_PSG_BackR_initialize(void);
|
||||
void powerwindow_PW_Control_PSG_BackR_main(void);
|
||||
void powerwindow_PW_Control_PSG_BackR_terminate(void);
|
||||
|
||||
/* Real-time Model object */
|
||||
extern powerwindow_RT_MODEL_PW_Control_PSG_BackR
|
||||
*const powerwindow_PW_Control_PSG_BackR_M;
|
||||
|
||||
/*-
|
||||
The generated code includes comments that allow you to trace directly
|
||||
back to the appropriate location in the model. The basic format
|
||||
is <system>/block_name, where system is the system number (uniquely
|
||||
assigned by Simulink) and block_name is the name of the block.
|
||||
|
||||
Note that this particular code originates from a subsystem build,
|
||||
and has its own system numbers different from the parent model.
|
||||
Refer to the system hierarchy for this subsystem below, and use the
|
||||
MATLAB hilite_system command to trace the generated code back
|
||||
to the parent model. For example,
|
||||
|
||||
hilite_system('PowerWindow/PW_Control_PSG_BackR') - opens subsystem
|
||||
PowerWindow/PW_Control_PSG_BackR
|
||||
hilite_system('PowerWindow/PW_Control_PSG_BackR/Kp') - opens and selects
|
||||
block Kp
|
||||
|
||||
Here is the system hierarchy for this model
|
||||
|
||||
'<Root>' : 'PowerWindow'
|
||||
'<S1>' : 'PowerWindow/PW_Control_PSG_BackR'
|
||||
'<S2>' : 'PowerWindow/PW_Control_PSG_BackR/Debounce_PSG'
|
||||
*/
|
||||
#endif /* RTW_HEADER_PW_Control_PSG_h_*/
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,31 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_PSG_BackR_private.h
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: headerfile
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_private.h
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackR_private_h_
|
||||
#define powerwindow_RTW_HEADER_PW_Control_PSG_BackR_private_h_
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h"
|
||||
#endif /* RTW_HEADER_PW_Control_PSG_BackR_private_h_ */
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,34 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_PSG_BackR_tyoes.h
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: headerfile
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_types.h
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackR_types_h_
|
||||
#define powerwindow_RTW_HEADER_PW_Control_PSG_BackR_types_h_
|
||||
|
||||
/* Forward declaration for rtModel */
|
||||
typedef struct powerwindow_tag_RTM_PW_Control_PSG_BackR
|
||||
powerwindow_RT_MODEL_PW_Control_PSG_BackR;
|
||||
|
||||
#endif /* RTW_HEADER_PW_Control_PSG_BackR_types_h_ */
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,198 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_PSG_Front.c
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: PW_Control_DRV realizes the functionality of front passenger side
|
||||
powerwindow. It connects the 3 smaller modules together.
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h"
|
||||
#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_private.h"
|
||||
#include "wcclib.h"
|
||||
|
||||
/*
|
||||
Forward declaration of functions
|
||||
*/
|
||||
|
||||
void powerwindow_PW_Control_PSG_Front_initialize(void);
|
||||
void powerwindow_PW_Control_PSG_Front_terminate(void);
|
||||
void powerwindow_PW_Control_PSG_Front_main(void);
|
||||
|
||||
/* Block states (auto storage) */
|
||||
powerwindow_D_Work_PW_Control_PSG_Front powerwindow_PW_Control_PSG_Front_DWork;
|
||||
|
||||
/* External inputs (root inport signals with auto storage) */
|
||||
powerwindow_ExternalInputs_PW_Control_PSG_Front
|
||||
powerwindow_PW_Control_PSG_Front_U;
|
||||
|
||||
/* External outputs (root outports fed by signals with auto storage) */
|
||||
powerwindow_ExternalOutputs_PW_Control_PSG_Front
|
||||
powerwindow_PW_Control_PSG_Front_Y;
|
||||
|
||||
/* Real-time model */
|
||||
powerwindow_RT_MODEL_PW_Control_PSG_Front powerwindow_PW_Control_PSG_Front_M_;
|
||||
powerwindow_RT_MODEL_PW_Control_PSG_Front *const
|
||||
powerwindow_PW_Control_PSG_Front_M = &powerwindow_PW_Control_PSG_Front_M_;
|
||||
|
||||
/* Model step function */
|
||||
void
|
||||
powerwindow_PW_Control_PSG_Front_main(void) {
|
||||
/* local block i/o variables */
|
||||
powerwindow_boolean_T rtb_debounce_Up;
|
||||
powerwindow_boolean_T rtb_debounce_Down;
|
||||
powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_Front_Front_o1;
|
||||
powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_Front_Front_o2;
|
||||
|
||||
/* ModelReference: '<S2>/debounce_Up' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_PSG_Front_U.Up_PSG_Front, &rtb_debounce_Up,
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtzce));
|
||||
|
||||
/* ModelReference: '<S2>/debounce_Down' */
|
||||
powerwindow_debounce_main(
|
||||
&powerwindow_PW_Control_PSG_Front_U.Down_PSG_Front, &rtb_debounce_Down,
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtzce));
|
||||
|
||||
/* ModelReference: '<S1>/ControlEx_PSG_Front_Front' */
|
||||
powerwindow_controlexclusion_main(
|
||||
&powerwindow_PW_Control_PSG_Front_U.Up_DRV,
|
||||
&powerwindow_PW_Control_PSG_Front_U.Down_DRV, &rtb_debounce_Up,
|
||||
&rtb_debounce_Down, &powerwindow_rtb_ControlEx_PSG_Front_Front_o1,
|
||||
&powerwindow_rtb_ControlEx_PSG_Front_Front_o2);
|
||||
|
||||
/* ModelReference: '<S1>/PW_PSG_Front_Front' */
|
||||
powerwindow_powerwindow_control_main(
|
||||
&powerwindow_rtb_ControlEx_PSG_Front_Front_o1,
|
||||
&powerwindow_rtb_ControlEx_PSG_Front_Front_o2,
|
||||
&powerwindow_PW_Control_PSG_Front_U.endofdetectionrange,
|
||||
&powerwindow_PW_Control_PSG_Front_U.currentsense,
|
||||
&powerwindow_PW_Control_PSG_Front_Y.window_up,
|
||||
&powerwindow_PW_Control_PSG_Front_Y.window_down,
|
||||
&powerwindow_PW_Control_PSG_Front_Y.overcurrent,
|
||||
&powerwindow_PW_Control_PSG_Front_Y.pinch,
|
||||
&powerwindow_PW_Control_PSG_Front_Y.wake,
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1
|
||||
.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1
|
||||
.rtzce));
|
||||
}
|
||||
|
||||
/* Model initialize function */
|
||||
void
|
||||
powerwindow_PW_Control_PSG_Front_initialize(void) {
|
||||
/* Registration code */
|
||||
|
||||
/* initialize error status */
|
||||
powerwindow_PW_PSG_Front_rtmSetErrorStatus(
|
||||
powerwindow_PW_Control_PSG_Front_M, (NULL));
|
||||
|
||||
/* states (dwork) */
|
||||
(void) wcclib_memset((void *) &powerwindow_PW_Control_PSG_Front_DWork, 0,
|
||||
sizeof(powerwindow_D_Work_PW_Control_PSG_Front));
|
||||
|
||||
/* external inputs */
|
||||
(void) wcclib_memset(
|
||||
(void *) &powerwindow_PW_Control_PSG_Front_U, 0,
|
||||
sizeof(powerwindow_ExternalInputs_PW_Control_PSG_Front));
|
||||
|
||||
/* external outputs */
|
||||
(void) wcclib_memset(
|
||||
(void *) &powerwindow_PW_Control_PSG_Front_Y, 0,
|
||||
sizeof(powerwindow_ExternalOutputs_PW_Control_PSG_Front));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block:
|
||||
* '<S1>/ControlEx_PSG_Front_Front' */
|
||||
powerwindow_controlexclusion_initialize();
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S2>/debounce_Down' */
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_PSG_Front_M),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S2>/debounce_Up' */
|
||||
powerwindow_debounce_initialize(
|
||||
powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_PSG_Front_M),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtzce));
|
||||
|
||||
/* Model Initialize fcn for ModelReference Block: '<S1>/PW_PSG_Front_Front'
|
||||
*/
|
||||
powerwindow_powerwindow_control_initialize(
|
||||
powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer(
|
||||
powerwindow_PW_Control_PSG_Front_M),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtm),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1
|
||||
.rtdw),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1
|
||||
.rtzce));
|
||||
|
||||
/* Start for ModelReference: '<S2>/debounce_Up' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S2>/debounce_Down' */
|
||||
powerwindow_debounce_Start(
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw));
|
||||
|
||||
/* Start for ModelReference: '<S1>/PW_PSG_Front_Front' */
|
||||
powerwindow_powerwindow_control_Start(&(
|
||||
powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtdw));
|
||||
|
||||
/* InitializeConditions for ModelReference: '<S2>/debounce_Up' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw));
|
||||
|
||||
/* InitializeConditions for ModelReference: '<S2>/debounce_Down' */
|
||||
powerwindow_debounce_Init(
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb),
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw));
|
||||
|
||||
/* InitializeConditions for ModelReference: '<S1>/PW_PSG_Front_Front' */
|
||||
powerwindow_powerwindow_control_Init(
|
||||
&powerwindow_PW_Control_PSG_Front_Y.window_up,
|
||||
&powerwindow_PW_Control_PSG_Front_Y.window_down,
|
||||
&powerwindow_PW_Control_PSG_Front_Y.overcurrent,
|
||||
&powerwindow_PW_Control_PSG_Front_Y.pinch,
|
||||
&powerwindow_PW_Control_PSG_Front_Y.wake,
|
||||
&(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1
|
||||
.rtdw));
|
||||
}
|
||||
|
||||
/* Model terminate function */
|
||||
void
|
||||
powerwindow_PW_Control_PSG_Front_terminate(void) {
|
||||
/* (no terminate code required) */
|
||||
}
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,139 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_PSG_Front.h
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: headerfile
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_Front_h_
|
||||
#define powerwindow_RTW_HEADER_PW_Control_PSG_Front_h_
|
||||
#ifndef powerwindow_PW_Control_PSG_Front_COMMON_INCLUDES_
|
||||
#define powerwindow_PW_Control_PSG_Front_COMMON_INCLUDES_
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h"
|
||||
#endif /* powerwindow_PW_Control_PSG_Front_COMMON_INCLUDES_*/
|
||||
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_types.h"
|
||||
|
||||
/* Shared type includes */
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h"
|
||||
|
||||
/* Child system includes */
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_debounce.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h"
|
||||
|
||||
/* Macros for accessing real-time model data structure */
|
||||
#ifndef powerwindow_PW_PSG_Front_rtmGetErrorStatus
|
||||
#define powerwindow_PW_PSG_Front_rtmGetErrorStatus(rtm) ((rtm)->errorStatus)
|
||||
#endif
|
||||
|
||||
#ifndef powerwindow_PW_PSG_Front_rtmSetErrorStatus
|
||||
#define powerwindow_PW_PSG_Front_rtmSetErrorStatus(rtm, val) \
|
||||
((rtm)->errorStatus = (val))
|
||||
#endif
|
||||
|
||||
#ifndef powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer
|
||||
#define powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer(rtm) \
|
||||
((const powerwindow_char_T **) (&((rtm)->errorStatus)))
|
||||
#endif
|
||||
|
||||
/* Block states (auto storage) for system '<Root>' */
|
||||
typedef struct {
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Up_DWORK1; /* '<S2>/Debounce_Up' */
|
||||
powerwindow_rtMdlrefDWork_debounce_T
|
||||
Debounce_Down_DWORK1; /* '<S2>/Debounce_Down' */
|
||||
powerwindow_rtMdlrefDWork_PowerWindow_contr
|
||||
PW_PSG_Front_Front_DWORK1; /* '<S1>/PW_PSG_Front_Front' */
|
||||
} powerwindow_D_Work_PW_Control_PSG_Front;
|
||||
|
||||
/* External inputs (root inport signals with auto storage) */
|
||||
typedef struct {
|
||||
powerwindow_boolean_T Up_DRV; /* '<Root>/Up_DRV' */
|
||||
powerwindow_boolean_T Down_DRV; /* '<Root>/Down_DRV' */
|
||||
powerwindow_boolean_T
|
||||
endofdetectionrange; /* '<Root>/end of detection range' */
|
||||
powerwindow_uint8_T currentsense; /* '<Root>/current sense' */
|
||||
powerwindow_boolean_T Up_PSG_Front; /* '<Root>/Up_PSG_Front' */
|
||||
powerwindow_boolean_T Down_PSG_Front; /* '<Root>/Down_PSG_Front' */
|
||||
} powerwindow_ExternalInputs_PW_Control_PSG_Front;
|
||||
|
||||
/* External outputs (root outports fed by signals with auto storage) */
|
||||
typedef struct {
|
||||
powerwindow_boolean_T window_up; /* '<Root>/window_up' */
|
||||
powerwindow_boolean_T window_down; /* '<Root>/window_down' */
|
||||
powerwindow_boolean_T overcurrent; /* '<Root>/overcurrent' */
|
||||
powerwindow_boolean_T pinch; /* '<Root>/pinch' */
|
||||
powerwindow_boolean_T wake; /* '<Root>/wake' */
|
||||
} powerwindow_ExternalOutputs_PW_Control_PSG_Front;
|
||||
|
||||
/* Real-time Model Data Structure */
|
||||
struct powerwindow_tag_RTM_PW_Control_PSG_Front {
|
||||
const powerwindow_char_T *volatile errorStatus;
|
||||
};
|
||||
|
||||
/* Block states (auto storage) */
|
||||
extern powerwindow_D_Work_PW_Control_PSG_Front
|
||||
powerwindow_PW_Control_PSG_Front_DWork;
|
||||
|
||||
/* External inputs (root inport signals with auto storage) */
|
||||
extern powerwindow_ExternalInputs_PW_Control_PSG_Front
|
||||
powerwindow_PW_Control_PSG_Front_U;
|
||||
|
||||
/* External outputs (root outports fed by signals with auto storage) */
|
||||
extern powerwindow_ExternalOutputs_PW_Control_PSG_Front
|
||||
powerwindow_PW_Control_PSG_Front_Y;
|
||||
|
||||
/* Model entry point functions */
|
||||
void powerwindow_PW_Control_PSG_Front_initialize(void);
|
||||
void powerwindow_PW_Control_PSG_Front_main(void);
|
||||
void powerwindow_PW_Control_PSG_Front_terminate(void);
|
||||
|
||||
/* Real-time Model object */
|
||||
extern powerwindow_RT_MODEL_PW_Control_PSG_Front
|
||||
*const powerwindow_PW_Control_PSG_Front_M;
|
||||
|
||||
/*-
|
||||
The generated code includes comments that allow you to trace directly
|
||||
back to the appropriate location in the model. The basic format
|
||||
is <system>/block_name, where system is the system number (uniquely
|
||||
assigned by Simulink) and block_name is the name of the block.
|
||||
|
||||
Note that this particular code originates from a subsystem build,
|
||||
and has its own system numbers different from the parent model.
|
||||
Refer to the system hierarchy for this subsystem below, and use the
|
||||
MATLAB hilite_system command to trace the generated code back
|
||||
to the parent model. For example,
|
||||
|
||||
hilite_system('PowerWindow/PW_Control_PSG_Front') - opens subsystem
|
||||
PowerWindow/PW_Control_PSG_Front
|
||||
hilite_system('PowerWindow/PW_Control_PSG_Front/Kp') - opens and selects
|
||||
block Kp
|
||||
|
||||
Here is the system hierarchy for this model
|
||||
|
||||
'<Root>' : 'PowerWindow'
|
||||
'<S1>' : 'PowerWindow/PW_Control_PSG_Front'
|
||||
'<S2>' : 'PowerWindow/PW_Control_PSG_Front/Debounce_PSG_Front_Front'
|
||||
*/
|
||||
#endif /* RTW_HEADER_PW_Control_PSG_Front_h_*/
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,31 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_PSG_Front_private.h
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: headerfile
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_Front_private_h_
|
||||
#define powerwindow_RTW_HEADER_PW_Control_PSG_Front_private_h_
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h"
|
||||
#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h"
|
||||
#endif /* RTW_HEADER_PW_Control_PSG_Front_private_h_ */
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
@ -0,0 +1,34 @@
|
||||
/*
|
||||
|
||||
This program is part of the TACLeBench benchmark suite.
|
||||
Version V 1.x
|
||||
|
||||
Name: powerwindow_PW_Control_PSG_Front_types.h
|
||||
|
||||
Author: CoSys-Lab, University of Antwerp
|
||||
|
||||
Function: headerfile
|
||||
|
||||
Source:
|
||||
https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_types.h
|
||||
|
||||
Changes: a brief summary of major functional changes and formatting)
|
||||
|
||||
License: GNU General Public License
|
||||
|
||||
*/
|
||||
|
||||
#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_Front_types_h_
|
||||
#define powerwindow_RTW_HEADER_PW_Control_PSG_Front_types_h_
|
||||
|
||||
/* Forward declaration for rtModel */
|
||||
typedef struct powerwindow_tag_RTM_PW_Control_PSG_Front
|
||||
powerwindow_RT_MODEL_PW_Control_PSG_Front;
|
||||
|
||||
#endif /* RTW_HEADER_PW_Control_PSG_Front_types_h_ */
|
||||
|
||||
/*
|
||||
File trailer for generated code.
|
||||
|
||||
[ EOF ]
|
||||
*/
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user