Compare commits
151 Commits
main
...
bc98e2af5c
| Author | SHA1 | Date | |
|---|---|---|---|
|
bc98e2af5c
|
|||
|
3819e84acb
|
|||
|
6ce8987ebd
|
|||
|
6859402483
|
|||
|
32b1f3fa31
|
|||
|
a6f33f1960
|
|||
|
1bf4886c64
|
|||
|
e33fed9b8d
|
|||
|
c87409dd5c
|
|||
|
5f6537b7ea
|
|||
|
5bfe1a366b
|
|||
|
f2559c8445
|
|||
|
4d0693dd30
|
|||
|
bba9ced348
|
|||
|
a8aa0bbb07
|
|||
|
1257534a64
|
|||
|
5aab319424
|
|||
|
348aac20ae
|
|||
|
5da8fffed0
|
|||
|
2b554a22ad
|
|||
|
c76b0b8a8e
|
|||
|
5f42323ccb
|
|||
|
551335bf53
|
|||
|
7bd3d205c9
|
|||
|
59e36f6a7f
|
|||
|
693378d059
|
|||
|
1773e1d55a
|
|||
|
99c32e1ac0
|
|||
|
5ff6f6d0d8
|
|||
|
6c7351b3d1
|
|||
|
e36cfdc07d
|
|||
|
7067c015bc
|
|||
|
94ec38fa84
|
|||
|
42817bab52
|
|||
|
aec774c633
|
|||
|
41ffcaeb08
|
|||
|
41e079b977
|
|||
|
371b323980
|
|||
|
d1d6e4de34
|
|||
|
a7e2c14529
|
|||
|
7bbd30a6f8
|
|||
|
8ea5aed355
|
|||
|
264795bf71
|
|||
|
ea56079c09
|
|||
|
f45ce702d2
|
|||
|
545b581659
|
|||
|
353f971408
|
|||
|
77d0cd7814
|
|||
|
ed0a3b67de
|
|||
|
51fb2ef4d4
|
|||
|
0dbcaf68cd
|
|||
|
19048ed4bf
|
|||
|
495f74ade7
|
|||
|
6125a3b9fc
|
|||
|
7b31507403
|
|||
|
aacc895800
|
|||
|
116aa5f303
|
|||
|
2d9837219c
|
|||
|
fabf7745ee
|
|||
|
5b316bbd64
|
|||
|
9c7933e912
|
|||
|
d925b19135
|
|||
|
31d2b422cb
|
|||
|
10bffc0fbc
|
|||
|
f6989084ff
|
|||
|
d345745962
|
|||
|
f729cfbcd2
|
|||
|
8a381d71cf
|
|||
|
c092295520
|
|||
|
7efa945977
|
|||
|
40d40bc57b
|
|||
|
5dd763fd8a
|
|||
|
4d714a4442
|
|||
|
540596c33d
|
|||
|
cf319c5a72
|
|||
|
e7cfc59096
|
|||
|
d9e0d8d70d
|
|||
|
b141ba1e38
|
|||
|
959c9a8bee
|
|||
|
86e3814fb2
|
|||
| a287df261c | |||
|
eebb596773
|
|||
|
d45d367d89
|
|||
|
038660c969
|
|||
|
ca405f953b
|
|||
|
c3ada55395
|
|||
|
52e766e1c2
|
|||
|
a10f04c83e
|
|||
|
0d168bf759
|
|||
|
94f3fc7611
|
|||
|
5538e19c82
|
|||
|
980025e5a1
|
|||
|
18c3f13a71
|
|||
|
3563a810a1
|
|||
|
329014aada
|
|||
|
e73ab0a788
|
|||
|
bd7f09251e
|
|||
|
187ad521cb
|
|||
|
550ce0b079
|
|||
|
fe6c2f5b99
|
|||
|
89db76e555
|
|||
|
28a3c37d41
|
|||
|
39d2e1c51f
|
|||
|
353dfae39c
|
|||
|
e3b97ba865
|
|||
|
fc1d3feadb
|
|||
|
63231f8b48
|
|||
|
07830e1976
|
|||
|
f170ded33b
|
|||
|
23f1d55feb
|
|||
|
a10dc97616
|
|||
|
d797e9f71c
|
|||
|
ea6a009c0d
|
|||
|
bc2eefface
|
|||
|
a0ea3a3bbf
|
|||
|
92ac5ec7d8
|
|||
|
07ac6f6fc3
|
|||
|
7b47a70448
|
|||
|
96082f33aa
|
|||
|
945c1fe0bc
|
|||
|
5efff7c84e
|
|||
|
83ae53768c
|
|||
| c8fb5d537d | |||
| a6a335aaf4 | |||
| 5d4d84de39 | |||
| 8afdee2fd2 | |||
| 0d871c4e56 | |||
| 5e0b71a818 | |||
| af70aebcff | |||
| cacd2d8883 | |||
| 35dec73236 | |||
| e23a3d5033 | |||
| b500d56c8e | |||
| 8a0193408f | |||
| 129ba0e0b6 | |||
| 0f847d7d2d | |||
| 28d1db3b79 | |||
| c1eb861bfb | |||
| 4b8a4ad0f1 | |||
| a79219d39e | |||
| 593b88c3fd | |||
| b1a8fe0c53 | |||
| 99608cc645 | |||
| 50c6e9adea | |||
| 66eb0b3814 | |||
| 078fdca44b | |||
| 744af52f76 | |||
| 43414edd0a | |||
| 679aeb24d4 | |||
| facf04df7f | |||
| 86baf67fac |
9
.gitmodules
vendored
9
.gitmodules
vendored
@ -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
72
.vscode/launch.json
vendored
@ -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
25
.vscode/tasks.json
vendored
@ -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$",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}
|
|
||||||
@ -6,16 +6,13 @@ library(ggalluvial)
|
|||||||
args <- commandArgs(trailingOnly = TRUE)
|
args <- commandArgs(trailingOnly = TRUE)
|
||||||
argc <- length(args)
|
argc <- length(args)
|
||||||
|
|
||||||
if (argc < 2 || argc > 3) {
|
if (argc != 2) {
|
||||||
print("Expecting two or three arguments: exp1 exp2 [faults_file]")
|
print("Expecting two input files")
|
||||||
stop()
|
stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
faults_file <- if (argc == 3) args[3] else "faults.csv"
|
for (experiment in args) {
|
||||||
suffix <- gsub("^faults|\\.csv$", "", faults_file)
|
datafile <- paste(experiment, "/faults.csv", sep = "")
|
||||||
|
|
||||||
for (experiment in args[1:2]) {
|
|
||||||
datafile <- file.path(experiment, faults_file)
|
|
||||||
if (!file.exists(datafile)) {
|
if (!file.exists(datafile)) {
|
||||||
print(paste("Input file", datafile, "is missing"))
|
print(paste("Input file", datafile, "is missing"))
|
||||||
stop()
|
stop()
|
||||||
@ -33,13 +30,13 @@ resulttype_labels <- c(
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Read data
|
# Read data
|
||||||
datafile1 <- file.path(args[1], faults_file)
|
datafile1 <- paste(args[1], "/faults.csv", sep = "")
|
||||||
data1 <- readr::read_csv(datafile1)
|
data1 <- readr::read_csv(datafile1)
|
||||||
data1$fault_address <- strtoi(data1$fault_address)
|
data1$fault_address <- strtoi(data1$fault_address)
|
||||||
data1$resulttype <- resulttype_labels[data1$resulttype]
|
data1$resulttype <- resulttype_labels[data1$resulttype]
|
||||||
# tibble::glimpse(data1)
|
# tibble::glimpse(data1)
|
||||||
|
|
||||||
datafile2 <- file.path(args[2], faults_file)
|
datafile2 <- paste(args[2], "/faults.csv", sep = "")
|
||||||
data2 <- readr::read_csv(datafile2)
|
data2 <- readr::read_csv(datafile2)
|
||||||
data2$fault_address <- strtoi(data2$fault_address)
|
data2$fault_address <- strtoi(data2$fault_address)
|
||||||
data2$resulttype <- resulttype_labels[data2$resulttype]
|
data2$resulttype <- resulttype_labels[data2$resulttype]
|
||||||
@ -78,6 +75,6 @@ plot <- ggplot(
|
|||||||
|
|
||||||
# TODO: Name the file according to the benchmarks
|
# TODO: Name the file according to the benchmarks
|
||||||
ggsave(
|
ggsave(
|
||||||
paste0(args[2], "/../sankey", suffix, ".svg"),
|
paste(args[2], "/../sankey.svg", sep = ""),
|
||||||
plot = plot,
|
plot = plot,
|
||||||
)
|
)
|
||||||
@ -1,12 +1,10 @@
|
|||||||
library(ggplot2)
|
library(ggplot2)
|
||||||
|
|
||||||
# Usage: Rscript single_result.r exp_abspath [resultsdata_file]
|
# Usage: Rscript single_result.r exp_abspath
|
||||||
|
|
||||||
args <- commandArgs(trailingOnly = TRUE)
|
args <- commandArgs(trailingOnly = TRUE)
|
||||||
experiment <- args[1]
|
experiment <- args[1]
|
||||||
resultsdata_file <- if (length(args) >= 2) args[2] else "resultsdata.csv"
|
datafile <- paste(experiment, "/resultsdata.csv", sep = "")
|
||||||
suffix <- gsub("^resultsdata|\\.csv$", "", resultsdata_file)
|
|
||||||
datafile <- file.path(experiment, resultsdata_file)
|
|
||||||
|
|
||||||
if (!file.exists(datafile)) {
|
if (!file.exists(datafile)) {
|
||||||
print(paste("Input file", datafile, "is missing"))
|
print(paste("Input file", datafile, "is missing"))
|
||||||
@ -23,6 +21,6 @@ plot <- ggplot(data, aes(x = benchmark, y = faults, fill = resulttype)) +
|
|||||||
theme_minimal()
|
theme_minimal()
|
||||||
|
|
||||||
ggsave(
|
ggsave(
|
||||||
paste0(experiment, "/single_result", suffix, ".svg"),
|
paste(experiment, "/single_result.svg", sep = ""),
|
||||||
plot = plot,
|
plot = plot,
|
||||||
)
|
)
|
||||||
@ -6,9 +6,7 @@ library(ggplot2)
|
|||||||
|
|
||||||
args <- commandArgs(trailingOnly = TRUE)
|
args <- commandArgs(trailingOnly = TRUE)
|
||||||
experiment <- args[1]
|
experiment <- args[1]
|
||||||
faults_file <- if (length(args) >= 2) args[2] else "faults.csv"
|
datafile <- paste(experiment, "/faults.csv", sep = "")
|
||||||
suffix <- gsub("^faults|\\.csv$", "", faults_file)
|
|
||||||
datafile <- file.path(experiment, faults_file)
|
|
||||||
|
|
||||||
if (!file.exists(datafile)) {
|
if (!file.exists(datafile)) {
|
||||||
print(paste("Input file", datafile, "is missing"))
|
print(paste("Input file", datafile, "is missing"))
|
||||||
@ -29,6 +27,6 @@ plot <- ggplot(data, aes(x = fault_address, y = faults)) +
|
|||||||
theme_minimal()
|
theme_minimal()
|
||||||
|
|
||||||
ggsave(
|
ggsave(
|
||||||
paste0(experiment, "/scatter", suffix, ".svg"),
|
paste(experiment, "/scatter.svg", sep = ""),
|
||||||
plot = plot,
|
plot = plot,
|
||||||
)
|
)
|
||||||
BIN
fail/bin/fail-x86-tracing
(Stored with Git LFS)
BIN
fail/bin/fail-x86-tracing
(Stored with Git LFS)
Binary file not shown.
BIN
fail/bin/generic-experiment-client
(Stored with Git LFS)
BIN
fail/bin/generic-experiment-client
(Stored with Git LFS)
Binary file not shown.
BIN
fail/bin/generic-experiment-server
(Stored with Git LFS)
BIN
fail/bin/generic-experiment-server
(Stored with Git LFS)
Binary file not shown.
BIN
fail/bin/import-trace
(Stored with Git LFS)
BIN
fail/bin/import-trace
(Stored with Git LFS)
Binary file not shown.
BIN
fail/bin/prune-trace
(Stored with Git LFS)
BIN
fail/bin/prune-trace
(Stored with Git LFS)
Binary file not shown.
1
fail/src
1
fail/src
Submodule fail/src deleted from dda6da2a50
836
flake.nix
836
flake.nix
@ -12,387 +12,529 @@ rec {
|
|||||||
flake-utils,
|
flake-utils,
|
||||||
}:
|
}:
|
||||||
# Create a shell (and possibly package) for each possible system, not only x86_64-linux
|
# Create a shell (and possibly package) for each possible system, not only x86_64-linux
|
||||||
flake-utils.lib.eachDefaultSystem (
|
flake-utils.lib.eachDefaultSystem (system: let
|
||||||
system: let
|
# =========================================================================================
|
||||||
# =========================================================================================
|
# Define pkgs/stdenvs
|
||||||
# Define pkgs/stdenvs
|
# =========================================================================================
|
||||||
# =========================================================================================
|
pkgs = import nixpkgs {
|
||||||
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;
|
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;
|
inherit system;
|
||||||
config.allowUnfree = true;
|
|
||||||
overlays = [];
|
|
||||||
|
|
||||||
# Build crosscompiler
|
|
||||||
crossSystem = {
|
|
||||||
config = "i386-elf";
|
|
||||||
libc = "newlib";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
boost_pkgs =
|
inherit (pkgs) lib stdenv;
|
||||||
import
|
|
||||||
(builtins.fetchTarball {
|
|
||||||
url = "https://github.com/NixOS/nixpkgs/archive/824421b1796332ad1bcb35bc7855da832c43305f.tar.gz";
|
|
||||||
sha256 = "sha256:1w6cjnakz1yi66rs8c6nmhymsr7bj82vs2hz200ipi1sfiq8dy4y";
|
|
||||||
})
|
|
||||||
{
|
|
||||||
inherit system;
|
|
||||||
};
|
|
||||||
|
|
||||||
libdwarf_pkgs =
|
# =========================================================================================
|
||||||
import
|
# Define shell environment
|
||||||
(builtins.fetchTarball {
|
# =========================================================================================
|
||||||
url = "https://github.com/NixOS/nixpkgs/archive/f597e7e9fcf37d8ed14a12835ede0a7d362314bd.tar.gz";
|
|
||||||
sha256 = "sha256:1l79hh7jh7m8yc5mvc8dbg6s8rf30bgm994kf07xriqbzwfn158r";
|
|
||||||
})
|
|
||||||
{
|
|
||||||
inherit system;
|
|
||||||
};
|
|
||||||
|
|
||||||
inherit (pkgs) lib stdenv;
|
# Setup the shell when entering the "nix develop" environment (bash script).
|
||||||
|
shellHook = let
|
||||||
# =========================================================================================
|
mkCmakeScript = type: let
|
||||||
# Define shell environment
|
typeLower = lib.toLower type;
|
||||||
# =========================================================================================
|
|
||||||
|
|
||||||
# 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)}
|
|
||||||
'';
|
|
||||||
in
|
in
|
||||||
builtins.concatStringsSep "\n" [
|
pkgs.writers.writeFish "cmake-${typeLower}.fish" ''
|
||||||
# Launch into pure fish shell
|
cd $FLAKE_PROJECT_ROOT
|
||||||
''
|
|
||||||
# Can't do the "exec" with nix-direnv
|
|
||||||
# - The "exec fish" would call direnv again => Infinite loop
|
|
||||||
# - The shellHook is Bash/POSIX, so fish syntax doesn't work
|
|
||||||
# exec "$(type -p fish)" -C "source ${initProjectShell} && abbr -a menu '${pkgs.bat}/bin/bat "${initProjectShell}"'"
|
|
||||||
|
|
||||||
# Determine the project root, used e.g. in cmake scripts
|
echo "Removing build directory ./cmake-build-${typeLower}/"
|
||||||
export FLAKE_PROJECT_ROOT="$(git rev-parse --show-toplevel)"
|
rm -rf ./cmake-build-${typeLower}
|
||||||
export INIT_PROJECT_SHELL="${initProjectShell}"
|
|
||||||
export UNLOAD_PROJECT_SHELL="${unloadProjectShell}"
|
|
||||||
''
|
|
||||||
];
|
|
||||||
|
|
||||||
# ===========================================================================================
|
echo "Creating build directory"
|
||||||
# Define custom dependencies
|
mkdir cmake-build-${typeLower}
|
||||||
# ===========================================================================================
|
cd cmake-build-${typeLower}
|
||||||
|
|
||||||
python = pkgs.python314.withPackages (
|
echo "Running cmake"
|
||||||
p:
|
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE="${type}" -DCMAKE_EXPORT_COMPILE_COMMANDS="On" ..
|
||||||
with p; [
|
|
||||||
setuptools
|
|
||||||
flask
|
|
||||||
flask-mysqldb
|
|
||||||
pyyaml
|
|
||||||
tabulate
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
# perl = pkgs.perl.withPackages (p:
|
echo "Linking compile_commands.json"
|
||||||
# with p; [
|
cd ..
|
||||||
# # Those are already installed system-wide
|
ln -sf ./cmake-build-${typeLower}/compile_commands.json ./compile_commands.json
|
||||||
# # 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
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
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
|
eraseAbbr = name: value: ''abbr --erase ${name} 2>/dev/null'';
|
||||||
wasi-sdk = stdenv.mkDerivation rec {
|
createAbbr = name: value: ''abbr -a ${name} "${value}"'';
|
||||||
pname = "wasi-sdk";
|
|
||||||
version = "29";
|
|
||||||
|
|
||||||
src = let
|
# This will be sourced by the global fish config if INIT_PROJECT_SHELL gets unset
|
||||||
baseurl = "https://github.com/WebAssembly/wasi-sdk/releases/download";
|
unloadProjectShell = pkgs.writers.writeFish "unload-shell.fish" ''
|
||||||
in
|
echo "Unloading \"${description}\" environment..."
|
||||||
builtins.fetchTarball {
|
|
||||||
url = "${baseurl}/${pname}-${version}/${pname}-${version}.0-x86_64-linux.tar.gz";
|
|
||||||
sha256 = "sha256:16afis71iqfvwiny4dz0lk9f7wbary0wa67ybwyhywr8g57ss6hq";
|
|
||||||
};
|
|
||||||
|
|
||||||
nativeBuildInputs = with pkgs; [
|
${builtins.concatStringsSep "\n" (lib.mapAttrsToList eraseAbbr abbrs)}
|
||||||
autoPatchelfHook
|
'';
|
||||||
];
|
|
||||||
|
|
||||||
buildInputs = with pkgs; [
|
# This will be sourced by the global fish config if INIT_PROJECT_SHELL gets set
|
||||||
libgcc.lib
|
initProjectShell = pkgs.writers.writeFish "init-shell.fish" ''
|
||||||
];
|
# Unload just in case, to not have redefinition errors
|
||||||
|
source ${unloadProjectShell}
|
||||||
|
|
||||||
dontBuild = true;
|
echo "Sourcing \"${description}\" environment..."
|
||||||
installPhase = ''
|
|
||||||
runHook preInstall
|
|
||||||
|
|
||||||
mkdir -p $out
|
${builtins.concatStringsSep "\n" (lib.mapAttrsToList createAbbr abbrs)}
|
||||||
cp -rv ./* $out/
|
'';
|
||||||
|
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
|
# 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}"
|
||||||
# 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
|
|
||||||
];
|
];
|
||||||
|
|
||||||
# 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
|
# Define custom dependencies
|
||||||
# - Interpreters needed by patchShebangs for scripts which are installed, which can be the case for e.g. perl
|
# ===========================================================================================
|
||||||
buildInputs = with pkgs; [];
|
|
||||||
|
|
||||||
# ===========================================================================================
|
python = pkgs.python314.withPackages (p:
|
||||||
# Define buildable + installable packages
|
with p; [
|
||||||
# ===========================================================================================
|
setuptools
|
||||||
|
flask
|
||||||
|
flask-mysqldb
|
||||||
|
pyyaml
|
||||||
|
]);
|
||||||
|
|
||||||
fail-bin = stdenv.mkDerivation {
|
# perl = pkgs.perl.withPackages (p:
|
||||||
pname = "fail";
|
# with p; [
|
||||||
version = "1.0.0";
|
# # Those are already installed system-wide
|
||||||
src = ./.;
|
# # 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;
|
dontStrip = true;
|
||||||
|
cmakeBuildType = buildtype;
|
||||||
|
cmakeFlags =
|
||||||
|
extraCmakeFlags
|
||||||
|
++ [
|
||||||
|
"-DCMAKE_VERBOSE_MAKEFILE=ON"
|
||||||
|
"-DCMAKE_COLOR_DIAGNOSTICS=ON"
|
||||||
|
|
||||||
nativeBuildInputs = with pkgs; [
|
"-DWAMR_BUILD_PLATFORM=${platform}"
|
||||||
autoPatchelfHook
|
"-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; [
|
# Since GCC 15, implicit declarations are an error. Disable this.
|
||||||
# FAIL runtime dependencies
|
NIX_CFLAGS_COMPILE = "-Wno-error=implicit-function-declaration " + cflags;
|
||||||
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 = {
|
libiwasm-baremetal-debug = mkLibiwasm {
|
||||||
# Provide default environment for "nix develop".
|
buildenv = i386_pkgs.stdenv;
|
||||||
# Other environments can be added below.
|
platform = "baremetal";
|
||||||
default = pkgs.mkShell {
|
buildtype = "Debug";
|
||||||
inherit nativeBuildInputs buildInputs shellHook;
|
cflags = "-O0 -ggdb3";
|
||||||
name = description;
|
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"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
# =========================================================================================
|
libiwasm-linux-debug = mkLibiwasm {
|
||||||
# Define environment variables
|
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
|
# Add dependencies to nativeBuildInputs if they are executed during the build:
|
||||||
FAIL_SHARE = "${fail-bin}/share";
|
# - Those which are needed on $PATH during the build, for example cmake and pkg-config
|
||||||
FAIL_PYTHON = "${python}/bin/python";
|
# - Setup hooks, for example makeWrapper/autoPatchelfHook
|
||||||
WASI_ROOT = wasi-sdk;
|
# - Interpreters needed by patchShebangs for build scripts (with the --build flag), which can be the case for e.g. perl
|
||||||
WAMR_ROOT = "/home/christoph/Notes/TU/MastersThesis/FailNix/wamr";
|
nativeBuildInputs = with pkgs; [
|
||||||
CROSS_CC = "${i386_pkgs.stdenv.cc}/bin/i386-elf-gcc";
|
just
|
||||||
CROSS_CXX = "${i386_pkgs.stdenv.cc}/bin/i386-elf-g++";
|
gdb
|
||||||
LINUX_CC = "${pkgs.multiStdenv.cc}/bin/gcc";
|
xxd
|
||||||
LINUX_CXX = "${pkgs.multiStdenv.cc}/bin/g++";
|
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
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
108
just-bin/Cargo.toml
Normal 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
152
just-bin/GRAMMAR.md
Normal 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
121
just-bin/LICENSE
Normal 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
4882
just-bin/README.md
Normal file
File diff suppressed because it is too large
Load Diff
189
just-bin/completions/just.bash
Normal file
189
just-bin/completions/just.bash
Normal 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
|
||||||
94
just-bin/completions/just.elvish
Normal file
94
just-bin/completions/just.elvish
Normal 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]
|
||||||
|
}
|
||||||
87
just-bin/completions/just.fish
Normal file
87
just-bin/completions/just.fish
Normal 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'
|
||||||
8
just-bin/completions/just.nu
Normal file
8
just-bin/completions/just.nu
Normal 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)
|
||||||
|
]
|
||||||
120
just-bin/completions/just.powershell
Normal file
120
just-bin/completions/just.powershell
Normal 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
|
||||||
|
}
|
||||||
181
just-bin/completions/just.zsh
Normal file
181
just-bin/completions/just.zsh
Normal 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
BIN
just-bin/just
(Stored with Git LFS)
Executable file
Binary file not shown.
294
just-bin/just.1
Normal file
294
just-bin/just.1
Normal 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>
|
||||||
72
schema.sql
72
schema.sql
@ -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;
|
|
||||||
@ -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;
|
|
||||||
@ -1,23 +1,13 @@
|
|||||||
package Faults;
|
package Queries::Faults;
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use diagnostics;
|
use diagnostics;
|
||||||
|
|
||||||
use FindBin;
|
|
||||||
use lib "$FindBin::Bin/../Modules";
|
|
||||||
use Filters;
|
|
||||||
|
|
||||||
use feature 'say';
|
|
||||||
|
|
||||||
sub query {
|
sub query {
|
||||||
my ( $experiment, $experiment_dir, $filter_config_name ) = @_;
|
my ($experiment) = @_;
|
||||||
$filter_config_name //= '';
|
|
||||||
|
|
||||||
my $filters =
|
return "SELECT
|
||||||
Filters::build_filter_clause( $experiment_dir, $filter_config_name );
|
|
||||||
|
|
||||||
my $querystring = "SELECT
|
|
||||||
benchmark, resulttype, SUM(t.time2 - t.time1 + 1) AS faults,
|
benchmark, resulttype, SUM(t.time2 - t.time1 + 1) AS faults,
|
||||||
CONCAT('0x', HEX(p.injection_instr_absolute)) AS fault_address
|
CONCAT('0x', HEX(p.injection_instr_absolute)) AS fault_address
|
||||||
FROM variant v
|
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 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 result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||||
JOIN fsppilot p ON r.pilot_id = p.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
|
GROUP BY benchmark, resulttype, p.injection_instr_absolute
|
||||||
ORDER BY benchmark, resulttype, SUM(t.time2 - t.time1 + 1) DESC;";
|
ORDER BY benchmark, resulttype, SUM(t.time2 - t.time1 + 1) DESC;";
|
||||||
|
|
||||||
say $querystring;
|
|
||||||
|
|
||||||
return $querystring;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub args { return "--batch --raw"; }
|
sub args { return "--batch --raw"; }
|
||||||
|
|
||||||
sub filename {
|
sub filename { return "faults.csv"; }
|
||||||
my ($filter_config_name) = @_;
|
|
||||||
$filter_config_name //= '';
|
|
||||||
my $suffix = length($filter_config_name) ? "_$filter_config_name" : "";
|
|
||||||
return "faults${suffix}.csv";
|
|
||||||
}
|
|
||||||
|
|
||||||
sub postprocess { $_[0] =~ s/\t/,/g; }
|
sub postprocess { $_[0] =~ s/\t/,/g; }
|
||||||
|
|
||||||
|
|||||||
@ -1,46 +1,27 @@
|
|||||||
package Results;
|
package Queries::Results;
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use diagnostics;
|
use diagnostics;
|
||||||
|
|
||||||
use FindBin;
|
|
||||||
use lib "$FindBin::Bin/../Modules";
|
|
||||||
use Filters;
|
|
||||||
|
|
||||||
use feature 'say';
|
|
||||||
|
|
||||||
sub query {
|
sub query {
|
||||||
my ( $experiment, $experiment_dir, $filter_config_name ) = @_;
|
my ($experiment) = @_;
|
||||||
$filter_config_name //= '';
|
|
||||||
|
|
||||||
my $extra =
|
return "SELECT
|
||||||
Filters::build_filter_clause( $experiment_dir, $filter_config_name );
|
|
||||||
|
|
||||||
my $querystring = "SELECT
|
|
||||||
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
||||||
FROM variant v
|
FROM variant v
|
||||||
JOIN trace t ON v.id = t.variant_id
|
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 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 result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||||
JOIN fsppilot p ON r.pilot_id = p.id
|
JOIN fsppilot p ON r.pilot_id = p.id
|
||||||
WHERE v.variant = '$experiment'$extra
|
WHERE v.variant = '$experiment'
|
||||||
GROUP BY v.id, resulttype
|
GROUP BY v.id, resulttype
|
||||||
ORDER BY variant, benchmark, resulttype;";
|
ORDER BY variant, benchmark, resulttype;";
|
||||||
|
|
||||||
say $querystring;
|
|
||||||
|
|
||||||
return $querystring;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub args { return "-t"; }
|
sub args { return "-t"; }
|
||||||
|
|
||||||
sub filename {
|
sub filename { return "results.txt"; }
|
||||||
my ($filter_config_name) = @_;
|
|
||||||
$filter_config_name //= '';
|
|
||||||
my $suffix = length($filter_config_name) ? "_$filter_config_name" : "";
|
|
||||||
return "results${suffix}.txt";
|
|
||||||
}
|
|
||||||
|
|
||||||
sub postprocess { }
|
sub postprocess { }
|
||||||
|
|
||||||
|
|||||||
@ -1,46 +1,27 @@
|
|||||||
package ResultsData;
|
package Queries::ResultsData;
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use diagnostics;
|
use diagnostics;
|
||||||
|
|
||||||
use FindBin;
|
|
||||||
use lib "$FindBin::Bin/../Modules";
|
|
||||||
use Filters;
|
|
||||||
|
|
||||||
use feature 'say';
|
|
||||||
|
|
||||||
sub query {
|
sub query {
|
||||||
my ( $experiment, $experiment_dir, $filter_config_name ) = @_;
|
my ($experiment) = @_;
|
||||||
$filter_config_name //= '';
|
|
||||||
|
|
||||||
my $extra =
|
return "SELECT
|
||||||
Filters::build_filter_clause( $experiment_dir, $filter_config_name );
|
|
||||||
|
|
||||||
my $querystring = "SELECT
|
|
||||||
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
||||||
FROM variant v
|
FROM variant v
|
||||||
JOIN trace t ON v.id = t.variant_id
|
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 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 result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||||
JOIN fsppilot p ON r.pilot_id = p.id
|
JOIN fsppilot p ON r.pilot_id = p.id
|
||||||
WHERE v.variant = '$experiment'$extra
|
WHERE v.variant = '$experiment'
|
||||||
GROUP BY v.id, resulttype
|
GROUP BY v.id, resulttype
|
||||||
ORDER BY variant, benchmark, resulttype;";
|
ORDER BY variant, benchmark, resulttype;";
|
||||||
|
|
||||||
say $querystring;
|
|
||||||
|
|
||||||
return $querystring;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub args { return "--batch --raw"; }
|
sub args { return "--batch --raw"; }
|
||||||
|
|
||||||
sub filename {
|
sub filename { return "resultsdata.csv"; }
|
||||||
my ($filter_config_name) = @_;
|
|
||||||
$filter_config_name //= '';
|
|
||||||
my $suffix = length($filter_config_name) ? "_$filter_config_name" : "";
|
|
||||||
return "resultsdata${suffix}.csv";
|
|
||||||
}
|
|
||||||
|
|
||||||
sub postprocess { $_[0] =~ s/\t/,/g; }
|
sub postprocess { $_[0] =~ s/\t/,/g; }
|
||||||
|
|
||||||
|
|||||||
@ -33,13 +33,11 @@ sub select_from_list {
|
|||||||
: map { $_ => $_ } @items;
|
: map { $_ => $_ } @items;
|
||||||
|
|
||||||
my @selection;
|
my @selection;
|
||||||
my @selection_order; # multiselect only: items in toggle order
|
|
||||||
|
|
||||||
my $cui = init_cui();
|
my $cui = init_cui();
|
||||||
my $win = $cui->add( 'root', 'Window', );
|
my $win = $cui->add( 'root', 'Window', );
|
||||||
|
|
||||||
my $listbox;
|
my $listbox = $win->add(
|
||||||
$listbox = $win->add(
|
|
||||||
'item_list',
|
'item_list',
|
||||||
'Listbox',
|
'Listbox',
|
||||||
-title => $title,
|
-title => $title,
|
||||||
@ -49,20 +47,7 @@ sub select_from_list {
|
|||||||
-multi => $multiselect == 1,
|
-multi => $multiselect == 1,
|
||||||
-radio => $multiselect == 0,
|
-radio => $multiselect == 0,
|
||||||
-padbottom => 1,
|
-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(
|
$win->add(
|
||||||
@ -79,9 +64,6 @@ sub select_from_list {
|
|||||||
if ( $multiselect && grep { $_ eq '__ALL__' } @picked ) {
|
if ( $multiselect && grep { $_ eq '__ALL__' } @picked ) {
|
||||||
@selection = @items;
|
@selection = @items;
|
||||||
}
|
}
|
||||||
elsif ($multiselect) {
|
|
||||||
@selection = @selection_order;
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
@selection = @picked;
|
@selection = @picked;
|
||||||
}
|
}
|
||||||
@ -5,13 +5,6 @@ use warnings;
|
|||||||
use diagnostics;
|
use diagnostics;
|
||||||
|
|
||||||
use DateTime;
|
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';
|
use feature 'say';
|
||||||
|
|
||||||
@ -56,29 +49,6 @@ sub date_now {
|
|||||||
return $date;
|
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 {
|
sub rewrite_file {
|
||||||
my ( $file, $matches, $replacement ) = @_;
|
my ( $file, $matches, $replacement ) = @_;
|
||||||
|
|
||||||
@ -133,26 +103,23 @@ sub find_subdirs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub execute_query {
|
sub execute_query {
|
||||||
my ( $experiment, $queryname, $db_conf, $builds_dir, $do_notify_file,
|
my ( $experiment, $queryname, $db_conf, $builds_dir, $do_notify_file ) = @_;
|
||||||
$filter_config_name )
|
|
||||||
= @_;
|
|
||||||
|
|
||||||
my $module = "$queryname";
|
my $module = "Queries::$queryname";
|
||||||
my $file = "$module.pm";
|
my $file = "$module.pm";
|
||||||
$file =~ s/::/\//g;
|
$file =~ s/::/\//g;
|
||||||
|
|
||||||
require $file;
|
require $file;
|
||||||
|
|
||||||
my $query = $module->can('query') or die "$module can't query()";
|
my $query = $module->can('query') or die "$module can't query()";
|
||||||
my $args = $module->can('args') or die "$module can't args()";
|
my $args = $module->can('args') or die "$module can't args()";
|
||||||
my $filename = $module->can('filename') or die "$module can't filename()";
|
my $filename = $module->can('filename') or die "$module can't filanem()";
|
||||||
my $postprocess = $module->can('postprocess')
|
my $postprocess = $module->can('postprocess')
|
||||||
or die "$module can't postprocess()";
|
or die "$module can't postprocess()";
|
||||||
|
|
||||||
my $querystring =
|
my $querystring = $query->($experiment);
|
||||||
$query->( $experiment, "$builds_dir/$experiment", $filter_config_name );
|
|
||||||
my $argsstring = $args->();
|
my $argsstring = $args->();
|
||||||
my $filenamestring = $filename->($filter_config_name);
|
my $filenamestring = $filename->();
|
||||||
|
|
||||||
# TODO: Pass the values instead of rewriting db.conf.
|
# TODO: Pass the values instead of rewriting db.conf.
|
||||||
# Can also use DBI's database handle directly.
|
# Can also use DBI's database handle directly.
|
||||||
@ -181,13 +148,6 @@ sub format_number_sep {
|
|||||||
return $number;
|
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 {
|
sub elf_read_sections {
|
||||||
my ($elffile) = @_;
|
my ($elffile) = @_;
|
||||||
|
|
||||||
@ -281,27 +241,6 @@ sub delete_marker_info {
|
|||||||
"$local_archive_dir/$experiment/markers/$benchmark-$address.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 {
|
sub select_experiment {
|
||||||
my ($multi) = @_;
|
my ($multi) = @_;
|
||||||
|
|
||||||
@ -321,8 +260,7 @@ sub select_experiment {
|
|||||||
TUI::select_from_list( "Select Experiment", $multi, @exp_with_notes );
|
TUI::select_from_list( "Select Experiment", $multi, @exp_with_notes );
|
||||||
die "No experiment selected" unless @selected_experiments;
|
die "No experiment selected" unless @selected_experiments;
|
||||||
|
|
||||||
@selected_experiments =
|
map { s/(.*?)\s+\(.+\)$/$1/ } @selected_experiments;
|
||||||
map { s/(.*?)\s+\(.+\)$/$1/r } @selected_experiments;
|
|
||||||
|
|
||||||
return $multi == 1 ? @selected_experiments : $selected_experiments[0];
|
return $multi == 1 ? @selected_experiments : $selected_experiments[0];
|
||||||
}
|
}
|
||||||
270
scripts/build.pl
270
scripts/build.pl
@ -5,35 +5,28 @@ use warnings;
|
|||||||
use diagnostics;
|
use diagnostics;
|
||||||
|
|
||||||
use FindBin;
|
use FindBin;
|
||||||
use lib "$FindBin::Bin/Modules";
|
use lib $FindBin::Bin;
|
||||||
|
|
||||||
use Util;
|
use Util;
|
||||||
use TUI;
|
use TUI;
|
||||||
|
|
||||||
use POSIX qw(strftime);
|
|
||||||
use feature 'say';
|
use feature 'say';
|
||||||
|
|
||||||
|
my $date = Util::date_now;
|
||||||
|
|
||||||
my $local_root = '/home/christoph/Notes/TU/MastersThesis/FailNix';
|
my $local_root = '/home/christoph/Notes/TU/MastersThesis/FailNix';
|
||||||
my $local_builds_dir = "$local_root/builds";
|
my $local_builds_dir = "$local_root/builds";
|
||||||
my $local_experiments_dir = "$local_root/targets/wasm-module";
|
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 @targets = ( "fail", "linux", "linux-baremetal" );
|
||||||
my ( $module, $target, $mode ) = @_;
|
my @modes = ( "c", "aot", "interp" );
|
||||||
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";
|
|
||||||
|
|
||||||
system(
|
sub just {
|
||||||
"perl $compile_pl $module $target $mode > $local_root/build.log 2>&1")
|
say "Running: just @_...";
|
||||||
== 0
|
system("$justbin -d $local_root -f $justfile @_")
|
||||||
or die "Build failed\n";
|
and die "Build failed";
|
||||||
sleep(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Find and select experiments
|
# Find and select experiments
|
||||||
@ -43,263 +36,28 @@ my @selected_experiments =
|
|||||||
die "No experiment selected" unless @selected_experiments;
|
die "No experiment selected" unless @selected_experiments;
|
||||||
|
|
||||||
# Select targets
|
# Select targets
|
||||||
my @targets = ( "fail", "linux", "linux-baremetal" );
|
|
||||||
my @selected_targets =
|
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;
|
die "No target selected" unless @selected_targets;
|
||||||
|
|
||||||
# Select modes
|
# Select modes
|
||||||
my @modes = ( "c", "aot", "interp" );
|
|
||||||
my @selected_modes =
|
my @selected_modes =
|
||||||
TUI::select_from_list( "Select Execution Modes", 1, @modes );
|
TUI::select_from_list( "Select Execution Modes", 1, @modes );
|
||||||
die "No mode selected" unless @selected_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
|
# Build everything
|
||||||
# ========================================================================================= #
|
|
||||||
|
|
||||||
# TODO: linux-baremetal target is broken
|
# TODO: linux-baremetal target is broken
|
||||||
system( "mkdir", "-p", "$local_builds_dir" );
|
system( "mkdir", "-p", "$local_builds_dir" );
|
||||||
foreach my $experiment (@selected_experiments) {
|
foreach my $experiment (@selected_experiments) {
|
||||||
foreach my $target (@selected_targets) {
|
foreach my $target (@selected_targets) {
|
||||||
foreach my $mode (@selected_modes) {
|
foreach my $mode (@selected_modes) {
|
||||||
|
just( "build", $experiment, $target, $mode );
|
||||||
my $allocator_info = "";
|
|
||||||
if ( $mode eq "aot" || $mode eq "interp" ) {
|
|
||||||
$allocator_info =
|
|
||||||
$selected_allocator_variant eq $allocator_variants[0]
|
|
||||||
? "alloc_pool"
|
|
||||||
: "alloc_usage";
|
|
||||||
}
|
|
||||||
my $xip_info =
|
|
||||||
( $mode eq "aot"
|
|
||||||
&& $selected_xip_variant
|
|
||||||
&& $selected_xip_variant eq $xip_variants[0] )
|
|
||||||
? "xip"
|
|
||||||
: "";
|
|
||||||
my $aot_info =
|
|
||||||
( $mode eq "aot"
|
|
||||||
&& $selected_aot_variant
|
|
||||||
&& $selected_aot_variant eq $aot_section_variants[0] )
|
|
||||||
? "wamr_aot"
|
|
||||||
: "";
|
|
||||||
my $mmap_info =
|
|
||||||
( ( $mode eq "aot" || $mode eq "interp" )
|
|
||||||
&& $selected_mmap_variant eq $mmap_variants[0] )
|
|
||||||
? "wamr_mmap"
|
|
||||||
: "";
|
|
||||||
my $global_heap_info =
|
|
||||||
( ( $mode eq "aot" || $mode eq "interp" )
|
|
||||||
&& $selected_global_heap_variant
|
|
||||||
&& $selected_global_heap_variant eq $global_heap_variants[0] )
|
|
||||||
? "wamr_global_heap"
|
|
||||||
: "";
|
|
||||||
my $runtime_pool_info =
|
|
||||||
( ( $mode eq "aot" || $mode eq "interp" )
|
|
||||||
&& $selected_runtime_pool_variant
|
|
||||||
&& $selected_runtime_pool_variant eq
|
|
||||||
$runtime_pool_variants[0] )
|
|
||||||
? "wamr_runtime_pool"
|
|
||||||
: "";
|
|
||||||
my $linear_pool_info =
|
|
||||||
( ( $mode eq "aot" || $mode eq "interp" )
|
|
||||||
&& $selected_linear_pool_variant
|
|
||||||
&& $selected_linear_pool_variant eq $linear_pool_variants[0] )
|
|
||||||
? "wamr_linear_pool"
|
|
||||||
: "";
|
|
||||||
my $flags_info = join " ", @selected_catch_flags;
|
|
||||||
|
|
||||||
my $info_str = join " ",
|
|
||||||
grep { length } (
|
|
||||||
$mode, $aot_info, $mmap_info,
|
|
||||||
$allocator_info, $global_heap_info, $runtime_pool_info,
|
|
||||||
$linear_pool_info, $xip_info, $flags_info
|
|
||||||
);
|
|
||||||
|
|
||||||
# Build experiment
|
|
||||||
my $date = strftime( "%m-%d_%H-%M-%S", localtime );
|
|
||||||
compile( $experiment, $target, $mode );
|
|
||||||
|
|
||||||
# Write extra info for the menu
|
|
||||||
system("echo '$info_str' > $local_root/build-$experiment/0.info");
|
|
||||||
|
|
||||||
# Write runner_flags so runner.pl knows which FAIL flags to use
|
|
||||||
my $runner_flags_path =
|
|
||||||
"$local_root/build-$experiment/runner_flags";
|
|
||||||
open( my $fhandle, '>', $runner_flags_path )
|
|
||||||
or die "Cannot write $runner_flags_path: $!";
|
|
||||||
print $fhandle "$catch_flag_map{$_}\n" for @selected_catch_flags;
|
|
||||||
close($fhandle);
|
|
||||||
|
|
||||||
system( "mv", "$local_root/build.log",
|
|
||||||
"$local_root/build-$experiment/build.log" );
|
|
||||||
|
|
||||||
system(
|
system(
|
||||||
join " ",
|
join " ",
|
||||||
(
|
(
|
||||||
"mv",
|
"mv",
|
||||||
"$local_root/build-$experiment",
|
"$local_root/build-$experiment",
|
||||||
"$local_builds_dir/${date}_${experiment}_${mode}_${target}",
|
"$local_builds_dir/${date}_$experiment-$target-$mode",
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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" );
|
|
||||||
}
|
|
||||||
@ -5,7 +5,7 @@ use warnings;
|
|||||||
use diagnostics;
|
use diagnostics;
|
||||||
|
|
||||||
use FindBin;
|
use FindBin;
|
||||||
use lib "$FindBin::Bin/Modules";
|
use lib $FindBin::Bin;
|
||||||
|
|
||||||
use Util;
|
use Util;
|
||||||
use Mars;
|
use Mars;
|
||||||
@ -18,8 +18,8 @@ my $local_builds_dir = "$local_root/builds";
|
|||||||
|
|
||||||
my $remote_root = '/home/lab/smchurla/Documents/failnix';
|
my $remote_root = '/home/lab/smchurla/Documents/failnix';
|
||||||
my $remote_builds_dir = "$remote_root/builds";
|
my $remote_builds_dir = "$remote_root/builds";
|
||||||
my $remote_runner = "$remote_root/scripts/multi_runner.pl";
|
my $remote_runner = "$remote_root/scripts/runner.pl";
|
||||||
my $remote_log = "$remote_root/multi_runner.log";
|
my $remote_log = "$remote_root/runner.log";
|
||||||
|
|
||||||
# Upload new experiments
|
# Upload new experiments
|
||||||
my @experiments = grep { /fail/ } Util::find_subdirs($local_builds_dir);
|
my @experiments = grep { /fail/ } Util::find_subdirs($local_builds_dir);
|
||||||
|
|||||||
@ -5,7 +5,7 @@ use warnings;
|
|||||||
use diagnostics;
|
use diagnostics;
|
||||||
|
|
||||||
use FindBin;
|
use FindBin;
|
||||||
use lib "$FindBin::Bin/Modules";
|
use lib $FindBin::Bin;
|
||||||
|
|
||||||
use Util;
|
use Util;
|
||||||
use Mars;
|
use Mars;
|
||||||
@ -23,9 +23,6 @@ my $local_archive_dir = "$local_root/injections";
|
|||||||
# Select experiment to open
|
# Select experiment to open
|
||||||
my $selected_experiment = Util::select_experiment(0);
|
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();
|
my $cui = TUI::init_cui();
|
||||||
|
|
||||||
# TODO: Add a TextEditor panel beside the experiment selection for notes.
|
# TODO: Add a TextEditor panel beside the experiment selection for notes.
|
||||||
@ -54,10 +51,10 @@ my $source_text;
|
|||||||
|
|
||||||
my @benchs = ( "ip", "mem", "regs" );
|
my @benchs = ( "ip", "mem", "regs" );
|
||||||
my @markers = (
|
my @markers = (
|
||||||
"OK_MARKER", "DETECTED_MARKER",
|
"OK_MARKER", "DETECTED_MARKER",
|
||||||
"FAIL_MARKER", "TRAP",
|
"FAIL_MARKER", "TRAP",
|
||||||
"TIMEOUT", "ACCESS_OUTERSPACE",
|
"TIMEOUT", "ACCESS_OUTERSPACE",
|
||||||
"WRITE_TEXTSEGMENT", "GROUP1_MARKER",
|
"WRITE_TEXTSEGMENT",
|
||||||
);
|
);
|
||||||
|
|
||||||
# Filter popup state
|
# Filter popup state
|
||||||
@ -98,7 +95,7 @@ sub load_faults_csv {
|
|||||||
|
|
||||||
# Schema: benchmark, resulttype, faults, fault_address
|
# Schema: benchmark, resulttype, faults, fault_address
|
||||||
my $data = Text::CSV_XS::csv(
|
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'
|
headers => 'auto'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
134
scripts/fail.just
Normal file
134
scripts/fail.just
Normal 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
35
scripts/mars.just
Normal 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
|
||||||
194
scripts/menu.pl
194
scripts/menu.pl
@ -5,30 +5,34 @@ use warnings;
|
|||||||
use diagnostics;
|
use diagnostics;
|
||||||
|
|
||||||
use FindBin;
|
use FindBin;
|
||||||
use lib "$FindBin::Bin/Modules";
|
use lib $FindBin::Bin;
|
||||||
|
|
||||||
use Util;
|
use Util;
|
||||||
use Mars;
|
use Mars;
|
||||||
use TUI;
|
use TUI;
|
||||||
use Filters;
|
|
||||||
use Text::CSV_XS;
|
use Text::CSV_XS;
|
||||||
|
|
||||||
use feature 'say';
|
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
|
# TODO: Much can be extracted into utility functions
|
||||||
|
|
||||||
my $local_obsidian = '/home/christoph/Notes/Obsidian/Chriphost';
|
my $local_obsidian = '/home/christoph/Notes/Obsidian/Chriphost';
|
||||||
my $local_obsidian_attach = "$local_obsidian/attach";
|
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_newlib = '/home/christoph/Notes/TU/MastersThesis/07 NewLib';
|
||||||
my $local_root = '/home/christoph/Notes/TU/MastersThesis/FailNix';
|
my $local_root = '/home/christoph/Notes/TU/MastersThesis/FailNix';
|
||||||
my $local_wamr = "$local_root/wamr";
|
|
||||||
my $local_scripts_dir = "$local_root/scripts";
|
my $local_scripts_dir = "$local_root/scripts";
|
||||||
my $local_builds_dir = "$local_root/builds";
|
my $local_builds_dir = "$local_root/builds";
|
||||||
my $local_archive_dir = "$local_root/injections";
|
my $local_archive_dir = "$local_root/injections";
|
||||||
my $local_charts_dir = "$local_root/scripts/charts";
|
my $local_charts_dir = "$local_root/charts";
|
||||||
my $local_ghidra_projects = "$local_root/ghidra";
|
my $local_ghidra_projects = "$local_root/ghidra/projects";
|
||||||
my $local_ghidra_scripts = "$local_root/scripts/ghidra";
|
my $local_ghidra_scripts = "$local_root/ghidra/scripts";
|
||||||
my $local_db_conf = "$local_root/db.conf";
|
my $local_db_conf = "$local_root/db.conf";
|
||||||
|
|
||||||
my $resultbrowser_port = '5000';
|
my $resultbrowser_port = '5000';
|
||||||
@ -42,10 +46,10 @@ my $db_port = "3306";
|
|||||||
my $db_user = "smchurla";
|
my $db_user = "smchurla";
|
||||||
|
|
||||||
my %handlers = (
|
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)' =>
|
'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 {
|
'03. Archive Experiments (Downloads from Mars)' => sub {
|
||||||
|
|
||||||
@ -68,6 +72,9 @@ my %handlers = (
|
|||||||
Mars::download_dir( "$remote_builds_dir/$_",
|
Mars::download_dir( "$remote_builds_dir/$_",
|
||||||
"$local_archive_dir/" . $_ =~ s/:/-/gr )
|
"$local_archive_dir/" . $_ =~ s/:/-/gr )
|
||||||
for @selected_dirs;
|
for @selected_dirs;
|
||||||
|
|
||||||
|
system( 'touch', "$local_archive_dir/" . $_ =~ s/:/-/gr . "/0.info" )
|
||||||
|
for @selected_dirs;
|
||||||
},
|
},
|
||||||
|
|
||||||
'04. Query Databases (Mars)' => sub {
|
'04. Query Databases (Mars)' => sub {
|
||||||
@ -85,43 +92,15 @@ my %handlers = (
|
|||||||
TUI::select_from_list( "Select Queries to Run", 1, @queries );
|
TUI::select_from_list( "Select Queries to Run", 1, @queries );
|
||||||
die "No query selected" unless @selected_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
|
# Run queries on databases
|
||||||
foreach my $db (@selected_dbs) {
|
foreach my $db (@selected_dbs) {
|
||||||
foreach my $query (@selected_queries) {
|
foreach my $query (@selected_queries) {
|
||||||
foreach my $config (@filter_configs) {
|
Util::rewrite_file( $local_db_conf, "database=",
|
||||||
Util::rewrite_file( $local_db_conf, "database=",
|
"database=$db\n" );
|
||||||
"database=$db\n" );
|
|
||||||
|
|
||||||
my $config_label = length($config) ? " ($config)" : "";
|
say "Running $query on $db...";
|
||||||
say "Running $query$config_label on $db...";
|
Util::execute_query( $db =~ s/smchurla_//r,
|
||||||
Util::execute_query( $db =~ s/smchurla_//r,
|
$query, $local_db_conf, $local_archive_dir, 0 );
|
||||||
$query, $local_db_conf, $local_archive_dir, 0,
|
|
||||||
$config );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -130,8 +109,7 @@ my %handlers = (
|
|||||||
|
|
||||||
my @existing = Util::find_files($local_ghidra_projects);
|
my @existing = Util::find_files($local_ghidra_projects);
|
||||||
|
|
||||||
# Determine if an experiment was already imported
|
my $is_old = sub {
|
||||||
my $project_exists = sub {
|
|
||||||
my ($name) = @_;
|
my ($name) = @_;
|
||||||
$name =~ s/:/-/g;
|
$name =~ s/:/-/g;
|
||||||
|
|
||||||
@ -140,37 +118,23 @@ my %handlers = (
|
|||||||
|
|
||||||
# Import archived experiments into ghidra
|
# Import archived experiments into ghidra
|
||||||
my @dirs =
|
my @dirs =
|
||||||
grep { !$project_exists->($_) }
|
grep { !$is_old->($_) } Util::find_subdirs($local_archive_dir);
|
||||||
Util::find_subdirs($local_archive_dir);
|
|
||||||
|
|
||||||
my @dirs_with_notes;
|
|
||||||
foreach my $dir (@dirs) {
|
|
||||||
my $info = Util::read_experiment_info($dir);
|
|
||||||
|
|
||||||
push @dirs_with_notes,
|
|
||||||
( defined $info && length($info) > 0 )
|
|
||||||
? sprintf( "%-50s (%s)", $dir, $info )
|
|
||||||
: $dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
my @selected_dirs =
|
my @selected_dirs =
|
||||||
TUI::select_from_list( "Select Experiments to Import into Ghidra",
|
TUI::select_from_list( "Select Experiments to Import into Ghidra",
|
||||||
1, @dirs_with_notes );
|
1, @dirs );
|
||||||
|
|
||||||
foreach (@selected_dirs) {
|
foreach (@selected_dirs) {
|
||||||
my $experiment = $_ =~ s/(.*?)\s+\(.+\)$/$1/r;
|
say "Creating Ghidra project for $_...";
|
||||||
|
|
||||||
say "Creating Ghidra project for $experiment...";
|
|
||||||
system(
|
system(
|
||||||
'ghidra-analyzeHeadless',
|
'ghidra-analyzeHeadless',
|
||||||
|
|
||||||
$local_ghidra_projects, $experiment =~ s/:/-/gr,
|
$local_ghidra_projects, $_ =~ s/:/-/gr,
|
||||||
'-import', "$local_archive_dir/$experiment/system.elf",
|
'-import', "$local_archive_dir/$_/system.elf",
|
||||||
'-scriptPath', $local_ghidra_scripts,
|
'-scriptPath', $local_ghidra_scripts,
|
||||||
'-postScript', 'DWARFLineInfoSourceMapScript',
|
'-postScript', 'DWARFLineInfoSourceMapScript',
|
||||||
'-postScript', 'DWARFLineInfoCommentScript',
|
'-postScript', 'DWARFLineInfoCommentScript',
|
||||||
'-postScript', 'ImportMarkersAsBookmarks',
|
'-postScript', 'ImportMarkersAsBookmarks',
|
||||||
"$local_archive_dir/$experiment/faults.csv"
|
"$local_archive_dir/$_/faults.csv"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -234,25 +198,20 @@ my %handlers = (
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
'10. Explore Experiment Results' =>
|
'10. Open Experiment In Explorer' =>
|
||||||
sub { do qq{$local_scripts_dir/explore.pl}; },
|
sub { do "$local_scripts_dir/explore.pl" },
|
||||||
|
|
||||||
'11. Compare Experiment Results' => sub {
|
'11. Compare Experiment Results' => sub {
|
||||||
|
|
||||||
my @selected_experiments = Util::select_experiment(1);
|
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
|
# Read results
|
||||||
my %all_results;
|
my %all_results;
|
||||||
foreach my $experiment (@selected_experiments) {
|
foreach my $experiment (@selected_experiments) {
|
||||||
|
|
||||||
# Schema: benchmark, resulttype, faults
|
# Schema: benchmark, resulttype, faults
|
||||||
my $data = Text::CSV_XS::csv(
|
my $data = Text::CSV_XS::csv(
|
||||||
in => "$local_archive_dir/$experiment/$resultsdata_csv",
|
in => "$local_archive_dir/$experiment/resultsdata.csv",
|
||||||
headers => 'auto'
|
headers => 'auto'
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -264,10 +223,10 @@ my %handlers = (
|
|||||||
|
|
||||||
my @benchs = ( 'ip', 'mem', 'regs' );
|
my @benchs = ( 'ip', 'mem', 'regs' );
|
||||||
my @markers = (
|
my @markers = (
|
||||||
'OK_MARKER', 'FAIL_MARKER',
|
'OK_MARKER', 'FAIL_MARKER',
|
||||||
'DETECTED_MARKER', 'TIMEOUT',
|
'DETECTED_MARKER', 'TIMEOUT',
|
||||||
'TRAP', 'WRITE_TEXTSEGMENT',
|
'TRAP', 'WRITE_TEXTSEGMENT',
|
||||||
'ACCESS_OUTERSPACE', 'GROUP1_MARKER'
|
'ACCESS_OUTERSPACE'
|
||||||
);
|
);
|
||||||
|
|
||||||
my $heading = sprintf( "%5s %20s ", "BENCH", "TYPE" );
|
my $heading = sprintf( "%5s %20s ", "BENCH", "TYPE" );
|
||||||
@ -422,11 +381,7 @@ my %handlers = (
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
'20. Open TablePlus (Mars)' => sub {
|
'20. Run Build in GDB' => sub {
|
||||||
system('tableplus');
|
|
||||||
},
|
|
||||||
|
|
||||||
'21. Run Build in GDB' => sub {
|
|
||||||
my @builds = grep { /linux/ } Util::find_subdirs($local_builds_dir);
|
my @builds = grep { /linux/ } Util::find_subdirs($local_builds_dir);
|
||||||
my @selected_builds =
|
my @selected_builds =
|
||||||
TUI::select_from_list( "Select Build to Run in GDB", 0, @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 $selected_build = $selected_builds[0];
|
||||||
|
|
||||||
my $build_dir = "$local_builds_dir/$selected_build";
|
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";
|
say "$build_name";
|
||||||
|
|
||||||
@ -444,9 +400,7 @@ my %handlers = (
|
|||||||
'-q',
|
'-q',
|
||||||
"$build_dir/system.elf",
|
"$build_dir/system.elf",
|
||||||
'-ex',
|
'-ex',
|
||||||
'set disassembly-flavor intel',
|
"set substitute-path '$module_source' '$build_dir'",
|
||||||
'-ex',
|
|
||||||
"set substitute-path 'build-$build_name' '$build_dir'",
|
|
||||||
'-ex',
|
'-ex',
|
||||||
"set substitute-path '/build/source/core' '$local_wamr/core'",
|
"set substitute-path '/build/source/core' '$local_wamr/core'",
|
||||||
'-ex',
|
'-ex',
|
||||||
@ -461,16 +415,6 @@ my %handlers = (
|
|||||||
'break fail_marker_detected',
|
'break fail_marker_detected',
|
||||||
'-ex',
|
'-ex',
|
||||||
'break fail_marker_negative',
|
'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 );
|
TUI::select_from_list( "Select Plots to Generate", 1, @charts );
|
||||||
die "No plot selected" unless @selected_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;
|
my @single_charts = grep { /single/ } @selected_charts;
|
||||||
foreach my $experiment (@selected_experiments) {
|
foreach my $experiment (@selected_experiments) {
|
||||||
foreach my $chart (@single_charts) {
|
foreach my $chart (@single_charts) {
|
||||||
say " - Generating plot $chart for $experiment...";
|
say " - Generating plot $chart for $experiment...";
|
||||||
my @r_args = (
|
system(
|
||||||
'Rscript',
|
'Rscript',
|
||||||
"$local_charts_dir/$chart.r",
|
"$local_charts_dir/$chart.r",
|
||||||
"$local_archive_dir/$experiment"
|
"$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;
|
map { "$local_archive_dir/$_" } @selected_experiments;
|
||||||
foreach my $chart (@combined_charts) {
|
foreach my $chart (@combined_charts) {
|
||||||
say " - Generating plot $chart for ($print_experiments)...";
|
say " - Generating plot $chart for ($print_experiments)...";
|
||||||
my @r_args =
|
system( 'Rscript', "$local_charts_dir/$chart.r",
|
||||||
( 'Rscript', "$local_charts_dir/$chart.r", @path_experiments );
|
@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);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -585,26 +500,11 @@ my %handlers = (
|
|||||||
'99. Drop Databases (Mars)' => sub {
|
'99. Drop Databases (Mars)' => sub {
|
||||||
|
|
||||||
# Drop databases on mars
|
# Drop databases on mars
|
||||||
my @dbs = Mars::db_list();
|
my @db_names = Mars::db_list();
|
||||||
my @dbs_with_notes;
|
|
||||||
foreach my $db (@dbs) {
|
|
||||||
my $info =
|
|
||||||
Util::read_experiment_info( $db =~ s/smchurla_//r =~ s/:/-/gr );
|
|
||||||
|
|
||||||
push @dbs_with_notes,
|
|
||||||
( defined $info && length($info) > 0 )
|
|
||||||
? sprintf( "%-60s (%s)", $db, $info )
|
|
||||||
: $db;
|
|
||||||
}
|
|
||||||
|
|
||||||
my @selected_dbs =
|
my @selected_dbs =
|
||||||
TUI::select_from_list( "Select Databases to Drop from Mars",
|
TUI::select_from_list( "Select Databases to Drop from Mars",
|
||||||
1, @dbs_with_notes );
|
1, @db_names );
|
||||||
die "No database selected" unless @selected_dbs;
|
die "No database selected" unless @selected_dbs;
|
||||||
|
|
||||||
@selected_dbs =
|
|
||||||
map { s/(.*?)\s+\(.+\)$/$1/r } @selected_dbs;
|
|
||||||
|
|
||||||
Mars::db_drop($_) for @selected_dbs;
|
Mars::db_drop($_) for @selected_dbs;
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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
244
scripts/nixos.just
Normal 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 }}"
|
||||||
@ -5,12 +5,8 @@ use warnings;
|
|||||||
use diagnostics;
|
use diagnostics;
|
||||||
|
|
||||||
use FindBin;
|
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 Util;
|
||||||
|
|
||||||
use feature 'say';
|
use feature 'say';
|
||||||
@ -39,156 +35,148 @@ my $result_browser = "$fail_bin/resultbrowser.py";
|
|||||||
sub trace {
|
sub trace {
|
||||||
my ($experiment) = @_;
|
my ($experiment) = @_;
|
||||||
|
|
||||||
# Util::notify("Tracing $experiment...");
|
Util::notify("Tracing $experiment...");
|
||||||
|
|
||||||
my $trace_command = join " ", (
|
system(
|
||||||
"$bochs_runner",
|
join " ",
|
||||||
"-V $fail_share/vgabios.bin",
|
(
|
||||||
"-b $fail_share/BIOS-bochs-latest",
|
"$bochs_runner",
|
||||||
"-1",
|
"-V $fail_share/vgabios.bin",
|
||||||
"-f $fail_trace",
|
"-b $fail_share/BIOS-bochs-latest",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
"-1",
|
||||||
"-i $remote_builds_dir/$experiment/system.iso",
|
"-f $fail_trace",
|
||||||
"--",
|
"-e $remote_builds_dir/$experiment/system.elf",
|
||||||
"-Wf,--start-symbol=fail_start_trace",
|
"-i $remote_builds_dir/$experiment/system.iso",
|
||||||
"-Wf,--save-symbol=fail_start_trace",
|
"--",
|
||||||
"-Wf,--end-symbol=fail_stop_trace",
|
"-Wf,--start-symbol=fail_start_trace",
|
||||||
"-Wf,--state-file=$remote_builds_dir/$experiment/state",
|
"-Wf,--save-symbol=fail_start_trace",
|
||||||
"-Wf,--trace-file=$remote_builds_dir/$experiment/trace.pb",
|
"-Wf,--end-symbol=fail_stop_trace",
|
||||||
"-Wf,--elf-file=$remote_builds_dir/$experiment/system.elf",
|
"-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,--full-trace",
|
||||||
# "-Wf,--check-bounds",
|
# "-Wf,--check-bounds",
|
||||||
">$remote_builds_dir/$experiment/1_trace.log 2>&1"
|
)
|
||||||
);
|
);
|
||||||
say "Trace command: $trace_command";
|
|
||||||
|
|
||||||
system($trace_command);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub import_trace {
|
sub import_trace {
|
||||||
my ($experiment) = @_;
|
my ($experiment) = @_;
|
||||||
|
|
||||||
# Util::notify("Importing $experiment trace...");
|
Util::notify("Importing $experiment trace...");
|
||||||
|
|
||||||
# Benchmark: ip
|
# Benchmark: ip
|
||||||
my $import_ip_command = join " ", (
|
system(
|
||||||
"$fail_import",
|
join " ",
|
||||||
"--database-option-file $remote_db_conf",
|
(
|
||||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
"$fail_import",
|
||||||
"-i RegisterImporter",
|
"--database-option-file $remote_db_conf",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
"-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
"-v $experiment",
|
"-i RegisterImporter",
|
||||||
"-b ip",
|
"-e $remote_builds_dir/$experiment/system.elf",
|
||||||
"--no-gp", # Don't inject general purpose registers
|
"-v $experiment",
|
||||||
"--ip", # Inject instruction pointer
|
"-b ip",
|
||||||
">$remote_builds_dir/$experiment/2_import_ip.log 2>&1"
|
"--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
|
# Benchmark: mem
|
||||||
my $import_mem_command = join " ",
|
system(
|
||||||
(
|
join " ",
|
||||||
"$fail_import",
|
(
|
||||||
"--database-option-file $remote_db_conf",
|
"$fail_import",
|
||||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
"--database-option-file $remote_db_conf",
|
||||||
"-i MemoryImporter",
|
"-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
"-i MemoryImporter",
|
||||||
"-v $experiment",
|
"-e $remote_builds_dir/$experiment/system.elf",
|
||||||
"-b mem",
|
"-v $experiment",
|
||||||
">$remote_builds_dir/$experiment/2_import_mem.log 2>&1"
|
"-b mem"
|
||||||
);
|
)
|
||||||
say "Import MEM command: $import_mem_command";
|
);
|
||||||
system($import_mem_command);
|
|
||||||
|
|
||||||
# Benchmark: regs
|
# Benchmark: regs
|
||||||
my $import_regs_command = join " ", (
|
system(
|
||||||
"$fail_import",
|
join " ",
|
||||||
"--database-option-file $remote_db_conf",
|
(
|
||||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
"$fail_import",
|
||||||
"-i RegisterImporter",
|
"--database-option-file $remote_db_conf",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
"-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
"-v $experiment",
|
"-i RegisterImporter",
|
||||||
"-b regs",
|
"-e $remote_builds_dir/$experiment/system.elf",
|
||||||
"--flags", # Inject flags register
|
"-v $experiment",
|
||||||
">$remote_builds_dir/$experiment/2_import_regs.log 2>&1"
|
"-b regs",
|
||||||
|
"--flags" # Inject flags register
|
||||||
|
)
|
||||||
);
|
);
|
||||||
say "Import REGS command: $import_regs_command";
|
|
||||||
system($import_regs_command);
|
|
||||||
|
|
||||||
# Import fulltrace for VisualFAIL
|
# Import fulltrace for VisualFAIL
|
||||||
# system(
|
system(
|
||||||
# join " ",
|
join " ",
|
||||||
# (
|
(
|
||||||
# "$fail_import",
|
"$fail_import",
|
||||||
# "--database-option-file $remote_db_conf",
|
"--database-option-file $remote_db_conf",
|
||||||
# "-t $remote_builds_dir/$experiment/trace.pb",
|
"-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
# "-i FullTraceImporter",
|
"-i FullTraceImporter",
|
||||||
# "-e $remote_builds_dir/$experiment/system.elf",
|
"-e $remote_builds_dir/$experiment/system.elf",
|
||||||
# "-v $experiment",
|
"-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"
|
|
||||||
);
|
);
|
||||||
say "Import IP Asm command: $import_ip_asm_command";
|
|
||||||
system($import_ip_asm_command);
|
|
||||||
|
|
||||||
my $import_mem_asm_command = join " ", (
|
# Import objdump disassembly + source files
|
||||||
"$fail_import",
|
system(
|
||||||
"--database-option-file $remote_db_conf",
|
join " ",
|
||||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
(
|
||||||
"-i ElfImporter",
|
"$fail_import",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
"--database-option-file $remote_db_conf",
|
||||||
"-v $experiment",
|
"-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
"-b mem",
|
"-i ElfImporter",
|
||||||
"--objdump objdump",
|
"-e $remote_builds_dir/$experiment/system.elf",
|
||||||
|
"-v $experiment",
|
||||||
# "--sources",
|
"-b ip",
|
||||||
">$remote_builds_dir/$experiment/2_import_mem_asm.log 2>&1"
|
"--objdump objdump",
|
||||||
|
"--sources",
|
||||||
|
)
|
||||||
);
|
);
|
||||||
say "Import Mem Asm command: $import_mem_asm_command";
|
system(
|
||||||
system($import_mem_asm_command);
|
join " ",
|
||||||
|
(
|
||||||
my $import_regs_asm_command = join " ", (
|
"$fail_import",
|
||||||
"$fail_import",
|
"--database-option-file $remote_db_conf",
|
||||||
"--database-option-file $remote_db_conf",
|
"-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
"-i ElfImporter",
|
||||||
"-i ElfImporter",
|
"-e $remote_builds_dir/$experiment/system.elf",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
"-v $experiment",
|
||||||
"-v $experiment",
|
"-b mem",
|
||||||
"-b regs",
|
"--objdump objdump",
|
||||||
"--objdump objdump",
|
"--sources",
|
||||||
|
)
|
||||||
# "--sources",
|
|
||||||
">$remote_builds_dir/$experiment/2_import_regs_asm.log 2>&1"
|
|
||||||
);
|
);
|
||||||
say "Import Regs Asm command: $import_regs_asm_command";
|
system(
|
||||||
system($import_regs_asm_command);
|
join " ",
|
||||||
|
(
|
||||||
my $prune_command = join " ", (
|
"$fail_import",
|
||||||
"$fail_prune", "--database-option-file $remote_db_conf",
|
"--database-option-file $remote_db_conf",
|
||||||
"-v $experiment", "-b %%",
|
"-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
|
"-i ElfImporter",
|
||||||
# '-p NoPruner',
|
"-e $remote_builds_dir/$experiment/system.elf",
|
||||||
'-p BasicPruner',
|
"-v $experiment",
|
||||||
"--overwrite", ">$remote_builds_dir/$experiment/2_prune.log 2>&1"
|
"-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 {
|
sub inject {
|
||||||
@ -198,57 +186,6 @@ sub inject {
|
|||||||
|
|
||||||
Util::notify("Injecting $experiment using $count cores...");
|
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...";
|
say "Forking...";
|
||||||
my $pid = fork();
|
my $pid = fork();
|
||||||
die "fork failed: $!" unless defined $pid;
|
die "fork failed: $!" unless defined $pid;
|
||||||
@ -256,16 +193,52 @@ sub inject {
|
|||||||
if ( $pid == 0 ) {
|
if ( $pid == 0 ) {
|
||||||
|
|
||||||
# child -> server
|
# child -> server
|
||||||
|
|
||||||
say "Running server in child process...";
|
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
|
# parent -> client
|
||||||
|
|
||||||
say "Waiting for server...";
|
say "Waiting for server...";
|
||||||
sleep(10);
|
sleep(10);
|
||||||
|
|
||||||
say "Running client with $count cores in parent process";
|
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...";
|
say "Killing server with pid $pid...";
|
||||||
kill 'TERM', $pid;
|
kill 'TERM', $pid;
|
||||||
@ -275,30 +248,29 @@ sub inject {
|
|||||||
sub results {
|
sub results {
|
||||||
my ($experiment) = @_;
|
my ($experiment) = @_;
|
||||||
|
|
||||||
my @queries =
|
my @queries = Util::find_files("$remote_root/scripts/Queries");
|
||||||
map { s/\.pm//gr } Util::find_files("$remote_root/scripts/Queries");
|
|
||||||
my @configs = ( '', Filters::get_default_configs() );
|
|
||||||
|
|
||||||
for my $query (@queries) {
|
foreach (@queries) {
|
||||||
for my $config (@configs) {
|
my $query = $_;
|
||||||
Util::execute_query( $experiment, $query,
|
$query =~ s/\.pm//g;
|
||||||
$remote_db_conf, $remote_builds_dir, 1, $config );
|
|
||||||
}
|
# 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
|
# Run experiments
|
||||||
my $experiment = $ARGV[0] or die "Usage: runner.pl <experiment>\n";
|
my @experiments = Util::find_subdirs($remote_builds_dir);
|
||||||
Util::rewrite_file( $remote_db_conf, "database=",
|
for my $experiment (@experiments) {
|
||||||
"database=${db_prefix}_$experiment\n" );
|
Util::rewrite_file( $remote_db_conf, "database=",
|
||||||
|
"database=${db_prefix}_$experiment\n" );
|
||||||
|
|
||||||
say "Killing generic-experiment-server process if it's running...";
|
trace($experiment);
|
||||||
system( "pkill", "-u", $db_user, "-f", "generic-experiment-server" );
|
import_trace($experiment);
|
||||||
sleep(10);
|
inject($experiment);
|
||||||
|
results($experiment);
|
||||||
|
}
|
||||||
|
|
||||||
trace($experiment);
|
Util::notify("Finished all experiments");
|
||||||
import_trace($experiment);
|
|
||||||
inject($experiment);
|
|
||||||
results($experiment);
|
|
||||||
|
|
||||||
Util::notify("Finished experiment $experiment");
|
|
||||||
|
|||||||
390
scripts/wasm.just
Normal file
390
scripts/wasm.just
Normal 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
@ -45,123 +45,7 @@ SECTIONS {
|
|||||||
/* . += 16; /\* padding after data, workaround for import-trace *\/ */
|
/* . += 16; /\* padding after data, workaround for import-trace *\/ */
|
||||||
|
|
||||||
KEEP (*(".text.startup"))
|
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*")
|
||||||
_text_end = .;
|
|
||||||
|
|
||||||
*(".rodata*")
|
*(".rodata*")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -55,7 +55,4 @@ _start:
|
|||||||
|
|
||||||
# Set the size of the _start symbol to the current location '.' minus its 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.
|
# This is useful when debugging or when you implement call tracing.
|
||||||
|
.size _start, . - _start
|
||||||
# If this is enabled, the linker.ld needs to define a symbol before the .text segment.
|
|
||||||
# Otherwise, there's a gap that prevents FAIL from disassembling the AOT.
|
|
||||||
# .size _start, . - _start
|
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
#include "bh_platform.h"
|
#include "bh_platform.h"
|
||||||
|
|
||||||
#include "__WASM_ARRAY_FILE__"
|
#include "__WASM_ARRAY_FILE__"
|
||||||
|
|
||||||
#ifdef TARGET_LINUX
|
#ifdef TARGET_LINUX
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.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 STACK_SIZE (4 * 1024)
|
||||||
#define HEAP_SIZE STACK_SIZE
|
#define HEAP_SIZE STACK_SIZE
|
||||||
|
#define RUNTIME_POOL_SIZE 4 * STACK_SIZE
|
||||||
#if WASM_MEM_ALLOC_WITH_USAGE
|
|
||||||
|
|
||||||
// Another bump allocator
|
|
||||||
#define WASM_LINEAR_MEMORY_SIZE (64 * 1024) // Need to match --initial-memory?
|
|
||||||
#define RUNTIME_POOL_SIZE (2 * 1024 * 1024)
|
|
||||||
#define LINEAR_POOL_SIZE (WASM_LINEAR_MEMORY_SIZE + 512 * 1024)
|
|
||||||
#define ALIGNMENT 8
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char *buf;
|
|
||||||
size_t size;
|
|
||||||
size_t offset;
|
|
||||||
} BumpPool;
|
|
||||||
|
|
||||||
#if WAMR_RUNTIME_POOL_IN_TEXT
|
|
||||||
__attribute__((section(".text.wamr_runtime_pool"), aligned(4096)))
|
|
||||||
#endif
|
|
||||||
static char runtime_pool_buf[RUNTIME_POOL_SIZE];
|
|
||||||
|
|
||||||
#if WAMR_LINEAR_POOL_IN_TEXT
|
|
||||||
__attribute__((section(".text.wamr_linear_pool"), aligned(4096)))
|
|
||||||
#endif
|
|
||||||
static char linear_pool_buf[LINEAR_POOL_SIZE];
|
|
||||||
|
|
||||||
// mem_alloc_usage_t: 0 = Alloc_For_Runtime, 1 = Alloc_For_LinearMemory
|
|
||||||
static BumpPool pools[] = {
|
|
||||||
{ runtime_pool_buf, RUNTIME_POOL_SIZE, 0 },
|
|
||||||
{ linear_pool_buf, LINEAR_POOL_SIZE, 0 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static size_t align_up(size_t x, size_t a) {
|
|
||||||
return (x + a - 1) & ~(a - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t alloc_size(void *ptr) {
|
|
||||||
size_t header_size = align_up(sizeof(size_t), ALIGNMENT);
|
|
||||||
return *(size_t *)((char *)ptr - header_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *bump_alloc(BumpPool *pool, unsigned int size) {
|
|
||||||
size_t header_size = align_up(sizeof(size_t), ALIGNMENT);
|
|
||||||
size_t start = align_up(pool->offset, ALIGNMENT);
|
|
||||||
size_t end = start + header_size + align_up(size, ALIGNMENT);
|
|
||||||
|
|
||||||
if (end > pool->size) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
*(size_t *)&pool->buf[start] = size;
|
|
||||||
void *ptr = &pool->buf[start + header_size];
|
|
||||||
pool->offset = end;
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *wamr_malloc(mem_alloc_usage_t usage, unsigned int size) {
|
|
||||||
PRINT("wamr_malloc: usage=%d size=%u\n", usage, size);
|
|
||||||
return bump_alloc(&pools[usage], size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *wamr_realloc(mem_alloc_usage_t usage, bool full_size_mmaped, void *ptr,
|
|
||||||
unsigned int new_size) {
|
|
||||||
PRINT("wamr_realloc: usage=%d full_size_mmaped=%d ptr=%p new_size=%u\n",
|
|
||||||
usage, full_size_mmaped, ptr, new_size);
|
|
||||||
|
|
||||||
void *new_addr = bump_alloc(&pools[usage], new_size);
|
|
||||||
if (!new_addr) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ptr) {
|
|
||||||
size_t old_size = alloc_size(ptr);
|
|
||||||
memcpy(new_addr, ptr, old_size < new_size ? old_size : new_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new_addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wamr_free(mem_alloc_usage_t usage, void *ptr) {
|
|
||||||
// PRINT("wamr_free: usage=%d ptr=%p\n", usage, ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define RUNTIME_POOL_SIZE (4 * STACK_SIZE)
|
|
||||||
|
|
||||||
#if WAMR_GLOBAL_HEAP_IN_TEXT
|
|
||||||
__attribute__((section(".text.wamr_global_heap"), aligned(4096)))
|
|
||||||
#endif
|
|
||||||
static char global_heap_buf[RUNTIME_POOL_SIZE];
|
|
||||||
|
|
||||||
#endif // WASM_MEM_ALLOC_WITH_USAGE
|
|
||||||
|
|
||||||
MAIN {
|
MAIN {
|
||||||
char error_buf[128];
|
char error_buf[128];
|
||||||
@ -133,18 +42,11 @@ MAIN {
|
|||||||
// Step 1: Initialize WAMR Runtime
|
// Step 1: Initialize WAMR Runtime
|
||||||
static RuntimeInitArgs init_args;
|
static RuntimeInitArgs init_args;
|
||||||
memset(&init_args, 0, sizeof(RuntimeInitArgs));
|
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_type = Alloc_With_Pool;
|
||||||
init_args.mem_alloc_option.pool.heap_buf = global_heap_buf;
|
init_args.mem_alloc_option.pool.heap_buf = global_heap_buf;
|
||||||
init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf);
|
init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf);
|
||||||
#endif
|
|
||||||
|
|
||||||
init_args.max_thread_num = 1;
|
init_args.max_thread_num = 1;
|
||||||
if (!wasm_runtime_full_init(&init_args)) {
|
if (!wasm_runtime_full_init(&init_args)) {
|
||||||
PRINT_ERROR("wasm_runtime_full_init failed.\n");
|
PRINT_ERROR("wasm_runtime_full_init failed.\n");
|
||||||
|
|||||||
@ -36,14 +36,11 @@ extern "C" EXPORT("wasm_module") int wasm_module(void) {
|
|||||||
YC = 0;
|
YC = 0;
|
||||||
ZC = 0;
|
ZC = 0;
|
||||||
|
|
||||||
// "early" starts trace here
|
|
||||||
fail_start_trace();
|
|
||||||
|
|
||||||
sum<0>();
|
sum<0>();
|
||||||
sum<1>();
|
sum<1>();
|
||||||
sum<2>();
|
sum<2>();
|
||||||
|
|
||||||
// "late" starts trace here
|
fail_start_trace();
|
||||||
|
|
||||||
naive_vote();
|
naive_vote();
|
||||||
|
|
||||||
@ -69,13 +69,10 @@ extern "C" EXPORT("wasm_module") int wasm_module(void) {
|
|||||||
YC = 0;
|
YC = 0;
|
||||||
ZC = 0;
|
ZC = 0;
|
||||||
|
|
||||||
// "early" starts trace here
|
|
||||||
|
|
||||||
sum<0, SIG_X>();
|
sum<0, SIG_X>();
|
||||||
sum<1, SIG_Y>();
|
sum<1, SIG_Y>();
|
||||||
sum<2, SIG_Z>();
|
sum<2, SIG_Z>();
|
||||||
|
|
||||||
// "late" starts trace here
|
|
||||||
fail_start_trace();
|
fail_start_trace();
|
||||||
|
|
||||||
sign_t static_sig = cored_vote();
|
sign_t static_sig = cored_vote();
|
||||||
@ -36,15 +36,12 @@ extern "C" EXPORT("wasm_module") int wasm_module(void) {
|
|||||||
YC = 0;
|
YC = 0;
|
||||||
ZC = 0;
|
ZC = 0;
|
||||||
|
|
||||||
// "early" starts trace here
|
fail_start_trace();
|
||||||
|
|
||||||
sum<0>();
|
sum<0>();
|
||||||
sum<1>();
|
sum<1>();
|
||||||
sum<2>();
|
sum<2>();
|
||||||
|
|
||||||
// "late" starts trace here
|
|
||||||
fail_start_trace();
|
|
||||||
|
|
||||||
naive_vote();
|
naive_vote();
|
||||||
|
|
||||||
fail_stop_trace();
|
fail_stop_trace();
|
||||||
@ -69,15 +69,12 @@ extern "C" EXPORT("wasm_module") int wasm_module(void) {
|
|||||||
YC = 0;
|
YC = 0;
|
||||||
ZC = 0;
|
ZC = 0;
|
||||||
|
|
||||||
// "early" starts trace here
|
|
||||||
fail_start_trace();
|
fail_start_trace();
|
||||||
|
|
||||||
sum<0, SIG_X>();
|
sum<0, SIG_X>();
|
||||||
sum<1, SIG_Y>();
|
sum<1, SIG_Y>();
|
||||||
sum<2, SIG_Z>();
|
sum<2, SIG_Z>();
|
||||||
|
|
||||||
// "late" starts trace here
|
|
||||||
|
|
||||||
sign_t static_sig = cored_vote();
|
sign_t static_sig = cored_vote();
|
||||||
|
|
||||||
fail_stop_trace();
|
fail_stop_trace();
|
||||||
@ -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)
|
|
||||||
|
|
||||||
|
|
||||||
@ -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/
|
|
||||||
@ -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
|
|
||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -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());
|
|
||||||
}
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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());
|
|
||||||
}
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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() );
|
|
||||||
}
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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)
|
|
||||||
|
|
||||||
|
|
||||||
@ -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.
|
|
||||||
Binary file not shown.
File diff suppressed because one or more lines are too long
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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 ]
|
|
||||||
*/
|
|
||||||
@ -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
Reference in New Issue
Block a user