Skip to content

Commit

Permalink
added configurations and mapper for integration WebAssembly analyzer
Browse files Browse the repository at this point in the history
  • Loading branch information
luth1um committed Aug 28, 2024
1 parent 47b8cc5 commit 106a58c
Show file tree
Hide file tree
Showing 5 changed files with 236 additions and 4 deletions.
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
"react": "18.3.1",
"react-dom": "18.3.1",
"react-i18next": "15.0.1",
"timed-automata-analyzer": "0.9.0",
"vis-data": "7.1.9",
"vis-network": "9.1.9"
},
Expand Down Expand Up @@ -58,7 +59,9 @@
"ts-jest": "29.2.4",
"typescript": "5.5.4",
"typescript-eslint": "7.18.0",
"vite": "5.4.0"
"vite": "5.4.0",
"vite-plugin-top-level-await": "1.4.4",
"vite-plugin-wasm": "3.3.0"
},
"lint-staged": {
"*.{ts,tsx}": [
Expand Down
105 changes: 105 additions & 0 deletions src/utils/analyzerMappingUtils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import {
TimedAutomaton as AnalyzerTimedAutomaton,
Clock as AnalyzerClock,
Clause as AnalyzerClause,
ClockComparator as AnalyzerClockComparator,
Location as AnalyzerLocation,
ClockConstraint as AnalyzerClockConstraint,
Switch as AnalyzerSwitch,
} from 'timed-automata-analyzer';
import { TimedAutomaton as InternalTimedAutomaton } from '../model/ta/timedAutomaton';
import { useCallback } from 'react';
import { Clock as InternalClock } from '../model/ta/clock';
import { Clause as InternalClause } from '../model/ta/clause';
import { ClockComparator as InternalClockComparator } from '../model/ta/clockComparator';
import { ClockConstraint as InternalClockConstraint } from '../model/ta/clockConstraint';
import { Location as InternalLocation } from '../model/ta/location';
import { Switch as InternalSwitch } from '../model/ta/switch';

interface AnalyzerMappingUtils {
mapTaToAnalyzerModel(ta: InternalTimedAutomaton): AnalyzerTimedAutomaton;
}

export function useAnalyzerMappingUtils(): AnalyzerMappingUtils {
const mapClock = useCallback((clock: InternalClock) => new AnalyzerClock(clock.name), []);

const mapClocks = useCallback((clocks: InternalClock[]) => clocks.map(mapClock), [mapClock]);

const mapClause = useCallback(
(clause: InternalClause) => {
let analyzerOp: AnalyzerClockComparator;
switch (clause.op) {
case InternalClockComparator.LESSER:
analyzerOp = AnalyzerClockComparator.LESSER;
break;
case InternalClockComparator.LEQ:
analyzerOp = AnalyzerClockComparator.LEQ;
break;
case InternalClockComparator.GEQ:
analyzerOp = AnalyzerClockComparator.GEQ;
break;
case InternalClockComparator.GREATER:
analyzerOp = AnalyzerClockComparator.GREATER;
break;
case InternalClockComparator.EQ:
throw Error('Comparator EQ not supported by analyzer');
}
return new AnalyzerClause(mapClock(clause.lhs), analyzerOp, clause.rhs);
},
[mapClock]
);

const mapClockConstraint = useCallback(
(cc?: InternalClockConstraint) => {
if (!cc) {
return undefined;
}

const analyzerClauses: AnalyzerClause[] = [];
for (let i = 0; i < cc.clauses.length; i++) {
const clause = cc.clauses[i];
if (clause.op == InternalClockComparator.EQ) {
// analyzer does not support EQ directly
const clauseLeq = { ...structuredClone(clause), op: InternalClockComparator.LEQ };
const clauseGeq = { ...structuredClone(clause), op: InternalClockComparator.GEQ };
analyzerClauses.push(mapClause(clauseLeq));
analyzerClauses.push(mapClause(clauseGeq));
} else {
analyzerClauses.push(mapClause(clause));
}
}

return new AnalyzerClockConstraint(analyzerClauses);
},
[mapClause]
);

const mapLocation = useCallback(
(loc: InternalLocation) => new AnalyzerLocation(loc.name, !!loc.isInitial, mapClockConstraint(loc.invariant)),
[mapClockConstraint]
);

const mapLocations = useCallback((locs: InternalLocation[]) => locs.map(mapLocation), [mapLocation]);

const mapSwitch = useCallback(
(sw: InternalSwitch) =>
new AnalyzerSwitch(
mapLocation(sw.source),
mapClockConstraint(sw.guard),
sw.actionLabel,
mapClocks(sw.reset),
mapLocation(sw.target)
),
[mapLocation, mapClockConstraint, mapClocks]
);

const mapSwitches = useCallback((switches: InternalSwitch[]) => switches.map(mapSwitch), [mapSwitch]);

const mapTaToAnalyzerModel = useCallback(
(ta: InternalTimedAutomaton) =>
new AnalyzerTimedAutomaton(mapLocations(ta.locations), mapClocks(ta.clocks), mapSwitches(ta.switches)),
[mapClocks, mapLocations, mapSwitches]
);

return { mapTaToAnalyzerModel };
}
4 changes: 2 additions & 2 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"compilerOptions": {
"target": "ES2020",
"target": "ES2022",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"lib": ["ES2022", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
"esModuleInterop": true,
Expand Down
16 changes: 15 additions & 1 deletion vite.config.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,23 @@
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import wasm from 'vite-plugin-wasm';
import topLevelAwait from 'vite-plugin-top-level-await';

// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
plugins: [
react(),
wasm(),
topLevelAwait({
// The export name of top-level await promise for each chunk module
promiseExportName: '__tla',
// The function to generate import names of top-level await promise in each chunk module
promiseImportName: (i) => `__tla_${i}`,
}),
],
esbuild: {
target: 'es2022',
},
base: '/timed-automata-analysis/',
build: {
outDir: 'dist/timed-automata-analysis',
Expand Down
110 changes: 110 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -934,6 +934,11 @@
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==

"@rollup/plugin-virtual@^3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz#17e17eeecb4c9fa1c0a6e72c9e5f66382fddbb82"
integrity sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==

"@rollup/[email protected]":
version "4.20.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz#c3f5660f67030c493a981ac1d34ee9dfe1d8ec0f"
Expand Down Expand Up @@ -1033,6 +1038,87 @@
dependencies:
"@sinonjs/commons" "^3.0.0"

"@swc/[email protected]":
version "1.7.14"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.14.tgz#a4530ec755ea183802cc9dfe4900ab5f6a327fea"
integrity sha512-V0OUXjOH+hdGxDYG8NkQzy25mKOpcNKFpqtZEzLe5V/CpLJPnpg1+pMz70m14s9ZFda9OxsjlvPbg1FLUwhgIQ==

"@swc/[email protected]":
version "1.7.14"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.7.14.tgz#2c9c717fd28dd1dde9c21cf58b01f1cda7976b1a"
integrity sha512-9iFvUnxG6FC3An5ogp5jbBfQuUmTTwy8KMB+ZddUoPB3NR1eV+Y9vOh/tfWcenSJbgOKDLgYC5D/b1mHAprsrQ==

"@swc/[email protected]":
version "1.7.14"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.14.tgz#fed055c9c65347177c8df88720f8a51793a4df06"
integrity sha512-zGJsef9qPivKSH8Vv4F/HiBXBTHZ5Hs3ZjVGo/UIdWPJF8fTL9OVADiRrl34Q7zOZEtGXRwEKLUW1SCQcbDvZA==

"@swc/[email protected]":
version "1.7.14"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.14.tgz#ca740c8ea26f041b2dc43ba87facec452052814f"
integrity sha512-AxV3MPsoI7i4B8FXOew3dx3N8y00YoJYvIPfxelw07RegeCEH3aHp2U2DtgbP/NV1ugZMx0TL2Z2DEvocmA51g==

"@swc/[email protected]":
version "1.7.14"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.14.tgz#fbc6fed24f5ad58b948e5b7abe6cd1f07112bef1"
integrity sha512-JDLdNjUj3zPehd4+DrQD8Ltb3B5lD8D05IwePyDWw+uR/YPc7w/TX1FUVci5h3giJnlMCJRvi1IQYV7K1n7KtQ==

"@swc/[email protected]":
version "1.7.14"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.14.tgz#509a37833e4fbf89506b9291d9bd131fa2017fca"
integrity sha512-Siy5OvPCLLWmMdx4msnEs8HvEVUEigSn0+3pbLjv78iwzXd0qSBNHUPZyC1xeurVaUbpNDxZTpPRIwpqNE2+Og==

"@swc/[email protected]":
version "1.7.14"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.14.tgz#81156cc6ff814ad4b8fcf6eb6658d3f247db0b57"
integrity sha512-FtEGm9mwtRYQNK43WMtUIadxHs/ja2rnDurB99os0ZoFTGG2IHuht2zD97W0wB8JbqEabT1XwSG9Y5wmN+ciEQ==

"@swc/[email protected]":
version "1.7.14"
resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.14.tgz#c605fa783b5fbe1fff784ace4c4bb074b8d6026d"
integrity sha512-Jp8KDlfq7Ntt2/BXr0y344cYgB1zf0DaLzDZ1ZJR6rYlAzWYSccLYcxHa97VGnsYhhPspMpmCvHid97oe2hl4A==

"@swc/[email protected]":
version "1.7.14"
resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.14.tgz#3e15dc3b662c9fab851a38b3e271c8e2da4ba03a"
integrity sha512-I+cFsXF0OU0J9J4zdWiQKKLURO5dvCujH9Jr8N0cErdy54l9d4gfIxdctfTF+7FyXtWKLTCkp+oby9BQhkFGWA==

"@swc/[email protected]":
version "1.7.14"
resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.14.tgz#83958d92e9f07865ec9365212111fbc295660f0d"
integrity sha512-NNrprQCK6d28mG436jVo2TD+vACHseUECacEBGZ9Ef0qfOIWS1XIt2MisQKG0Oea2VvLFl6tF/V4Lnx/H0Sn3Q==

"@swc/core@^1.7.0":
version "1.7.14"
resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.7.14.tgz#d10492b5a4168cb1e73cf561a315e8b0f62255ed"
integrity sha512-9aeXeifnyuvc2pcuuhPQgVUwdpGEzZ+9nJu0W8/hNl/aESFsJGR5i9uQJRGu0atoNr01gK092fvmqMmQAPcKow==
dependencies:
"@swc/counter" "^0.1.3"
"@swc/types" "^0.1.12"
optionalDependencies:
"@swc/core-darwin-arm64" "1.7.14"
"@swc/core-darwin-x64" "1.7.14"
"@swc/core-linux-arm-gnueabihf" "1.7.14"
"@swc/core-linux-arm64-gnu" "1.7.14"
"@swc/core-linux-arm64-musl" "1.7.14"
"@swc/core-linux-x64-gnu" "1.7.14"
"@swc/core-linux-x64-musl" "1.7.14"
"@swc/core-win32-arm64-msvc" "1.7.14"
"@swc/core-win32-ia32-msvc" "1.7.14"
"@swc/core-win32-x64-msvc" "1.7.14"

"@swc/counter@^0.1.3":
version "0.1.3"
resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9"
integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==

"@swc/types@^0.1.12":
version "0.1.12"
resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.12.tgz#7f632c06ab4092ce0ebd046ed77ff7557442282f"
integrity sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==
dependencies:
"@swc/counter" "^0.1.3"

"@testing-library/[email protected]":
version "10.4.0"
resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8"
Expand Down Expand Up @@ -4226,6 +4312,11 @@ text-table@^0.2.0:
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==

[email protected]:
version "0.9.0"
resolved "https://registry.yarnpkg.com/timed-automata-analyzer/-/timed-automata-analyzer-0.9.0.tgz#604300aa30fb1b87aa47883756aee006b9e68cb9"
integrity sha512-j24MeRnuuH7cNzZ6Y/Pxa8ACyghcQ4u1osARBXOiBgN5gIa/4ABHVoKNs/kOpqfs9mVDoX87xZrOwmIZ5sRjjw==

[email protected]:
version "1.0.5"
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
Expand Down Expand Up @@ -4371,6 +4462,11 @@ url-parse@^1.5.3:
querystringify "^2.1.1"
requires-port "^1.0.0"

uuid@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294"
integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==

v8-to-istanbul@^9.0.1:
version "9.3.0"
resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175"
Expand All @@ -4390,6 +4486,20 @@ [email protected]:
resolved "https://registry.yarnpkg.com/vis-network/-/vis-network-9.1.9.tgz#8159b34e7c1570150fcc9296213d2b88ed169394"
integrity sha512-Ft+hLBVyiLstVYSb69Q1OIQeh3FeUxHJn0WdFcq+BFPqs+Vq1ibMi2sb//cxgq1CP7PH4yOXnHxEH/B2VzpZYA==

[email protected]:
version "1.4.4"
resolved "https://registry.yarnpkg.com/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.4.4.tgz#4900e06bfb7179de20aaa9b4730d04022a9e259e"
integrity sha512-QyxQbvcMkgt+kDb12m2P8Ed35Sp6nXP+l8ptGrnHV9zgYDUpraO0CPdlqLSeBqvY2DToR52nutDG7mIHuysdiw==
dependencies:
"@rollup/plugin-virtual" "^3.0.2"
"@swc/core" "^1.7.0"
uuid "^10.0.0"

[email protected]:
version "3.3.0"
resolved "https://registry.yarnpkg.com/vite-plugin-wasm/-/vite-plugin-wasm-3.3.0.tgz#2908ef2529bf8f33f4e549c8c6fda26ad273ca15"
integrity sha512-tVhz6w+W9MVsOCHzxo6SSMSswCeIw4HTrXEi6qL3IRzATl83jl09JVO1djBqPSwfjgnpVHNLYcaMbaDX5WB/pg==

[email protected]:
version "5.4.0"
resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.0.tgz#11dca8a961369ba8b5cae42d068c7ad684d5370f"
Expand Down

0 comments on commit 106a58c

Please sign in to comment.