Aal Borg ti CK, um einen Utomata Vali D Ator - ein ausziehbarer Überprüfungsmotor und Simulator für Tick Tock Automata.
TTAs (Tick Tock Automata) sind eine automatisch basierende Theorie, die eine parallele Geschäftslogik für alle Arten von Automatisierungssystemen modellieren kann. Ein TTA besteht aus einer Reihe von Standorten und Übergängen zwischen ihnen. Jeder Übergang kann durch einen booleschen Ausdruck bewacht werden und haben eine Reihe von variablen Zuordnungen als "Konsequenz" der Übergang .
Eine gute Analogie zu TTA ist eine Statemachine , bei der ein System von einem Zustand in einen anderen wechseln kann. Im Folgenden finden Sie ein Beispiel für ein einfaches TTA, das ein Licht basierend auf einer Tasteeingabe steuert.
Beginnend am Off -Standort gibt es nur einen ausgehenden Vorteil mit dem Wachmann, der überprüft, ob btn_is_pressed wahr ist. Wenn dies der Fall ist, wechseln wir zum Standort und setzen das variable light als Folge der Einnahme der Kante/des Übergangs auf wahr . Wenn dann die Taste freigegeben wird, kehren wir zum Off -Locaiton zurück und light ist wieder auf false gesetzt.
Was TTAs von jedem anderen Übergangssystem unterscheidet, ist, dass die Variable btn_is_pressed eine externe Variable ist, was bedeutet, dass sie durch das Übergangssystem keinem Wert zugewiesen werden kann, sondern sich nur basierend auf einer externen Eingabe ändern kann. Externe Eingänge werden gelesen, wenn wir keine Übergänge durchführen. In dieser Aufteilung der Semantik stammt der Name Tick Tock Automata von:
Wenn Sie die Syntax noch einen Schritt weiter gehen, können Sie viele dieser TTAs parallel laufen lassen und den gleichen Pool von internen und externen Variablen teilen. Ein solches Netzwerk wird als einfach als NTWORK von T ick t ock a utomata (NTTA) bezeichnet.
Aaltitoad wird mit CMake erstellt. Sie müssen einen C ++ 20 kompatiblen Compiler, flex , bison Version 3.5+ und die Standard -Vorlagenbibliothek installiert haben. Alle anderen Abhängigkeiten werden über den wunderbaren CPM -Paketmanager behandelt.
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make Wenn der CPM -Schritt lange dauert, versuchen Sie es mit -DCPM_SOURCE_CACHE=~/.cache/CPM erneut
Um die Unit -Tests auszuführen, kompilieren Sie das Ziel aaltitoad_tests
mkdir build-test && cd build-test
cmake -DCMAKE_BUILD_TYPE=Debug ..
make aaltitoad_tests
# run the tests
./aaltitoad_test -r xml -d yes --order lex Wenn Sie Code -Coverage -Statistiken einfügen möchten, geben Sie das cmake -Flag -DCODE_COVERAGE=ON .
Aaltitoad liefert drei primäre Kompilierungsziele. Alle Befehlszeilenschnittstellen verfügen über eine Hilfeseite, die Sie mit dem Argument --help beschwören können.
verifier : Eine Befehlszeilungsschnittstelle für Verifizierungsmotorensimulator : Eine Laufzeit -Befehlszeilenschnittstelleaaltitoad : Eine Bibliothek mit allen Dingen Aaltitoad Aaltitoad unterstützt "Tocker" -Bibliotheken von Drittanbietern, sodass Sie benutzerdefinierte Integrationen direkt in die Laufzeit einfließen können. Dieses Repository enthält ein Beispiel, das Tocker namens pipe_tocker im Verzeichnis tocker_plugins als Beispielprojekt dient. Ein "Tocker" muss die folgenden Symbole definieren:
# include < plugin_system.h > // aaltitoad::* typedefs
extern " C " {
const char * get_plugin_name (); // Return value of this func dictates the name the next two funcs
aaltitoad:: tocker_t * create_TOCKER_NAME ( const std::string& argument, const aaltitoad:: ntta_t & ntta);
void destroy_TOCKER_NAME ( tocker_t * tocker);
plugin_type get_plugin_type () {
return plugin_type::tocker;
}
} Der TOCKER_NAME bezieht sich auf die C-String, die durch die Funktion get_plugin_name bereitgestellt wird. Die Funktionsnamen müssen übereinstimmen, andernfalls wird das Plugin nicht geladen. Tocker Plugins muss mit der aaltitoad -Shared Library in Verbindung gebracht werden und sollte als gemeinsame Bibliothek wie SO zusammengestellt werden:
add_library (TOCKER_NAME_tocker SHARED *.cpp)
target_link_libraries (TOCKER_NAME_tocker aaltitoad) Sobald Sie zusammengestellt wurden, können Sie den Tocker mit --tocker / -t zusammen mit --tocker-dir / -T an die Befehlszeile von Aaltitoad bereitstellen. Die Option --tocker sollte wie SO bereitgestellt werden:
--tocker-dir /path/to/tocker-plugins --tocker " TOCKER_NAME(argument string) " Der "argument string" -Part der Option bezieht sich auf die für die Funktion create_TOCKER_NAME bereitgestellte Eingabeargument -Zeichenfolge. Jetzt hätten Ihre Tecker instanziiert werden sollen, und die tock -Funktion wird jedes Mal aufgerufen, wenn die TTA bereit ist, die Tecker -Werte zu berechnen.
Es gibt zwei Arten von Tokker -Schnittstellen, die ein Drittanbieter -Tokker verlängern kann:
tocker_t )async_tocker_t ) Der blockierende Tocker wird in einem einzigen Thread ausgeführt und alle Tick-Execution blockiert, bis der TOCK abgeschlossen ist, und eine Integration von Drittanbietern sollte die tock -Funktion nur überschreiben. Im Gegensatz dazu blockiert der asynchrone Tokker die Ausführung der Zecken nicht, sondern startet eine neue asynchrone Aufgabe der Funktion get_tock_values .
Wenn Sie Ihren Tocker implementieren, sollten Sie berücksichtigen, ob Sie die TTA daran hindern möchten, auszuführen oder nicht. Wenn Sie einen asynchronen Tocker implementieren, beachten Sie, dass sich die Eingabeumgebung seit Ausgabe des Tecks geändert haben kann.
Wenn Sie den mitgelieferten Parser nicht verwenden möchten, können Sie immer Ihre eigenen liefern. Solange Sie die folgenden Symbole angeben (erinnern Sie sich extern "C" ):
# include < plugin_system.h > // aaltitoad::* typedefs
extern " C " {
const char * get_plugin_name ();
const char * get_plugin_version ();
aaltitoad:: ntta_t * load ( const std::vector<std::string>& folders, const std::vector<std::string>& ignore_list);
plugin_type get_plugin_type () {
return plugin_type::parser;
}
} Um es ein bisschen einfacher zu machen aaltitoad::tta_builder das aaltitoad::ntta_t -Objekt aaltitoad::ntta_builder konstruieren