Compare commits

..

68 Commits

Author SHA1 Message Date
961a2f02c5 Add filters for data_physical_address 2026-06-14 21:15:53 +02:00
e3be326c42 Allow to select datafile for charts/explore/compare (filtered/non-filtered) 2026-06-14 17:06:43 +02:00
1d1ed3581a Fix dynamic query loading import error (!) 2026-06-13 23:05:36 +02:00
b9ff08db16 Fix dynamic query loading import error (?) 2026-06-13 22:28:45 +02:00
59736fb576 Fix dynamic query loading import error 2026-06-13 22:07:07 +02:00
b10233439f Fix runner.pl import error 2026-06-13 21:44:09 +02:00
4ba417ebdf Fix perl import errors 2026-06-13 21:39:50 +02:00
b344c55eee Update faults filtering to be selectable from menu 2026-06-13 21:22:56 +02:00
797c9512b4 Add FaultsFiltered query to exclude memory regions 2026-06-13 16:22:03 +02:00
08c2e9c13d Add wasm tacle-bench targets 2026-06-12 20:06:22 +02:00
30daa8a00c Move tacle-converter submodule 2026-06-12 20:05:07 +02:00
b0cb01a7e4 Add elf symbol address helper + pass experiment path to queries 2026-06-12 17:34:24 +02:00
4b0a4b175b Add tacle-bench-wasm-converter as submodule 2026-06-12 17:32:26 +02:00
f999b01538 Show regions with _start/_end syms in heatmap + generate all heatmaps 2026-06-12 12:30:05 +02:00
7dec717e03 Enclose libiwasm.a objects with _start/_end symbols 2026-06-12 12:29:02 +02:00
f14d4f8d36 Remove wamr-build directory after build 2026-06-12 12:28:35 +02:00
6f3d11128c WIP: heatmap chart 2026-06-11 21:17:31 +02:00
47f3132859 Fix imports after moving files 2026-06-11 20:28:41 +02:00
93d911a09e Hide allocator build options when building native 2026-06-11 20:07:37 +02:00
170a4487c1 move some files around 2026-06-11 20:03:20 +02:00
c4bcae753b Fix incorrect group1-marker flag 2026-06-09 21:53:49 +02:00
8fc755372f Fix build variant environment variable handling 2026-06-09 21:21:17 +02:00
6042b2a145 Preserve selection order in TUI.pm (e.g. when comparing results) 2026-06-09 14:12:27 +02:00
7a3a23b4d6 Enable/disable wamr exception handler marker from build menu 2026-06-09 13:56:35 +02:00
454a85043f Only ask for WAMR-specific build options for WAMR builds 2026-06-09 13:51:40 +02:00
c5c5172f65 Gate .text.wamr_mmap behind WAMR_MMAP_IN_TEXT 2026-06-05 20:16:11 +02:00
a07cd4913c Allow configuring which memory for pool/usage allocators is placed where 2026-06-05 20:15:19 +02:00
b6355a67f3 implement another bump allocator for WAMR's Alloc_With_Allocator 2026-06-05 19:11:00 +02:00
7284849684 rename targets 2026-06-05 17:14:43 +02:00
bd6df6b4e9 replace build.just with compile.pl 2026-06-05 17:14:34 +02:00
9c42618028 make fail flags and .wamr_aot configurable from build menu 2026-05-29 02:34:01 +02:00
78733403f5 update build naming 2026-05-29 01:08:34 +02:00
b1821cabd6 rename experiment targets 2026-05-29 01:08:09 +02:00
ac6297643f remove obsolete justfiles 2026-05-29 01:07:56 +02:00
c57ae5fced make --xip and .wamr_mmap configurable from build menu 2026-05-29 00:20:23 +02:00
05a4aa18e4 fix menu.pl syntax highlighting in zed 2026-05-28 08:51:14 +02:00
d7548a19ab capture runner logs 2026-05-27 17:09:46 +02:00
d1c618443c runner kills possibly left-over generic-experiment-server process before
starting
2026-05-27 16:55:46 +02:00
25e10511e1 update runner scripts to allow different experiment arguments 2026-05-27 16:37:15 +02:00
ebaf128d92 Switch back to BasicPruner 2026-05-27 15:52:56 +02:00
d0166f32a6 remove .size from startup.s, so linker.ld doesn't need gap-bridge symbols 2026-05-21 11:26:47 +02:00
a77d0782bf update fail 2026-05-21 11:26:29 +02:00
928719db7c disable --catch-outerspace and --catch-write-textsegment 2026-05-21 01:01:48 +02:00
dd87df37c1 switch back to NoPruner 2026-05-21 00:45:35 +02:00
2c43e630f0 capture stderr in runner.pl 2026-05-21 00:27:03 +02:00
0cb829ccf4 Revert "update fail binaries"
This reverts commit 4bd3a9d7a4.
2026-05-21 00:26:40 +02:00
4bd3a9d7a4 update fail binaries 2026-05-21 00:09:04 +02:00
ca6801edd6 re-enable objdump importing 2026-05-20 23:33:11 +02:00
1e3dfa2504 update fail binaries - add debug logs to prune-trace (correct pruner this time) 2026-05-20 22:27:22 +02:00
30f09a276f update fail binaries - add debug logs to prune-trace 2026-05-20 21:47:25 +02:00
7846a2f3b6 fix linker.ld - wamr subsections have to be declared before the .text* wildcard 2026-05-20 21:31:31 +02:00
8f5e6f35b4 switch back to BasicPruner 2026-05-20 21:31:07 +02:00
8ac7cf8a70 update fail binaries - enable import-trace debug logs 2026-05-20 20:09:17 +02:00
5c874f4cbc update fail binaries - enable tracing logs + modify CapstoneDisassembler for custom sections 2026-05-19 22:47:57 +02:00
635a625e7c don't strip debug information from patched fail binaries 2026-05-19 22:47:28 +02:00
b61ee93a3e add qemu debug config + fail-x86-tracing debug config to launch.json 2026-05-19 22:46:08 +02:00
e6d2e736ff add fail-x86-tracing build with debug information 2026-05-19 20:42:22 +02:00
a0ac7fa7e9 use "NoPruner" pruning method 2026-05-17 22:47:50 +02:00
612aad911b update fail binaries (added NoPruner) 2026-05-17 22:47:37 +02:00
ddbd6fa8d1 pin new wamr commit + add .text.wamr_mmap section to linker.ld 2026-05-17 21:22:13 +02:00
99e8c80dc7 update wamr 2026-05-17 21:13:43 +02:00
54ec5ef63e add wamr src as submodule 2026-05-17 20:59:09 +02:00
494e06bcb1 add fail db schema 2026-05-17 19:52:30 +02:00
67a36aa7f8 add fail src as submodule 2026-05-17 19:52:19 +02:00
31e8f9d093 add .vscode debug configuration 2026-05-13 15:47:40 +02:00
156ce50116 update menu/explorer + flake for group1-marker 2026-05-11 17:35:59 +02:00
34d89b23fa register group1-marker (for WAMR exception handler) 2026-05-11 16:48:47 +02:00
eefabbd043 reenable trace pruning 2026-05-11 16:05:16 +02:00
1181 changed files with 522956 additions and 9152 deletions

9
.gitmodules vendored Normal file
View 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
View 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
View 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)

Binary file not shown.

BIN
fail/bin/generic-experiment-client (Stored with Git LFS)

Binary file not shown.

BIN
fail/bin/generic-experiment-server (Stored with Git LFS)

Binary file not shown.

BIN
fail/bin/import-trace (Stored with Git LFS)

Binary file not shown.

BIN
fail/bin/prune-trace (Stored with Git LFS)

Binary file not shown.

1
fail/src Submodule

Submodule fail/src added at dda6da2a50

822
flake.nix
View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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"

View File

@ -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 '}}'
```

View File

@ -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.

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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]
}

View File

@ -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'

View File

@ -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)
]

View File

@ -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
}

View File

@ -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)

Binary file not shown.

View File

@ -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
View 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
View 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;

View File

@ -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;
}

View File

@ -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) = @_;

View File

@ -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; }

View File

@ -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 { }

View File

@ -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; }

View File

@ -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}",
)
);
}

View File

@ -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,
)

View 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)
}
}

View File

@ -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,
)

View File

@ -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
View 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" );
}

View File

@ -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);

View File

@ -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'
);

View File

@ -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 }}

View File

@ -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

View File

@ -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 );
}
}
}
},
@ -213,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'
);
@ -238,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" );
@ -408,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";
@ -419,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',
@ -434,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',
);
},
@ -447,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);
}
}
@ -465,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);
}
},

28
scripts/multi_runner.pl Normal file
View 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");

View File

@ -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 }}"

View File

@ -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,62 +130,65 @@ 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 " ",
# (
# "$fail_prune", "--database-option-file $remote_db_conf",
# "-v $experiment", "-b %%",
# "--overwrite", ">$remote_builds_dir/$experiment/2_prune.log"
# );
# say "Prune command: $prune_command";
#
# system($prune_command);
# "--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 %%",
# '-p NoPruner',
'-p BasicPruner',
"--overwrite", ">$remote_builds_dir/$experiment/2_prune.log 2>&1"
);
say "Prune command: $prune_command";
system($prune_command);
}
sub inject {
@ -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");

View File

@ -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

Submodule tacle-converter added at ff9c74cae5

View File

@ -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*")
}

View File

@ -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

View File

@ -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");

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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();

View 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)

View 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/

View 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

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -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());
}

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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());
}

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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

View 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() );
}

View 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;
}

View 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

View 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;
}

View 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

View 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)

View 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.

File diff suppressed because one or more lines are too long

View File

@ -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 ]
*/

View File

@ -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

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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 ]
*/

View File

@ -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