Compare commits

..

151 Commits

Author SHA1 Message Date
bc98e2af5c add updated fail binaries 2026-05-04 11:38:05 +02:00
3819e84acb remove fail binaries 2026-05-04 11:35:42 +02:00
6ce8987ebd add --server-port option to generic-experiment-client 2026-04-29 21:02:10 +02:00
6859402483 update FAIL database queries for new version 2026-04-29 20:16:24 +02:00
32b1f3fa31 move old FAIL binaries so nix doesn't autopatchelf them 2026-04-29 20:10:02 +02:00
a6f33f1960 update FAIL version to current 2026-04-29 19:58:18 +02:00
1bf4886c64 choose experiments instead of builds for radare/objdump/wasm-objdump actions 2026-04-28 00:53:46 +02:00
e33fed9b8d add binaryninja action to menu 2026-04-28 00:40:31 +02:00
c87409dd5c add radare/objdump/wasm-objdump actions to menu 2026-04-28 00:17:51 +02:00
5f6537b7ea reenable --catch-outerspace and --catch-write-textsegment 2026-04-27 19:09:19 +02:00
5bfe1a366b disable --catch-outerspace and --catch-write-textsegment 2026-04-27 18:49:51 +02:00
f2559c8445 disable --catch-write-textsegment 2026-04-27 15:57:17 +02:00
4d0693dd30 disable --catch-outerspace 2026-04-27 15:49:18 +02:00
bba9ced348 add sankey chart 2026-04-24 15:27:41 +02:00
a8aa0bbb07 add matrix multiplication test program 2026-04-24 15:27:20 +02:00
1257534a64 enable --full-trace and --check-bounds 2026-04-24 15:27:11 +02:00
5aab319424 import native symbols in lib.h
lib.h gets included into the host module and the wasm module. For the
host module the attributes will be ignored.
2026-04-24 10:45:55 +02:00
348aac20ae add lazysql menu action 2026-04-24 00:25:06 +02:00
5da8fffed0 add tableplus to shell environment 2026-04-24 00:03:25 +02:00
2b554a22ad read entire marker notes file instead of first line 2026-04-23 22:44:50 +02:00
c76b0b8a8e allow annotating markers in explorer 2026-04-23 21:53:07 +02:00
5f42323ccb display corresponding section for markers in explorer 2026-04-23 18:42:31 +02:00
551335bf53 store additional files with builds (flake/startup/linkerscript/...) 2026-04-23 17:56:46 +02:00
7bd3d205c9 scatterplot: addresses in hex 2026-04-23 17:55:57 +02:00
59e36f6a7f update fail-db.png 2026-04-22 23:59:53 +02:00
693378d059 fix fail trace sources import 2026-04-22 21:53:52 +02:00
1773e1d55a run FullTraceImporter when importing trace + import --sources 2026-04-22 21:45:44 +02:00
99c32e1ac0 add visualfail 2026-04-22 21:45:18 +02:00
5ff6f6d0d8 remove obsolete startup.s modifications 2026-04-22 15:41:15 +02:00
6c7351b3d1 add result comparison menu action 2026-04-22 15:40:57 +02:00
e36cfdc07d abort assembly/source loading if no marker is selected in explorer 2026-04-22 10:22:57 +02:00
7067c015bc exclude existing experiments when archiving 2026-04-21 23:21:14 +02:00
94ec38fa84 cleanup old injections/projects 2026-04-21 22:37:18 +02:00
42817bab52 decrease loop iterations in sum sample 2026-04-21 22:35:33 +02:00
aec774c633 link mmap_space + aot array into .text 2026-04-21 22:34:36 +02:00
41ffcaeb08 add obsidian experiment note creation menu action 2026-04-21 22:32:17 +02:00
41e079b977 add resultbrowser menu action 2026-04-21 18:39:47 +02:00
371b323980 add ssh keepalive to perl ssh connection 2026-04-21 18:39:27 +02:00
d1d6e4de34 undo last change 2026-04-21 16:34:10 +02:00
a7e2c14529 don't redirect fail client output to /dev/null 2026-04-21 16:21:29 +02:00
7bbd30a6f8 add ACCESS_OUTERSPACE markertype to explorer filters 2026-04-21 16:18:27 +02:00
8ea5aed355 fix database creation in deploy.pl 2026-04-21 14:48:47 +02:00
264795bf71 don't link mmap region into .text but aot array itself 2026-04-21 14:46:31 +02:00
ea56079c09 replace : with - on experiment archival 2026-04-21 14:11:57 +02:00
f45ce702d2 add abandoned ghidra path remapping script 2026-04-21 14:11:24 +02:00
545b581659 color points based on resulttype in scatterplot 2026-04-21 14:10:37 +02:00
353f971408 remove faulty injections 2026-04-21 14:07:58 +02:00
77d0cd7814 remove faulty ghidra projects 2026-04-21 14:07:18 +02:00
ed0a3b67de filter markers by default in explorer 2026-04-21 12:21:15 +02:00
51fb2ef4d4 only deploy "fail" targets, only gdb "linux" targets, only import new results into ghidra 2026-04-21 01:06:57 +02:00
0dbcaf68cd update wasm aot recipe for linux (only use --xip for fail/baremetal) 2026-04-21 00:39:00 +02:00
19048ed4bf add run in gdb menu action 2026-04-20 23:52:06 +02:00
495f74ade7 ignore db.conf 2026-04-20 21:06:14 +02:00
6125a3b9fc add barebones results bar chart 2026-04-20 21:01:07 +02:00
7b31507403 add result explorer 2026-04-20 20:59:36 +02:00
aacc895800 update flake to use direnv 2026-04-20 11:41:08 +02:00
116aa5f303 update ghidra projects 2026-04-20 00:21:29 +02:00
2d9837219c update injections 2026-04-20 00:21:18 +02:00
fabf7745ee update ghidra marker import script (headless, import all types from all benchs) 2026-04-20 00:17:46 +02:00
5b316bbd64 add curses entry point for scripts (archival, ghidra import, plots, queries, cleanup) 2026-04-20 00:16:27 +02:00
9c7933e912 add query for detected markers 2026-04-19 13:21:56 +02:00
d925b19135 add queries for other fault types 2026-04-19 13:19:55 +02:00
31d2b422cb move update_db_config to util 2026-04-19 13:05:32 +02:00
10bffc0fbc run all available queries automatically 2026-04-19 12:55:33 +02:00
f6989084ff fix query typos 2026-04-19 12:46:36 +02:00
d345745962 use qualified names for module functions 2026-04-19 12:45:46 +02:00
f729cfbcd2 add current script path to @INC 2026-04-19 12:42:52 +02:00
8a381d71cf add objdump just recipe 2026-04-19 12:39:14 +02:00
c092295520 move queries to modules 2026-04-19 12:39:00 +02:00
7efa945977 move some functions to Util module 2026-04-19 12:38:47 +02:00
40d40bc57b update targets 2026-04-18 19:46:45 +02:00
5dd763fd8a pass substitution as function 2026-04-18 18:03:05 +02:00
4d714a4442 substitute tabs with , for csv output 2026-04-18 17:49:04 +02:00
540596c33d fix injection error handling 2026-04-18 17:42:14 +02:00
cf319c5a72 wait for fail server port 2026-04-18 12:10:01 +02:00
e7cfc59096 add fork logs to inject 2026-04-18 11:52:52 +02:00
d9e0d8d70d send injection results as ntfy attachements 2026-04-18 11:50:06 +02:00
b141ba1e38 invoke runner without screen + add log file 2026-04-18 11:36:47 +02:00
959c9a8bee run with all available cpus 2026-04-18 11:36:36 +02:00
86e3814fb2 loop dropdb + support multiple selection 2026-04-18 11:36:12 +02:00
a287df261c fix runner external commands 2026-04-18 10:27:08 +02:00
eebb596773 update sub import/inject 2026-04-17 22:45:10 +02:00
d45d367d89 update sub trace 2026-04-17 22:39:38 +02:00
038660c969 fix print to filehandle bug 2026-04-17 22:33:56 +02:00
ca405f953b add success check to file writing 2026-04-17 22:27:36 +02:00
c3ada55395 add newline to db.conf updater 2026-04-17 22:21:48 +02:00
52e766e1c2 fix duplicated filehandle bug 2026-04-17 22:18:02 +02:00
a10f04c83e fix screen old session termination bug + db.conf rewriting bug 2026-04-17 22:13:31 +02:00
0d168bf759 add wip buildscripts for automated experiment execution 2026-04-17 21:58:29 +02:00
94f3fc7611 update injections + projects (aot readonly test) 2026-04-17 15:17:53 +02:00
5538e19c82 move justfiles to scripts/ 2026-04-17 15:17:30 +02:00
980025e5a1 disable --catch-write-textsegment after moving mmap memory region into .text 2026-04-17 00:59:04 +02:00
18c3f13a71 move wamr mmap memory region into .text segment for wamr aot mode 2026-04-17 00:25:22 +02:00
3563a810a1 enable --catch-write-textsegment and --catch-outerspace 2026-04-16 22:36:48 +02:00
329014aada unify host programs across targets 2026-04-16 22:36:36 +02:00
e73ab0a788 update build recipe: copy wasm-module source to build directory for archival 2026-04-16 12:47:06 +02:00
bd7f09251e update injections + projects (cored aot/interp) 2026-04-16 12:46:42 +02:00
187ad521cb update injections + projects (cored c) 2026-04-13 23:04:05 +02:00
550ce0b079 do fail interactions inside wasm module + unify host modules + fix cored module 2026-04-13 23:03:54 +02:00
fe6c2f5b99 update injections + projects (cored interp) 2026-04-08 18:32:44 +02:00
89db76e555 update injections + projects (cored c/aot) 2026-04-07 22:13:13 +02:00
28a3c37d41 update hosts for cored target
WIP: currently the hosts are not generic and don't support different
targets
2026-04-07 22:12:57 +02:00
39d2e1c51f switch fail markers to function symbols 2026-04-01 21:17:01 +02:00
353dfae39c add interp ghidra project with -O0 2026-03-19 18:59:25 +01:00
e3b97ba865 add interp injection with -O0 2026-03-19 18:59:09 +01:00
fc1d3feadb update mars faildir 2026-03-19 09:02:53 +01:00
63231f8b48 update mars faildir 2026-03-19 01:17:43 +01:00
07830e1976 re-add file (lfs issue) 2026-03-19 01:14:08 +01:00
f170ded33b remove file 2026-03-19 01:10:39 +01:00
23f1d55feb rename file 2026-03-19 01:08:44 +01:00
a10dc97616 update injections + projects 2026-03-19 01:01:01 +01:00
d797e9f71c compile with -O0 and -ggdb3 2026-03-19 01:00:54 +01:00
ea6a009c0d add aot ghidra project 2026-03-18 23:13:34 +01:00
bc2eefface add c-only ghidra project 2026-03-18 23:13:27 +01:00
a0ea3a3bbf update .gitignore 2026-03-18 23:13:21 +01:00
92ac5ec7d8 move ghidra script location 2026-03-18 23:12:47 +01:00
07ac6f6fc3 update .gitattributes 2026-03-18 23:12:18 +01:00
7b47a70448 add aot injection 2026-03-18 23:11:00 +01:00
96082f33aa add c-only injection 2026-03-18 23:10:56 +01:00
945c1fe0bc update recipes 2026-03-18 23:10:41 +01:00
5efff7c84e add rough fail db table overview 2026-03-18 23:10:38 +01:00
83ae53768c update .gitattributes 2026-03-18 23:10:33 +01:00
c8fb5d537d add gitattributes 2026-03-18 20:06:36 +01:00
a6a335aaf4 move fail binaries 2026-03-18 19:54:44 +01:00
5d4d84de39 add ghidra script to import markers as bookmarks 2026-03-17 23:52:33 +01:00
8afdee2fd2 add recipe to download markers from mars 2026-03-17 23:52:22 +01:00
0d871c4e56 add recipe to export markers to csv 2026-03-17 23:09:12 +01:00
5e0b71a818 update radare2 config 2026-03-17 20:43:39 +01:00
af70aebcff update radare2 config 2026-03-17 20:42:26 +01:00
cacd2d8883 update radare2 config 2026-03-17 20:41:54 +01:00
35dec73236 update radare2 config 2026-03-17 20:40:57 +01:00
e23a3d5033 disable importing --sources because of libdwarf error on mars
FAIL_IMPORT requires dwarf_init from libdwarf, but provided version only
defines dwarf_init_b?
2026-03-13 00:37:28 +01:00
b500d56c8e make radare recipe accept an address 2026-03-13 00:31:23 +01:00
8a0193408f remove obsolete recipe 2026-03-13 00:24:57 +01:00
129ba0e0b6 add a c-only target (no WASM) 2026-03-13 00:22:03 +01:00
0f847d7d2d split compilation into wasm.just + add targets for interpreted wasm 2026-03-12 21:13:06 +01:00
28d1db3b79 launch fail on non-default port on mars 2026-03-12 15:36:09 +01:00
c1eb861bfb fix just path in mars.just 2026-03-12 15:16:57 +01:00
4b8a4ad0f1 split justfile into nixos.just + mars.just 2026-03-12 15:15:15 +01:00
a79219d39e add just static binaries 2026-03-12 14:57:48 +01:00
593b88c3fd don't stop server in all-in-one 2026-03-12 14:52:22 +01:00
b1a8fe0c53 add all in one recipe 2026-03-12 14:26:36 +01:00
99608cc645 use shebang recipes for conditional dependencies instead of inline templating 2026-03-12 14:06:45 +01:00
50c6e9adea add linux-posix + linux-baremetal recipes 2026-03-12 13:45:33 +01:00
66eb0b3814 replace compose-file with direct docker command + add dbeaver recipe 2026-03-12 10:16:09 +01:00
078fdca44b fix incompatible libdwarf version 2026-03-12 10:15:30 +01:00
744af52f76 slightly restructure flake 2026-03-12 09:27:07 +01:00
43414edd0a add injection targets 2026-03-12 01:42:34 +01:00
679aeb24d4 add build + fail recipes 2026-03-12 01:42:25 +01:00
facf04df7f add wasi/wamr dependencies 2026-03-12 01:41:43 +01:00
86baf67fac add binaries 2026-03-11 20:22:30 +01:00
1181 changed files with 9261 additions and 523109 deletions

9
.gitmodules vendored
View File

@ -1,9 +0,0 @@
[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
View File

@ -1,72 +0,0 @@
{
"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
View File

@ -1,25 +0,0 @@
{
"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$",
},
},
},
],
}

View File

@ -6,16 +6,13 @@ library(ggalluvial)
args <- commandArgs(trailingOnly = TRUE)
argc <- length(args)
if (argc < 2 || argc > 3) {
print("Expecting two or three arguments: exp1 exp2 [faults_file]")
if (argc != 2) {
print("Expecting two input files")
stop()
}
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)
for (experiment in args) {
datafile <- paste(experiment, "/faults.csv", sep = "")
if (!file.exists(datafile)) {
print(paste("Input file", datafile, "is missing"))
stop()
@ -33,13 +30,13 @@ resulttype_labels <- c(
)
# Read data
datafile1 <- file.path(args[1], faults_file)
datafile1 <- paste(args[1], "/faults.csv", sep = "")
data1 <- readr::read_csv(datafile1)
data1$fault_address <- strtoi(data1$fault_address)
data1$resulttype <- resulttype_labels[data1$resulttype]
# tibble::glimpse(data1)
datafile2 <- file.path(args[2], faults_file)
datafile2 <- paste(args[2], "/faults.csv", sep = "")
data2 <- readr::read_csv(datafile2)
data2$fault_address <- strtoi(data2$fault_address)
data2$resulttype <- resulttype_labels[data2$resulttype]
@ -78,6 +75,6 @@ plot <- ggplot(
# TODO: Name the file according to the benchmarks
ggsave(
paste0(args[2], "/../sankey", suffix, ".svg"),
paste(args[2], "/../sankey.svg", sep = ""),
plot = plot,
)

View File

@ -1,12 +1,10 @@
library(ggplot2)
# Usage: Rscript single_result.r exp_abspath [resultsdata_file]
# Usage: Rscript single_result.r exp_abspath
args <- commandArgs(trailingOnly = TRUE)
experiment <- args[1]
resultsdata_file <- if (length(args) >= 2) args[2] else "resultsdata.csv"
suffix <- gsub("^resultsdata|\\.csv$", "", resultsdata_file)
datafile <- file.path(experiment, resultsdata_file)
datafile <- paste(experiment, "/resultsdata.csv", sep = "")
if (!file.exists(datafile)) {
print(paste("Input file", datafile, "is missing"))
@ -23,6 +21,6 @@ plot <- ggplot(data, aes(x = benchmark, y = faults, fill = resulttype)) +
theme_minimal()
ggsave(
paste0(experiment, "/single_result", suffix, ".svg"),
paste(experiment, "/single_result.svg", sep = ""),
plot = plot,
)

View File

@ -6,9 +6,7 @@ library(ggplot2)
args <- commandArgs(trailingOnly = TRUE)
experiment <- args[1]
faults_file <- if (length(args) >= 2) args[2] else "faults.csv"
suffix <- gsub("^faults|\\.csv$", "", faults_file)
datafile <- file.path(experiment, faults_file)
datafile <- paste(experiment, "/faults.csv", sep = "")
if (!file.exists(datafile)) {
print(paste("Input file", datafile, "is missing"))
@ -29,6 +27,6 @@ plot <- ggplot(data, aes(x = fault_address, y = faults)) +
theme_minimal()
ggsave(
paste0(experiment, "/scatter", suffix, ".svg"),
paste(experiment, "/scatter.svg", sep = ""),
plot = plot,
)

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.

Submodule fail/src deleted from dda6da2a50

836
flake.nix
View File

@ -12,387 +12,529 @@ 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 {
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";
}) {
inherit system;
config.allowUnfree = true;
overlays = [];
};
i386_pkgs = import nixpkgs {
libdwarf_pkgs =
import (builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/f597e7e9fcf37d8ed14a12835ede0a7d362314bd.tar.gz";
sha256 = "sha256:1l79hh7jh7m8yc5mvc8dbg6s8rf30bgm994kf07xriqbzwfn158r";
}) {
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";
})
{
inherit system;
};
inherit (pkgs) lib stdenv;
libdwarf_pkgs =
import
(builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/f597e7e9fcf37d8ed14a12835ede0a7d362314bd.tar.gz";
sha256 = "sha256:1l79hh7jh7m8yc5mvc8dbg6s8rf30bgm994kf07xriqbzwfn158r";
})
{
inherit system;
};
# =========================================================================================
# Define shell environment
# =========================================================================================
inherit (pkgs) lib stdenv;
# =========================================================================================
# Define shell environment
# =========================================================================================
# 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";
# 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)}
'';
# Setup the shell when entering the "nix develop" environment (bash script).
shellHook = let
mkCmakeScript = type: let
typeLower = lib.toLower type;
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}"'"
pkgs.writers.writeFish "cmake-${typeLower}.fish" ''
cd $FLAKE_PROJECT_ROOT
# 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}"
''
];
echo "Removing build directory ./cmake-build-${typeLower}/"
rm -rf ./cmake-build-${typeLower}
# ===========================================================================================
# Define custom dependencies
# ===========================================================================================
echo "Creating build directory"
mkdir cmake-build-${typeLower}
cd cmake-build-${typeLower}
python = pkgs.python314.withPackages (
p:
with p; [
setuptools
flask
flask-mysqldb
pyyaml
tabulate
]
);
echo "Running cmake"
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE="${type}" -DCMAKE_EXPORT_COMPILE_COMMANDS="On" ..
# 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
echo "Linking compile_commands.json"
cd ..
ln -sf ./cmake-build-${typeLower}/compile_commands.json ./compile_commands.json
'';
cmakeDebug = mkCmakeScript "Debug";
cmakeRelease = mkCmakeScript "Release";
mkBuildScript = type: let
typeLower = lib.toLower type;
in
pkgs.writers.writeFish "cmake-build.fish" ''
cd $FLAKE_PROJECT_ROOT/cmake-build-${typeLower}
echo "Running cmake"
cmake --build .
'';
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}";
};
# Provides clang to compile C++ to Wasm
wasi-sdk = stdenv.mkDerivation rec {
pname = "wasi-sdk";
version = "29";
eraseAbbr = name: value: ''abbr --erase ${name} 2>/dev/null'';
createAbbr = name: value: ''abbr -a ${name} "${value}"'';
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";
};
# 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..."
nativeBuildInputs = with pkgs; [
autoPatchelfHook
];
${builtins.concatStringsSep "\n" (lib.mapAttrsToList eraseAbbr abbrs)}
'';
buildInputs = with pkgs; [
libgcc.lib
];
# 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}
dontBuild = true;
installPhase = ''
runHook preInstall
echo "Sourcing \"${description}\" environment..."
mkdir -p $out
cp -rv ./* $out/
${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}"'"
runHook postInstall
'';
};
# Provides the iwasm interpreter
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
'';
};
# 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
# 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}"
''
];
# 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 custom dependencies
# ===========================================================================================
# ===========================================================================================
# Define buildable + installable packages
# ===========================================================================================
python = pkgs.python314.withPackages (p:
with p; [
setuptools
flask
flask-mysqldb
pyyaml
]);
fail-bin = stdenv.mkDerivation {
pname = "fail";
version = "1.0.0";
src = ./.;
# 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";
};
nativeBuildInputs = with pkgs; [
autoPatchelfHook
];
buildInputs = with pkgs; [
libgcc.lib
];
dontBuild = true;
installPhase = ''
runHook preInstall
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=";
};
dontBuild = true;
installPhase = ''
runHook preInstall
mkdir -p $out
cp -rv ./* $out/
runHook postInstall
'';
};
mkLibiwasm = {
buildenv,
platform,
buildtype,
cflags,
extraCmakeFlags ? [],
}:
buildenv.mkDerivation {
pname = "libiwasm";
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";
# With mmap_space in .text.wamr_aot
rev = "cda2009deb85511089b04b0ac736ad4da2d07e58";
hash = "sha256-CN6xTiwzF4Jbrpf21TF5c/C03Xb3urwkibRuIXjoU/w=";
# Without mmap_space in .text.wamr_aot
# rev = "4e7aed33fe53bf3ee4a3f2fe582c74816f850759";
# hash = "sha256-/4BKwoFDRfkA+DmbWagxdtkCDAED5rxbz5e4xvjvVWU=";
};
nativeBuildInputs = with pkgs; [cmake];
dontStrip = true;
cmakeBuildType = buildtype;
cmakeFlags =
extraCmakeFlags
++ [
"-DCMAKE_VERBOSE_MAKEFILE=ON"
"-DCMAKE_COLOR_DIAGNOSTICS=ON"
nativeBuildInputs = with pkgs; [
autoPatchelfHook
];
"-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"
];
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;
# Since GCC 15, implicit declarations are an error. Disable this.
NIX_CFLAGS_COMPILE = "-Wno-error=implicit-function-declaration " + cflags;
};
devShells = {
# Provide default environment for "nix develop".
# Other environments can be added below.
default = pkgs.mkShell {
inherit nativeBuildInputs buildInputs shellHook;
name = description;
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"
];
};
# =========================================================================================
# Define environment variables
# =========================================================================================
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";
};
# Dynamic libraries from buildinputs:
# LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs;
# ===========================================================================================
# Specify dependencies
# https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-dependencies-overview
# Just for a "nix develop" shell, buildInputs can be used for everything.
# ===========================================================================================
# 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++";
};
# 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++";
};
}
);
};
});
}

1430
just-bin/Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

108
just-bin/Cargo.toml Normal file
View File

@ -0,0 +1,108 @@
[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"

152
just-bin/GRAMMAR.md Normal file
View File

@ -0,0 +1,152 @@
justfile grammar
================
Justfiles are processed by a mildly context-sensitive tokenizer
and a recursive descent parser. The grammar is LL(k), for an
unknown but hopefully reasonable value of k.
tokens
------
```
BACKTICK = `[^`]*`
INDENTED_BACKTICK = ```[^(```)]*```
COMMENT = #([^!].*)?$
DEDENT = emitted when indentation decreases
EOF = emitted at the end of the file
INDENT = emitted when indentation increases
LINE = emitted before a recipe line
NAME = [a-zA-Z_][a-zA-Z0-9_-]*
NEWLINE = \n|\r\n
RAW_STRING = '[^']*'
INDENTED_RAW_STRING = '''[^(''')]*'''
STRING = "[^"]*" # also processes \n \r \t \" \\ escapes
INDENTED_STRING = """[^(""")]*""" # also processes \n \r \t \" \\ escapes
LINE_PREFIX = @-|-@|@|-
TEXT = recipe text, only matches in a recipe body
```
grammar syntax
--------------
```
| alternation
() grouping
_? option (0 or 1 times)
_* repetition (0 or more times)
_+ repetition (1 or more times)
```
grammar
-------
```
justfile : item* EOF
item : alias
| assignment
| eol
| export
| import
| module
| recipe
| set
eol : NEWLINE
| COMMENT NEWLINE
alias : 'alias' NAME ':=' target eol
target : NAME ('::' NAME)*
assignment : NAME ':=' expression eol
export : 'export' assignment
set : 'set' setting eol
setting : 'allow-duplicate-recipes' boolean?
| 'allow-duplicate-variables' boolean?
| 'dotenv-filename' ':=' string
| 'dotenv-load' boolean?
| 'dotenv-path' ':=' string
| 'dotenv-required' boolean?
| 'export' boolean?
| 'fallback' boolean?
| 'ignore-comments' boolean?
| 'positional-arguments' boolean?
| 'script-interpreter' ':=' string_list
| 'quiet' boolean?
| 'shell' ':=' string_list
| 'tempdir' ':=' string
| 'unstable' boolean?
| 'windows-powershell' boolean?
| 'windows-shell' ':=' string_list
| 'working-directory' ':=' string
boolean : ':=' ('true' | 'false')
string_list : '[' string (',' string)* ','? ']'
import : 'import' '?'? string? eol
module : 'mod' '?'? NAME string? eol
expression : disjunct || expression
| disjunct
disjunct : conjunct && disjunct
| conjunct
conjunct : 'if' condition '{' expression '}' 'else' '{' expression '}'
| 'assert' '(' condition ',' expression ')'
| '/' expression
| value '/' expression
| value '+' expression
| value
condition : expression '==' expression
| expression '!=' expression
| expression '=~' expression
value : NAME '(' sequence? ')'
| BACKTICK
| INDENTED_BACKTICK
| NAME
| string
| '(' expression ')'
string : 'x'? STRING
| 'x'? INDENTED_STRING
| 'x'? RAW_STRING
| 'x'? INDENTED_RAW_STRING
sequence : expression ',' sequence
| expression ','?
recipe : attributes* '@'? NAME parameter* variadic? ':' dependencies eol body?
attributes : '[' attribute (',' attribute)* ']' eol
attribute : NAME
| NAME ':' string
| NAME '(' string (',' string)* ')'
parameter : '$'? NAME
| '$'? NAME '=' value
variadic : '*' parameter
| '+' parameter
dependencies : dependency* ('&&' dependency+)?
dependency : target
| '(' target expression* ')'
body : INDENT line+ DEDENT
line : LINE LINE_PREFIX? (TEXT | interpolation)+ NEWLINE
| NEWLINE
interpolation : '{{' expression '}}'
```

121
just-bin/LICENSE Normal file
View File

@ -0,0 +1,121 @@
Creative Commons Legal Code
CC0 1.0 Universal
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
HEREUNDER.
Statement of Purpose
The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator
and subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").
Certain owners wish to permanently relinquish those rights to a Work for
the purpose of contributing to a commons of creative, cultural and
scientific works ("Commons") that the public can reliably and without fear
of later claims of infringement build upon, modify, incorporate in other
works, reuse and redistribute as freely as possible in any form whatsoever
and for any purposes, including without limitation commercial purposes.
These owners may contribute to the Commons to promote the ideal of a free
culture and the further production of creative, cultural and scientific
works, or to gain reputation or greater distribution for their Work in
part through the use and efforts of others.
For these and/or other purposes and motivations, and without any
expectation of additional consideration or compensation, the person
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
is an owner of Copyright and Related Rights in the Work, voluntarily
elects to apply CC0 to the Work and publicly distribute the Work under its
terms, with knowledge of his or her Copyright and Related Rights in the
Work and the meaning and intended legal effect of CC0 on those rights.
1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not
limited to, the following:
i. the right to reproduce, adapt, distribute, perform, display,
communicate, and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or
likeness depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work,
subject to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data
in a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the
European Parliament and of the Council of 11 March 1996 on the legal
protection of databases, and under any national implementation
thereof, including any amended or successor version of such
directive); and
vii. other similar, equivalent or corresponding rights throughout the
world based on applicable law or treaty, and any national
implementations thereof.
2. Waiver. To the greatest extent permitted by, but not in contravention
of, applicable law, Affirmer hereby overtly, fully, permanently,
irrevocably and unconditionally waives, abandons, and surrenders all of
Affirmer's Copyright and Related Rights and associated claims and causes
of action, whether now known or unknown (including existing as well as
future claims and causes of action), in the Work (i) in all territories
worldwide, (ii) for the maximum duration provided by applicable law or
treaty (including future time extensions), (iii) in any current or future
medium and for any number of copies, and (iv) for any purpose whatsoever,
including without limitation commercial, advertising or promotional
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
member of the public at large and to the detriment of Affirmer's heirs and
successors, fully intending that such Waiver shall not be subject to
revocation, rescission, cancellation, termination, or any other legal or
equitable action to disrupt the quiet enjoyment of the Work by the public
as contemplated by Affirmer's express Statement of Purpose.
3. Public License Fallback. Should any part of the Waiver for any reason
be judged legally invalid or ineffective under applicable law, then the
Waiver shall be preserved to the maximum extent permitted taking into
account Affirmer's express Statement of Purpose. In addition, to the
extent the Waiver is so judged Affirmer hereby grants to each affected
person a royalty-free, non transferable, non sublicensable, non exclusive,
irrevocable and unconditional license to exercise Affirmer's Copyright and
Related Rights in the Work (i) in all territories worldwide, (ii) for the
maximum duration provided by applicable law or treaty (including future
time extensions), (iii) in any current or future medium and for any number
of copies, and (iv) for any purpose whatsoever, including without
limitation commercial, advertising or promotional purposes (the
"License"). The License shall be deemed effective as of the date CC0 was
applied by Affirmer to the Work. Should any part of the License for any
reason be judged legally invalid or ineffective under applicable law, such
partial invalidity or ineffectiveness shall not invalidate the remainder
of the License, and in such case Affirmer hereby affirms that he or she
will not (i) exercise any of his or her remaining Copyright and Related
Rights in the Work or (ii) assert any associated claims and causes of
action with respect to the Work, in either case contrary to Affirmer's
express Statement of Purpose.
4. Limitations and Disclaimers.
a. No trademark or patent rights held by Affirmer are waived, abandoned,
surrendered, licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or
warranties of any kind concerning the Work, express, implied,
statutory or otherwise, including without limitation warranties of
title, merchantability, fitness for a particular purpose, non
infringement, or the absence of latent or other defects, accuracy, or
the present or absence of errors, whether or not discoverable, all to
the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons
that may apply to the Work or any use thereof, including without
limitation any person's Copyright and Related Rights in the Work.
Further, Affirmer disclaims responsibility for obtaining any necessary
consents, permissions or other rights required for any use of the
Work.
d. Affirmer understands and acknowledges that Creative Commons is not a
party to this document and has no duty or obligation with respect to
this CC0 or use of the Work.

4882
just-bin/README.md Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,189 @@
_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

@ -0,0 +1,94 @@
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

@ -0,0 +1,87 @@
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

@ -0,0 +1,8 @@
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

@ -0,0 +1,120 @@
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

@ -0,0 +1,181 @@
#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) Executable file

Binary file not shown.

294
just-bin/just.1 Normal file
View File

@ -0,0 +1,294 @@
.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>

View File

@ -1,72 +0,0 @@
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;

View File

@ -1,133 +0,0 @@
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

@ -1,23 +1,13 @@
package Faults;
package Queries::Faults;
use strict;
use warnings;
use diagnostics;
use FindBin;
use lib "$FindBin::Bin/../Modules";
use Filters;
use feature 'say';
sub query {
my ( $experiment, $experiment_dir, $filter_config_name ) = @_;
$filter_config_name //= '';
my ($experiment) = @_;
my $filters =
Filters::build_filter_clause( $experiment_dir, $filter_config_name );
my $querystring = "SELECT
return "SELECT
benchmark, resulttype, SUM(t.time2 - t.time1 + 1) AS faults,
CONCAT('0x', HEX(p.injection_instr_absolute)) AS fault_address
FROM variant v
@ -25,23 +15,14 @@ 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'$filters
WHERE v.variant = '$experiment'
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 {
my ($filter_config_name) = @_;
$filter_config_name //= '';
my $suffix = length($filter_config_name) ? "_$filter_config_name" : "";
return "faults${suffix}.csv";
}
sub filename { return "faults.csv"; }
sub postprocess { $_[0] =~ s/\t/,/g; }

View File

@ -1,46 +1,27 @@
package Results;
package Queries::Results;
use strict;
use warnings;
use diagnostics;
use FindBin;
use lib "$FindBin::Bin/../Modules";
use Filters;
use feature 'say';
sub query {
my ( $experiment, $experiment_dir, $filter_config_name ) = @_;
$filter_config_name //= '';
my ($experiment) = @_;
my $extra =
Filters::build_filter_clause( $experiment_dir, $filter_config_name );
my $querystring = "SELECT
return "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'$extra
WHERE v.variant = '$experiment'
GROUP BY v.id, resulttype
ORDER BY variant, benchmark, resulttype;";
say $querystring;
return $querystring;
}
sub args { return "-t"; }
sub filename {
my ($filter_config_name) = @_;
$filter_config_name //= '';
my $suffix = length($filter_config_name) ? "_$filter_config_name" : "";
return "results${suffix}.txt";
}
sub filename { return "results.txt"; }
sub postprocess { }

View File

@ -1,46 +1,27 @@
package ResultsData;
package Queries::ResultsData;
use strict;
use warnings;
use diagnostics;
use FindBin;
use lib "$FindBin::Bin/../Modules";
use Filters;
use feature 'say';
sub query {
my ( $experiment, $experiment_dir, $filter_config_name ) = @_;
$filter_config_name //= '';
my ($experiment) = @_;
my $extra =
Filters::build_filter_clause( $experiment_dir, $filter_config_name );
my $querystring = "SELECT
return "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'$extra
WHERE v.variant = '$experiment'
GROUP BY v.id, resulttype
ORDER BY variant, benchmark, resulttype;";
say $querystring;
return $querystring;
}
sub args { return "--batch --raw"; }
sub filename {
my ($filter_config_name) = @_;
$filter_config_name //= '';
my $suffix = length($filter_config_name) ? "_$filter_config_name" : "";
return "resultsdata${suffix}.csv";
}
sub filename { return "resultsdata.csv"; }
sub postprocess { $_[0] =~ s/\t/,/g; }

View File

@ -33,13 +33,11 @@ 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;
$listbox = $win->add(
my $listbox = $win->add(
'item_list',
'Listbox',
-title => $title,
@ -49,20 +47,7 @@ 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(
@ -79,9 +64,6 @@ sub select_from_list {
if ( $multiselect && grep { $_ eq '__ALL__' } @picked ) {
@selection = @items;
}
elsif ($multiselect) {
@selection = @selection_order;
}
else {
@selection = @picked;
}

View File

@ -5,13 +5,6 @@ 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';
@ -56,29 +49,6 @@ 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 ) = @_;
@ -133,26 +103,23 @@ sub find_subdirs {
}
sub execute_query {
my ( $experiment, $queryname, $db_conf, $builds_dir, $do_notify_file,
$filter_config_name )
= @_;
my ( $experiment, $queryname, $db_conf, $builds_dir, $do_notify_file ) = @_;
my $module = "$queryname";
my $module = "Queries::$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 filename()";
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 $postprocess = $module->can('postprocess')
or die "$module can't postprocess()";
my $querystring =
$query->( $experiment, "$builds_dir/$experiment", $filter_config_name );
my $querystring = $query->($experiment);
my $argsstring = $args->();
my $filenamestring = $filename->($filter_config_name);
my $filenamestring = $filename->();
# TODO: Pass the values instead of rewriting db.conf.
# Can also use DBI's database handle directly.
@ -181,13 +148,6 @@ 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) = @_;
@ -281,27 +241,6 @@ 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) = @_;
@ -321,8 +260,7 @@ sub select_experiment {
TUI::select_from_list( "Select Experiment", $multi, @exp_with_notes );
die "No experiment selected" unless @selected_experiments;
@selected_experiments =
map { s/(.*?)\s+\(.+\)$/$1/r } @selected_experiments;
map { s/(.*?)\s+\(.+\)$/$1/ } @selected_experiments;
return $multi == 1 ? @selected_experiments : $selected_experiments[0];
}

View File

@ -5,35 +5,28 @@ use warnings;
use diagnostics;
use FindBin;
use lib "$FindBin::Bin/Modules";
use lib $FindBin::Bin;
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 $compile_pl = "$local_root/scripts/compile.pl";
my $justbin = "$local_root/just-bin/just";
my $justfile = "$local_root/scripts/nixos.just";
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";
my @targets = ( "fail", "linux", "linux-baremetal" );
my @modes = ( "c", "aot", "interp" );
system(
"perl $compile_pl $module $target $mode > $local_root/build.log 2>&1")
== 0
or die "Build failed\n";
sleep(1);
sub just {
say "Running: just @_...";
system("$justbin -d $local_root -f $justfile @_")
and die "Build failed";
}
# Find and select experiments
@ -43,263 +36,28 @@ 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 Target Platforms", 1, @targets );
TUI::select_from_list( "Select Targets 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) {
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" );
just( "build", $experiment, $target, $mode );
system(
join " ",
(
"mv",
"$local_root/build-$experiment",
"$local_builds_dir/${date}_${experiment}_${mode}_${target}",
"$local_builds_dir/${date}_$experiment-$target-$mode",
)
);
}

View File

@ -1,511 +0,0 @@
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,441 +0,0 @@
#!/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/Modules";
use lib $FindBin::Bin;
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/multi_runner.pl";
my $remote_log = "$remote_root/multi_runner.log";
my $remote_runner = "$remote_root/scripts/runner.pl";
my $remote_log = "$remote_root/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/Modules";
use lib $FindBin::Bin;
use Util;
use Mars;
@ -23,9 +23,6 @@ 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.
@ -54,10 +51,10 @@ my $source_text;
my @benchs = ( "ip", "mem", "regs" );
my @markers = (
"OK_MARKER", "DETECTED_MARKER",
"FAIL_MARKER", "TRAP",
"TIMEOUT", "ACCESS_OUTERSPACE",
"WRITE_TEXTSEGMENT", "GROUP1_MARKER",
"OK_MARKER", "DETECTED_MARKER",
"FAIL_MARKER", "TRAP",
"TIMEOUT", "ACCESS_OUTERSPACE",
"WRITE_TEXTSEGMENT",
);
# Filter popup state
@ -98,7 +95,7 @@ sub load_faults_csv {
# Schema: benchmark, resulttype, faults, fault_address
my $data = Text::CSV_XS::csv(
in => "$local_archive_dir/$selected_experiment/$selected_faults_csv",
in => "$local_archive_dir/$selected_experiment/faults.csv",
headers => 'auto'
);

134
scripts/fail.just Normal file
View File

@ -0,0 +1,134 @@
[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 }}

35
scripts/mars.just Normal file
View File

@ -0,0 +1,35 @@
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,30 +5,34 @@ use warnings;
use diagnostics;
use FindBin;
use lib "$FindBin::Bin/Modules";
use lib $FindBin::Bin;
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/scripts/charts";
my $local_ghidra_projects = "$local_root/ghidra";
my $local_ghidra_scripts = "$local_root/scripts/ghidra";
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_db_conf = "$local_root/db.conf";
my $resultbrowser_port = '5000';
@ -42,10 +46,10 @@ my $db_port = "3306";
my $db_user = "smchurla";
my %handlers = (
'01. Build Experiments' => sub { do qq{$local_scripts_dir/build.pl}; },
'01. Build Experiments' => sub { do "$local_scripts_dir/build.pl"; },
'02. Deploy Experiments (Mars)' =>
sub { do qq{$local_scripts_dir/deploy.pl}; },
sub { do "$local_scripts_dir/deploy.pl"; },
'03. Archive Experiments (Downloads from Mars)' => sub {
@ -68,6 +72,9 @@ 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 {
@ -85,43 +92,15 @@ 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) {
foreach my $config (@filter_configs) {
Util::rewrite_file( $local_db_conf, "database=",
"database=$db\n" );
Util::rewrite_file( $local_db_conf, "database=",
"database=$db\n" );
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 );
}
say "Running $query on $db...";
Util::execute_query( $db =~ s/smchurla_//r,
$query, $local_db_conf, $local_archive_dir, 0 );
}
}
},
@ -130,8 +109,7 @@ my %handlers = (
my @existing = Util::find_files($local_ghidra_projects);
# Determine if an experiment was already imported
my $project_exists = sub {
my $is_old = sub {
my ($name) = @_;
$name =~ s/:/-/g;
@ -140,37 +118,23 @@ my %handlers = (
# Import archived experiments into ghidra
my @dirs =
grep { !$project_exists->($_) }
Util::find_subdirs($local_archive_dir);
my @dirs_with_notes;
foreach my $dir (@dirs) {
my $info = Util::read_experiment_info($dir);
push @dirs_with_notes,
( defined $info && length($info) > 0 )
? sprintf( "%-50s (%s)", $dir, $info )
: $dir;
}
grep { !$is_old->($_) } Util::find_subdirs($local_archive_dir);
my @selected_dirs =
TUI::select_from_list( "Select Experiments to Import into Ghidra",
1, @dirs_with_notes );
1, @dirs );
foreach (@selected_dirs) {
my $experiment = $_ =~ s/(.*?)\s+\(.+\)$/$1/r;
say "Creating Ghidra project for $experiment...";
say "Creating Ghidra project for $_...";
system(
'ghidra-analyzeHeadless',
$local_ghidra_projects, $experiment =~ s/:/-/gr,
'-import', "$local_archive_dir/$experiment/system.elf",
'-scriptPath', $local_ghidra_scripts,
'-postScript', 'DWARFLineInfoSourceMapScript',
'-postScript', 'DWARFLineInfoCommentScript',
'-postScript', 'ImportMarkersAsBookmarks',
"$local_archive_dir/$experiment/faults.csv"
$local_ghidra_projects, $_ =~ s/:/-/gr,
'-import', "$local_archive_dir/$_/system.elf",
'-scriptPath', $local_ghidra_scripts,
'-postScript', 'DWARFLineInfoSourceMapScript',
'-postScript', 'DWARFLineInfoCommentScript',
'-postScript', 'ImportMarkersAsBookmarks',
"$local_archive_dir/$_/faults.csv"
);
}
},
@ -234,25 +198,20 @@ my %handlers = (
}
},
'10. Explore Experiment Results' =>
sub { do qq{$local_scripts_dir/explore.pl}; },
'10. Open Experiment In Explorer' =>
sub { do "$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'
);
@ -264,10 +223,10 @@ my %handlers = (
my @benchs = ( 'ip', 'mem', 'regs' );
my @markers = (
'OK_MARKER', 'FAIL_MARKER',
'DETECTED_MARKER', 'TIMEOUT',
'TRAP', 'WRITE_TEXTSEGMENT',
'ACCESS_OUTERSPACE', 'GROUP1_MARKER'
'OK_MARKER', 'FAIL_MARKER',
'DETECTED_MARKER', 'TIMEOUT',
'TRAP', 'WRITE_TEXTSEGMENT',
'ACCESS_OUTERSPACE'
);
my $heading = sprintf( "%5s %20s ", "BENCH", "TYPE" );
@ -422,11 +381,7 @@ my %handlers = (
);
},
'20. Open TablePlus (Mars)' => sub {
system('tableplus');
},
'21. Run Build in GDB' => sub {
'20. Run Build in GDB' => sub {
my @builds = grep { /linux/ } Util::find_subdirs($local_builds_dir);
my @selected_builds =
TUI::select_from_list( "Select Build to Run in GDB", 0, @builds );
@ -434,7 +389,8 @@ 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 $build_name = $selected_build =~ s/.*-.*-.*:.*:.*?_(.*)-.*-.*/$1/r;
my $module_source = "$local_root/build-$build_name";
say "$build_name";
@ -444,9 +400,7 @@ my %handlers = (
'-q',
"$build_dir/system.elf",
'-ex',
'set disassembly-flavor intel',
'-ex',
"set substitute-path 'build-$build_name' '$build_dir'",
"set substitute-path '$module_source' '$build_dir'",
'-ex',
"set substitute-path '/build/source/core' '$local_wamr/core'",
'-ex',
@ -461,16 +415,6 @@ 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',
);
},
@ -484,38 +428,15 @@ 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...";
my @r_args = (
system(
'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);
}
}
@ -525,14 +446,8 @@ my %handlers = (
map { "$local_archive_dir/$_" } @selected_experiments;
foreach my $chart (@combined_charts) {
say " - Generating plot $chart for ($print_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);
system( 'Rscript', "$local_charts_dir/$chart.r",
@path_experiments );
}
},
@ -585,26 +500,11 @@ my %handlers = (
'99. Drop Databases (Mars)' => sub {
# Drop databases on mars
my @dbs = Mars::db_list();
my @dbs_with_notes;
foreach my $db (@dbs) {
my $info =
Util::read_experiment_info( $db =~ s/smchurla_//r =~ s/:/-/gr );
push @dbs_with_notes,
( defined $info && length($info) > 0 )
? sprintf( "%-60s (%s)", $db, $info )
: $db;
}
my @db_names = Mars::db_list();
my @selected_dbs =
TUI::select_from_list( "Select Databases to Drop from Mars",
1, @dbs_with_notes );
1, @db_names );
die "No database selected" unless @selected_dbs;
@selected_dbs =
map { s/(.*?)\s+\(.+\)$/$1/r } @selected_dbs;
Mars::db_drop($_) for @selected_dbs;
},
);

View File

@ -1,28 +0,0 @@
#!/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");

244
scripts/nixos.just Normal file
View File

@ -0,0 +1,244 @@
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,12 +5,8 @@ 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';
@ -39,156 +35,148 @@ my $result_browser = "$fail_bin/resultbrowser.py";
sub trace {
my ($experiment) = @_;
# Util::notify("Tracing $experiment...");
Util::notify("Tracing $experiment...");
my $trace_command = join " ", (
"$bochs_runner",
"-V $fail_share/vgabios.bin",
"-b $fail_share/BIOS-bochs-latest",
"-1",
"-f $fail_trace",
"-e $remote_builds_dir/$experiment/system.elf",
"-i $remote_builds_dir/$experiment/system.iso",
"--",
"-Wf,--start-symbol=fail_start_trace",
"-Wf,--save-symbol=fail_start_trace",
"-Wf,--end-symbol=fail_stop_trace",
"-Wf,--state-file=$remote_builds_dir/$experiment/state",
"-Wf,--trace-file=$remote_builds_dir/$experiment/trace.pb",
"-Wf,--elf-file=$remote_builds_dir/$experiment/system.elf",
system(
join " ",
(
"$bochs_runner",
"-V $fail_share/vgabios.bin",
"-b $fail_share/BIOS-bochs-latest",
"-1",
"-f $fail_trace",
"-e $remote_builds_dir/$experiment/system.elf",
"-i $remote_builds_dir/$experiment/system.iso",
"--",
"-Wf,--start-symbol=fail_start_trace",
"-Wf,--save-symbol=fail_start_trace",
"-Wf,--end-symbol=fail_stop_trace",
"-Wf,--state-file=$remote_builds_dir/$experiment/state",
"-Wf,--trace-file=$remote_builds_dir/$experiment/trace.pb",
"-Wf,--elf-file=$remote_builds_dir/$experiment/system.elf"
# "-Wf,--full-trace",
# "-Wf,--check-bounds",
">$remote_builds_dir/$experiment/1_trace.log 2>&1"
# "-Wf,--full-trace",
# "-Wf,--check-bounds",
)
);
say "Trace command: $trace_command";
system($trace_command);
}
sub import_trace {
my ($experiment) = @_;
# Util::notify("Importing $experiment trace...");
Util::notify("Importing $experiment trace...");
# Benchmark: ip
my $import_ip_command = join " ", (
"$fail_import",
"--database-option-file $remote_db_conf",
"-t $remote_builds_dir/$experiment/trace.pb",
"-i RegisterImporter",
"-e $remote_builds_dir/$experiment/system.elf",
"-v $experiment",
"-b ip",
"--no-gp", # Don't inject general purpose registers
"--ip", # Inject instruction pointer
">$remote_builds_dir/$experiment/2_import_ip.log 2>&1"
system(
join " ",
(
"$fail_import",
"--database-option-file $remote_db_conf",
"-t $remote_builds_dir/$experiment/trace.pb",
"-i RegisterImporter",
"-e $remote_builds_dir/$experiment/system.elf",
"-v $experiment",
"-b ip",
"--no-gp", # Don't inject general purpose registers
"--ip" # Inject instruction pointer
)
);
say "Import IP command: $import_ip_command";
system($import_ip_command);
# Benchmark: mem
my $import_mem_command = join " ",
(
"$fail_import",
"--database-option-file $remote_db_conf",
"-t $remote_builds_dir/$experiment/trace.pb",
"-i MemoryImporter",
"-e $remote_builds_dir/$experiment/system.elf",
"-v $experiment",
"-b mem",
">$remote_builds_dir/$experiment/2_import_mem.log 2>&1"
);
say "Import MEM command: $import_mem_command";
system($import_mem_command);
system(
join " ",
(
"$fail_import",
"--database-option-file $remote_db_conf",
"-t $remote_builds_dir/$experiment/trace.pb",
"-i MemoryImporter",
"-e $remote_builds_dir/$experiment/system.elf",
"-v $experiment",
"-b mem"
)
);
# Benchmark: regs
my $import_regs_command = join " ", (
"$fail_import",
"--database-option-file $remote_db_conf",
"-t $remote_builds_dir/$experiment/trace.pb",
"-i RegisterImporter",
"-e $remote_builds_dir/$experiment/system.elf",
"-v $experiment",
"-b regs",
"--flags", # Inject flags register
">$remote_builds_dir/$experiment/2_import_regs.log 2>&1"
system(
join " ",
(
"$fail_import",
"--database-option-file $remote_db_conf",
"-t $remote_builds_dir/$experiment/trace.pb",
"-i RegisterImporter",
"-e $remote_builds_dir/$experiment/system.elf",
"-v $experiment",
"-b regs",
"--flags" # Inject flags register
)
);
say "Import REGS command: $import_regs_command";
system($import_regs_command);
# Import fulltrace for VisualFAIL
# system(
# join " ",
# (
# "$fail_import",
# "--database-option-file $remote_db_conf",
# "-t $remote_builds_dir/$experiment/trace.pb",
# "-i FullTraceImporter",
# "-e $remote_builds_dir/$experiment/system.elf",
# "-v $experiment",
# )
# );
# 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",
# "--sources",
">$remote_builds_dir/$experiment/2_import_ip_asm.log 2>&1"
system(
join " ",
(
"$fail_import",
"--database-option-file $remote_db_conf",
"-t $remote_builds_dir/$experiment/trace.pb",
"-i FullTraceImporter",
"-e $remote_builds_dir/$experiment/system.elf",
"-v $experiment",
)
);
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"
# 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",
)
);
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"
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",
)
);
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"
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",
)
);
system(
join " ",
(
"$fail_prune",
"--database-option-file $remote_db_conf",
"-v $experiment",
"-b %%", "--overwrite"
)
);
say "Prune command: $prune_command";
system($prune_command);
}
sub inject {
@ -198,57 +186,6 @@ sub inject {
Util::notify("Injecting $experiment using $count cores...");
my $server_command = join " ", (
"$fail_server",
# "--port $fail_server_port",
"--database-option-file $remote_db_conf", "-v $experiment",
"-b %", "--inject-single-bit",
"--inject-registers",
">$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",
"-b $fail_share/BIOS-bochs-latest",
"-f $fail_inject",
"-e $remote_builds_dir/$experiment/system.elf",
"-i $remote_builds_dir/$experiment/system.iso",
"-j $count",
"--",
# "-Wf,--server-port=$fail_server_port",
"-Wf,--state-dir=$remote_builds_dir/$experiment/state",
"-Wf,--trap",
@catch_flags,
"-Wf,--timeout=500000",
"-Wf,--ok-marker=fail_marker_positive",
"-Wf,--fail-marker=fail_marker_negative",
"-Wf,--detected-marker=fail_marker_detected",
# Called in WAMR exception handler (disable for C compilation target!)
# "-Wf,--group1-marker=fail_marker_group1",
">/dev/null 2>&1"
# ">$remote_builds_dir/$experiment/4_client.log 2>&1"
);
say "Client command: $client_command";
say "Forking...";
my $pid = fork();
die "fork failed: $!" unless defined $pid;
@ -256,16 +193,52 @@ sub inject {
if ( $pid == 0 ) {
# child -> server
say "Running server in child process...";
exec($server_command) == 0 or die "exec server failed: $!";
exec(
join " ",
(
"$fail_server",
"--port $fail_server_port",
"--database-option-file $remote_db_conf",
"-v $experiment",
"-b %",
"--inject-single-bit",
"--inject-registers"
)
) == 0 or die "exec server failed: $!";
}
# parent -> client
say "Waiting for server...";
sleep(10);
say "Running client with $count cores in parent process";
system($client_command) == 0 or die "client failed: $?";
system(
join " ",
(
"nice $bochs_runner",
"-V $fail_share/vgabios.bin",
"-b $fail_share/BIOS-bochs-latest",
"-f $fail_inject",
"-e $remote_builds_dir/$experiment/system.elf",
"-i $remote_builds_dir/$experiment/system.iso",
"-j $count",
"--",
"-Wf,--server-port=$fail_server_port",
"-Wf,--state-dir=$remote_builds_dir/$experiment/state",
"-Wf,--trap",
"-Wf,--catch-outerspace",
"-Wf,--catch-write-textsegment",
"-Wf,--timeout=500000",
"-Wf,--ok-marker=fail_marker_positive",
"-Wf,--fail-marker=fail_marker_negative",
"-Wf,--detected-marker=fail_marker_detected",
">/dev/null"
)
) == 0 or die "client failed: $?";
say "Killing server with pid $pid...";
kill 'TERM', $pid;
@ -275,30 +248,29 @@ sub inject {
sub results {
my ($experiment) = @_;
my @queries =
map { s/\.pm//gr } Util::find_files("$remote_root/scripts/Queries");
my @configs = ( '', Filters::get_default_configs() );
my @queries = Util::find_files("$remote_root/scripts/Queries");
for my $query (@queries) {
for my $config (@configs) {
Util::execute_query( $experiment, $query,
$remote_db_conf, $remote_builds_dir, 1, $config );
}
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 );
}
}
# 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" );
# 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" );
say "Killing generic-experiment-server process if it's running...";
system( "pkill", "-u", $db_user, "-f", "generic-experiment-server" );
sleep(10);
trace($experiment);
import_trace($experiment);
inject($experiment);
results($experiment);
}
trace($experiment);
import_trace($experiment);
inject($experiment);
results($experiment);
Util::notify("Finished experiment $experiment");
Util::notify("Finished all experiments");

390
scripts/wasm.just Normal file
View File

@ -0,0 +1,390 @@
# =================================================================================================================== #
# 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

Submodule tacle-converter deleted from ff9c74cae5

View File

@ -45,123 +45,7 @@ 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,7 +55,4 @@ _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.
# 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
.size _start, . - _start

View File

@ -3,6 +3,7 @@
#include "bh_platform.h"
#include "__WASM_ARRAY_FILE__"
#ifdef TARGET_LINUX
#include <stdio.h>
#include <string.h>
@ -33,99 +34,7 @@ void host_print(wasm_exec_env_t exec_env, const char *msg) {
#define STACK_SIZE (4 * 1024)
#define HEAP_SIZE 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
#define RUNTIME_POOL_SIZE 4 * STACK_SIZE
MAIN {
char error_buf[128];
@ -133,18 +42,11 @@ 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,14 +36,11 @@ 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>();
// "late" starts trace here
fail_start_trace();
naive_vote();

View File

@ -69,13 +69,10 @@ 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,15 +36,12 @@ 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>();
// "late" starts trace here
fail_start_trace();
naive_vote();
fail_stop_trace();

View File

@ -69,15 +69,12 @@ 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

@ -1,27 +0,0 @@
# ~~~
# 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

@ -1,31 +0,0 @@
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

@ -1,46 +0,0 @@
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

File diff suppressed because it is too large Load Diff

View File

@ -1,130 +0,0 @@
/*
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

@ -1,267 +0,0 @@
#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

@ -1,62 +0,0 @@
#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

@ -1,69 +0,0 @@
#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

@ -1,28 +0,0 @@
#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

@ -1,138 +0,0 @@
/*
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

@ -1,267 +0,0 @@
#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

@ -1,63 +0,0 @@
#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

@ -1,69 +0,0 @@
#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

@ -1,28 +0,0 @@
#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

@ -1,132 +0,0 @@
/*
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

@ -1,277 +0,0 @@
#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

@ -1,64 +0,0 @@
#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

@ -1,65 +0,0 @@
#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

@ -1,27 +0,0 @@
#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

@ -1,35 +0,0 @@
# ~~~
# 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

@ -1,42 +0,0 @@
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

@ -1,782 +0,0 @@
/*
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

@ -1,23 +0,0 @@
/*
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

@ -1,328 +0,0 @@
/*
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

@ -1,154 +0,0 @@
/*
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

@ -1,31 +0,0 @@
/*
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

@ -1,34 +0,0 @@
/*
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

@ -1,192 +0,0 @@
/*
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

@ -1,139 +0,0 @@
/*
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

@ -1,31 +0,0 @@
/*
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

@ -1,34 +0,0 @@
/*
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

@ -1,192 +0,0 @@
/*
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

@ -1,139 +0,0 @@
/*
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

@ -1,31 +0,0 @@
/*
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

@ -1,34 +0,0 @@
/*
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

@ -1,198 +0,0 @@
/*
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

@ -1,139 +0,0 @@
/*
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

@ -1,31 +0,0 @@
/*
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

@ -1,34 +0,0 @@
/*
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