From e2b814266b1a90763629892e9fd11359b79ac6d2 Mon Sep 17 00:00:00 2001 From: jserot Date: Tue, 14 Nov 2023 18:20:11 +0100 Subject: [PATCH] Renamed ./doc as ./docs To allow automatic building of GH page on github.io --- .gitignore | 8 +- Makefile | 13 +- README.md | 16 +- .../fonts/KaTeX_AMS-Regular.woff2 | Bin 0 -> 28076 bytes .../fonts/KaTeX_Caligraphic-Bold.woff2 | Bin 0 -> 6912 bytes .../fonts/KaTeX_Caligraphic-Regular.woff2 | Bin 0 -> 6908 bytes .../fonts/KaTeX_Fraktur-Bold.woff2 | Bin 0 -> 11348 bytes .../fonts/KaTeX_Fraktur-Regular.woff2 | Bin 0 -> 11316 bytes .../_odoc_support/fonts/KaTeX_Main-Bold.woff2 | Bin 0 -> 25324 bytes .../fonts/KaTeX_Main-BoldItalic.woff2 | Bin 0 -> 16780 bytes .../fonts/KaTeX_Main-Italic.woff2 | Bin 0 -> 16988 bytes .../fonts/KaTeX_Main-Regular.woff2 | Bin 0 -> 26272 bytes .../fonts/KaTeX_Math-BoldItalic.woff2 | Bin 0 -> 16400 bytes .../fonts/KaTeX_Math-Italic.woff2 | Bin 0 -> 16440 bytes .../fonts/KaTeX_SansSerif-Bold.woff2 | Bin 0 -> 12216 bytes .../fonts/KaTeX_SansSerif-Italic.woff2 | Bin 0 -> 12028 bytes .../fonts/KaTeX_SansSerif-Regular.woff2 | Bin 0 -> 10344 bytes .../fonts/KaTeX_Script-Regular.woff2 | Bin 0 -> 9644 bytes .../fonts/KaTeX_Size1-Regular.woff2 | Bin 0 -> 5468 bytes .../fonts/KaTeX_Size2-Regular.woff2 | Bin 0 -> 5208 bytes .../fonts/KaTeX_Size3-Regular.woff2 | Bin 0 -> 3624 bytes .../fonts/KaTeX_Size4-Regular.woff2 | Bin 0 -> 4928 bytes .../fonts/KaTeX_Typewriter-Regular.woff2 | Bin 0 -> 13568 bytes docs/_odoc_support/highlight.pack.js | 461 +++++++ docs/_odoc_support/katex.min.css | 1 + docs/_odoc_support/katex.min.js | 1 + docs/_odoc_support/odoc.css | 794 ++++++++++++ {doc => docs}/code/gensig/README.md | 0 {doc => docs}/code/gensig/ctask/README.md | 0 {doc => docs}/code/gensig/ctask/gensig.c | 0 {doc => docs}/code/gensig/systemc/README.md | 0 {doc => docs}/code/gensig/systemc/g.cpp | 0 {doc => docs}/code/gensig/systemc/g.h | 0 {doc => docs}/code/gensig/systemc/gensig.cpp | 0 {doc => docs}/code/gensig/systemc/gensig.h | 0 {doc => docs}/code/gensig/systemc/inp_E.cpp | 0 {doc => docs}/code/gensig/systemc/inp_E.h | 0 {doc => docs}/code/gensig/systemc/inp_H.cpp | 0 {doc => docs}/code/gensig/systemc/inp_H.h | 0 {doc => docs}/code/gensig/systemc/main.cpp | 0 {doc => docs}/code/gensig/vhdl/README.md | 0 {doc => docs}/code/gensig/vhdl/g.vhd | 0 {doc => docs}/code/gensig/vhdl/main_tb.vhd | 0 {doc => docs}/code/gensig/vhdl/main_top.vhd | 0 {doc => docs}/figs/ctrmod8-chrono.png | Bin {doc => docs}/figs/ctrmod8-top.png | Bin {doc => docs}/figs/gensig-chrono.png | Bin {doc => docs}/figs/gensig-model-moore.png | Bin docs/index.html | 19 + docs/ref_manual/Makefile | 33 + docs/ref_manual/bcprules.sty | 317 +++++ docs/ref_manual/bnf.tex | 28 + docs/ref_manual/dune | 3 + docs/ref_manual/grammar-defns.sty | 299 +++++ docs/ref_manual/grammar.tex | 283 +++++ docs/ref_manual/options.tex | 16 + {doc => docs}/ref_manual/rfsm_rm.pdf | Bin docs/ref_manual/rfsm_rm.tex | 117 ++ docs/ref_manual/rfsmc-options.tex | 32 + docs/ref_manual/semantics.tex | 693 +++++++++++ docs/ref_manual/variants.tex | 330 +++++ docs/rfsm/Rfsm/.dummy | 0 docs/rfsm/Rfsm/Annot/index.html | 6 + docs/rfsm/Rfsm/Bits/index.html | 2 + .../Syntax/Guest/Types/index.html | 2 + .../argument-1-Static/Syntax/Guest/index.html | 2 + .../Make/argument-1-Static/Syntax/index.html | 5 + .../Make/argument-1-Static/Typing/index.html | 2 + .../Make/argument-1-Static/Value/index.html | 2 + .../Cmodel/Make/argument-1-Static/index.html | 2 + docs/rfsm/Rfsm/Cmodel/Make/index.html | 2 + docs/rfsm/Rfsm/Cmodel/index.html | 4 + .../Static/Syntax/Guest/Types/index.html | 2 + .../Static/Syntax/Guest/index.html | 2 + .../Static/Syntax/index.html | 5 + .../Static/Typing/index.html | 2 + .../Static/Value/index.html | 2 + .../module-type-CMODEL/Static/index.html | 2 + .../Rfsm/Cmodel/module-type-CMODEL/index.html | 2 + .../Ctask/G/Syntax/Types/index.html | 2 + .../argument-1-L/Ctask/G/Syntax/index.html | 2 + .../Make/argument-1-L/Ctask/G/index.html | 5 + .../Make/argument-1-L/Ctask/index.html | 2 + .../Compiler/Make/argument-1-L/Dot/index.html | 2 + .../EvSeq/Evset/Event/Syntax/Types/index.html | 2 + .../EvSeq/Evset/Event/Syntax/index.html | 2 + .../EvSeq/Evset/Event/Value/index.html | 2 + .../Dynamic/EvSeq/Evset/Event/index.html | 2 + .../Dynamic/EvSeq/Evset/index.html | 2 + .../argument-1-L/Dynamic/EvSeq/index.html | 2 + .../Dynamic/Eval/Syntax/Types/index.html | 2 + .../Dynamic/Eval/Syntax/index.html | 2 + .../Dynamic/Eval/Value/index.html | 2 + .../Make/argument-1-L/Dynamic/Eval/index.html | 2 + .../Make/argument-1-L/Dynamic/index.html | 2 + .../Make/argument-1-L/Guest/Ctask/index.html | 5 + .../Make/argument-1-L/Guest/Error/index.html | 2 + .../Make/argument-1-L/Guest/Eval/index.html | 2 + .../Make/argument-1-L/Guest/Info/index.html | 2 + .../argument-1-L/Guest/Options/index.html | 2 + .../Make/argument-1-L/Guest/Static/index.html | 2 + .../Make/argument-1-L/Guest/Syntax/index.html | 2 + .../argument-1-L/Guest/Systemc/index.html | 5 + .../Make/argument-1-L/Guest/Types/index.html | 2 + .../Make/argument-1-L/Guest/Typing/index.html | 2 + .../Make/argument-1-L/Guest/Value/index.html | 2 + .../Make/argument-1-L/Guest/Vhdl/index.html | 2 + .../Make/argument-1-L/Guest/index.html | 12 + .../Static/Syntax/Guest/Types/index.html | 2 + .../Static/Syntax/Guest/index.html | 2 + .../argument-1-L/Static/Syntax/index.html | 5 + .../argument-1-L/Static/Typing/index.html | 2 + .../Make/argument-1-L/Static/Value/index.html | 2 + .../Make/argument-1-L/Static/index.html | 2 + .../Syntax/Guest/Types/index.html | 2 + .../Make/argument-1-L/Syntax/Guest/index.html | 2 + .../Make/argument-1-L/Syntax/index.html | 5 + .../argument-1-L/Systemc/G/Static/index.html | 2 + .../Systemc/G/Syntax/Types/index.html | 2 + .../argument-1-L/Systemc/G/Syntax/index.html | 2 + .../Make/argument-1-L/Systemc/G/index.html | 5 + .../Make/argument-1-L/Systemc/index.html | 2 + .../Typing/HostSyntax/Guest/Types/index.html | 2 + .../Typing/HostSyntax/Guest/index.html | 2 + .../argument-1-L/Typing/HostSyntax/index.html | 5 + .../Make/argument-1-L/Typing/index.html | 2 + .../Compiler/Make/argument-1-L/Vcd/index.html | 2 + .../argument-1-L/Vhdl/G/Static/index.html | 2 + .../Vhdl/G/Syntax/Types/index.html | 2 + .../argument-1-L/Vhdl/G/Syntax/index.html | 2 + .../Make/argument-1-L/Vhdl/G/index.html | 2 + .../Make/argument-1-L/Vhdl/index.html | 2 + .../Compiler/Make/argument-1-L/index.html | 3 + .../Compiler/Make/argument-2-Lexer/index.html | 2 + .../Make/argument-3-Parser/index.html | 5 + docs/rfsm/Rfsm/Compiler/Make/index.html | 2 + docs/rfsm/Rfsm/Compiler/index.html | 7 + .../Compiler/module-type-LEXER/index.html | 2 + .../Compiler/module-type-PARSER/index.html | 5 + .../Rfsm/Compiler/module-type-T/index.html | 2 + .../Rfsm/Ctask/Make/G/Syntax/Types/index.html | 2 + docs/rfsm/Rfsm/Ctask/Make/G/Syntax/index.html | 2 + docs/rfsm/Rfsm/Ctask/Make/G/index.html | 5 + .../Syntax/Guest/Types/index.html | 2 + .../argument-1-Static/Syntax/Guest/index.html | 2 + .../Make/argument-1-Static/Syntax/index.html | 5 + .../Make/argument-1-Static/Typing/index.html | 2 + .../Make/argument-1-Static/Value/index.html | 2 + .../Ctask/Make/argument-1-Static/index.html | 2 + .../Ctask/Make/argument-2-Guest/index.html | 5 + docs/rfsm/Rfsm/Ctask/Make/index.html | 2 + docs/rfsm/Rfsm/Ctask/index.html | 5 + .../G/Syntax/Types/index.html | 2 + .../module-type-CTASK/G/Syntax/index.html | 2 + .../Rfsm/Ctask/module-type-CTASK/G/index.html | 5 + .../Static/Syntax/Guest/Types/index.html | 2 + .../Static/Syntax/Guest/index.html | 2 + .../Static/Syntax/index.html | 5 + .../Static/Typing/index.html | 2 + .../module-type-CTASK/Static/Value/index.html | 2 + .../Ctask/module-type-CTASK/Static/index.html | 2 + .../Rfsm/Ctask/module-type-CTASK/index.html | 2 + docs/rfsm/Rfsm/Depg/G/E/index.html | 2 + docs/rfsm/Rfsm/Depg/G/Mark/index.html | 2 + docs/rfsm/Rfsm/Depg/G/V/index.html | 2 + docs/rfsm/Rfsm/Depg/G/index.html | 2 + docs/rfsm/Rfsm/Depg/M/index.html | 6 + .../Rfsm/Depg/Make/argument-1-N/index.html | 2 + docs/rfsm/Rfsm/Depg/Make/index.html | 2 + docs/rfsm/Rfsm/Depg/TS/index.html | 2 + docs/rfsm/Rfsm/Depg/index.html | 2 + .../Rfsm/Depg/module-type-NODE/index.html | 2 + docs/rfsm/Rfsm/Depg/module-type-T/index.html | 2 + .../Syntax/Guest/Types/index.html | 2 + .../Make/argument-1-S/Syntax/Guest/index.html | 2 + .../Dot/Make/argument-1-S/Syntax/index.html | 5 + .../Dot/Make/argument-1-S/Typing/index.html | 2 + .../Dot/Make/argument-1-S/Value/index.html | 2 + .../Rfsm/Dot/Make/argument-1-S/index.html | 2 + docs/rfsm/Rfsm/Dot/Make/index.html | 2 + docs/rfsm/Rfsm/Dot/index.html | 2 + .../Static/Syntax/Guest/Types/index.html | 2 + .../Static/Syntax/Guest/index.html | 2 + .../module-type-DOT/Static/Syntax/index.html | 5 + .../module-type-DOT/Static/Typing/index.html | 2 + .../module-type-DOT/Static/Value/index.html | 2 + .../Dot/module-type-DOT/Static/index.html | 2 + docs/rfsm/Rfsm/Dot/module-type-DOT/index.html | 2 + .../EvSeq/Evset/Event/Syntax/Types/index.html | 2 + .../Make/EvSeq/Evset/Event/Syntax/index.html | 2 + .../Make/EvSeq/Evset/Event/Value/index.html | 2 + .../Dynamic/Make/EvSeq/Evset/Event/index.html | 2 + .../Rfsm/Dynamic/Make/EvSeq/Evset/index.html | 2 + docs/rfsm/Rfsm/Dynamic/Make/EvSeq/index.html | 2 + .../argument-1-Syntax/Guest/Types/index.html | 2 + .../Make/argument-1-Syntax/Guest/index.html | 2 + .../Dynamic/Make/argument-1-Syntax/index.html | 5 + .../Make/argument-2-Static/Typing/index.html | 2 + .../Make/argument-2-Static/Value/index.html | 2 + .../Dynamic/Make/argument-2-Static/index.html | 2 + .../Dynamic/Make/argument-3-Eval/index.html | 2 + docs/rfsm/Rfsm/Dynamic/Make/index.html | 2 + docs/rfsm/Rfsm/Dynamic/index.html | 12 + .../EvSeq/Evset/Event/Syntax/Types/index.html | 2 + .../EvSeq/Evset/Event/Syntax/index.html | 2 + .../EvSeq/Evset/Event/Value/index.html | 2 + .../EvSeq/Evset/Event/index.html | 2 + .../EvSeq/Evset/index.html | 2 + .../module-type-DYNAMIC/EvSeq/index.html | 2 + .../Eval/Syntax/Types/index.html | 2 + .../Eval/Syntax/index.html | 2 + .../module-type-DYNAMIC/Eval/Value/index.html | 2 + .../module-type-DYNAMIC/Eval/index.html | 2 + .../Static/Syntax/Guest/Types/index.html | 2 + .../Static/Syntax/Guest/index.html | 2 + .../Static/Syntax/index.html | 5 + .../Static/Typing/index.html | 2 + .../Static/Value/index.html | 2 + .../module-type-DYNAMIC/Static/index.html | 2 + .../Syntax/Guest/Types/index.html | 2 + .../Syntax/Guest/index.html | 2 + .../module-type-DYNAMIC/Syntax/index.html | 5 + .../Dynamic/module-type-DYNAMIC/index.html | 2 + docs/rfsm/Rfsm/Env/index.html | 13 + .../Event/Make/argument-1-GS/Types/index.html | 2 + .../Rfsm/Event/Make/argument-1-GS/index.html | 2 + .../Rfsm/Event/Make/argument-2-GV/index.html | 2 + docs/rfsm/Rfsm/Event/Make/index.html | 2 + docs/rfsm/Rfsm/Event/index.html | 5 + .../module-type-T/Syntax/Types/index.html | 2 + .../Event/module-type-T/Syntax/index.html | 2 + .../Rfsm/Event/module-type-T/Value/index.html | 2 + docs/rfsm/Rfsm/Event/module-type-T/index.html | 2 + .../Event/Syntax/Types/index.html | 2 + .../argument-1-ES/Event/Syntax/index.html | 2 + .../Make/argument-1-ES/Event/Value/index.html | 2 + .../Evseq/Make/argument-1-ES/Event/index.html | 2 + .../Rfsm/Evseq/Make/argument-1-ES/index.html | 2 + docs/rfsm/Rfsm/Evseq/Make/index.html | 2 + docs/rfsm/Rfsm/Evseq/index.html | 4 + .../Evset/Event/Syntax/Types/index.html | 2 + .../Evset/Event/Syntax/index.html | 2 + .../Evset/Event/Value/index.html | 2 + .../module-type-EVSEQ/Evset/Event/index.html | 2 + .../Evseq/module-type-EVSEQ/Evset/index.html | 2 + .../Rfsm/Evseq/module-type-EVSEQ/index.html | 2 + .../Make/argument-1-E/Syntax/Types/index.html | 2 + .../Evset/Make/argument-1-E/Syntax/index.html | 2 + .../Evset/Make/argument-1-E/Value/index.html | 2 + .../Rfsm/Evset/Make/argument-1-E/index.html | 2 + docs/rfsm/Rfsm/Evset/Make/index.html | 2 + docs/rfsm/Rfsm/Evset/index.html | 2 + .../Event/Syntax/Types/index.html | 2 + .../module-type-T/Event/Syntax/index.html | 2 + .../module-type-T/Event/Value/index.html | 2 + .../Rfsm/Evset/module-type-T/Event/index.html | 2 + docs/rfsm/Rfsm/Evset/module-type-T/index.html | 2 + docs/rfsm/Rfsm/Ext/Base/index.html | 19 + docs/rfsm/Rfsm/Ext/File/index.html | 6 + docs/rfsm/Rfsm/Ext/Format/index.html | 2 + docs/rfsm/Rfsm/Ext/List/index.html | 26 + docs/rfsm/Rfsm/Ext/Option/index.html | 7 + docs/rfsm/Rfsm/Ext/index.html | 19 + docs/rfsm/Rfsm/Guest/index.html | 2 + .../module-type-CTASK/Syntax/Types/index.html | 2 + .../Guest/module-type-CTASK/Syntax/index.html | 2 + .../Rfsm/Guest/module-type-CTASK/index.html | 5 + .../Rfsm/Guest/module-type-ERROR/index.html | 2 + .../module-type-EVAL/Syntax/Types/index.html | 2 + .../Guest/module-type-EVAL/Syntax/index.html | 2 + .../Guest/module-type-EVAL/Value/index.html | 2 + .../Rfsm/Guest/module-type-EVAL/index.html | 2 + .../Rfsm/Guest/module-type-INFO/index.html | 2 + .../Rfsm/Guest/module-type-OPTIONS/index.html | 2 + .../Rfsm/Guest/module-type-STATIC/index.html | 2 + .../Guest/module-type-SYNTAX/Types/index.html | 2 + .../Rfsm/Guest/module-type-SYNTAX/index.html | 2 + .../module-type-SYSTEMC/Static/index.html | 2 + .../Syntax/Types/index.html | 2 + .../module-type-SYSTEMC/Syntax/index.html | 2 + .../Rfsm/Guest/module-type-SYSTEMC/index.html | 5 + .../Rfsm/Guest/module-type-T/Ctask/index.html | 5 + .../Rfsm/Guest/module-type-T/Error/index.html | 2 + .../Rfsm/Guest/module-type-T/Eval/index.html | 2 + .../Rfsm/Guest/module-type-T/Info/index.html | 2 + .../Guest/module-type-T/Options/index.html | 2 + .../Guest/module-type-T/Static/index.html | 2 + .../Guest/module-type-T/Syntax/index.html | 2 + .../Guest/module-type-T/Systemc/index.html | 5 + .../Rfsm/Guest/module-type-T/Types/index.html | 2 + .../Guest/module-type-T/Typing/index.html | 2 + .../Rfsm/Guest/module-type-T/Value/index.html | 2 + .../Rfsm/Guest/module-type-T/Vhdl/index.html | 2 + docs/rfsm/Rfsm/Guest/module-type-T/index.html | 10 + .../Rfsm/Guest/module-type-TYPES/index.html | 2 + .../Syntax/Types/index.html | 2 + .../module-type-TYPING/Syntax/index.html | 2 + .../Guest/module-type-TYPING/Types/index.html | 2 + .../Rfsm/Guest/module-type-TYPING/index.html | 2 + .../Rfsm/Guest/module-type-VALUE/index.html | 2 + .../Guest/module-type-VHDL/Static/index.html | 2 + .../module-type-VHDL/Syntax/Types/index.html | 2 + .../Guest/module-type-VHDL/Syntax/index.html | 2 + .../Rfsm/Guest/module-type-VHDL/index.html | 2 + .../Host/Make/Ctask/G/Syntax/Types/index.html | 2 + .../Rfsm/Host/Make/Ctask/G/Syntax/index.html | 2 + docs/rfsm/Rfsm/Host/Make/Ctask/G/index.html | 5 + docs/rfsm/Rfsm/Host/Make/Ctask/index.html | 2 + docs/rfsm/Rfsm/Host/Make/Dot/index.html | 2 + .../EvSeq/Evset/Event/Syntax/Types/index.html | 2 + .../EvSeq/Evset/Event/Syntax/index.html | 2 + .../EvSeq/Evset/Event/Value/index.html | 2 + .../Make/Dynamic/EvSeq/Evset/Event/index.html | 2 + .../Host/Make/Dynamic/EvSeq/Evset/index.html | 2 + .../Rfsm/Host/Make/Dynamic/EvSeq/index.html | 2 + .../Make/Dynamic/Eval/Syntax/Types/index.html | 2 + .../Host/Make/Dynamic/Eval/Syntax/index.html | 2 + .../Host/Make/Dynamic/Eval/Value/index.html | 2 + .../Rfsm/Host/Make/Dynamic/Eval/index.html | 2 + docs/rfsm/Rfsm/Host/Make/Dynamic/index.html | 2 + .../Make/Static/Syntax/Guest/Types/index.html | 2 + .../Host/Make/Static/Syntax/Guest/index.html | 2 + .../Rfsm/Host/Make/Static/Syntax/index.html | 5 + .../Rfsm/Host/Make/Static/Typing/index.html | 2 + .../Rfsm/Host/Make/Static/Value/index.html | 2 + docs/rfsm/Rfsm/Host/Make/Static/index.html | 2 + .../Host/Make/Systemc/G/Static/index.html | 2 + .../Make/Systemc/G/Syntax/Types/index.html | 2 + .../Host/Make/Systemc/G/Syntax/index.html | 2 + docs/rfsm/Rfsm/Host/Make/Systemc/G/index.html | 5 + docs/rfsm/Rfsm/Host/Make/Systemc/index.html | 2 + .../Typing/HostSyntax/Guest/Types/index.html | 2 + .../Make/Typing/HostSyntax/Guest/index.html | 2 + .../Host/Make/Typing/HostSyntax/index.html | 5 + docs/rfsm/Rfsm/Host/Make/Typing/index.html | 2 + docs/rfsm/Rfsm/Host/Make/Vcd/index.html | 2 + .../Rfsm/Host/Make/Vhdl/G/Static/index.html | 2 + .../Host/Make/Vhdl/G/Syntax/Types/index.html | 2 + .../Rfsm/Host/Make/Vhdl/G/Syntax/index.html | 2 + docs/rfsm/Rfsm/Host/Make/Vhdl/G/index.html | 2 + docs/rfsm/Rfsm/Host/Make/Vhdl/index.html | 2 + .../Host/Make/argument-1-G/Ctask/index.html | 5 + .../Host/Make/argument-1-G/Error/index.html | 2 + .../Host/Make/argument-1-G/Eval/index.html | 2 + .../Host/Make/argument-1-G/Info/index.html | 2 + .../Host/Make/argument-1-G/Options/index.html | 2 + .../Host/Make/argument-1-G/Static/index.html | 2 + .../Host/Make/argument-1-G/Syntax/index.html | 2 + .../Host/Make/argument-1-G/Systemc/index.html | 5 + .../Host/Make/argument-1-G/Types/index.html | 2 + .../Host/Make/argument-1-G/Typing/index.html | 2 + .../Host/Make/argument-1-G/Value/index.html | 2 + .../Host/Make/argument-1-G/Vhdl/index.html | 2 + .../Rfsm/Host/Make/argument-1-G/index.html | 12 + docs/rfsm/Rfsm/Host/Make/index.html | 3 + docs/rfsm/Rfsm/Host/index.html | 4 + .../Ctask/G/Syntax/Types/index.html | 2 + .../module-type-T/Ctask/G/Syntax/index.html | 2 + .../Host/module-type-T/Ctask/G/index.html | 5 + .../Rfsm/Host/module-type-T/Ctask/index.html | 2 + .../Rfsm/Host/module-type-T/Dot/index.html | 2 + .../EvSeq/Evset/Event/Syntax/Types/index.html | 2 + .../EvSeq/Evset/Event/Syntax/index.html | 2 + .../EvSeq/Evset/Event/Value/index.html | 2 + .../Dynamic/EvSeq/Evset/Event/index.html | 2 + .../Dynamic/EvSeq/Evset/index.html | 2 + .../module-type-T/Dynamic/EvSeq/index.html | 2 + .../Dynamic/Eval/Syntax/Types/index.html | 2 + .../Dynamic/Eval/Syntax/index.html | 2 + .../Dynamic/Eval/Value/index.html | 2 + .../module-type-T/Dynamic/Eval/index.html | 2 + .../Host/module-type-T/Dynamic/index.html | 2 + .../Host/module-type-T/Guest/Ctask/index.html | 5 + .../Host/module-type-T/Guest/Error/index.html | 2 + .../Host/module-type-T/Guest/Eval/index.html | 2 + .../Host/module-type-T/Guest/Info/index.html | 2 + .../module-type-T/Guest/Options/index.html | 2 + .../module-type-T/Guest/Static/index.html | 2 + .../module-type-T/Guest/Syntax/index.html | 2 + .../module-type-T/Guest/Systemc/index.html | 5 + .../Host/module-type-T/Guest/Types/index.html | 2 + .../module-type-T/Guest/Typing/index.html | 2 + .../Host/module-type-T/Guest/Value/index.html | 2 + .../Host/module-type-T/Guest/Vhdl/index.html | 2 + .../Rfsm/Host/module-type-T/Guest/index.html | 12 + .../Static/Syntax/Guest/Types/index.html | 2 + .../Static/Syntax/Guest/index.html | 2 + .../module-type-T/Static/Syntax/index.html | 5 + .../module-type-T/Static/Typing/index.html | 2 + .../module-type-T/Static/Value/index.html | 2 + .../Rfsm/Host/module-type-T/Static/index.html | 2 + .../Syntax/Guest/Types/index.html | 2 + .../module-type-T/Syntax/Guest/index.html | 2 + .../Rfsm/Host/module-type-T/Syntax/index.html | 5 + .../module-type-T/Systemc/G/Static/index.html | 2 + .../Systemc/G/Syntax/Types/index.html | 2 + .../module-type-T/Systemc/G/Syntax/index.html | 2 + .../Host/module-type-T/Systemc/G/index.html | 5 + .../Host/module-type-T/Systemc/index.html | 2 + .../Typing/HostSyntax/Guest/Types/index.html | 2 + .../Typing/HostSyntax/Guest/index.html | 2 + .../Typing/HostSyntax/index.html | 5 + .../Rfsm/Host/module-type-T/Typing/index.html | 2 + .../Rfsm/Host/module-type-T/Vcd/index.html | 2 + .../module-type-T/Vhdl/G/Static/index.html | 2 + .../Vhdl/G/Syntax/Types/index.html | 2 + .../module-type-T/Vhdl/G/Syntax/index.html | 2 + .../Rfsm/Host/module-type-T/Vhdl/G/index.html | 2 + .../Rfsm/Host/module-type-T/Vhdl/index.html | 2 + docs/rfsm/Rfsm/Host/module-type-T/index.html | 3 + docs/rfsm/Rfsm/Ident/index.html | 2 + docs/rfsm/Rfsm/Location/index.html | 2 + docs/rfsm/Rfsm/Logfile/index.html | 2 + docs/rfsm/Rfsm/Misc/index.html | 2 + docs/rfsm/Rfsm/Options/index.html | 2 + .../Make/argument-1-HS/Guest/Types/index.html | 2 + .../Make/argument-1-HS/Guest/index.html | 2 + .../Rfsm/Static/Make/argument-1-HS/index.html | 5 + .../Rfsm/Static/Make/argument-2-HT/index.html | 2 + .../Rfsm/Static/Make/argument-3-GV/index.html | 2 + .../Rfsm/Static/Make/argument-4-GS/index.html | 2 + docs/rfsm/Rfsm/Static/Make/index.html | 2 + docs/rfsm/Rfsm/Static/index.html | 30 + .../Syntax/Guest/Types/index.html | 2 + .../module-type-T/Syntax/Guest/index.html | 2 + .../Static/module-type-T/Syntax/index.html | 5 + .../Static/module-type-T/Typing/index.html | 2 + .../Static/module-type-T/Value/index.html | 2 + .../rfsm/Rfsm/Static/module-type-T/index.html | 2 + docs/rfsm/Rfsm/Subst/index.html | 6 + .../Syntax/Make/argument-1-G/Types/index.html | 2 + .../Rfsm/Syntax/Make/argument-1-G/index.html | 2 + docs/rfsm/Rfsm/Syntax/Make/index.html | 5 + docs/rfsm/Rfsm/Syntax/index.html | 2 + .../module-type-SYNTAX/Guest/Types/index.html | 2 + .../module-type-SYNTAX/Guest/index.html | 2 + .../Rfsm/Syntax/module-type-SYNTAX/index.html | 5 + .../Rfsm/Systemc/Make/G/Static/index.html | 2 + .../Systemc/Make/G/Syntax/Types/index.html | 2 + .../Rfsm/Systemc/Make/G/Syntax/index.html | 2 + docs/rfsm/Rfsm/Systemc/Make/G/index.html | 5 + .../Syntax/Guest/Types/index.html | 2 + .../argument-1-Static/Syntax/Guest/index.html | 2 + .../Make/argument-1-Static/Syntax/index.html | 5 + .../Make/argument-1-Static/Typing/index.html | 2 + .../Make/argument-1-Static/Value/index.html | 2 + .../Systemc/Make/argument-1-Static/index.html | 2 + .../Make/argument-2-Guest/Static/index.html | 2 + .../Systemc/Make/argument-2-Guest/index.html | 5 + docs/rfsm/Rfsm/Systemc/Make/index.html | 5 + docs/rfsm/Rfsm/Systemc/index.html | 8 + .../module-type-SYSTEMC/G/Static/index.html | 2 + .../G/Syntax/Types/index.html | 2 + .../module-type-SYSTEMC/G/Syntax/index.html | 2 + .../Systemc/module-type-SYSTEMC/G/index.html | 5 + .../Static/Syntax/Guest/Types/index.html | 2 + .../Static/Syntax/Guest/index.html | 2 + .../Static/Syntax/index.html | 5 + .../Static/Typing/index.html | 2 + .../Static/Value/index.html | 2 + .../module-type-SYSTEMC/Static/index.html | 2 + .../Systemc/module-type-SYSTEMC/index.html | 2 + .../Make/argument-1-HS/Guest/Types/index.html | 2 + .../Make/argument-1-HS/Guest/index.html | 2 + .../Rfsm/Typing/Make/argument-1-HS/index.html | 5 + .../Make/argument-2-GT/Types/index.html | 2 + .../Rfsm/Typing/Make/argument-2-GT/index.html | 2 + .../Rfsm/Typing/Make/argument-3-GS/index.html | 2 + docs/rfsm/Rfsm/Typing/Make/index.html | 88 ++ docs/rfsm/Rfsm/Typing/index.html | 6 + .../HostSyntax/Guest/Types/index.html | 2 + .../HostSyntax/Guest/index.html | 2 + .../module-type-TYPING/HostSyntax/index.html | 5 + .../Rfsm/Typing/module-type-TYPING/index.html | 2 + .../Evset/Event/Syntax/Types/index.html | 2 + .../Evset/Event/Syntax/index.html | 2 + .../Evset/Event/Value/index.html | 2 + .../argument-1-EvSeq/Evset/Event/index.html | 2 + .../Make/argument-1-EvSeq/Evset/index.html | 2 + .../Rfsm/Vcd/Make/argument-1-EvSeq/index.html | 2 + docs/rfsm/Rfsm/Vcd/Make/index.html | 2 + docs/rfsm/Rfsm/Vcd/index.html | 2 + docs/rfsm/Rfsm/Vcd/module-type-VCD/index.html | 2 + docs/rfsm/Rfsm/Vcd_types/index.html | 8 + docs/rfsm/Rfsm/Version/index.html | 2 + docs/rfsm/Rfsm/Vhdl/Make/G/Static/index.html | 2 + .../Rfsm/Vhdl/Make/G/Syntax/Types/index.html | 2 + docs/rfsm/Rfsm/Vhdl/Make/G/Syntax/index.html | 2 + docs/rfsm/Rfsm/Vhdl/Make/G/index.html | 2 + .../Syntax/Guest/Types/index.html | 2 + .../argument-1-Static/Syntax/Guest/index.html | 2 + .../Make/argument-1-Static/Syntax/index.html | 5 + .../Make/argument-1-Static/Typing/index.html | 2 + .../Make/argument-1-Static/Value/index.html | 2 + .../Vhdl/Make/argument-1-Static/index.html | 2 + .../Make/argument-2-Guest/Static/index.html | 2 + .../Vhdl/Make/argument-2-Guest/index.html | 2 + docs/rfsm/Rfsm/Vhdl/Make/index.html | 5 + docs/rfsm/Rfsm/Vhdl/index.html | 8 + .../Vhdl/module-type-VHDL/G/Static/index.html | 2 + .../G/Syntax/Types/index.html | 2 + .../Vhdl/module-type-VHDL/G/Syntax/index.html | 2 + .../Rfsm/Vhdl/module-type-VHDL/G/index.html | 2 + .../Static/Syntax/Guest/Types/index.html | 2 + .../Static/Syntax/Guest/index.html | 2 + .../module-type-VHDL/Static/Syntax/index.html | 5 + .../module-type-VHDL/Static/Typing/index.html | 2 + .../module-type-VHDL/Static/Value/index.html | 2 + .../Vhdl/module-type-VHDL/Static/index.html | 2 + .../Rfsm/Vhdl/module-type-VHDL/index.html | 2 + docs/rfsm/Rfsm/Vhdl_types/index.html | 2 + docs/rfsm/Rfsm/index.html | 19 + docs/rfsm/index.html | 2 + docs/user_manual/Makefile | 23 + docs/user_manual/dune | 3 + docs/user_manual/ex1-c.tex | 43 + docs/user_manual/ex1-systemc.tex | 177 +++ docs/user_manual/ex1-vhdl.tex | 154 +++ docs/user_manual/figs/.gitignore | 2 + docs/user_manual/figs/ctlsouris-chrono.pdf | Bin 0 -> 44818 bytes docs/user_manual/figs/ctlsouris-delim.pdf | Bin 0 -> 12868 bytes docs/user_manual/figs/ctlsouris-model.pdf | Bin 0 -> 16009 bytes docs/user_manual/figs/ctlsouris-top.pdf | Bin 0 -> 15727 bytes docs/user_manual/figs/ctrmod8-chrono.pdf | Bin 0 -> 48486 bytes docs/user_manual/figs/ctrmod8-top.pdf | Bin 0 -> 15947 bytes docs/user_manual/figs/gensig-chrono.pdf | Bin 0 -> 76207 bytes docs/user_manual/figs/gensig-model-moore.pdf | Bin 0 -> 11497 bytes docs/user_manual/figs/gensig-model.pdf | Bin 0 -> 11465 bytes docs/user_manual/figs/gensig-top.pdf | Bin 0 -> 14423 bytes docs/user_manual/figs/gensig-trace.pdf | Bin 0 -> 12828 bytes docs/user_manual/figs/gui/mainwindow.pdf | Bin 0 -> 57947 bytes .../user_manual/figs/gui/make-dot-project.pdf | Bin 0 -> 113028 bytes docs/user_manual/figs/gui/make-dot.pdf | Bin 0 -> 82817 bytes docs/user_manual/figs/gui/make-sim.pdf | Bin 0 -> 46808 bytes docs/user_manual/figs/gui/make-systemc.pdf | Bin 0 -> 61379 bytes docs/user_manual/figs/gui/open-file.pdf | Bin 0 -> 60763 bytes docs/user_manual/figs/gui/open-project.pdf | Bin 0 -> 73566 bytes docs/user_manual/figs/gui/options.pdf | Bin 0 -> 16916 bytes docs/user_manual/figs/gui/pathconfig.pdf | Bin 0 -> 19030 bytes docs/user_manual/figs/rfsm-logo.pdf | Bin 0 -> 179592 bytes docs/user_manual/figs/shvar-chrono.pdf | Bin 0 -> 60541 bytes docs/user_manual/figs/shvar-top.pdf | Bin 0 -> 14659 bytes docs/user_manual/figs/sync-ev1-chrono.pdf | Bin 0 -> 8918 bytes docs/user_manual/figs/sync-ev1-model.pdf | Bin 0 -> 11409 bytes docs/user_manual/figs/sync-ev2-chrono.pdf | Bin 0 -> 9566 bytes docs/user_manual/figs/sync-ev2-model.pdf | Bin 0 -> 11952 bytes docs/user_manual/figs/sync-sv1-chrono.pdf | Bin 0 -> 9579 bytes docs/user_manual/figs/sync-sv1-model.pdf | Bin 0 -> 12054 bytes docs/user_manual/figs/sync-sv2-chrono.pdf | Bin 0 -> 9476 bytes docs/user_manual/figs/sync-sv2-model.pdf | Bin 0 -> 11909 bytes docs/user_manual/introduction.tex | 50 + docs/user_manual/language.tex | 1077 +++++++++++++++++ docs/user_manual/overview.tex | 356 ++++++ {doc => docs}/user_manual/rfsm_um.pdf | Bin docs/user_manual/rfsm_um.tex | 112 ++ docs/user_manual/rfsmc.tex | 253 ++++ 556 files changed, 7064 insertions(+), 22 deletions(-) create mode 100644 docs/_odoc_support/fonts/KaTeX_AMS-Regular.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Caligraphic-Bold.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Caligraphic-Regular.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Fraktur-Bold.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Fraktur-Regular.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Main-Bold.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Main-BoldItalic.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Main-Italic.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Main-Regular.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Math-BoldItalic.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Math-Italic.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_SansSerif-Bold.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_SansSerif-Italic.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_SansSerif-Regular.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Script-Regular.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Size1-Regular.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Size2-Regular.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Size3-Regular.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Size4-Regular.woff2 create mode 100644 docs/_odoc_support/fonts/KaTeX_Typewriter-Regular.woff2 create mode 100644 docs/_odoc_support/highlight.pack.js create mode 100644 docs/_odoc_support/katex.min.css create mode 100644 docs/_odoc_support/katex.min.js create mode 100644 docs/_odoc_support/odoc.css rename {doc => docs}/code/gensig/README.md (100%) rename {doc => docs}/code/gensig/ctask/README.md (100%) rename {doc => docs}/code/gensig/ctask/gensig.c (100%) rename {doc => docs}/code/gensig/systemc/README.md (100%) rename {doc => docs}/code/gensig/systemc/g.cpp (100%) rename {doc => docs}/code/gensig/systemc/g.h (100%) rename {doc => docs}/code/gensig/systemc/gensig.cpp (100%) rename {doc => docs}/code/gensig/systemc/gensig.h (100%) rename {doc => docs}/code/gensig/systemc/inp_E.cpp (100%) rename {doc => docs}/code/gensig/systemc/inp_E.h (100%) rename {doc => docs}/code/gensig/systemc/inp_H.cpp (100%) rename {doc => docs}/code/gensig/systemc/inp_H.h (100%) rename {doc => docs}/code/gensig/systemc/main.cpp (100%) rename {doc => docs}/code/gensig/vhdl/README.md (100%) rename {doc => docs}/code/gensig/vhdl/g.vhd (100%) rename {doc => docs}/code/gensig/vhdl/main_tb.vhd (100%) rename {doc => docs}/code/gensig/vhdl/main_top.vhd (100%) rename {doc => docs}/figs/ctrmod8-chrono.png (100%) rename {doc => docs}/figs/ctrmod8-top.png (100%) rename {doc => docs}/figs/gensig-chrono.png (100%) rename {doc => docs}/figs/gensig-model-moore.png (100%) create mode 100644 docs/index.html create mode 100644 docs/ref_manual/Makefile create mode 100644 docs/ref_manual/bcprules.sty create mode 100644 docs/ref_manual/bnf.tex create mode 100644 docs/ref_manual/dune create mode 100644 docs/ref_manual/grammar-defns.sty create mode 100644 docs/ref_manual/grammar.tex create mode 100644 docs/ref_manual/options.tex rename {doc => docs}/ref_manual/rfsm_rm.pdf (100%) create mode 100755 docs/ref_manual/rfsm_rm.tex create mode 100644 docs/ref_manual/rfsmc-options.tex create mode 100644 docs/ref_manual/semantics.tex create mode 100644 docs/ref_manual/variants.tex create mode 100644 docs/rfsm/Rfsm/.dummy create mode 100644 docs/rfsm/Rfsm/Annot/index.html create mode 100644 docs/rfsm/Rfsm/Bits/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/Make/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/index.html create mode 100644 docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/G/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dot/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/Value/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/Value/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Ctask/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Error/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Eval/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Info/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Options/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Static/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Systemc/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Value/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Vhdl/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/Static/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/HostSyntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/HostSyntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/HostSyntax/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vcd/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/Static/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-1-L/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-2-Lexer/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/argument-3-Parser/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/Make/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/module-type-LEXER/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/module-type-PARSER/index.html create mode 100644 docs/rfsm/Rfsm/Compiler/module-type-T/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/Make/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/Make/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/Make/G/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/Make/argument-2-Guest/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/Make/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/module-type-CTASK/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/module-type-CTASK/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/module-type-CTASK/G/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/index.html create mode 100644 docs/rfsm/Rfsm/Ctask/module-type-CTASK/index.html create mode 100644 docs/rfsm/Rfsm/Depg/G/E/index.html create mode 100644 docs/rfsm/Rfsm/Depg/G/Mark/index.html create mode 100644 docs/rfsm/Rfsm/Depg/G/V/index.html create mode 100644 docs/rfsm/Rfsm/Depg/G/index.html create mode 100644 docs/rfsm/Rfsm/Depg/M/index.html create mode 100644 docs/rfsm/Rfsm/Depg/Make/argument-1-N/index.html create mode 100644 docs/rfsm/Rfsm/Depg/Make/index.html create mode 100644 docs/rfsm/Rfsm/Depg/TS/index.html create mode 100644 docs/rfsm/Rfsm/Depg/index.html create mode 100644 docs/rfsm/Rfsm/Depg/module-type-NODE/index.html create mode 100644 docs/rfsm/Rfsm/Depg/module-type-T/index.html create mode 100644 docs/rfsm/Rfsm/Dot/Make/argument-1-S/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Dot/Make/argument-1-S/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Dot/Make/argument-1-S/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Dot/Make/argument-1-S/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Dot/Make/argument-1-S/Value/index.html create mode 100644 docs/rfsm/Rfsm/Dot/Make/argument-1-S/index.html create mode 100644 docs/rfsm/Rfsm/Dot/Make/index.html create mode 100644 docs/rfsm/Rfsm/Dot/index.html create mode 100644 docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Dot/module-type-DOT/Static/index.html create mode 100644 docs/rfsm/Rfsm/Dot/module-type-DOT/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/Value/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/EvSeq/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/argument-1-Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/argument-1-Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/argument-1-Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/argument-2-Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/argument-2-Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/argument-2-Static/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/argument-3-Eval/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/Make/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/Value/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/Value/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/index.html create mode 100644 docs/rfsm/Rfsm/Env/index.html create mode 100644 docs/rfsm/Rfsm/Event/Make/argument-1-GS/Types/index.html create mode 100644 docs/rfsm/Rfsm/Event/Make/argument-1-GS/index.html create mode 100644 docs/rfsm/Rfsm/Event/Make/argument-2-GV/index.html create mode 100644 docs/rfsm/Rfsm/Event/Make/index.html create mode 100644 docs/rfsm/Rfsm/Event/index.html create mode 100644 docs/rfsm/Rfsm/Event/module-type-T/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Event/module-type-T/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Event/module-type-T/Value/index.html create mode 100644 docs/rfsm/Rfsm/Event/module-type-T/index.html create mode 100644 docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/Value/index.html create mode 100644 docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/index.html create mode 100644 docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/index.html create mode 100644 docs/rfsm/Rfsm/Evseq/Make/index.html create mode 100644 docs/rfsm/Rfsm/Evseq/index.html create mode 100644 docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/Value/index.html create mode 100644 docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/index.html create mode 100644 docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/index.html create mode 100644 docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/index.html create mode 100644 docs/rfsm/Rfsm/Evset/Make/argument-1-E/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Evset/Make/argument-1-E/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Evset/Make/argument-1-E/Value/index.html create mode 100644 docs/rfsm/Rfsm/Evset/Make/argument-1-E/index.html create mode 100644 docs/rfsm/Rfsm/Evset/Make/index.html create mode 100644 docs/rfsm/Rfsm/Evset/index.html create mode 100644 docs/rfsm/Rfsm/Evset/module-type-T/Event/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Evset/module-type-T/Event/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Evset/module-type-T/Event/Value/index.html create mode 100644 docs/rfsm/Rfsm/Evset/module-type-T/Event/index.html create mode 100644 docs/rfsm/Rfsm/Evset/module-type-T/index.html create mode 100644 docs/rfsm/Rfsm/Ext/Base/index.html create mode 100644 docs/rfsm/Rfsm/Ext/File/index.html create mode 100644 docs/rfsm/Rfsm/Ext/Format/index.html create mode 100644 docs/rfsm/Rfsm/Ext/List/index.html create mode 100644 docs/rfsm/Rfsm/Ext/Option/index.html create mode 100644 docs/rfsm/Rfsm/Ext/index.html create mode 100644 docs/rfsm/Rfsm/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-CTASK/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-CTASK/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-CTASK/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-ERROR/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-EVAL/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-EVAL/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-EVAL/Value/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-EVAL/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-INFO/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-OPTIONS/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-STATIC/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-SYNTAX/Types/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-SYNTAX/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/Static/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-T/Ctask/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-T/Error/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-T/Eval/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-T/Info/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-T/Options/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-T/Static/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-T/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-T/Systemc/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-T/Types/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-T/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-T/Value/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-T/Vhdl/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-T/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-TYPES/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-TYPING/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-TYPING/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-TYPING/Types/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-TYPING/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-VALUE/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-VHDL/Static/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-VHDL/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-VHDL/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Guest/module-type-VHDL/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Ctask/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Ctask/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Ctask/G/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Ctask/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Dot/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/Value/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/Value/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Dynamic/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Static/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Static/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Static/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Static/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Systemc/G/Static/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Systemc/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Systemc/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Systemc/G/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Systemc/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Typing/HostSyntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Typing/HostSyntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Typing/HostSyntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Vcd/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Vhdl/G/Static/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Vhdl/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Vhdl/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Vhdl/G/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/Vhdl/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/argument-1-G/Ctask/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/argument-1-G/Error/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/argument-1-G/Eval/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/argument-1-G/Info/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/argument-1-G/Options/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/argument-1-G/Static/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/argument-1-G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/argument-1-G/Systemc/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/argument-1-G/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/argument-1-G/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/argument-1-G/Value/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/argument-1-G/Vhdl/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/argument-1-G/index.html create mode 100644 docs/rfsm/Rfsm/Host/Make/index.html create mode 100644 docs/rfsm/Rfsm/Host/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Ctask/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Ctask/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Ctask/G/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Ctask/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Dot/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/Value/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/Value/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Dynamic/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Guest/Ctask/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Guest/Error/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Guest/Eval/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Guest/Info/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Guest/Options/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Guest/Static/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Guest/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Guest/Systemc/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Guest/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Guest/Value/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Guest/Vhdl/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Static/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Static/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Static/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Static/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/Static/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Systemc/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Typing/HostSyntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Typing/HostSyntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Typing/HostSyntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Vcd/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/Static/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/Vhdl/index.html create mode 100644 docs/rfsm/Rfsm/Host/module-type-T/index.html create mode 100644 docs/rfsm/Rfsm/Ident/index.html create mode 100644 docs/rfsm/Rfsm/Location/index.html create mode 100644 docs/rfsm/Rfsm/Logfile/index.html create mode 100644 docs/rfsm/Rfsm/Misc/index.html create mode 100644 docs/rfsm/Rfsm/Options/index.html create mode 100644 docs/rfsm/Rfsm/Static/Make/argument-1-HS/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Static/Make/argument-1-HS/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Static/Make/argument-1-HS/index.html create mode 100644 docs/rfsm/Rfsm/Static/Make/argument-2-HT/index.html create mode 100644 docs/rfsm/Rfsm/Static/Make/argument-3-GV/index.html create mode 100644 docs/rfsm/Rfsm/Static/Make/argument-4-GS/index.html create mode 100644 docs/rfsm/Rfsm/Static/Make/index.html create mode 100644 docs/rfsm/Rfsm/Static/index.html create mode 100644 docs/rfsm/Rfsm/Static/module-type-T/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Static/module-type-T/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Static/module-type-T/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Static/module-type-T/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Static/module-type-T/Value/index.html create mode 100644 docs/rfsm/Rfsm/Static/module-type-T/index.html create mode 100644 docs/rfsm/Rfsm/Subst/index.html create mode 100644 docs/rfsm/Rfsm/Syntax/Make/argument-1-G/Types/index.html create mode 100644 docs/rfsm/Rfsm/Syntax/Make/argument-1-G/index.html create mode 100644 docs/rfsm/Rfsm/Syntax/Make/index.html create mode 100644 docs/rfsm/Rfsm/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Syntax/module-type-SYNTAX/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Syntax/module-type-SYNTAX/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Syntax/module-type-SYNTAX/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/Make/G/Static/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/Make/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/Make/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/Make/G/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/Make/argument-2-Guest/Static/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/Make/argument-2-Guest/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/Make/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/Static/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/index.html create mode 100644 docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/index.html create mode 100644 docs/rfsm/Rfsm/Typing/Make/argument-1-HS/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Typing/Make/argument-1-HS/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Typing/Make/argument-1-HS/index.html create mode 100644 docs/rfsm/Rfsm/Typing/Make/argument-2-GT/Types/index.html create mode 100644 docs/rfsm/Rfsm/Typing/Make/argument-2-GT/index.html create mode 100644 docs/rfsm/Rfsm/Typing/Make/argument-3-GS/index.html create mode 100644 docs/rfsm/Rfsm/Typing/Make/index.html create mode 100644 docs/rfsm/Rfsm/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Typing/module-type-TYPING/HostSyntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Typing/module-type-TYPING/HostSyntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Typing/module-type-TYPING/HostSyntax/index.html create mode 100644 docs/rfsm/Rfsm/Typing/module-type-TYPING/index.html create mode 100644 docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/Value/index.html create mode 100644 docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/index.html create mode 100644 docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/index.html create mode 100644 docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/index.html create mode 100644 docs/rfsm/Rfsm/Vcd/Make/index.html create mode 100644 docs/rfsm/Rfsm/Vcd/index.html create mode 100644 docs/rfsm/Rfsm/Vcd/module-type-VCD/index.html create mode 100644 docs/rfsm/Rfsm/Vcd_types/index.html create mode 100644 docs/rfsm/Rfsm/Version/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/Make/G/Static/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/Make/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/Make/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/Make/G/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/Make/argument-2-Guest/Static/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/Make/argument-2-Guest/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/Make/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/Static/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/Syntax/Types/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Syntax/Guest/Types/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Syntax/Guest/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Syntax/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Typing/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Value/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl/module-type-VHDL/index.html create mode 100644 docs/rfsm/Rfsm/Vhdl_types/index.html create mode 100644 docs/rfsm/Rfsm/index.html create mode 100644 docs/rfsm/index.html create mode 100644 docs/user_manual/Makefile create mode 100644 docs/user_manual/dune create mode 100644 docs/user_manual/ex1-c.tex create mode 100644 docs/user_manual/ex1-systemc.tex create mode 100644 docs/user_manual/ex1-vhdl.tex create mode 100644 docs/user_manual/figs/.gitignore create mode 100644 docs/user_manual/figs/ctlsouris-chrono.pdf create mode 100644 docs/user_manual/figs/ctlsouris-delim.pdf create mode 100644 docs/user_manual/figs/ctlsouris-model.pdf create mode 100644 docs/user_manual/figs/ctlsouris-top.pdf create mode 100644 docs/user_manual/figs/ctrmod8-chrono.pdf create mode 100644 docs/user_manual/figs/ctrmod8-top.pdf create mode 100644 docs/user_manual/figs/gensig-chrono.pdf create mode 100644 docs/user_manual/figs/gensig-model-moore.pdf create mode 100644 docs/user_manual/figs/gensig-model.pdf create mode 100644 docs/user_manual/figs/gensig-top.pdf create mode 100644 docs/user_manual/figs/gensig-trace.pdf create mode 100644 docs/user_manual/figs/gui/mainwindow.pdf create mode 100644 docs/user_manual/figs/gui/make-dot-project.pdf create mode 100644 docs/user_manual/figs/gui/make-dot.pdf create mode 100644 docs/user_manual/figs/gui/make-sim.pdf create mode 100644 docs/user_manual/figs/gui/make-systemc.pdf create mode 100644 docs/user_manual/figs/gui/open-file.pdf create mode 100644 docs/user_manual/figs/gui/open-project.pdf create mode 100644 docs/user_manual/figs/gui/options.pdf create mode 100644 docs/user_manual/figs/gui/pathconfig.pdf create mode 100644 docs/user_manual/figs/rfsm-logo.pdf create mode 100644 docs/user_manual/figs/shvar-chrono.pdf create mode 100644 docs/user_manual/figs/shvar-top.pdf create mode 100644 docs/user_manual/figs/sync-ev1-chrono.pdf create mode 100644 docs/user_manual/figs/sync-ev1-model.pdf create mode 100644 docs/user_manual/figs/sync-ev2-chrono.pdf create mode 100644 docs/user_manual/figs/sync-ev2-model.pdf create mode 100644 docs/user_manual/figs/sync-sv1-chrono.pdf create mode 100644 docs/user_manual/figs/sync-sv1-model.pdf create mode 100644 docs/user_manual/figs/sync-sv2-chrono.pdf create mode 100644 docs/user_manual/figs/sync-sv2-model.pdf create mode 100644 docs/user_manual/introduction.tex create mode 100644 docs/user_manual/language.tex create mode 100644 docs/user_manual/overview.tex rename {doc => docs}/user_manual/rfsm_um.pdf (100%) create mode 100755 docs/user_manual/rfsm_um.tex create mode 100644 docs/user_manual/rfsmc.tex diff --git a/.gitignore b/.gitignore index 46f25088..8b49904a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,10 +13,10 @@ config config-stamp *.dvi *.pdf -doc/user_manual/* -!doc/user_manual/rfsm_um.pdf -doc/ref_manual/* -!doc/ref_manual/rfsm_rm.pdf +docs/user_manual/* +!docs/user_manual/rfsm_um.pdf +docs/ref_manual/* +!docs/ref_manual/rfsm_rm.pdf *.aux *.log *.rel diff --git a/Makefile b/Makefile index 7f4f8bed..c11fcddd 100755 --- a/Makefile +++ b/Makefile @@ -1,5 +1,3 @@ -.PHONY: doc.html doc.pdf tests - all: host std_guest doc host: @@ -16,8 +14,6 @@ other_guests: install: dune build @install -INSTALL_DOCDIR=`opam var doc` - doc: doc.html doc.pdf doc.view: @@ -25,14 +21,11 @@ doc.view: doc.html: dune build @doc + cp -r _build/default/_doc/_html/* ./docs doc.pdf: - (cd ./doc/user_manual; make) - (cd ./doc/ref_manual; make) - -html: README.md - pandoc -t html -o README.html README.md - pandoc -t html -o CHANGES.html CHANGES.md + (cd ./docs/user_manual; make) + (cd ./docs/ref_manual; make) clean: dune clean diff --git a/README.md b/README.md index 00e3ca3e..f2ec264c 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ two inputs (`h`, of type `event`, and `e`, of type `bool`) and one output (`s`, occurrence of the `h` event and when a `1` is read, the `s` output is set to `1` for a duration `D=n.T`. -![](https://github.com/jserot/rfsm/blob/master/doc/figs/gensig-model-moore.png "") +![](https://github.com/jserot/rfsm/blob/master/docs/figs/gensig-model-moore.png "") The model has two states (named `E0` and `E1`). The initial state is `E0`. The `s` output is `0` when the machine is in state `E0` and `1` when it is in state `E1`. @@ -75,12 +75,12 @@ Invoking the `rfmsc` compiler with the `-sim` option produces `.vcd` file, which be viewed with the [Gtkwave](http://gtkwave.sourceforge.net) trace viewer for example, as shown below -![](https://github.com/jserot/rfsm/blob/master/doc/figs/gensig-chrono.png "") +![](https://github.com/jserot/rfsm/blob/master/docs/figs/gensig-chrono.png "") Invoking the `rfmsc` compiler with the `-ctask`, `-systemc` and `-vhdl` option can generate C, SystemC and VHDL code for the model (and the testbench). Here's for example the VHDL code generated for the `gensig` model. All the generated code can can be viewed -[here](https://github.com/jserot/rfsm/tree/master/doc/code/gensig). +[here](https://github.com/jserot/rfsm/tree/master/docs/code/gensig). RFSM can also be used to describe multi-FSM models. Here's a description of a simple modulo-8 counter as three concurrent modulo-2 counters : @@ -116,11 +116,11 @@ internal, shared events named `R0` and `R1`. A graphical view of global model (obtained by invoking the `rfsmc` compiler with the `-dot` option) is given below -![](https://github.com/jserot/rfsm/blob/master/doc/figs/ctrmod8-top.png "") +![](https://github.com/jserot/rfsm/blob/master/docs/figs/ctrmod8-top.png "") Simulation of this model produces the following trace : -![](https://github.com/jserot/rfsm/blob/master/doc/figs/ctrmod8-chrono.png "") +![](https://github.com/jserot/rfsm/blob/master/docs/figs/ctrmod8-chrono.png "") ## PACKAGE DESCRIPTION @@ -151,11 +151,11 @@ for simulation or implementation on a target platform (micro-controlers or FPGAs ## Documentation The user and reference manuals can be found -[here](https://github.com/jserot/rfsm/tree/master/doc/user_manual/rfsm_um.pdf) and -[here](https://github.com/jserot/rfsm/tree/master/doc/ref_manual/rfsm_rm.pdf). +[here](https://github.com/jserot/rfsm/tree/master/docs/user_manual/rfsm_um.pdf) and +[here](https://github.com/jserot/rfsm/tree/master/docs/ref_manual/rfsm_rm.pdf). The "host" library API is documented -[here](https://github.com/jserot/rfsm/blob/master/doc/lib/index.html ""). +[here](https://jserot/github.io/rfsm/index.html ""). diff --git a/docs/_odoc_support/fonts/KaTeX_AMS-Regular.woff2 b/docs/_odoc_support/fonts/KaTeX_AMS-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0acaaff03d4bb7606de02a827aeee338e5a86910 GIT binary patch literal 28076 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 G2<`xUL{2yW literal 0 HcmV?d00001 diff --git a/docs/_odoc_support/fonts/KaTeX_Caligraphic-Regular.woff2 b/docs/_odoc_support/fonts/KaTeX_Caligraphic-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..75344a1f98e37e2c631e178065854c3a81fb842f GIT binary patch literal 6908 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 CFgb+) literal 0 HcmV?d00001 diff --git a/docs/_odoc_support/fonts/KaTeX_Fraktur-Bold.woff2 b/docs/_odoc_support/fonts/KaTeX_Fraktur-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..395f28beac23c7b0f7f3a1e714bd8dac253dd3bc GIT binary patch literal 11348 zcmV-aEUVLZPew8T0RR9104!7h4gdfE08HQj04x0f0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/docs/_odoc_support/fonts/KaTeX_Main-Italic.woff2 b/docs/_odoc_support/fonts/KaTeX_Main-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b50920e138807f385d0b0359f4f0f09891f18406 GIT binary patch literal 16988 zcmV(>K-j-`Pew8T0RR91076^<4gdfE0E4su073x(0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/docs/_odoc_support/fonts/KaTeX_Main-Regular.woff2 b/docs/_odoc_support/fonts/KaTeX_Main-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..eb24a7ba282b03d830fa6c63ee897d92a5188736 GIT binary patch literal 26272 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�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 bkH82T%!~T~dOL3iZSfI!+IWoKhyte*`46Vs literal 0 HcmV?d00001 diff --git a/docs/_odoc_support/fonts/KaTeX_Math-BoldItalic.woff2 b/docs/_odoc_support/fonts/KaTeX_Math-BoldItalic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..29657023adc09956249f6295746c8ce4469b50d3 GIT binary patch literal 16400 zcmV+rK<~eIPew8T0RR9106-7`4gdfE0D43K06(+<0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/docs/_odoc_support/fonts/KaTeX_Math-Italic.woff2 b/docs/_odoc_support/fonts/KaTeX_Math-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..215c143fd7805a5c2b222bd7892a1a2b09610020 GIT binary patch literal 16440 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 G>;nKVNojrn literal 0 HcmV?d00001 diff --git a/docs/_odoc_support/fonts/KaTeX_SansSerif-Italic.woff2 b/docs/_odoc_support/fonts/KaTeX_SansSerif-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..349c06dc609f896392fd5bc8b364d3bc3efc9330 GIT binary patch literal 12028 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 GG{*pT{>~Tx literal 0 HcmV?d00001 diff --git a/docs/_odoc_support/fonts/KaTeX_Script-Regular.woff2 b/docs/_odoc_support/fonts/KaTeX_Script-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b3048fc115681ee6c1bc86b0aa158cfbbf59daa3 GIT binary patch literal 9644 zcmV;dB~#jWPew8T0RR91041yd4gdfE06`=G03}%f0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/docs/_odoc_support/fonts/KaTeX_Size1-Regular.woff2 b/docs/_odoc_support/fonts/KaTeX_Size1-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c5a8462fbfe2c39a7c1857b9e296e62500a8a8a5 GIT binary patch literal 5468 zcmV-i6{G5RPew8T0RR9102N#S4gdfE059|a02KrP0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/docs/_odoc_support/fonts/KaTeX_Size4-Regular.woff2 b/docs/_odoc_support/fonts/KaTeX_Size4-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..680c13085076a2f6c5a7e695935ec3f21cddb65f GIT binary patch literal 4928 zcmV-G6Tj?tPew8T0RR91024p}4gdfE04S^g021l|0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/docs/_odoc_support/fonts/KaTeX_Typewriter-Regular.woff2 b/docs/_odoc_support/fonts/KaTeX_Typewriter-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..771f1af705f5cef5f578b3a1e7d8eff66f9b76b0 GIT binary patch literal 13568 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 G0ssIW{ +throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((n=>{var i=e[n] +;"object"!=typeof i||Object.isFrozen(i)||t(i)})),e} +e.exports=t,e.exports.default=t;class n{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function i(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function r(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] +;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n} +const s=e=>!!e.scope||e.sublanguage&&e.language;class o{constructor(e,t){ +this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ +this.buffer+=i(e)}openNode(e){if(!s(e))return;let t="" +;t=e.sublanguage?"language-"+e.language:((e,{prefix:t})=>{if(e.includes(".")){ +const n=e.split(".") +;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ") +}return`${t}${e}`})(e.scope,{prefix:this.classPrefix}),this.span(t)} +closeNode(e){s(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}const a=(e={})=>{const t={children:[]} +;return Object.assign(t,e),t};class c{constructor(){ +this.rootNode=a(),this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const t=a({scope:e}) +;this.add(t),this.stack.push(t)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ +return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), +t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +c._collapse(e)})))}}class l extends c{constructor(e){super(),this.options=e} +addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} +addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root +;n.sublanguage=!0,n.language=t,this.add(n)}toHTML(){ +return new o(this,this.options).value()}finalize(){return!0}}function g(e){ +return e?"string"==typeof e?e:e.source:null}function d(e){return p("(?=",e,")")} +function u(e){return p("(?:",e,")*")}function h(e){return p("(?:",e,")?")} +function p(...e){return e.map((e=>g(e))).join("")}function f(...e){const t=(e=>{ +const t=e[e.length-1] +;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{} +})(e);return"("+(t.capture?"":"?:")+e.map((e=>g(e))).join("|")+")"} +function b(e){return RegExp(e.toString()+"|").exec("").length-1} +const m=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function E(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n +;let i=g(e),r="";for(;i.length>0;){const e=m.exec(i);if(!e){r+=i;break} +r+=i.substring(0,e.index), +i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?r+="\\"+(Number(e[1])+t):(r+=e[0], +"("===e[0]&&n++)}return r})).map((e=>`(${e})`)).join(t)} +const x="[a-zA-Z]\\w*",w="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",_="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",O="\\b(0b[01]+)",v={ +begin:"\\\\[\\s\\S]",relevance:0},N={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[v]},k={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[v]},M=(e,t,n={})=>{const i=r({scope:"comment",begin:e,end:t, +contains:[]},n);i.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const s=f("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return i.contains.push({begin:p(/[ ]+/,"(",s,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i +},S=M("//","$"),R=M("/\\*","\\*/"),j=M("#","$");var A=Object.freeze({ +__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:x,UNDERSCORE_IDENT_RE:w, +NUMBER_RE:y,C_NUMBER_RE:_,BINARY_NUMBER_RE:O, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const t=/^#![ ]*\// +;return e.binary&&(e.begin=p(t,/.*\b/,e.binary,/\b.*/)),r({scope:"meta",begin:t, +end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)}, +BACKSLASH_ESCAPE:v,APOS_STRING_MODE:N,QUOTE_STRING_MODE:k,PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},COMMENT:M,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:R,HASH_COMMENT_MODE:j, +NUMBER_MODE:{scope:"number",begin:y,relevance:0},C_NUMBER_MODE:{scope:"number", +begin:_,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:O,relevance:0}, +REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//, +end:/\/[gimuy]*/,illegal:/\n/,contains:[v,{begin:/\[/,end:/\]/,relevance:0, +contains:[v]}]}]},TITLE_MODE:{scope:"title",begin:x,relevance:0}, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:w,relevance:0},METHOD_GUARD:{ +begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ +t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function I(e,t){ +"."===e.input[e.index-1]&&t.ignoreMatch()}function T(e,t){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function L(e,t){ +t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=I,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function B(e,t){ +Array.isArray(e.illegal)&&(e.illegal=f(...e.illegal))}function D(e,t){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function H(e,t){ +void 0===e.relevance&&(e.relevance=1)}const P=(e,t)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t] +})),e.keywords=n.keywords,e.begin=p(n.beforeMatch,d(n.begin)),e.starts={ +relevance:0,contains:[Object.assign(n,{endsParent:!0})] +},e.relevance=0,delete n.beforeMatch +},C=["of","and","for","in","not","or","if","then","parent","list","value"] +;function $(e,t,n="keyword"){const i=Object.create(null) +;return"string"==typeof e?r(n,e.split(" ")):Array.isArray(e)?r(n,e):Object.keys(e).forEach((n=>{ +Object.assign(i,$(e[n],t,n))})),i;function r(e,n){ +t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") +;i[n[0]]=[e,U(n[0],n[1])]}))}}function U(e,t){ +return t?Number(t):(e=>C.includes(e.toLowerCase()))(e)?0:1}const z={},K=e=>{ +console.error(e)},W=(e,...t)=>{console.log("WARN: "+e,...t)},X=(e,t)=>{ +z[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),z[`${e}/${t}`]=!0) +},G=Error();function Z(e,t,{key:n}){let i=0;const r=e[n],s={},o={} +;for(let e=1;e<=t.length;e++)o[e+i]=r[e],s[e+i]=!0,i+=b(t[e-1]) +;e[n]=o,e[n]._emit=s,e[n]._multi=!0}function F(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +G +;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), +G;Z(e,e.begin,{key:"beginScope"}),e.begin=E(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +G +;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), +G;Z(e,e.end,{key:"endScope"}),e.end=E(e.end,{joinWith:""})}})(e)}function V(e){ +function t(t,n){ +return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":"")) +}class n{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,t){ +t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), +this.matchAt+=b(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(E(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const t=this.matcherRe.exec(e);if(!t)return null +;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] +;return t.splice(0,n),Object.assign(t,i)}}class i{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n +;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), +t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ +this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ +const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex +;let n=t.exec(e) +;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ +const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} +return n&&(this.regexIndex+=n.position+1, +this.regexIndex===this.count&&this.considerAll()),n}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=r(e.classNameAliases||{}),function n(s,o){const a=s +;if(s.isCompiled)return a +;[T,D,F,P].forEach((e=>e(s,o))),e.compilerExtensions.forEach((e=>e(s,o))), +s.__beforeBegin=null,[L,B,H].forEach((e=>e(s,o))),s.isCompiled=!0;let c=null +;return"object"==typeof s.keywords&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords), +c=s.keywords.$pattern, +delete s.keywords.$pattern),c=c||/\w+/,s.keywords&&(s.keywords=$(s.keywords,e.case_insensitive)), +a.keywordPatternRe=t(c,!0), +o&&(s.begin||(s.begin=/\B|\b/),a.beginRe=t(a.begin),s.end||s.endsWithParent||(s.end=/\B|\b/), +s.end&&(a.endRe=t(a.end)), +a.terminatorEnd=g(a.end)||"",s.endsWithParent&&o.terminatorEnd&&(a.terminatorEnd+=(s.end?"|":"")+o.terminatorEnd)), +s.illegal&&(a.illegalRe=t(s.illegal)), +s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>r(e,{ +variants:null},t)))),e.cachedVariants?e.cachedVariants:q(e)?r(e,{ +starts:e.starts?r(e.starts):null +}):Object.isFrozen(e)?r(e):e))("self"===e?s:e)))),s.contains.forEach((e=>{n(e,a) +})),s.starts&&n(s.starts,o),a.matcher=(e=>{const t=new i +;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function q(e){ +return!!e&&(e.endsWithParent||q(e.starts))}class J extends Error{ +constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}} +const Y=i,Q=r,ee=Symbol("nomatch");var te=(t=>{ +const i=Object.create(null),r=Object.create(null),s=[];let o=!0 +;const a="Could not find the language '{}', did you forget to load/include a language module?",c={ +disableAutodetect:!0,name:"Plain text",contains:[]};let g={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:l};function b(e){ +return g.noHighlightRe.test(e)}function m(e,t,n){let i="",r="" +;"object"==typeof t?(i=e, +n=t.ignoreIllegals,r=t.language):(X("10.7.0","highlight(lang, code, ...args) has been deprecated."), +X("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +r=e,i=t),void 0===n&&(n=!0);const s={code:i,language:r};k("before:highlight",s) +;const o=s.result?s.result:E(s.language,s.code,n) +;return o.code=s.code,k("after:highlight",o),o}function E(e,t,r,s){ +const c=Object.create(null);function l(){if(!N.keywords)return void M.addText(S) +;let e=0;N.keywordPatternRe.lastIndex=0;let t=N.keywordPatternRe.exec(S),n="" +;for(;t;){n+=S.substring(e,t.index) +;const r=y.case_insensitive?t[0].toLowerCase():t[0],s=(i=r,N.keywords[i]);if(s){ +const[e,i]=s +;if(M.addText(n),n="",c[r]=(c[r]||0)+1,c[r]<=7&&(R+=i),e.startsWith("_"))n+=t[0];else{ +const n=y.classNameAliases[e]||e;M.addKeyword(t[0],n)}}else n+=t[0] +;e=N.keywordPatternRe.lastIndex,t=N.keywordPatternRe.exec(S)}var i +;n+=S.substring(e),M.addText(n)}function d(){null!=N.subLanguage?(()=>{ +if(""===S)return;let e=null;if("string"==typeof N.subLanguage){ +if(!i[N.subLanguage])return void M.addText(S) +;e=E(N.subLanguage,S,!0,k[N.subLanguage]),k[N.subLanguage]=e._top +}else e=x(S,N.subLanguage.length?N.subLanguage:null) +;N.relevance>0&&(R+=e.relevance),M.addSublanguage(e._emitter,e.language) +})():l(),S=""}function u(e,t){let n=1;const i=t.length-1;for(;n<=i;){ +if(!e._emit[n]){n++;continue}const i=y.classNameAliases[e[n]]||e[n],r=t[n] +;i?M.addKeyword(r,i):(S=r,l(),S=""),n++}}function h(e,t){ +return e.scope&&"string"==typeof e.scope&&M.openNode(y.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(M.addKeyword(S,y.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +S=""):e.beginScope._multi&&(u(e.beginScope,t),S="")),N=Object.create(e,{parent:{ +value:N}}),N}function p(e,t,i){let r=((e,t)=>{const n=e&&e.exec(t) +;return n&&0===n.index})(e.endRe,i);if(r){if(e["on:end"]){const i=new n(e) +;e["on:end"](t,i),i.isMatchIgnored&&(r=!1)}if(r){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return p(e.parent,t,i)}function f(e){ +return 0===N.matcher.regexIndex?(S+=e[0],1):(I=!0,0)}function b(e){ +const n=e[0],i=t.substring(e.index),r=p(N,e,i);if(!r)return ee;const s=N +;N.endScope&&N.endScope._wrap?(d(), +M.addKeyword(n,N.endScope._wrap)):N.endScope&&N.endScope._multi?(d(), +u(N.endScope,e)):s.skip?S+=n:(s.returnEnd||s.excludeEnd||(S+=n), +d(),s.excludeEnd&&(S=n));do{ +N.scope&&M.closeNode(),N.skip||N.subLanguage||(R+=N.relevance),N=N.parent +}while(N!==r.parent);return r.starts&&h(r.starts,e),s.returnEnd?0:n.length} +let m={};function w(i,s){const a=s&&s[0];if(S+=i,null==a)return d(),0 +;if("begin"===m.type&&"end"===s.type&&m.index===s.index&&""===a){ +if(S+=t.slice(s.index,s.index+1),!o){const t=Error(`0 width match regex (${e})`) +;throw t.languageName=e,t.badRule=m.rule,t}return 1} +if(m=s,"begin"===s.type)return(e=>{ +const t=e[0],i=e.rule,r=new n(i),s=[i.__beforeBegin,i["on:begin"]] +;for(const n of s)if(n&&(n(e,r),r.isMatchIgnored))return f(t) +;return i.skip?S+=t:(i.excludeBegin&&(S+=t), +d(),i.returnBegin||i.excludeBegin||(S=t)),h(i,e),i.returnBegin?0:t.length})(s) +;if("illegal"===s.type&&!r){ +const e=Error('Illegal lexeme "'+a+'" for mode "'+(N.scope||"")+'"') +;throw e.mode=N,e}if("end"===s.type){const e=b(s);if(e!==ee)return e} +if("illegal"===s.type&&""===a)return 1 +;if(A>1e5&&A>3*s.index)throw Error("potential infinite loop, way more iterations than matches") +;return S+=a,a.length}const y=O(e) +;if(!y)throw K(a.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const _=V(y);let v="",N=s||_;const k={},M=new g.__emitter(g);(()=>{const e=[] +;for(let t=N;t!==y;t=t.parent)t.scope&&e.unshift(t.scope) +;e.forEach((e=>M.openNode(e)))})();let S="",R=0,j=0,A=0,I=!1;try{ +for(N.matcher.considerAll();;){ +A++,I?I=!1:N.matcher.considerAll(),N.matcher.lastIndex=j +;const e=N.matcher.exec(t);if(!e)break;const n=w(t.substring(j,e.index),e) +;j=e.index+n} +return w(t.substring(j)),M.closeAllNodes(),M.finalize(),v=M.toHTML(),{ +language:e,value:v,relevance:R,illegal:!1,_emitter:M,_top:N}}catch(n){ +if(n.message&&n.message.includes("Illegal"))return{language:e,value:Y(t), +illegal:!0,relevance:0,_illegalBy:{message:n.message,index:j, +context:t.slice(j-100,j+100),mode:n.mode,resultSoFar:v},_emitter:M};if(o)return{ +language:e,value:Y(t),illegal:!1,relevance:0,errorRaised:n,_emitter:M,_top:N} +;throw n}}function x(e,t){t=t||g.languages||Object.keys(i);const n=(e=>{ +const t={value:Y(e),illegal:!1,relevance:0,_top:c,_emitter:new g.__emitter(g)} +;return t._emitter.addText(e),t})(e),r=t.filter(O).filter(N).map((t=>E(t,e,!1))) +;r.unshift(n);const s=r.sort(((e,t)=>{ +if(e.relevance!==t.relevance)return t.relevance-e.relevance +;if(e.language&&t.language){if(O(e.language).supersetOf===t.language)return 1 +;if(O(t.language).supersetOf===e.language)return-1}return 0})),[o,a]=s,l=o +;return l.secondBest=a,l}function w(e){let t=null;const n=(e=>{ +let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"" +;const n=g.languageDetectRe.exec(t);if(n){const t=O(n[1]) +;return t||(W(a.replace("{}",n[1])), +W("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"} +return t.split(/\s+/).find((e=>b(e)||O(e)))})(e);if(b(n))return +;if(k("before:highlightElement",{el:e,language:n +}),e.children.length>0&&(g.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), +console.warn("The element with unescaped HTML:"), +console.warn(e)),g.throwUnescapedHTML))throw new J("One of your code blocks includes unescaped HTML.",e.innerHTML) +;t=e;const i=t.textContent,s=n?m(i,{language:n,ignoreIllegals:!0}):x(i) +;e.innerHTML=s.value,((e,t,n)=>{const i=t&&r[t]||n +;e.classList.add("hljs"),e.classList.add("language-"+i) +})(e,n,s.language),e.result={language:s.language,re:s.relevance, +relevance:s.relevance},s.secondBest&&(e.secondBest={ +language:s.secondBest.language,relevance:s.secondBest.relevance +}),k("after:highlightElement",{el:e,result:s,text:i})}let y=!1;function _(){ +"loading"!==document.readyState?document.querySelectorAll(g.cssSelector).forEach(w):y=!0 +}function O(e){return e=(e||"").toLowerCase(),i[e]||i[r[e]]} +function v(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +r[e.toLowerCase()]=t}))}function N(e){const t=O(e) +;return t&&!t.disableAutodetect}function k(e,t){const n=e;s.forEach((e=>{ +e[n]&&e[n](t)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +y&&_()}),!1),Object.assign(t,{highlight:m,highlightAuto:x,highlightAll:_, +highlightElement:w, +highlightBlock:e=>(X("10.7.0","highlightBlock will be removed entirely in v12.0"), +X("10.7.0","Please use highlightElement now."),w(e)),configure:e=>{g=Q(g,e)}, +initHighlighting:()=>{ +_(),X("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +_(),X("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(e,n)=>{let r=null;try{r=n(t)}catch(t){ +if(K("Language definition for '{}' could not be registered.".replace("{}",e)), +!o)throw t;K(t),r=c} +r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&v(r.aliases,{ +languageName:e})},unregisterLanguage:e=>{delete i[e] +;for(const t of Object.keys(r))r[t]===e&&delete r[t]}, +listLanguages:()=>Object.keys(i),getLanguage:O,registerAliases:v, +autoDetection:N,inherit:Q,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ +e["before:highlightBlock"](Object.assign({block:t.el},t)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ +e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),s.push(e)} +}),t.debugMode=()=>{o=!1},t.safeMode=()=>{o=!0 +},t.versionString="11.7.0",t.regex={concat:p,lookahead:d,either:f,optional:h, +anyNumberOfTimes:u};for(const t in A)"object"==typeof A[t]&&e.exports(A[t]) +;return Object.assign(t,A),t})({});return te}() +;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);/*! `xml` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const a=e.regex,n=a.concat(/[\p{L}_]/u,a.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),s={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},t={begin:/\s/, +contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},i=e.inherit(t,{begin:/\(/,end:/\)/}),c=e.inherit(e.APOS_STRING_MODE,{ +className:"string"}),l=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),r={ +endsWithParent:!0,illegal:/`]+/}]}]}]};return{ +name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[t,l,c,i,{begin:/\[/,end:/\]/,contains:[{ +className:"meta",begin://,contains:[t,i,l,c]}]}] +},e.COMMENT(//,{relevance:10}),{begin://, +relevance:10},s,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, +relevance:10,contains:[l]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[r],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[r],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:a.concat(//,/>/,/\s/)))), +end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:r}]},{ +className:"tag",begin:a.concat(/<\//,a.lookahead(a.concat(n,/>/))),contains:[{ +className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}} +})();hljs.registerLanguage("xml",e)})();/*! `markdown` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{const n={begin:/<\/?[A-Za-z_]/, +end:">",subLanguage:"xml",relevance:0},a={variants:[{begin:/\[.+?\]\[.*?\]/, +relevance:0},{ +begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{ +begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ +},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},i={className:"strong",contains:[], +variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] +},s={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ +begin:/_(?![_\s])/,end:/_/,relevance:0}]},c=e.inherit(i,{contains:[] +}),t=e.inherit(s,{contains:[]});i.contains.push(t),s.contains.push(c) +;let g=[n,a];return[i,s,c,t].forEach((e=>{e.contains=e.contains.concat(g) +})),g=g.concat(i,s),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:g},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:g}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:g, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})() +;hljs.registerLanguage("markdown",e)})();/*! `plaintext` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var t=(()=>{"use strict";return t=>({name:"Plain text", +aliases:["text","txt"],disableAutodetect:!0})})() +;hljs.registerLanguage("plaintext",t)})();/*! `ocaml` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>({name:"OCaml",aliases:["ml"], +keywords:{$pattern:"[a-z_]\\w*!?", +keyword:"and as assert asr begin class constraint do done downto else end exception external for fun function functor if in include inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method mod module mutable new object of open! open or private rec sig struct then to try type val! val virtual when while with parser value", +built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit in_channel out_channel ref", +literal:"true false"},illegal:/\/\/|>>/,contains:[{className:"literal", +begin:"\\[(\\|\\|)?\\]|\\(\\)",relevance:0},e.COMMENT("\\(\\*","\\*\\)",{ +contains:["self"]}),{className:"symbol",begin:"'[A-Za-z_](?!')[\\w']*"},{ +className:"type",begin:"`[A-Z][\\w']*"},{className:"type", +begin:"\\b[A-Z][\\w']*",relevance:0},{begin:"[a-z_]\\w*'[\\w']*",relevance:0 +},e.inherit(e.APOS_STRING_MODE,{className:"string",relevance:0 +}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null}),{className:"number", +begin:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)", +relevance:0},{begin:/->/}]})})();hljs.registerLanguage("ocaml",e)})();/*! `python` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const n=e.regex,a=/[\p{XID_Start}_]\p{XID_Continue}*/u,i=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],s={ +$pattern:/[A-Za-z]\w+|__\w+__/,keyword:i, +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},t={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/, +end:/\}/,keywords:s,illegal:/#/},l={begin:/\{\{/,relevance:0},b={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,t],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,t],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,t,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,t,l,r]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,l,r]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},o="[0-9](_?[0-9])*",c=`(\\b(${o}))?\\.(${o})|\\b(${o})\\.`,d="\\b|"+i.join("|"),g={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${o})|(${c}))[eE][+-]?(${o})[jJ]?(?=${d})`},{begin:`(${c})[jJ]?`},{ +begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${d})`},{ +begin:`\\b0[bB](_?[01])+[lL]?(?=${d})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${d})` +},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${d})`},{begin:`\\b(${o})[jJ](?=${d})` +}]},p={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:s, +contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s, +contains:["self",t,g,b,e.HASH_COMMENT_MODE]}]};return r.contains=[b,g,t],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:s, +illegal:/(<\/|->|\?)|=>/,contains:[t,g,{begin:/\bself\b/},{beginKeywords:"if", +relevance:0},b,p,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,a],scope:{ +1:"keyword",3:"title.function"},contains:[m]},{variants:[{ +match:[/\bclass/,/\s+/,a,/\s*/,/\(\s*/,a,/\s*\)/]},{match:[/\bclass/,/\s+/,a]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[g,m,b]}]}}})() +;hljs.registerLanguage("python",e)})();/*! `reasonml` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const n="~?[a-z$_][0-9a-zA-Z$_]*",a="`?[A-Z$_][0-9a-zA-Z$_]*",s="("+["||","++","**","+.","*","/","*.","/.","..."].map((e=>e.split("").map((e=>"\\"+e)).join(""))).join("|")+"|\\|>|&&|==|===)",i="\\s+"+s+"\\s+",r={ +keyword:"and as asr assert begin class constraint do done downto else end exception external for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new nonrec object of open or private rec sig struct then to try type val virtual when while with", +built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 ref string unit ", +literal:"true false" +},l="\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",t={ +className:"number",relevance:0,variants:[{begin:l},{begin:"\\(-"+l+"\\)"}]},c={ +className:"operator",relevance:0,begin:s},o=[{className:"identifier", +relevance:0,begin:n},c,t],g=[e.QUOTE_STRING_MODE,c,{className:"module", +begin:"\\b"+a,returnBegin:!0,relevance:0,end:".",contains:[{ +className:"identifier",begin:a,relevance:0}]}],b=[{className:"module", +begin:"\\b"+a,returnBegin:!0,end:".",relevance:0,contains:[{ +className:"identifier",begin:a,relevance:0}]}],m={className:"function", +relevance:0,keywords:r,variants:[{begin:"\\s(\\(\\.?.*?\\)|"+n+")\\s*=>", +end:"\\s*=>",returnBegin:!0,relevance:0,contains:[{className:"params", +variants:[{begin:n},{ +begin:"~?[a-z$_][0-9a-zA-Z$_]*(\\s*:\\s*[a-z$_][0-9a-z$_]*(\\(\\s*('?[a-z$_][0-9a-z$_]*\\s*(,'?[a-z$_][0-9a-z$_]*\\s*)*)?\\))?){0,2}" +},{begin:/\(\s*\)/}]}]},{begin:"\\s\\(\\.?[^;\\|]*\\)\\s*=>",end:"\\s=>", +returnBegin:!0,relevance:0,contains:[{className:"params",relevance:0,variants:[{ +begin:n,end:"(,|\\n|\\))",relevance:0,contains:[c,{className:"typing",begin:":", +end:"(,|\\n)",returnBegin:!0,relevance:0,contains:b}]}]}]},{ +begin:"\\(\\.\\s"+n+"\\)\\s*=>"}]};g.push(m);const d={className:"constructor", +begin:a+"\\(",end:"\\)",illegal:"\\n",keywords:r, +contains:[e.QUOTE_STRING_MODE,c,{className:"params",begin:"\\b"+n}]},u={ +className:"pattern-match",begin:"\\|",returnBegin:!0,keywords:r,end:"=>", +relevance:0,contains:[d,c,{relevance:0,className:"constructor",begin:a}]},v={ +className:"module-access",keywords:r,returnBegin:!0,variants:[{ +begin:"\\b("+a+"\\.)+"+n},{begin:"\\b("+a+"\\.)+\\(",end:"\\)",returnBegin:!0, +contains:[m,{begin:"\\(",end:"\\)",relevance:0,skip:!0}].concat(g)},{ +begin:"\\b("+a+"\\.)+\\{",end:/\}/}],contains:g};return b.push(v),{ +name:"ReasonML",aliases:["re"],keywords:r,illegal:"(:-|:=|\\$\\{|\\+=)", +contains:[e.COMMENT("/\\*","\\*/",{illegal:"^(#,\\/\\/)"}),{ +className:"character",begin:"'(\\\\[^']+|[^'])'",illegal:"\\n",relevance:0 +},e.QUOTE_STRING_MODE,{className:"literal",begin:"\\(\\)",relevance:0},{ +className:"literal",begin:"\\[\\|",end:"\\|\\]",relevance:0,contains:o},{ +className:"literal",begin:"\\[",end:"\\]",relevance:0,contains:o},d,{ +className:"operator",begin:i,illegal:"--\x3e",relevance:0 +},t,e.C_LINE_COMMENT_MODE,u,m,{className:"module-def", +begin:"\\bmodule\\s+"+n+"\\s+"+a+"\\s+=\\s+\\{",end:/\}/,returnBegin:!0, +keywords:r,relevance:0,contains:[{className:"module",relevance:0,begin:a},{ +begin:/\{/,end:/\}/,relevance:0,skip:!0}].concat(g)},v]}}})() +;hljs.registerLanguage("reasonml",e)})(); \ No newline at end of file diff --git a/docs/_odoc_support/katex.min.css b/docs/_odoc_support/katex.min.css new file mode 100644 index 00000000..5f1f8576 --- /dev/null +++ b/docs/_odoc_support/katex.min.css @@ -0,0 +1 @@ +@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2")}@font-face{font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2")}.katex{text-rendering:auto;font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.15.2"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo} diff --git a/docs/_odoc_support/katex.min.js b/docs/_odoc_support/katex.min.js new file mode 100644 index 00000000..e4d78f24 --- /dev/null +++ b/docs/_odoc_support/katex.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return Zn}});var r=function e(t,r){this.position=void 0;var n,a="KaTeX parse error: "+t,i=r&&r.loc;if(i&&i.start<=i.end){var o=i.lexer.input;n=i.start;var s=i.end;n===o.length?a+=" at end of input: ":a+=" at position "+(n+1)+": ";var l=o.slice(n,s).replace(/[^]/g,"$&\u0332");a+=(n>15?"\u2026"+o.slice(n-15,n):o.slice(0,n))+l+(s+15":">","<":"<",'"':""","'":"'"},o=/[&><"']/g;var s=function e(t){return"ordgroup"===t.type||"color"===t.type?1===t.body.length?e(t.body[0]):t:"font"===t.type?e(t.body):t},l={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(o,(function(e){return i[e]}))},hyphenate:function(e){return e.replace(a,"-$1").toLowerCase()},getBaseElem:s,isCharacterBox:function(e){var t=s(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){var t=/^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(e);return null!=t?t[1]:"_relative"}},h={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:function(e){return"#"+e}},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:function(e,t){return t.push(e),t}},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:function(e){return Math.max(0,e)},cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:function(e){return Math.max(0,e)},cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:function(e){return Math.max(0,e)},cli:"-e, --max-expand ",cliProcessor:function(e){return"Infinity"===e?1/0:parseInt(e)}},globalGroup:{type:"boolean",cli:!1}};function m(e){if(e.default)return e.default;var t=e.type,r=Array.isArray(t)?t[0]:t;if("string"!=typeof r)return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}var c=function(){function e(e){for(var t in this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{},h)if(h.hasOwnProperty(t)){var r=h[t];this[t]=void 0!==e[t]?r.processor?r.processor(e[t]):e[t]:m(r)}}var t=e.prototype;return t.reportNonstrict=function(e,t,r){var a=this.strict;if("function"==typeof a&&(a=a(e,t,r)),a&&"ignore"!==a){if(!0===a||"error"===a)throw new n("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===a?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+t+" ["+e+"]")}},t.useStrictBehavior=function(e,t,r){var n=this.strict;if("function"==typeof n)try{n=n(e,t,r)}catch(e){n="error"}return!(!n||"ignore"===n)&&(!0===n||"error"===n||("warn"===n?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]"),!1)))},t.isTrusted=function(e){e.url&&!e.protocol&&(e.protocol=l.protocolFromUrl(e.url));var t="function"==typeof this.trust?this.trust(e):this.trust;return Boolean(t)},e}(),u=function(){function e(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}var t=e.prototype;return t.sup=function(){return p[d[this.id]]},t.sub=function(){return p[f[this.id]]},t.fracNum=function(){return p[g[this.id]]},t.fracDen=function(){return p[v[this.id]]},t.cramp=function(){return p[b[this.id]]},t.text=function(){return p[y[this.id]]},t.isTight=function(){return this.size>=2},e}(),p=[new u(0,0,!1),new u(1,0,!0),new u(2,1,!1),new u(3,1,!0),new u(4,2,!1),new u(5,2,!0),new u(6,3,!1),new u(7,3,!0)],d=[4,5,4,5,6,7,6,7],f=[5,5,5,5,7,7,7,7],g=[2,3,4,5,6,7,6,7],v=[3,3,5,5,7,7,7,7],b=[1,1,3,3,5,5,7,7],y=[0,1,2,3,2,3,2,3],x={DISPLAY:p[0],TEXT:p[2],SCRIPT:p[4],SCRIPTSCRIPT:p[6]},w=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];var k=[];function S(e){for(var t=0;t=k[t]&&e<=k[t+1])return!0;return!1}w.forEach((function(e){return e.blocks.forEach((function(e){return k.push.apply(k,e)}))}));var M=80,z={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"},A=function(){function e(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){for(var e=document.createDocumentFragment(),t=0;t=5?0:e>=3?1:2]){var r=N[t]={cssEmPerMu:B.quad[t]/18};for(var n in B)B.hasOwnProperty(n)&&(r[n]=B[n][t])}return N[t]}(this.size)),this._fontMetrics},t.getColor=function(){return this.phantom?"transparent":this.color},e}();H.BASESIZE=6;var E=H,L={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},D={ex:!0,em:!0,mu:!0},P=function(e){return"string"!=typeof e&&(e=e.unit),e in L||e in D||"ex"===e},F=function(e,t){var r;if(e.unit in L)r=L[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{var a;if(a=t.style.isTight()?t.havingStyle(t.style.text()):t,"ex"===e.unit)r=a.fontMetrics().xHeight;else{if("em"!==e.unit)throw new n("Invalid unit: '"+e.unit+"'");r=a.fontMetrics().quad}a!==t&&(r*=a.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)},V=function(e){return+e.toFixed(4)+"em"},G=function(e){return e.filter((function(e){return e})).join(" ")},U=function(e,t,r){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t){t.style.isTight()&&this.classes.push("mtight");var n=t.getColor();n&&(this.style.color=n)}},Y=function(e){var t=document.createElement(e);for(var r in t.className=G(this.classes),this.style)this.style.hasOwnProperty(r)&&(t.style[r]=this.style[r]);for(var n in this.attributes)this.attributes.hasOwnProperty(n)&&t.setAttribute(n,this.attributes[n]);for(var a=0;a"},W=function(){function e(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,e,r,n),this.children=t||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){return Y.call(this,"span")},t.toMarkup=function(){return X.call(this,"span")},e}(),_=function(){function e(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,t,n),this.children=r||[],this.setAttribute("href",e)}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){return Y.call(this,"a")},t.toMarkup=function(){return X.call(this,"a")},e}(),j=function(){function e(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){var e=document.createElement("img");for(var t in e.src=this.src,e.alt=this.alt,e.className="mord",this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e},t.toMarkup=function(){var e=""+this.alt+"=a[0]&&e<=a[1])return r.name}return null}(this.text.charCodeAt(0));l&&this.classes.push(l+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=$[this.text])}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){var e=document.createTextNode(this.text),t=null;for(var r in this.italic>0&&((t=document.createElement("span")).style.marginRight=V(this.italic)),this.classes.length>0&&((t=t||document.createElement("span")).className=G(this.classes)),this.style)this.style.hasOwnProperty(r)&&((t=t||document.createElement("span")).style[r]=this.style[r]);return t?(t.appendChild(e),t):e},t.toMarkup=function(){var e=!1,t="0&&(r+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(n)&&(r+=l.hyphenate(n)+":"+this.style[n]+";");r&&(e=!0,t+=' style="'+l.escape(r)+'"');var a=l.escape(this.text);return e?(t+=">",t+=a,t+=""):a},e}(),K=function(){function e(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);for(var r=0;r":""},e}(),Q=function(){function e(e){this.attributes=void 0,this.attributes=e||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","line");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e},t.toMarkup=function(){var e="","\\gt",!0),ie(oe,le,be,"\u2208","\\in",!0),ie(oe,le,be,"\ue020","\\@not"),ie(oe,le,be,"\u2282","\\subset",!0),ie(oe,le,be,"\u2283","\\supset",!0),ie(oe,le,be,"\u2286","\\subseteq",!0),ie(oe,le,be,"\u2287","\\supseteq",!0),ie(oe,he,be,"\u2288","\\nsubseteq",!0),ie(oe,he,be,"\u2289","\\nsupseteq",!0),ie(oe,le,be,"\u22a8","\\models"),ie(oe,le,be,"\u2190","\\leftarrow",!0),ie(oe,le,be,"\u2264","\\le"),ie(oe,le,be,"\u2264","\\leq",!0),ie(oe,le,be,"<","\\lt",!0),ie(oe,le,be,"\u2192","\\rightarrow",!0),ie(oe,le,be,"\u2192","\\to"),ie(oe,he,be,"\u2271","\\ngeq",!0),ie(oe,he,be,"\u2270","\\nleq",!0),ie(oe,le,ye,"\xa0","\\ "),ie(oe,le,ye,"\xa0","\\space"),ie(oe,le,ye,"\xa0","\\nobreakspace"),ie(se,le,ye,"\xa0","\\ "),ie(se,le,ye,"\xa0"," "),ie(se,le,ye,"\xa0","\\space"),ie(se,le,ye,"\xa0","\\nobreakspace"),ie(oe,le,ye,null,"\\nobreak"),ie(oe,le,ye,null,"\\allowbreak"),ie(oe,le,ve,",",","),ie(oe,le,ve,";",";"),ie(oe,he,ce,"\u22bc","\\barwedge",!0),ie(oe,he,ce,"\u22bb","\\veebar",!0),ie(oe,le,ce,"\u2299","\\odot",!0),ie(oe,le,ce,"\u2295","\\oplus",!0),ie(oe,le,ce,"\u2297","\\otimes",!0),ie(oe,le,xe,"\u2202","\\partial",!0),ie(oe,le,ce,"\u2298","\\oslash",!0),ie(oe,he,ce,"\u229a","\\circledcirc",!0),ie(oe,he,ce,"\u22a1","\\boxdot",!0),ie(oe,le,ce,"\u25b3","\\bigtriangleup"),ie(oe,le,ce,"\u25bd","\\bigtriangledown"),ie(oe,le,ce,"\u2020","\\dagger"),ie(oe,le,ce,"\u22c4","\\diamond"),ie(oe,le,ce,"\u22c6","\\star"),ie(oe,le,ce,"\u25c3","\\triangleleft"),ie(oe,le,ce,"\u25b9","\\triangleright"),ie(oe,le,ge,"{","\\{"),ie(se,le,xe,"{","\\{"),ie(se,le,xe,"{","\\textbraceleft"),ie(oe,le,ue,"}","\\}"),ie(se,le,xe,"}","\\}"),ie(se,le,xe,"}","\\textbraceright"),ie(oe,le,ge,"{","\\lbrace"),ie(oe,le,ue,"}","\\rbrace"),ie(oe,le,ge,"[","\\lbrack",!0),ie(se,le,xe,"[","\\lbrack",!0),ie(oe,le,ue,"]","\\rbrack",!0),ie(se,le,xe,"]","\\rbrack",!0),ie(oe,le,ge,"(","\\lparen",!0),ie(oe,le,ue,")","\\rparen",!0),ie(se,le,xe,"<","\\textless",!0),ie(se,le,xe,">","\\textgreater",!0),ie(oe,le,ge,"\u230a","\\lfloor",!0),ie(oe,le,ue,"\u230b","\\rfloor",!0),ie(oe,le,ge,"\u2308","\\lceil",!0),ie(oe,le,ue,"\u2309","\\rceil",!0),ie(oe,le,xe,"\\","\\backslash"),ie(oe,le,xe,"\u2223","|"),ie(oe,le,xe,"\u2223","\\vert"),ie(se,le,xe,"|","\\textbar",!0),ie(oe,le,xe,"\u2225","\\|"),ie(oe,le,xe,"\u2225","\\Vert"),ie(se,le,xe,"\u2225","\\textbardbl"),ie(se,le,xe,"~","\\textasciitilde"),ie(se,le,xe,"\\","\\textbackslash"),ie(se,le,xe,"^","\\textasciicircum"),ie(oe,le,be,"\u2191","\\uparrow",!0),ie(oe,le,be,"\u21d1","\\Uparrow",!0),ie(oe,le,be,"\u2193","\\downarrow",!0),ie(oe,le,be,"\u21d3","\\Downarrow",!0),ie(oe,le,be,"\u2195","\\updownarrow",!0),ie(oe,le,be,"\u21d5","\\Updownarrow",!0),ie(oe,le,fe,"\u2210","\\coprod"),ie(oe,le,fe,"\u22c1","\\bigvee"),ie(oe,le,fe,"\u22c0","\\bigwedge"),ie(oe,le,fe,"\u2a04","\\biguplus"),ie(oe,le,fe,"\u22c2","\\bigcap"),ie(oe,le,fe,"\u22c3","\\bigcup"),ie(oe,le,fe,"\u222b","\\int"),ie(oe,le,fe,"\u222b","\\intop"),ie(oe,le,fe,"\u222c","\\iint"),ie(oe,le,fe,"\u222d","\\iiint"),ie(oe,le,fe,"\u220f","\\prod"),ie(oe,le,fe,"\u2211","\\sum"),ie(oe,le,fe,"\u2a02","\\bigotimes"),ie(oe,le,fe,"\u2a01","\\bigoplus"),ie(oe,le,fe,"\u2a00","\\bigodot"),ie(oe,le,fe,"\u222e","\\oint"),ie(oe,le,fe,"\u222f","\\oiint"),ie(oe,le,fe,"\u2230","\\oiiint"),ie(oe,le,fe,"\u2a06","\\bigsqcup"),ie(oe,le,fe,"\u222b","\\smallint"),ie(se,le,pe,"\u2026","\\textellipsis"),ie(oe,le,pe,"\u2026","\\mathellipsis"),ie(se,le,pe,"\u2026","\\ldots",!0),ie(oe,le,pe,"\u2026","\\ldots",!0),ie(oe,le,pe,"\u22ef","\\@cdots",!0),ie(oe,le,pe,"\u22f1","\\ddots",!0),ie(oe,le,xe,"\u22ee","\\varvdots"),ie(oe,le,me,"\u02ca","\\acute"),ie(oe,le,me,"\u02cb","\\grave"),ie(oe,le,me,"\xa8","\\ddot"),ie(oe,le,me,"~","\\tilde"),ie(oe,le,me,"\u02c9","\\bar"),ie(oe,le,me,"\u02d8","\\breve"),ie(oe,le,me,"\u02c7","\\check"),ie(oe,le,me,"^","\\hat"),ie(oe,le,me,"\u20d7","\\vec"),ie(oe,le,me,"\u02d9","\\dot"),ie(oe,le,me,"\u02da","\\mathring"),ie(oe,le,de,"\ue131","\\@imath"),ie(oe,le,de,"\ue237","\\@jmath"),ie(oe,le,xe,"\u0131","\u0131"),ie(oe,le,xe,"\u0237","\u0237"),ie(se,le,xe,"\u0131","\\i",!0),ie(se,le,xe,"\u0237","\\j",!0),ie(se,le,xe,"\xdf","\\ss",!0),ie(se,le,xe,"\xe6","\\ae",!0),ie(se,le,xe,"\u0153","\\oe",!0),ie(se,le,xe,"\xf8","\\o",!0),ie(se,le,xe,"\xc6","\\AE",!0),ie(se,le,xe,"\u0152","\\OE",!0),ie(se,le,xe,"\xd8","\\O",!0),ie(se,le,me,"\u02ca","\\'"),ie(se,le,me,"\u02cb","\\`"),ie(se,le,me,"\u02c6","\\^"),ie(se,le,me,"\u02dc","\\~"),ie(se,le,me,"\u02c9","\\="),ie(se,le,me,"\u02d8","\\u"),ie(se,le,me,"\u02d9","\\."),ie(se,le,me,"\xb8","\\c"),ie(se,le,me,"\u02da","\\r"),ie(se,le,me,"\u02c7","\\v"),ie(se,le,me,"\xa8",'\\"'),ie(se,le,me,"\u02dd","\\H"),ie(se,le,me,"\u25ef","\\textcircled");var we={"--":!0,"---":!0,"``":!0,"''":!0};ie(se,le,xe,"\u2013","--",!0),ie(se,le,xe,"\u2013","\\textendash"),ie(se,le,xe,"\u2014","---",!0),ie(se,le,xe,"\u2014","\\textemdash"),ie(se,le,xe,"\u2018","`",!0),ie(se,le,xe,"\u2018","\\textquoteleft"),ie(se,le,xe,"\u2019","'",!0),ie(se,le,xe,"\u2019","\\textquoteright"),ie(se,le,xe,"\u201c","``",!0),ie(se,le,xe,"\u201c","\\textquotedblleft"),ie(se,le,xe,"\u201d","''",!0),ie(se,le,xe,"\u201d","\\textquotedblright"),ie(oe,le,xe,"\xb0","\\degree",!0),ie(se,le,xe,"\xb0","\\degree"),ie(se,le,xe,"\xb0","\\textdegree",!0),ie(oe,le,xe,"\xa3","\\pounds"),ie(oe,le,xe,"\xa3","\\mathsterling",!0),ie(se,le,xe,"\xa3","\\pounds"),ie(se,le,xe,"\xa3","\\textsterling",!0),ie(oe,he,xe,"\u2720","\\maltese"),ie(se,he,xe,"\u2720","\\maltese");for(var ke='0123456789/@."',Se=0;Set&&(t=i.height),i.depth>r&&(r=i.depth),i.maxFontSize>n&&(n=i.maxFontSize)}e.height=t,e.depth=r,e.maxFontSize=n},Xe=function(e,t,r,n){var a=new W(e,t,r,n);return Ye(a),a},We=function(e,t,r,n){return new W(e,t,r,n)},_e=function(e){var t=new A(e);return Ye(t),t},je=function(e,t,r){var n="";switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}return n+"-"+("textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular")},$e={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Ze={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Ke={fontMap:$e,makeSymbol:Ge,mathsym:function(e,t,r,n){return void 0===n&&(n=[]),"boldsymbol"===r.font&&Ve(e,"Main-Bold",t).metrics?Ge(e,"Main-Bold",t,r,n.concat(["mathbf"])):"\\"===e||"main"===ae[t][e].font?Ge(e,"Main-Regular",t,r,n):Ge(e,"AMS-Regular",t,r,n.concat(["amsrm"]))},makeSpan:Xe,makeSvgSpan:We,makeLineSpan:function(e,t,r){var n=Xe([e],[],t);return n.height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=V(n.height),n.maxFontSize=1,n},makeAnchor:function(e,t,r,n){var a=new _(e,t,r,n);return Ye(a),a},makeFragment:_e,wrapFragment:function(e,t){return e instanceof A?Xe([],[e],t):e},makeVList:function(e,t){for(var r=function(e){if("individualShift"===e.positionType){for(var t=e.children,r=[t[0]],n=-t[0].shift-t[0].elem.depth,a=n,i=1;i0&&(o.push(kt(s,t)),s=[]),o.push(a[l]));s.length>0&&o.push(kt(s,t)),r?((i=kt(ft(r,t,!0))).classes=["tag"],o.push(i)):n&&o.push(n);var m=mt(["katex-html"],o);if(m.setAttribute("aria-hidden","true"),i){var c=i.children[0];c.style.height=V(m.height+m.depth),m.depth&&(c.style.verticalAlign=V(-m.depth))}return m}function Mt(e){return new A(e)}var zt=function(){function e(e,t,r){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=r||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.getAttribute=function(e){return this.attributes[e]},t.toNode=function(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=G(this.classes));for(var r=0;r0&&(e+=' class ="'+l.escape(G(this.classes))+'"'),e+=">";for(var r=0;r"},t.toText=function(){return this.children.map((function(e){return e.toText()})).join("")},e}(),At=function(){function e(e){this.text=void 0,this.text=e}var t=e.prototype;return t.toNode=function(){return document.createTextNode(this.text)},t.toMarkup=function(){return l.escape(this.toText())},t.toText=function(){return this.text},e}(),Tt={MathNode:zt,TextNode:At,SpaceNode:function(){function e(e){this.width=void 0,this.character=void 0,this.width=e,this.character=e>=.05555&&e<=.05556?"\u200a":e>=.1666&&e<=.1667?"\u2009":e>=.2222&&e<=.2223?"\u2005":e>=.2777&&e<=.2778?"\u2005\u200a":e>=-.05556&&e<=-.05555?"\u200a\u2063":e>=-.1667&&e<=-.1666?"\u2009\u2063":e>=-.2223&&e<=-.2222?"\u205f\u2063":e>=-.2778&&e<=-.2777?"\u2005\u2063":null}var t=e.prototype;return t.toNode=function(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",V(this.width)),e},t.toMarkup=function(){return this.character?""+this.character+"":''},t.toText=function(){return this.character?this.character:" "},e}(),newDocumentFragment:Mt},Bt=function(e,t,r){return!ae[t][e]||!ae[t][e].replace||55349===e.charCodeAt(0)||we.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.substr(4,2)||r.font&&"tt"===r.font.substr(4,2))||(e=ae[t][e].replace),new Tt.TextNode(e)},Ct=function(e){return 1===e.length?e[0]:new Tt.MathNode("mrow",e)},qt=function(e,t){if("texttt"===t.fontFamily)return"monospace";if("textsf"===t.fontFamily)return"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===t.fontShape&&"textbf"===t.fontWeight)return"bold-italic";if("textit"===t.fontShape)return"italic";if("textbf"===t.fontWeight)return"bold";var r=t.font;if(!r||"mathnormal"===r)return null;var n=e.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"textord"===e.type?"bold":"bold-italic";if("mathbf"===r)return"bold";if("mathbb"===r)return"double-struck";if("mathfrak"===r)return"fraktur";if("mathscr"===r||"mathcal"===r)return"script";if("mathsf"===r)return"sans-serif";if("mathtt"===r)return"monospace";var a=e.text;return l.contains(["\\imath","\\jmath"],a)?null:(ae[n][a]&&ae[n][a].replace&&(a=ae[n][a].replace),q(a,Ke.fontMap[r].fontName,n)?Ke.fontMap[r].variant:null)},Nt=function(e,t,r){if(1===e.length){var n=Rt(e[0],t);return r&&n instanceof zt&&"mo"===n.type&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}for(var a,i=[],o=0;o0&&(p.text=p.text.slice(0,1)+"\u0338"+p.text.slice(1),i.pop())}}}i.push(s),a=s}return i},It=function(e,t,r){return Ct(Nt(e,t,r))},Rt=function(e,t){if(!e)return new Tt.MathNode("mrow");if(it[e.type])return it[e.type](e,t);throw new n("Got group of unknown type: '"+e.type+"'")};function Ot(e,t,r,n,a){var i,o=Nt(e,r);i=1===o.length&&o[0]instanceof zt&&l.contains(["mrow","mtable"],o[0].type)?o[0]:new Tt.MathNode("mrow",o);var s=new Tt.MathNode("annotation",[new Tt.TextNode(t)]);s.setAttribute("encoding","application/x-tex");var h=new Tt.MathNode("semantics",[i,s]),m=new Tt.MathNode("math",[h]);m.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&m.setAttribute("display","block");var c=a?"katex":"katex-mathml";return Ke.makeSpan([c],[m])}var Ht=function(e){return new E({style:e.displayMode?x.DISPLAY:x.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Et=function(e,t){if(t.displayMode){var r=["katex-display"];t.leqno&&r.push("leqno"),t.fleqn&&r.push("fleqn"),e=Ke.makeSpan(r,[e])}return e},Lt=function(e,t,r){var n,a=Ht(r);if("mathml"===r.output)return Ot(e,t,a,r.displayMode,!0);if("html"===r.output){var i=St(e,a);n=Ke.makeSpan(["katex"],[i])}else{var o=Ot(e,t,a,r.displayMode,!1),s=St(e,a);n=Ke.makeSpan(["katex"],[o,s])}return Et(n,r)},Dt={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},Pt={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Ft=function(e,t,r,n,a){var i,o=e.height+e.depth+r+n;if(/fbox|color|angl/.test(t)){if(i=Ke.makeSpan(["stretchy",t],[],a),"fbox"===t){var s=a.color&&a.getColor();s&&(i.style.borderColor=s)}}else{var l=[];/^[bx]cancel$/.test(t)&&l.push(new Q({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&l.push(new Q({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var h=new K(l,{width:"100%",height:V(o)});i=Ke.makeSvgSpan([],[h],a)}return i.height=o,i.style.height=V(o),i},Vt=function(e){var t=new Tt.MathNode("mo",[new Tt.TextNode(Dt[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},Gt=function(e,t){var r=function(){var r=4e5,n=e.label.substr(1);if(l.contains(["widehat","widecheck","widetilde","utilde"],n)){var a,i,o,s="ordgroup"===(d=e.base).type?d.body.length:1;if(s>5)"widehat"===n||"widecheck"===n?(a=420,r=2364,o=.42,i=n+"4"):(a=312,r=2340,o=.34,i="tilde4");else{var h=[1,1,2,2,3,3][s];"widehat"===n||"widecheck"===n?(r=[0,1062,2364,2364,2364][h],a=[0,239,300,360,420][h],o=[0,.24,.3,.3,.36,.42][h],i=n+h):(r=[0,600,1033,2339,2340][h],a=[0,260,286,306,312][h],o=[0,.26,.286,.3,.306,.34][h],i="tilde"+h)}var m=new J(i),c=new K([m],{width:"100%",height:V(o),viewBox:"0 0 "+r+" "+a,preserveAspectRatio:"none"});return{span:Ke.makeSvgSpan([],[c],t),minWidth:0,height:o}}var u,p,d,f=[],g=Pt[n],v=g[0],b=g[1],y=g[2],x=y/1e3,w=v.length;if(1===w)u=["hide-tail"],p=[g[3]];else if(2===w)u=["halfarrow-left","halfarrow-right"],p=["xMinYMin","xMaxYMin"];else{if(3!==w)throw new Error("Correct katexImagesData or update code here to support\n "+w+" children.");u=["brace-left","brace-center","brace-right"],p=["xMinYMin","xMidYMin","xMaxYMin"]}for(var k=0;k0&&(n.style.minWidth=V(a)),n};function Ut(e,t){if(!e||e.type!==t)throw new Error("Expected node of type "+t+", but got "+(e?"node of type "+e.type:String(e)));return e}function Yt(e){var t=Xt(e);if(!t)throw new Error("Expected node of symbol group type, but got "+(e?"node of type "+e.type:String(e)));return t}function Xt(e){return e&&("atom"===e.type||re.hasOwnProperty(e.type))?e:null}var Wt=function(e,t){var r,n,a;e&&"supsub"===e.type?(r=(n=Ut(e.base,"accent")).base,e.base=r,a=function(e){if(e instanceof W)return e;throw new Error("Expected span but got "+String(e)+".")}(wt(e,t)),e.base=n):r=(n=Ut(e,"accent")).base;var i=wt(r,t.havingCrampedStyle()),o=0;if(n.isShifty&&l.isCharacterBox(r)){var s=l.getBaseElem(r);o=ee(wt(s,t.havingCrampedStyle())).skew}var h,m="\\c"===n.label,c=m?i.height+i.depth:Math.min(i.height,t.fontMetrics().xHeight);if(n.isStretchy)h=Gt(n,t),h=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"elem",elem:h,wrapperClasses:["svg-align"],wrapperStyle:o>0?{width:"calc(100% - "+V(2*o)+")",marginLeft:V(2*o)}:void 0}]},t);else{var u,p;"\\vec"===n.label?(u=Ke.staticSvg("vec",t),p=Ke.svgData.vec[1]):((u=ee(u=Ke.makeOrd({mode:n.mode,text:n.label},t,"textord"))).italic=0,p=u.width,m&&(c+=u.depth)),h=Ke.makeSpan(["accent-body"],[u]);var d="\\textcircled"===n.label;d&&(h.classes.push("accent-full"),c=i.height);var f=o;d||(f-=p/2),h.style.left=V(f),"\\textcircled"===n.label&&(h.style.top=".2em"),h=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"kern",size:-c},{type:"elem",elem:h}]},t)}var g=Ke.makeSpan(["mord","accent"],[h],t);return a?(a.children[0]=g,a.height=Math.max(g.height,a.height),a.classes[0]="mord",a):g},_t=function(e,t){var r=e.isStretchy?Vt(e.label):new Tt.MathNode("mo",[Bt(e.label,e.mode)]),n=new Tt.MathNode("mover",[Rt(e.base,t),r]);return n.setAttribute("accent","true"),n},jt=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map((function(e){return"\\"+e})).join("|"));ot({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(e,t){var r=lt(t[0]),n=!jt.test(e.funcName),a=!n||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:n,isShifty:a,base:r}},htmlBuilder:Wt,mathmlBuilder:_t}),ot({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:function(e,t){var r=t[0],n=e.parser.mode;return"math"===n&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:e.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Wt,mathmlBuilder:_t}),ot({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"accentUnder",mode:r.mode,label:n,base:a}},htmlBuilder:function(e,t){var r=wt(e.base,t),n=Gt(e,t),a="\\utilde"===e.label?.12:0,i=Ke.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:a},{type:"elem",elem:r}]},t);return Ke.makeSpan(["mord","accentunder"],[i],t)},mathmlBuilder:function(e,t){var r=Vt(e.label),n=new Tt.MathNode("munder",[Rt(e.base,t),r]);return n.setAttribute("accentunder","true"),n}});var $t=function(e){var t=new Tt.MathNode("mpadded",e?[e]:[]);return t.setAttribute("width","+0.6em"),t.setAttribute("lspace","0.3em"),t};ot({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler:function(e,t,r){var n=e.parser,a=e.funcName;return{type:"xArrow",mode:n.mode,label:a,body:t[0],below:r[0]}},htmlBuilder:function(e,t){var r,n=t.style,a=t.havingStyle(n.sup()),i=Ke.wrapFragment(wt(e.body,a,t),t),o="\\x"===e.label.slice(0,2)?"x":"cd";i.classes.push(o+"-arrow-pad"),e.below&&(a=t.havingStyle(n.sub()),(r=Ke.wrapFragment(wt(e.below,a,t),t)).classes.push(o+"-arrow-pad"));var s,l=Gt(e,t),h=-t.fontMetrics().axisHeight+.5*l.height,m=-t.fontMetrics().axisHeight-.5*l.height-.111;if((i.depth>.25||"\\xleftequilibrium"===e.label)&&(m-=i.depth),r){var c=-t.fontMetrics().axisHeight+r.height+.5*l.height+.111;s=Ke.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h},{type:"elem",elem:r,shift:c}]},t)}else s=Ke.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h}]},t);return s.children[0].children[0].children[1].classes.push("svg-align"),Ke.makeSpan(["mrel","x-arrow"],[s],t)},mathmlBuilder:function(e,t){var r,n=Vt(e.label);if(n.setAttribute("minsize","x"===e.label.charAt(0)?"1.75em":"3.0em"),e.body){var a=$t(Rt(e.body,t));if(e.below){var i=$t(Rt(e.below,t));r=new Tt.MathNode("munderover",[n,i,a])}else r=new Tt.MathNode("mover",[n,a])}else if(e.below){var o=$t(Rt(e.below,t));r=new Tt.MathNode("munder",[n,o])}else r=$t(),r=new Tt.MathNode("mover",[n,r]);return r}});var Zt={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},Kt=function(e){return"textord"===e.type&&"@"===e.text};function Jt(e,t,r){var n=Zt[e];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":var a={type:"atom",text:n,mode:"math",family:"rel"},i={type:"ordgroup",mode:"math",body:[r.callFunction("\\\\cdleft",[t[0]],[]),r.callFunction("\\Big",[a],[]),r.callFunction("\\\\cdright",[t[1]],[])]};return r.callFunction("\\\\cdparent",[i],[]);case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":return r.callFunction("\\Big",[{type:"textord",text:"\\Vert",mode:"math"}],[]);default:return{type:"textord",text:" ",mode:"math"}}}ot({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:t[0]}},htmlBuilder:function(e,t){var r=t.havingStyle(t.style.sup()),n=Ke.wrapFragment(wt(e.label,r,t),t);return n.classes.push("cd-label-"+e.side),n.style.bottom=V(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mrow",[Rt(e.label,t)]);return(r=new Tt.MathNode("mpadded",[r])).setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),(r=new Tt.MathNode("mstyle",[r])).setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),ot({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler:function(e,t){return{type:"cdlabelparent",mode:e.parser.mode,fragment:t[0]}},htmlBuilder:function(e,t){var r=Ke.wrapFragment(wt(e.fragment,t),t);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder:function(e,t){return new Tt.MathNode("mrow",[Rt(e.fragment,t)])}}),ot({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){for(var r=e.parser,a=Ut(t[0],"ordgroup").body,i="",o=0;o=1114111)throw new n("\\@char with invalid code point "+i);return l<=65535?s=String.fromCharCode(l):(l-=65536,s=String.fromCharCode(55296+(l>>10),56320+(1023&l))),{type:"textord",mode:r.mode,text:s}}});var Qt=function(e,t){var r=ft(e.body,t.withColor(e.color),!1);return Ke.makeFragment(r)},er=function(e,t){var r=Nt(e.body,t.withColor(e.color)),n=new Tt.MathNode("mstyle",r);return n.setAttribute("mathcolor",e.color),n};ot({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler:function(e,t){var r=e.parser,n=Ut(t[0],"color-token").color,a=t[1];return{type:"color",mode:r.mode,color:n,body:ht(a)}},htmlBuilder:Qt,mathmlBuilder:er}),ot({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler:function(e,t){var r=e.parser,n=e.breakOnTokenText,a=Ut(t[0],"color-token").color;r.gullet.macros.set("\\current@color",a);var i=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:a,body:i}},htmlBuilder:Qt,mathmlBuilder:er}),ot({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:1,argTypes:["size"],allowedInText:!0},handler:function(e,t,r){var n=e.parser,a=r[0],i=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:i,size:a&&Ut(a,"size").value}},htmlBuilder:function(e,t){var r=Ke.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size&&(r.style.marginTop=V(F(e.size,t)))),r},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size&&r.setAttribute("height",V(F(e.size,t)))),r}});var tr={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},rr=function(e){var t=e.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(t))throw new n("Expected a control sequence",e);return t},nr=function(e,t,r,n){var a=e.gullet.macros.get(r.text);null==a&&(r.noexpand=!0,a={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,a,n)};ot({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler:function(e){var t=e.parser,r=e.funcName;t.consumeSpaces();var a=t.fetch();if(tr[a.text])return"\\global"!==r&&"\\\\globallong"!==r||(a.text=tr[a.text]),Ut(t.parseFunction(),"internal");throw new n("Invalid token after macro prefix",a)}}),ot({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,r=e.funcName,a=t.gullet.popToken(),i=a.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(i))throw new n("Expected a control sequence",a);for(var o,s=0,l=[[]];"{"!==t.gullet.future().text;)if("#"===(a=t.gullet.popToken()).text){if("{"===t.gullet.future().text){o=t.gullet.future(),l[s].push("{");break}if(a=t.gullet.popToken(),!/^[1-9]$/.test(a.text))throw new n('Invalid argument number "'+a.text+'"');if(parseInt(a.text)!==s+1)throw new n('Argument number "'+a.text+'" out of order');s++,l.push([])}else{if("EOF"===a.text)throw new n("Expected a macro definition");l[s].push(a.text)}var h=t.gullet.consumeArg().tokens;return o&&h.unshift(o),"\\edef"!==r&&"\\xdef"!==r||(h=t.gullet.expandTokens(h)).reverse(),t.gullet.macros.set(i,{tokens:h,numArgs:s,delimiters:l},r===tr[r]),{type:"internal",mode:t.mode}}}),ot({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,r=e.funcName,n=rr(t.gullet.popToken());t.gullet.consumeSpaces();var a=function(e){var t=e.gullet.popToken();return"="===t.text&&" "===(t=e.gullet.popToken()).text&&(t=e.gullet.popToken()),t}(t);return nr(t,n,a,"\\\\globallet"===r),{type:"internal",mode:t.mode}}}),ot({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,r=e.funcName,n=rr(t.gullet.popToken()),a=t.gullet.popToken(),i=t.gullet.popToken();return nr(t,n,i,"\\\\globalfuture"===r),t.gullet.pushToken(i),t.gullet.pushToken(a),{type:"internal",mode:t.mode}}});var ar=function(e,t,r){var n=q(ae.math[e]&&ae.math[e].replace||e,t,r);if(!n)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return n},ir=function(e,t,r,n){var a=r.havingBaseStyle(t),i=Ke.makeSpan(n.concat(a.sizingClasses(r)),[e],r),o=a.sizeMultiplier/r.sizeMultiplier;return i.height*=o,i.depth*=o,i.maxFontSize=a.sizeMultiplier,i},or=function(e,t,r){var n=t.havingBaseStyle(r),a=(1-t.sizeMultiplier/n.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=V(a),e.height-=a,e.depth+=a},sr=function(e,t,r,n,a,i){var o=function(e,t,r,n){return Ke.makeSymbol(e,"Size"+t+"-Regular",r,n)}(e,t,a,n),s=ir(Ke.makeSpan(["delimsizing","size"+t],[o],n),x.TEXT,n,i);return r&&or(s,n,x.TEXT),s},lr=function(e,t,r){var n;return n="Size1-Regular"===t?"delim-size1":"delim-size4",{type:"elem",elem:Ke.makeSpan(["delimsizinginner",n],[Ke.makeSpan([],[Ke.makeSymbol(e,t,r)])])}},hr=function(e,t,r){var n=T["Size4-Regular"][e.charCodeAt(0)]?T["Size4-Regular"][e.charCodeAt(0)][4]:T["Size1-Regular"][e.charCodeAt(0)][4],a=new J("inner",function(e,t){switch(e){case"\u239c":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"\u2223":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"\u2225":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"\u239f":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"\u23a2":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"\u23a5":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"\u23aa":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"\u23d0":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"\u2016":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}}(e,Math.round(1e3*t))),i=new K([a],{width:V(n),height:V(t),style:"width:"+V(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),o=Ke.makeSvgSpan([],[i],r);return o.height=t,o.style.height=V(t),o.style.width=V(n),{type:"elem",elem:o}},mr={type:"kern",size:-.008},cr=["|","\\lvert","\\rvert","\\vert"],ur=["\\|","\\lVert","\\rVert","\\Vert"],pr=function(e,t,r,n,a,i){var o,s,h,m;o=h=m=e,s=null;var c="Size1-Regular";"\\uparrow"===e?h=m="\u23d0":"\\Uparrow"===e?h=m="\u2016":"\\downarrow"===e?o=h="\u23d0":"\\Downarrow"===e?o=h="\u2016":"\\updownarrow"===e?(o="\\uparrow",h="\u23d0",m="\\downarrow"):"\\Updownarrow"===e?(o="\\Uparrow",h="\u2016",m="\\Downarrow"):l.contains(cr,e)?h="\u2223":l.contains(ur,e)?h="\u2225":"["===e||"\\lbrack"===e?(o="\u23a1",h="\u23a2",m="\u23a3",c="Size4-Regular"):"]"===e||"\\rbrack"===e?(o="\u23a4",h="\u23a5",m="\u23a6",c="Size4-Regular"):"\\lfloor"===e||"\u230a"===e?(h=o="\u23a2",m="\u23a3",c="Size4-Regular"):"\\lceil"===e||"\u2308"===e?(o="\u23a1",h=m="\u23a2",c="Size4-Regular"):"\\rfloor"===e||"\u230b"===e?(h=o="\u23a5",m="\u23a6",c="Size4-Regular"):"\\rceil"===e||"\u2309"===e?(o="\u23a4",h=m="\u23a5",c="Size4-Regular"):"("===e||"\\lparen"===e?(o="\u239b",h="\u239c",m="\u239d",c="Size4-Regular"):")"===e||"\\rparen"===e?(o="\u239e",h="\u239f",m="\u23a0",c="Size4-Regular"):"\\{"===e||"\\lbrace"===e?(o="\u23a7",s="\u23a8",m="\u23a9",h="\u23aa",c="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(o="\u23ab",s="\u23ac",m="\u23ad",h="\u23aa",c="Size4-Regular"):"\\lgroup"===e||"\u27ee"===e?(o="\u23a7",m="\u23a9",h="\u23aa",c="Size4-Regular"):"\\rgroup"===e||"\u27ef"===e?(o="\u23ab",m="\u23ad",h="\u23aa",c="Size4-Regular"):"\\lmoustache"===e||"\u23b0"===e?(o="\u23a7",m="\u23ad",h="\u23aa",c="Size4-Regular"):"\\rmoustache"!==e&&"\u23b1"!==e||(o="\u23ab",m="\u23a9",h="\u23aa",c="Size4-Regular");var u=ar(o,c,a),p=u.height+u.depth,d=ar(h,c,a),f=d.height+d.depth,g=ar(m,c,a),v=g.height+g.depth,b=0,y=1;if(null!==s){var w=ar(s,c,a);b=w.height+w.depth,y=2}var k=p+v+b,S=k+Math.max(0,Math.ceil((t-k)/(y*f)))*y*f,M=n.fontMetrics().axisHeight;r&&(M*=n.sizeMultiplier);var z=S/2-M,A=[];if(A.push(lr(m,c,a)),A.push(mr),null===s){var T=S-p-v+.016;A.push(hr(h,T,n))}else{var B=(S-p-v-b)/2+.016;A.push(hr(h,B,n)),A.push(mr),A.push(lr(s,c,a)),A.push(mr),A.push(hr(h,B,n))}A.push(mr),A.push(lr(o,c,a));var C=n.havingBaseStyle(x.TEXT),q=Ke.makeVList({positionType:"bottom",positionData:z,children:A},C);return ir(Ke.makeSpan(["delimsizing","mult"],[q],C),x.TEXT,n,i)},dr=.08,fr=function(e,t,r,n,a){var i=function(e,t,r){t*=1e3;var n="";switch(e){case"sqrtMain":n=function(e,t){return"M95,"+(622+e+t)+"\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl"+e/2.075+" -"+e+"\nc5.3,-9.3,12,-14,20,-14\nH400000v"+(40+e)+"H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM"+(834+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize1":n=function(e,t){return"M263,"+(601+e+t)+"c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl"+e/2.084+" -"+e+"\nc4.7,-7.3,11,-11,19,-11\nH40000v"+(40+e)+"H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize2":n=function(e,t){return"M983 "+(10+e+t)+"\nl"+e/3.13+" -"+e+"\nc4,-6.7,10,-10,18,-10 H400000v"+(40+e)+"\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize3":n=function(e,t){return"M424,"+(2398+e+t)+"\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl"+e/4.223+" -"+e+"c4,-6.7,10,-10,18,-10 H400000\nv"+(40+e)+"H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M"+(1001+e)+" "+t+"\nh400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize4":n=function(e,t){return"M473,"+(2713+e+t)+"\nc339.3,-1799.3,509.3,-2700,510,-2702 l"+e/5.298+" -"+e+"\nc3.3,-7.3,9.3,-11,18,-11 H400000v"+(40+e)+"H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM"+(1001+e)+" "+t+"h400000v"+(40+e)+"H1017.7z"}(t,M);break;case"sqrtTall":n=function(e,t,r){return"M702 "+(e+t)+"H400000"+(40+e)+"\nH742v"+(r-54-t-e)+"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 "+t+"H400000v"+(40+e)+"H742z"}(t,M,r)}return n}(e,n,r),o=new J(e,i),s=new K([o],{width:"400em",height:V(t),viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return Ke.makeSvgSpan(["hide-tail"],[s],a)},gr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],vr=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],br=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],yr=[0,1.2,1.8,2.4,3],xr=[{type:"small",style:x.SCRIPTSCRIPT},{type:"small",style:x.SCRIPT},{type:"small",style:x.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],wr=[{type:"small",style:x.SCRIPTSCRIPT},{type:"small",style:x.SCRIPT},{type:"small",style:x.TEXT},{type:"stack"}],kr=[{type:"small",style:x.SCRIPTSCRIPT},{type:"small",style:x.SCRIPT},{type:"small",style:x.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],Sr=function(e){if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},Mr=function(e,t,r,n){for(var a=Math.min(2,3-n.style.size);at)return r[a]}return r[r.length-1]},zr=function(e,t,r,n,a,i){var o;"<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),o=l.contains(br,e)?xr:l.contains(gr,e)?kr:wr;var s=Mr(e,t,o,n);return"small"===s.type?function(e,t,r,n,a,i){var o=Ke.makeSymbol(e,"Main-Regular",a,n),s=ir(o,t,n,i);return r&&or(s,n,t),s}(e,s.style,r,n,a,i):"large"===s.type?sr(e,s.size,r,n,a,i):pr(e,t,r,n,a,i)},Ar={sqrtImage:function(e,t){var r,n,a=t.havingBaseSizing(),i=Mr("\\surd",e*a.sizeMultiplier,kr,a),o=a.sizeMultiplier,s=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),l=0,h=0,m=0;return"small"===i.type?(e<1?o=1:e<1.4&&(o=.7),h=(1+s)/o,(r=fr("sqrtMain",l=(1+s+dr)/o,m=1e3+1e3*s+80,s,t)).style.minWidth="0.853em",n=.833/o):"large"===i.type?(m=1080*yr[i.size],h=(yr[i.size]+s)/o,l=(yr[i.size]+s+dr)/o,(r=fr("sqrtSize"+i.size,l,m,s,t)).style.minWidth="1.02em",n=1/o):(l=e+s+dr,h=e+s,m=Math.floor(1e3*e+s)+80,(r=fr("sqrtTall",l,m,s,t)).style.minWidth="0.742em",n=1.056),r.height=h,r.style.height=V(l),{span:r,advanceWidth:n,ruleWidth:(t.fontMetrics().sqrtRuleThickness+s)*o}},sizedDelim:function(e,t,r,a,i){if("<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),l.contains(gr,e)||l.contains(br,e))return sr(e,t,!1,r,a,i);if(l.contains(vr,e))return pr(e,yr[t],!1,r,a,i);throw new n("Illegal delimiter: '"+e+"'")},sizeToMaxHeight:yr,customSizedDelim:zr,leftRightDelim:function(e,t,r,n,a,i){var o=n.fontMetrics().axisHeight*n.sizeMultiplier,s=5/n.fontMetrics().ptPerEm,l=Math.max(t-o,r+o),h=Math.max(l/500*901,2*l-s);return zr(e,h,!0,n,a,i)}},Tr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Br=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function Cr(e,t){var r=Xt(e);if(r&&l.contains(Br,r.text))return r;throw new n(r?"Invalid delimiter '"+r.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function qr(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}ot({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:function(e,t){var r=Cr(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:Tr[e.funcName].size,mclass:Tr[e.funcName].mclass,delim:r.text}},htmlBuilder:function(e,t){return"."===e.delim?Ke.makeSpan([e.mclass]):Ar.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass])},mathmlBuilder:function(e){var t=[];"."!==e.delim&&t.push(Bt(e.delim,e.mode));var r=new Tt.MathNode("mo",t);"mopen"===e.mclass||"mclose"===e.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var n=V(Ar.sizeToMaxHeight[e.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r}}),ot({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:function(e,t){var r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new n("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:Cr(t[0],e).text,color:r}}}),ot({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:function(e,t){var r=Cr(t[0],e),n=e.parser;++n.leftrightDepth;var a=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var i=Ut(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:a,left:r.text,right:i.delim,rightColor:i.color}},htmlBuilder:function(e,t){qr(e);for(var r,n,a=ft(e.body,t,!0,["mopen","mclose"]),i=0,o=0,s=!1,l=0;l-1?"mpadded":"menclose",[Rt(e.body,t)]);switch(e.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=t.fontMetrics().fboxsep*t.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),"\\fcolorbox"===e.label){var a=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness);n.setAttribute("style","border: "+a+"em solid "+String(e.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return e.backgroundColor&&n.setAttribute("mathbackground",e.backgroundColor),n};ot({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler:function(e,t,r){var n=e.parser,a=e.funcName,i=Ut(t[0],"color-token").color,o=t[1];return{type:"enclose",mode:n.mode,label:a,backgroundColor:i,body:o}},htmlBuilder:Nr,mathmlBuilder:Ir}),ot({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler:function(e,t,r){var n=e.parser,a=e.funcName,i=Ut(t[0],"color-token").color,o=Ut(t[1],"color-token").color,s=t[2];return{type:"enclose",mode:n.mode,label:a,backgroundColor:o,borderColor:i,body:s}},htmlBuilder:Nr,mathmlBuilder:Ir}),ot({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler:function(e,t){return{type:"enclose",mode:e.parser.mode,label:"\\fbox",body:t[0]}}}),ot({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"enclose",mode:r.mode,label:n,body:a}},htmlBuilder:Nr,mathmlBuilder:Ir}),ot({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler:function(e,t){return{type:"enclose",mode:e.parser.mode,label:"\\angl",body:t[0]}}});var Rr={};function Or(e){for(var t=e.type,r=e.names,n=e.props,a=e.handler,i=e.htmlBuilder,o=e.mathmlBuilder,s={type:t,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:a},l=0;l1||!c)&&g.pop(),b.length0&&(y+=.25),m.push({pos:y,isDashed:e[t]})}for(w(o[0]),r=0;r0&&(M<(B+=b)&&(M=B),B=0),e.addJot&&(M+=f),z.height=S,z.depth=M,y+=S,z.pos=y,y+=M+B,h[r]=z,w(o[r+1])}var C,q,N=y/2+t.fontMetrics().axisHeight,I=e.cols||[],R=[],O=[];if(e.tags&&e.tags.some((function(e){return e})))for(r=0;r=s)){var W=void 0;(a>0||e.hskipBeforeAndAfter)&&0!==(W=l.deflt(P.pregap,p))&&((C=Ke.makeSpan(["arraycolsep"],[])).style.width=V(W),R.push(C));var _=[];for(r=0;r0){for(var K=Ke.makeLineSpan("hline",t,c),J=Ke.makeLineSpan("hdashline",t,c),Q=[{type:"elem",elem:h,shift:0}];m.length>0;){var ee=m.pop(),te=ee.pos-N;ee.isDashed?Q.push({type:"elem",elem:J,shift:te}):Q.push({type:"elem",elem:K,shift:te})}h=Ke.makeVList({positionType:"individualShift",children:Q},t)}if(0===O.length)return Ke.makeSpan(["mord"],[h],t);var re=Ke.makeVList({positionType:"individualShift",children:O},t);return re=Ke.makeSpan(["tag"],[re],t),Ke.makeFragment([h,re])},Xr={c:"center ",l:"left ",r:"right "},Wr=function(e,t){for(var r=[],n=new Tt.MathNode("mtd",[],["mtr-glue"]),a=new Tt.MathNode("mtd",[],["mml-eqn-num"]),i=0;i0){var p=e.cols,d="",f=!1,g=0,v=p.length;"separator"===p[0].type&&(c+="top ",g=1),"separator"===p[p.length-1].type&&(c+="bottom ",v-=1);for(var b=g;b0?"left ":"",c+=S[S.length-1].length>0?"right ":"";for(var M=1;M-1?"alignat":"align",o="split"===e.envName,s=Gr(e.parser,{cols:a,addJot:!0,autoTag:o?void 0:Vr(e.envName),emptySingleRow:!0,colSeparationType:i,maxNumCols:o?2:void 0,leqno:e.parser.settings.leqno},"display"),l=0,h={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&"ordgroup"===t[0].type){for(var m="",c=0;c0&&u&&(f=1),a[p]={type:"align",align:d,pregap:f,postgap:0}}return s.colSeparationType=u?"align":"alignat",s};Or({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(e,t){var r=(Xt(t[0])?[t[0]]:Ut(t[0],"ordgroup").body).map((function(e){var t=Yt(e).text;if(-1!=="lcr".indexOf(t))return{type:"align",align:t};if("|"===t)return{type:"separator",separator:"|"};if(":"===t)return{type:"separator",separator:":"};throw new n("Unknown column alignment: "+t,e)})),a={cols:r,hskipBeforeAndAfter:!0,maxNumCols:r.length};return Gr(e.parser,a,Ur(e.envName))},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler:function(e){var t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName.replace("*","")],r="c",a={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if("*"===e.envName.charAt(e.envName.length-1)){var i=e.parser;if(i.consumeSpaces(),"["===i.fetch().text){if(i.consume(),i.consumeSpaces(),r=i.fetch().text,-1==="lcr".indexOf(r))throw new n("Expected l or c or r",i.nextToken);i.consume(),i.consumeSpaces(),i.expect("]"),i.consume(),a.cols=[{type:"align",align:r}]}}var o=Gr(e.parser,a,Ur(e.envName)),s=Math.max.apply(Math,[0].concat(o.body.map((function(e){return e.length}))));return o.cols=new Array(s).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[o],left:t[0],right:t[1],rightColor:void 0}:o},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["smallmatrix"],props:{numArgs:0},handler:function(e){var t=Gr(e.parser,{arraystretch:.5},"script");return t.colSeparationType="small",t},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["subarray"],props:{numArgs:1},handler:function(e,t){var r=(Xt(t[0])?[t[0]]:Ut(t[0],"ordgroup").body).map((function(e){var t=Yt(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new n("Unknown column alignment: "+t,e)}));if(r.length>1)throw new n("{subarray} can contain only one column");var a={cols:r,hskipBeforeAndAfter:!1,arraystretch:.5};if((a=Gr(e.parser,a,"script")).body.length>0&&a.body[0].length>1)throw new n("{subarray} can contain only one column");return a},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler:function(e){var t=Gr(e.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},Ur(e.envName));return{type:"leftright",mode:e.mode,body:[t],left:e.envName.indexOf("r")>-1?".":"\\{",right:e.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:_r,htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler:function(e){l.contains(["gather","gather*"],e.envName)&&Fr(e);var t={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Vr(e.envName),emptySingleRow:!0,leqno:e.parser.settings.leqno};return Gr(e.parser,t,"display")},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:_r,htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["equation","equation*"],props:{numArgs:0},handler:function(e){Fr(e);var t={autoTag:Vr(e.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:e.parser.settings.leqno};return Gr(e.parser,t,"display")},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["CD"],props:{numArgs:0},handler:function(e){return Fr(e),function(e){var t=[];for(e.gullet.beginGroup(),e.gullet.macros.set("\\cr","\\\\\\relax"),e.gullet.beginGroup();;){t.push(e.parseExpression(!1,"\\\\")),e.gullet.endGroup(),e.gullet.beginGroup();var r=e.fetch().text;if("&"!==r&&"\\\\"!==r){if("\\end"===r){0===t[t.length-1].length&&t.pop();break}throw new n("Expected \\\\ or \\cr or \\end",e.nextToken)}e.consume()}for(var a,i,o=[],s=[o],l=0;l-1);else{if(!("<>AV".indexOf(u)>-1))throw new n('Expected one of "<>AV=|." after @',h[c]);for(var d=0;d<2;d++){for(var f=!0,g=c+1;g=x.SCRIPT.id?r.text():x.DISPLAY:"text"===e&&r.size===x.DISPLAY.size?r=x.TEXT:"script"===e?r=x.SCRIPT:"scriptscript"===e&&(r=x.SCRIPTSCRIPT),r},nn=function(e,t){var r,n=rn(e.size,t.style),a=n.fracNum(),i=n.fracDen();r=t.havingStyle(a);var o=wt(e.numer,r,t);if(e.continued){var s=8.5/t.fontMetrics().ptPerEm,l=3.5/t.fontMetrics().ptPerEm;o.height=o.height0?3*c:7*c,d=t.fontMetrics().denom1):(m>0?(u=t.fontMetrics().num2,p=c):(u=t.fontMetrics().num3,p=3*c),d=t.fontMetrics().denom2),h){var w=t.fontMetrics().axisHeight;u-o.depth-(w+.5*m)0&&(t="."===(t=e)?null:t),t};ot({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler:function(e,t){var r,n=e.parser,a=t[4],i=t[5],o=lt(t[0]),s="atom"===o.type&&"open"===o.family?sn(o.text):null,l=lt(t[1]),h="atom"===l.type&&"close"===l.family?sn(l.text):null,m=Ut(t[2],"size"),c=null;r=!!m.isBlank||(c=m.value).number>0;var u="auto",p=t[3];if("ordgroup"===p.type){if(p.body.length>0){var d=Ut(p.body[0],"textord");u=on[Number(d.text)]}}else p=Ut(p,"textord"),u=on[Number(p.text)];return{type:"genfrac",mode:n.mode,numer:a,denom:i,continued:!1,hasBarLine:r,barSize:c,leftDelim:s,rightDelim:h,size:u}},htmlBuilder:nn,mathmlBuilder:an}),ot({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(e,t){var r=e.parser,n=(e.funcName,e.token);return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Ut(t[0],"size").value,token:n}}}),ot({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(e,t){var r=e.parser,n=(e.funcName,t[0]),a=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e}(Ut(t[1],"infix").size),i=t[2],o=a.number>0;return{type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:o,barSize:a,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:nn,mathmlBuilder:an});var ln=function(e,t){var r,n,a=t.style;"supsub"===e.type?(r=e.sup?wt(e.sup,t.havingStyle(a.sup()),t):wt(e.sub,t.havingStyle(a.sub()),t),n=Ut(e.base,"horizBrace")):n=Ut(e,"horizBrace");var i,o=wt(n.base,t.havingBaseStyle(x.DISPLAY)),s=Gt(n,t);if(n.isOver?(i=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"kern",size:.1},{type:"elem",elem:s}]},t)).children[0].children[0].children[1].classes.push("svg-align"):(i=Ke.makeVList({positionType:"bottom",positionData:o.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:o}]},t)).children[0].children[0].children[0].classes.push("svg-align"),r){var l=Ke.makeSpan(["mord",n.isOver?"mover":"munder"],[i],t);i=n.isOver?Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.2},{type:"elem",elem:r}]},t):Ke.makeVList({positionType:"bottom",positionData:l.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:l}]},t)}return Ke.makeSpan(["mord",n.isOver?"mover":"munder"],[i],t)};ot({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:t[0]}},htmlBuilder:ln,mathmlBuilder:function(e,t){var r=Vt(e.label);return new Tt.MathNode(e.isOver?"mover":"munder",[Rt(e.base,t),r])}}),ot({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(e,t){var r=e.parser,n=t[1],a=Ut(t[0],"url").url;return r.settings.isTrusted({command:"\\href",url:a})?{type:"href",mode:r.mode,href:a,body:ht(n)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:function(e,t){var r=ft(e.body,t,!1);return Ke.makeAnchor(e.href,[],r,t)},mathmlBuilder:function(e,t){var r=It(e.body,t);return r instanceof zt||(r=new zt("mrow",[r])),r.setAttribute("href",e.href),r}}),ot({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(e,t){var r=e.parser,n=Ut(t[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");for(var a=[],i=0;i0&&(n=F(e.totalheight,t)-r);var a=0;e.width.number>0&&(a=F(e.width,t));var i={height:V(r+n)};a>0&&(i.width=V(a)),n>0&&(i.verticalAlign=V(-n));var o=new j(e.src,e.alt,i);return o.height=r,o.depth=n,o},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mglyph",[]);r.setAttribute("alt",e.alt);var n=F(e.height,t),a=0;if(e.totalheight.number>0&&(a=F(e.totalheight,t)-n,r.setAttribute("valign",V(-a))),r.setAttribute("height",V(n+a)),e.width.number>0){var i=F(e.width,t);r.setAttribute("width",V(i))}return r.setAttribute("src",e.src),r}}),ot({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=Ut(t[0],"size");if(r.settings.strict){var i="m"===n[1],o="mu"===a.value.unit;i?(o||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, not "+a.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):o&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:a.value}},htmlBuilder:function(e,t){return Ke.makeGlue(e.dimension,t)},mathmlBuilder:function(e,t){var r=F(e.dimension,t);return new Tt.SpaceNode(r)}}),ot({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:a}},htmlBuilder:function(e,t){var r;"clap"===e.alignment?(r=Ke.makeSpan([],[wt(e.body,t)]),r=Ke.makeSpan(["inner"],[r],t)):r=Ke.makeSpan(["inner"],[wt(e.body,t)]);var n=Ke.makeSpan(["fix"],[]),a=Ke.makeSpan([e.alignment],[r,n],t),i=Ke.makeSpan(["strut"]);return i.style.height=V(a.height+a.depth),a.depth&&(i.style.verticalAlign=V(-a.depth)),a.children.unshift(i),a=Ke.makeSpan(["thinbox"],[a],t),Ke.makeSpan(["mord","vbox"],[a],t)},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mpadded",[Rt(e.body,t)]);if("rlap"!==e.alignment){var n="llap"===e.alignment?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r}}),ot({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(e,t){var r=e.funcName,n=e.parser,a=n.mode;n.switchMode("math");var i="\\("===r?"\\)":"$",o=n.parseExpression(!1,i);return n.expect(i),n.switchMode(a),{type:"styling",mode:n.mode,style:"text",body:o}}}),ot({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(e,t){throw new n("Mismatched "+e.funcName)}});var mn=function(e,t){switch(t.style.size){case x.DISPLAY.size:return e.display;case x.TEXT.size:return e.text;case x.SCRIPT.size:return e.script;case x.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}};ot({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:function(e,t){return{type:"mathchoice",mode:e.parser.mode,display:ht(t[0]),text:ht(t[1]),script:ht(t[2]),scriptscript:ht(t[3])}},htmlBuilder:function(e,t){var r=mn(e,t),n=ft(r,t,!1);return Ke.makeFragment(n)},mathmlBuilder:function(e,t){var r=mn(e,t);return It(r,t)}});var cn=function(e,t,r,n,a,i,o){e=Ke.makeSpan([],[e]);var s,h,m,c=r&&l.isCharacterBox(r);if(t){var u=wt(t,n.havingStyle(a.sup()),n);h={elem:u,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-u.depth)}}if(r){var p=wt(r,n.havingStyle(a.sub()),n);s={elem:p,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-p.height)}}if(h&&s){var d=n.fontMetrics().bigOpSpacing5+s.elem.height+s.elem.depth+s.kern+e.depth+o;m=Ke.makeVList({positionType:"bottom",positionData:d,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:V(-i)},{type:"kern",size:s.kern},{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:V(i)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(s){var f=e.height-o;m=Ke.makeVList({positionType:"top",positionData:f,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:V(-i)},{type:"kern",size:s.kern},{type:"elem",elem:e}]},n)}else{if(!h)return e;var g=e.depth+o;m=Ke.makeVList({positionType:"bottom",positionData:g,children:[{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:V(i)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}var v=[m];if(s&&0!==i&&!c){var b=Ke.makeSpan(["mspace"],[],n);b.style.marginRight=V(i),v.unshift(b)}return Ke.makeSpan(["mop","op-limits"],v,n)},un=["\\smallint"],pn=function(e,t){var r,n,a,i=!1;"supsub"===e.type?(r=e.sup,n=e.sub,a=Ut(e.base,"op"),i=!0):a=Ut(e,"op");var o,s=t.style,h=!1;if(s.size===x.DISPLAY.size&&a.symbol&&!l.contains(un,a.name)&&(h=!0),a.symbol){var m=h?"Size2-Regular":"Size1-Regular",c="";if("\\oiint"!==a.name&&"\\oiiint"!==a.name||(c=a.name.substr(1),a.name="oiint"===c?"\\iint":"\\iiint"),o=Ke.makeSymbol(a.name,m,"math",t,["mop","op-symbol",h?"large-op":"small-op"]),c.length>0){var u=o.italic,p=Ke.staticSvg(c+"Size"+(h?"2":"1"),t);o=Ke.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:0},{type:"elem",elem:p,shift:h?.08:0}]},t),a.name="\\"+c,o.classes.unshift("mop"),o.italic=u}}else if(a.body){var d=ft(a.body,t,!0);1===d.length&&d[0]instanceof Z?(o=d[0]).classes[0]="mop":o=Ke.makeSpan(["mop"],d,t)}else{for(var f=[],g=1;g0){for(var s=a.body.map((function(e){var t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e})),l=ft(s,t.withFont("mathrm"),!0),h=0;h=0?s.setAttribute("height",V(a)):(s.setAttribute("height",V(a)),s.setAttribute("depth",V(-a))),s.setAttribute("voffset",V(a)),s}});var yn=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];ot({type:"sizing",names:yn,props:{numArgs:0,allowedInText:!0},handler:function(e,t){var r=e.breakOnTokenText,n=e.funcName,a=e.parser,i=a.parseExpression(!1,r);return{type:"sizing",mode:a.mode,size:yn.indexOf(n)+1,body:i}},htmlBuilder:function(e,t){var r=t.havingSize(e.size);return bn(e.body,r,t)},mathmlBuilder:function(e,t){var r=t.havingSize(e.size),n=Nt(e.body,r),a=new Tt.MathNode("mstyle",n);return a.setAttribute("mathsize",V(r.sizeMultiplier)),a}}),ot({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(e,t,r){var n=e.parser,a=!1,i=!1,o=r[0]&&Ut(r[0],"ordgroup");if(o)for(var s="",l=0;lr.height+r.depth+i&&(i=(i+c-r.height-r.depth)/2);var u=l.height-r.height-i-h;r.style.paddingLeft=V(m);var p=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+u)},{type:"elem",elem:l},{type:"kern",size:h}]},t);if(e.index){var d=t.havingStyle(x.SCRIPTSCRIPT),f=wt(e.index,d,t),g=.6*(p.height-p.depth),v=Ke.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:f}]},t),b=Ke.makeSpan(["root"],[v]);return Ke.makeSpan(["mord","sqrt"],[b,p],t)}return Ke.makeSpan(["mord","sqrt"],[p],t)},mathmlBuilder:function(e,t){var r=e.body,n=e.index;return n?new Tt.MathNode("mroot",[Rt(r,t),Rt(n,t)]):new Tt.MathNode("msqrt",[Rt(r,t)])}});var xn={display:x.DISPLAY,text:x.TEXT,script:x.SCRIPT,scriptscript:x.SCRIPTSCRIPT};ot({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e,t){var r=e.breakOnTokenText,n=e.funcName,a=e.parser,i=a.parseExpression(!0,r),o=n.slice(1,n.length-5);return{type:"styling",mode:a.mode,style:o,body:i}},htmlBuilder:function(e,t){var r=xn[e.style],n=t.havingStyle(r).withFont("");return bn(e.body,n,t)},mathmlBuilder:function(e,t){var r=xn[e.style],n=t.havingStyle(r),a=Nt(e.body,n),i=new Tt.MathNode("mstyle",a),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return i.setAttribute("scriptlevel",o[0]),i.setAttribute("displaystyle",o[1]),i}});var wn=function(e,t){var r=e.base;return r?"op"===r.type?r.limits&&(t.style.size===x.DISPLAY.size||r.alwaysHandleSupSub)?pn:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(t.style.size===x.DISPLAY.size||r.limits)?vn:null:"accent"===r.type?l.isCharacterBox(r.base)?Wt:null:"horizBrace"===r.type&&!e.sub===r.isOver?ln:null:null};st({type:"supsub",htmlBuilder:function(e,t){var r=wn(e,t);if(r)return r(e,t);var n,a,i,o=e.base,s=e.sup,h=e.sub,m=wt(o,t),c=t.fontMetrics(),u=0,p=0,d=o&&l.isCharacterBox(o);if(s){var f=t.havingStyle(t.style.sup());n=wt(s,f,t),d||(u=m.height-f.fontMetrics().supDrop*f.sizeMultiplier/t.sizeMultiplier)}if(h){var g=t.havingStyle(t.style.sub());a=wt(h,g,t),d||(p=m.depth+g.fontMetrics().subDrop*g.sizeMultiplier/t.sizeMultiplier)}i=t.style===x.DISPLAY?c.sup1:t.style.cramped?c.sup3:c.sup2;var v,b=t.sizeMultiplier,y=V(.5/c.ptPerEm/b),w=null;if(a){var k=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(m instanceof Z||k)&&(w=V(-m.italic))}if(n&&a){u=Math.max(u,i,n.depth+.25*c.xHeight),p=Math.max(p,c.sub2);var S=4*c.defaultRuleThickness;if(u-n.depth-(a.height-p)0&&(u+=M,p-=M)}var z=[{type:"elem",elem:a,shift:p,marginRight:y,marginLeft:w},{type:"elem",elem:n,shift:-u,marginRight:y}];v=Ke.makeVList({positionType:"individualShift",children:z},t)}else if(a){p=Math.max(p,c.sub1,a.height-.8*c.xHeight);var A=[{type:"elem",elem:a,marginLeft:w,marginRight:y}];v=Ke.makeVList({positionType:"shift",positionData:p,children:A},t)}else{if(!n)throw new Error("supsub must have either sup or sub.");u=Math.max(u,i,n.depth+.25*c.xHeight),v=Ke.makeVList({positionType:"shift",positionData:-u,children:[{type:"elem",elem:n,marginRight:y}]},t)}var T=yt(m,"right")||"mord";return Ke.makeSpan([T],[m,Ke.makeSpan(["msupsub"],[v])],t)},mathmlBuilder:function(e,t){var r,n=!1;e.base&&"horizBrace"===e.base.type&&!!e.sup===e.base.isOver&&(n=!0,r=e.base.isOver),!e.base||"op"!==e.base.type&&"operatorname"!==e.base.type||(e.base.parentIsSupSub=!0);var a,i=[Rt(e.base,t)];if(e.sub&&i.push(Rt(e.sub,t)),e.sup&&i.push(Rt(e.sup,t)),n)a=r?"mover":"munder";else if(e.sub)if(e.sup){var o=e.base;a=o&&"op"===o.type&&o.limits&&t.style===x.DISPLAY||o&&"operatorname"===o.type&&o.alwaysHandleSupSub&&(t.style===x.DISPLAY||o.limits)?"munderover":"msubsup"}else{var s=e.base;a=s&&"op"===s.type&&s.limits&&(t.style===x.DISPLAY||s.alwaysHandleSupSub)||s&&"operatorname"===s.type&&s.alwaysHandleSupSub&&(s.limits||t.style===x.DISPLAY)?"munder":"msub"}else{var l=e.base;a=l&&"op"===l.type&&l.limits&&(t.style===x.DISPLAY||l.alwaysHandleSupSub)||l&&"operatorname"===l.type&&l.alwaysHandleSupSub&&(l.limits||t.style===x.DISPLAY)?"mover":"msup"}return new Tt.MathNode(a,i)}}),st({type:"atom",htmlBuilder:function(e,t){return Ke.mathsym(e.text,e.mode,t,["m"+e.family])},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mo",[Bt(e.text,e.mode)]);if("bin"===e.family){var n=qt(e,t);"bold-italic"===n&&r.setAttribute("mathvariant",n)}else"punct"===e.family?r.setAttribute("separator","true"):"open"!==e.family&&"close"!==e.family||r.setAttribute("stretchy","false");return r}});var kn={mi:"italic",mn:"normal",mtext:"normal"};st({type:"mathord",htmlBuilder:function(e,t){return Ke.makeOrd(e,t,"mathord")},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mi",[Bt(e.text,e.mode,t)]),n=qt(e,t)||"italic";return n!==kn[r.type]&&r.setAttribute("mathvariant",n),r}}),st({type:"textord",htmlBuilder:function(e,t){return Ke.makeOrd(e,t,"textord")},mathmlBuilder:function(e,t){var r,n=Bt(e.text,e.mode,t),a=qt(e,t)||"normal";return r="text"===e.mode?new Tt.MathNode("mtext",[n]):/[0-9]/.test(e.text)?new Tt.MathNode("mn",[n]):"\\prime"===e.text?new Tt.MathNode("mo",[n]):new Tt.MathNode("mi",[n]),a!==kn[r.type]&&r.setAttribute("mathvariant",a),r}});var Sn={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},Mn={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};st({type:"spacing",htmlBuilder:function(e,t){if(Mn.hasOwnProperty(e.text)){var r=Mn[e.text].className||"";if("text"===e.mode){var a=Ke.makeOrd(e,t,"textord");return a.classes.push(r),a}return Ke.makeSpan(["mspace",r],[Ke.mathsym(e.text,e.mode,t)],t)}if(Sn.hasOwnProperty(e.text))return Ke.makeSpan(["mspace",Sn[e.text]],[],t);throw new n('Unknown type of space "'+e.text+'"')},mathmlBuilder:function(e,t){if(!Mn.hasOwnProperty(e.text)){if(Sn.hasOwnProperty(e.text))return new Tt.MathNode("mspace");throw new n('Unknown type of space "'+e.text+'"')}return new Tt.MathNode("mtext",[new Tt.TextNode("\xa0")])}});var zn=function(){var e=new Tt.MathNode("mtd",[]);return e.setAttribute("width","50%"),e};st({type:"tag",mathmlBuilder:function(e,t){var r=new Tt.MathNode("mtable",[new Tt.MathNode("mtr",[zn(),new Tt.MathNode("mtd",[It(e.body,t)]),zn(),new Tt.MathNode("mtd",[It(e.tag,t)])])]);return r.setAttribute("width","100%"),r}});var An={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Tn={"\\textbf":"textbf","\\textmd":"textmd"},Bn={"\\textit":"textit","\\textup":"textup"},Cn=function(e,t){var r=e.font;return r?An[r]?t.withTextFontFamily(An[r]):Tn[r]?t.withTextFontWeight(Tn[r]):t.withTextFontShape(Bn[r]):t};ot({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"text",mode:r.mode,body:ht(a),font:n}},htmlBuilder:function(e,t){var r=Cn(e,t),n=ft(e.body,r,!0);return Ke.makeSpan(["mord","text"],n,r)},mathmlBuilder:function(e,t){var r=Cn(e,t);return It(e.body,r)}}),ot({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){return{type:"underline",mode:e.parser.mode,body:t[0]}},htmlBuilder:function(e,t){var r=wt(e.body,t),n=Ke.makeLineSpan("underline-line",t),a=t.fontMetrics().defaultRuleThickness,i=Ke.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:a},{type:"elem",elem:n},{type:"kern",size:3*a},{type:"elem",elem:r}]},t);return Ke.makeSpan(["mord","underline"],[i],t)},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mo",[new Tt.TextNode("\u203e")]);r.setAttribute("stretchy","true");var n=new Tt.MathNode("munder",[Rt(e.body,t),r]);return n.setAttribute("accentunder","true"),n}}),ot({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler:function(e,t){return{type:"vcenter",mode:e.parser.mode,body:t[0]}},htmlBuilder:function(e,t){var r=wt(e.body,t),n=t.fontMetrics().axisHeight,a=.5*(r.height-n-(r.depth+n));return Ke.makeVList({positionType:"shift",positionData:a,children:[{type:"elem",elem:r}]},t)},mathmlBuilder:function(e,t){return new Tt.MathNode("mpadded",[Rt(e.body,t)],["vcenter"])}}),ot({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(e,t,r){throw new n("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(e,t){for(var r=qn(e),n=[],a=t.havingStyle(t.style.text()),i=0;i0;)this.endGroup()},t.has=function(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)},t.get=function(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]},t.set=function(e,t,r){if(void 0===r&&(r=!1),r){for(var n=0;n0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var a=this.undefStack[this.undefStack.length-1];a&&!a.hasOwnProperty(e)&&(a[e]=this.current[e])}null==t?delete this.current[e]:this.current[e]=t},e}(),Hn=Hr;Er("\\noexpand",(function(e){var t=e.popToken();return e.isExpandable(t.text)&&(t.noexpand=!0,t.treatAsRelax=!0),{tokens:[t],numArgs:0}})),Er("\\expandafter",(function(e){var t=e.popToken();return e.expandOnce(!0),{tokens:[t],numArgs:0}})),Er("\\@firstoftwo",(function(e){return{tokens:e.consumeArgs(2)[0],numArgs:0}})),Er("\\@secondoftwo",(function(e){return{tokens:e.consumeArgs(2)[1],numArgs:0}})),Er("\\@ifnextchar",(function(e){var t=e.consumeArgs(3);e.consumeSpaces();var r=e.future();return 1===t[0].length&&t[0][0].text===r.text?{tokens:t[1],numArgs:0}:{tokens:t[2],numArgs:0}})),Er("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),Er("\\TextOrMath",(function(e){var t=e.consumeArgs(2);return"text"===e.mode?{tokens:t[0],numArgs:0}:{tokens:t[1],numArgs:0}}));var En={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};Er("\\char",(function(e){var t,r=e.popToken(),a="";if("'"===r.text)t=8,r=e.popToken();else if('"'===r.text)t=16,r=e.popToken();else if("`"===r.text)if("\\"===(r=e.popToken()).text[0])a=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new n("\\char` missing argument");a=r.text.charCodeAt(0)}else t=10;if(t){if(null==(a=En[r.text])||a>=t)throw new n("Invalid base-"+t+" digit "+r.text);for(var i;null!=(i=En[e.future().text])&&i":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};Er("\\dots",(function(e){var t="\\dotso",r=e.expandAfterFuture().text;return r in Dn?t=Dn[r]:("\\not"===r.substr(0,4)||r in ae.math&&l.contains(["bin","rel"],ae.math[r].group))&&(t="\\dotsb"),t}));var Pn={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};Er("\\dotso",(function(e){return e.future().text in Pn?"\\ldots\\,":"\\ldots"})),Er("\\dotsc",(function(e){var t=e.future().text;return t in Pn&&","!==t?"\\ldots\\,":"\\ldots"})),Er("\\cdots",(function(e){return e.future().text in Pn?"\\@cdots\\,":"\\@cdots"})),Er("\\dotsb","\\cdots"),Er("\\dotsm","\\cdots"),Er("\\dotsi","\\!\\cdots"),Er("\\dotsx","\\ldots\\,"),Er("\\DOTSI","\\relax"),Er("\\DOTSB","\\relax"),Er("\\DOTSX","\\relax"),Er("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),Er("\\,","\\tmspace+{3mu}{.1667em}"),Er("\\thinspace","\\,"),Er("\\>","\\mskip{4mu}"),Er("\\:","\\tmspace+{4mu}{.2222em}"),Er("\\medspace","\\:"),Er("\\;","\\tmspace+{5mu}{.2777em}"),Er("\\thickspace","\\;"),Er("\\!","\\tmspace-{3mu}{.1667em}"),Er("\\negthinspace","\\!"),Er("\\negmedspace","\\tmspace-{4mu}{.2222em}"),Er("\\negthickspace","\\tmspace-{5mu}{.277em}"),Er("\\enspace","\\kern.5em "),Er("\\enskip","\\hskip.5em\\relax"),Er("\\quad","\\hskip1em\\relax"),Er("\\qquad","\\hskip2em\\relax"),Er("\\tag","\\@ifstar\\tag@literal\\tag@paren"),Er("\\tag@paren","\\tag@literal{({#1})}"),Er("\\tag@literal",(function(e){if(e.macros.get("\\df@tag"))throw new n("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"})),Er("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),Er("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),Er("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),Er("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),Er("\\pmb","\\html@mathml{\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}{\\mathbf{#1}}"),Er("\\newline","\\\\\\relax"),Er("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var Fn=V(T["Main-Regular"]["T".charCodeAt(0)][1]-.7*T["Main-Regular"]["A".charCodeAt(0)][1]);Er("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+Fn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),Er("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+Fn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),Er("\\hspace","\\@ifstar\\@hspacer\\@hspace"),Er("\\@hspace","\\hskip #1\\relax"),Er("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),Er("\\ordinarycolon",":"),Er("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),Er("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),Er("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),Er("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),Er("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),Er("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),Er("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),Er("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),Er("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),Er("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),Er("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),Er("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),Er("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),Er("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),Er("\u2237","\\dblcolon"),Er("\u2239","\\eqcolon"),Er("\u2254","\\coloneqq"),Er("\u2255","\\eqqcolon"),Er("\u2a74","\\Coloneqq"),Er("\\ratio","\\vcentcolon"),Er("\\coloncolon","\\dblcolon"),Er("\\colonequals","\\coloneqq"),Er("\\coloncolonequals","\\Coloneqq"),Er("\\equalscolon","\\eqqcolon"),Er("\\equalscoloncolon","\\Eqqcolon"),Er("\\colonminus","\\coloneq"),Er("\\coloncolonminus","\\Coloneq"),Er("\\minuscolon","\\eqcolon"),Er("\\minuscoloncolon","\\Eqcolon"),Er("\\coloncolonapprox","\\Colonapprox"),Er("\\coloncolonsim","\\Colonsim"),Er("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Er("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Er("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Er("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Er("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),Er("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),Er("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),Er("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),Er("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),Er("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),Er("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),Er("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),Er("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),Er("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),Er("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),Er("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),Er("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),Er("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),Er("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),Er("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),Er("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),Er("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),Er("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),Er("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),Er("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),Er("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),Er("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),Er("\\imath","\\html@mathml{\\@imath}{\u0131}"),Er("\\jmath","\\html@mathml{\\@jmath}{\u0237}"),Er("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),Er("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),Er("\u27e6","\\llbracket"),Er("\u27e7","\\rrbracket"),Er("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),Er("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),Er("\u2983","\\lBrace"),Er("\u2984","\\rBrace"),Er("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29b5}}"),Er("\u29b5","\\minuso"),Er("\\darr","\\downarrow"),Er("\\dArr","\\Downarrow"),Er("\\Darr","\\Downarrow"),Er("\\lang","\\langle"),Er("\\rang","\\rangle"),Er("\\uarr","\\uparrow"),Er("\\uArr","\\Uparrow"),Er("\\Uarr","\\Uparrow"),Er("\\N","\\mathbb{N}"),Er("\\R","\\mathbb{R}"),Er("\\Z","\\mathbb{Z}"),Er("\\alef","\\aleph"),Er("\\alefsym","\\aleph"),Er("\\Alpha","\\mathrm{A}"),Er("\\Beta","\\mathrm{B}"),Er("\\bull","\\bullet"),Er("\\Chi","\\mathrm{X}"),Er("\\clubs","\\clubsuit"),Er("\\cnums","\\mathbb{C}"),Er("\\Complex","\\mathbb{C}"),Er("\\Dagger","\\ddagger"),Er("\\diamonds","\\diamondsuit"),Er("\\empty","\\emptyset"),Er("\\Epsilon","\\mathrm{E}"),Er("\\Eta","\\mathrm{H}"),Er("\\exist","\\exists"),Er("\\harr","\\leftrightarrow"),Er("\\hArr","\\Leftrightarrow"),Er("\\Harr","\\Leftrightarrow"),Er("\\hearts","\\heartsuit"),Er("\\image","\\Im"),Er("\\infin","\\infty"),Er("\\Iota","\\mathrm{I}"),Er("\\isin","\\in"),Er("\\Kappa","\\mathrm{K}"),Er("\\larr","\\leftarrow"),Er("\\lArr","\\Leftarrow"),Er("\\Larr","\\Leftarrow"),Er("\\lrarr","\\leftrightarrow"),Er("\\lrArr","\\Leftrightarrow"),Er("\\Lrarr","\\Leftrightarrow"),Er("\\Mu","\\mathrm{M}"),Er("\\natnums","\\mathbb{N}"),Er("\\Nu","\\mathrm{N}"),Er("\\Omicron","\\mathrm{O}"),Er("\\plusmn","\\pm"),Er("\\rarr","\\rightarrow"),Er("\\rArr","\\Rightarrow"),Er("\\Rarr","\\Rightarrow"),Er("\\real","\\Re"),Er("\\reals","\\mathbb{R}"),Er("\\Reals","\\mathbb{R}"),Er("\\Rho","\\mathrm{P}"),Er("\\sdot","\\cdot"),Er("\\sect","\\S"),Er("\\spades","\\spadesuit"),Er("\\sub","\\subset"),Er("\\sube","\\subseteq"),Er("\\supe","\\supseteq"),Er("\\Tau","\\mathrm{T}"),Er("\\thetasym","\\vartheta"),Er("\\weierp","\\wp"),Er("\\Zeta","\\mathrm{Z}"),Er("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),Er("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),Er("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),Er("\\bra","\\mathinner{\\langle{#1}|}"),Er("\\ket","\\mathinner{|{#1}\\rangle}"),Er("\\braket","\\mathinner{\\langle{#1}\\rangle}"),Er("\\Bra","\\left\\langle#1\\right|"),Er("\\Ket","\\left|#1\\right\\rangle"),Er("\\angln","{\\angl n}"),Er("\\blue","\\textcolor{##6495ed}{#1}"),Er("\\orange","\\textcolor{##ffa500}{#1}"),Er("\\pink","\\textcolor{##ff00af}{#1}"),Er("\\red","\\textcolor{##df0030}{#1}"),Er("\\green","\\textcolor{##28ae7b}{#1}"),Er("\\gray","\\textcolor{gray}{#1}"),Er("\\purple","\\textcolor{##9d38bd}{#1}"),Er("\\blueA","\\textcolor{##ccfaff}{#1}"),Er("\\blueB","\\textcolor{##80f6ff}{#1}"),Er("\\blueC","\\textcolor{##63d9ea}{#1}"),Er("\\blueD","\\textcolor{##11accd}{#1}"),Er("\\blueE","\\textcolor{##0c7f99}{#1}"),Er("\\tealA","\\textcolor{##94fff5}{#1}"),Er("\\tealB","\\textcolor{##26edd5}{#1}"),Er("\\tealC","\\textcolor{##01d1c1}{#1}"),Er("\\tealD","\\textcolor{##01a995}{#1}"),Er("\\tealE","\\textcolor{##208170}{#1}"),Er("\\greenA","\\textcolor{##b6ffb0}{#1}"),Er("\\greenB","\\textcolor{##8af281}{#1}"),Er("\\greenC","\\textcolor{##74cf70}{#1}"),Er("\\greenD","\\textcolor{##1fab54}{#1}"),Er("\\greenE","\\textcolor{##0d923f}{#1}"),Er("\\goldA","\\textcolor{##ffd0a9}{#1}"),Er("\\goldB","\\textcolor{##ffbb71}{#1}"),Er("\\goldC","\\textcolor{##ff9c39}{#1}"),Er("\\goldD","\\textcolor{##e07d10}{#1}"),Er("\\goldE","\\textcolor{##a75a05}{#1}"),Er("\\redA","\\textcolor{##fca9a9}{#1}"),Er("\\redB","\\textcolor{##ff8482}{#1}"),Er("\\redC","\\textcolor{##f9685d}{#1}"),Er("\\redD","\\textcolor{##e84d39}{#1}"),Er("\\redE","\\textcolor{##bc2612}{#1}"),Er("\\maroonA","\\textcolor{##ffbde0}{#1}"),Er("\\maroonB","\\textcolor{##ff92c6}{#1}"),Er("\\maroonC","\\textcolor{##ed5fa6}{#1}"),Er("\\maroonD","\\textcolor{##ca337c}{#1}"),Er("\\maroonE","\\textcolor{##9e034e}{#1}"),Er("\\purpleA","\\textcolor{##ddd7ff}{#1}"),Er("\\purpleB","\\textcolor{##c6b9fc}{#1}"),Er("\\purpleC","\\textcolor{##aa87ff}{#1}"),Er("\\purpleD","\\textcolor{##7854ab}{#1}"),Er("\\purpleE","\\textcolor{##543b78}{#1}"),Er("\\mintA","\\textcolor{##f5f9e8}{#1}"),Er("\\mintB","\\textcolor{##edf2df}{#1}"),Er("\\mintC","\\textcolor{##e0e5cc}{#1}"),Er("\\grayA","\\textcolor{##f6f7f7}{#1}"),Er("\\grayB","\\textcolor{##f0f1f2}{#1}"),Er("\\grayC","\\textcolor{##e3e5e6}{#1}"),Er("\\grayD","\\textcolor{##d6d8da}{#1}"),Er("\\grayE","\\textcolor{##babec2}{#1}"),Er("\\grayF","\\textcolor{##888d93}{#1}"),Er("\\grayG","\\textcolor{##626569}{#1}"),Er("\\grayH","\\textcolor{##3b3e40}{#1}"),Er("\\grayI","\\textcolor{##21242c}{#1}"),Er("\\kaBlue","\\textcolor{##314453}{#1}"),Er("\\kaGreen","\\textcolor{##71B307}{#1}");var Vn={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},Gn=function(){function e(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new On(Hn,t.macros),this.mode=r,this.stack=[]}var t=e.prototype;return t.feed=function(e){this.lexer=new Rn(e,this.settings)},t.switchMode=function(e){this.mode=e},t.beginGroup=function(){this.macros.beginGroup()},t.endGroup=function(){this.macros.endGroup()},t.endGroups=function(){this.macros.endGroups()},t.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},t.popToken=function(){return this.future(),this.stack.pop()},t.pushToken=function(e){this.stack.push(e)},t.pushTokens=function(e){var t;(t=this.stack).push.apply(t,e)},t.scanArgument=function(e){var t,r,n;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken();var a=this.consumeArg(["]"]);n=a.tokens,r=a.end}else{var i=this.consumeArg();n=i.tokens,t=i.start,r=i.end}return this.pushToken(new Dr("EOF",r.loc)),this.pushTokens(n),t.range(r,"")},t.consumeSpaces=function(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}},t.consumeArg=function(e){var t=[],r=e&&e.length>0;r||this.consumeSpaces();var a,i=this.future(),o=0,s=0;do{if(a=this.popToken(),t.push(a),"{"===a.text)++o;else if("}"===a.text){if(-1===--o)throw new n("Extra }",a)}else if("EOF"===a.text)throw new n("Unexpected end of input in a macro argument, expected '"+(e&&r?e[s]:"}")+"'",a);if(e&&r)if((0===o||1===o&&"{"===e[s])&&a.text===e[s]){if(++s===e.length){t.splice(-s,s);break}}else s=0}while(0!==o||r);return"{"===i.text&&"}"===t[t.length-1].text&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:i,end:a}},t.consumeArgs=function(e,t){if(t){if(t.length!==e+1)throw new n("The length of delimiters doesn't match the number of args!");for(var r=t[0],a=0;athis.settings.maxExpand)throw new n("Too many expansions: infinite loop or need to increase maxExpand setting");var i=a.tokens,o=this.consumeArgs(a.numArgs,a.delimiters);if(a.numArgs)for(var s=(i=i.slice()).length-1;s>=0;--s){var l=i[s];if("#"===l.text){if(0===s)throw new n("Incomplete placeholder at end of macro body",l);if("#"===(l=i[--s]).text)i.splice(s+1,1);else{if(!/^[1-9]$/.test(l.text))throw new n("Not a valid argument number",l);var h;(h=i).splice.apply(h,[s,2].concat(o[+l.text-1]))}}}return this.pushTokens(i),i},t.expandAfterFuture=function(){return this.expandOnce(),this.future()},t.expandNextToken=function(){for(;;){var e=this.expandOnce();if(e instanceof Dr)return e.treatAsRelax&&(e.text="\\relax"),this.stack.pop()}throw new Error},t.expandMacro=function(e){return this.macros.has(e)?this.expandTokens([new Dr(e)]):void 0},t.expandTokens=function(e){var t=[],r=this.stack.length;for(this.pushTokens(e);this.stack.length>r;){var n=this.expandOnce(!0);n instanceof Dr&&(n.treatAsRelax&&(n.noexpand=!1,n.treatAsRelax=!1),t.push(this.stack.pop()))}return t},t.expandMacroAsText=function(e){var t=this.expandMacro(e);return t?t.map((function(e){return e.text})).join(""):t},t._getExpansion=function(e){var t=this.macros.get(e);if(null==t)return t;if(1===e.length){var r=this.lexer.catcodes[e];if(null!=r&&13!==r)return}var n="function"==typeof t?t(this):t;if("string"==typeof n){var a=0;if(-1!==n.indexOf("#"))for(var i=n.replace(/##/g,"");-1!==i.indexOf("#"+(a+1));)++a;for(var o=new Rn(n,this.settings),s=[],l=o.lex();"EOF"!==l.text;)s.push(l),l=o.lex();return s.reverse(),{tokens:s,numArgs:a}}return n},t.isDefined=function(e){return this.macros.has(e)||Nn.hasOwnProperty(e)||ae.math.hasOwnProperty(e)||ae.text.hasOwnProperty(e)||Vn.hasOwnProperty(e)},t.isExpandable=function(e){var t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:Nn.hasOwnProperty(e)&&!Nn[e].primitive},e}(),Un={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"},"\u0327":{text:"\\c"}},Yn={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u1e09":"c\u0327\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\xe7":"c\u0327","\u010f":"d\u030c","\u1e0b":"d\u0307","\u1e11":"d\u0327","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u1e1d":"e\u0327\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u0229":"e\u0327","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u0123":"g\u0327","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\u1e29":"h\u0327","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u0137":"k\u0327","\u013a":"l\u0301","\u013e":"l\u030c","\u013c":"l\u0327","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\u0146":"n\u0327","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u0157":"r\u0327","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u015f":"s\u0327","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\u0163":"t\u0327","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u1e08":"C\u0327\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\xc7":"C\u0327","\u010e":"D\u030c","\u1e0a":"D\u0307","\u1e10":"D\u0327","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u1e1c":"E\u0327\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u0228":"E\u0327","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u0122":"G\u0327","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\u1e28":"H\u0327","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0136":"K\u0327","\u0139":"L\u0301","\u013d":"L\u030c","\u013b":"L\u0327","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\u0145":"N\u0327","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u0156":"R\u0327","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u015e":"S\u0327","\u0164":"T\u030c","\u1e6a":"T\u0307","\u0162":"T\u0327","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"},Xn=function(){function e(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new Gn(e,t,this.mode),this.settings=t,this.leftrightDepth=0}var t=e.prototype;return t.expect=function(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new n("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()},t.consume=function(){this.nextToken=null},t.fetch=function(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken},t.switchMode=function(e){this.mode=e,this.gullet.switchMode(e)},t.parse=function(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}},t.subparse=function(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new Dr("}")),this.gullet.pushTokens(e);var r=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,r},t.parseExpression=function(t,r){for(var n=[];;){"math"===this.mode&&this.consumeSpaces();var a=this.fetch();if(-1!==e.endOfExpression.indexOf(a.text))break;if(r&&a.text===r)break;if(t&&Nn[a.text]&&Nn[a.text].infix)break;var i=this.parseAtom(r);if(!i)break;"internal"!==i.type&&n.push(i)}return"text"===this.mode&&this.formLigatures(n),this.handleInfixNodes(n)},t.handleInfixNodes=function(e){for(var t,r=-1,a=0;a=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var s,l=ae[this.mode][t].group,h=Lr.range(e);if(te.hasOwnProperty(l)){var m=l;s={type:"atom",mode:this.mode,family:m,loc:h,text:t}}else s={type:l,mode:this.mode,loc:h,text:t};i=s}else{if(!(t.charCodeAt(0)>=128))return null;this.settings.strict&&(S(t.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'" ('+t.charCodeAt(0)+")",e)),i={type:"textord",mode:"text",loc:Lr.range(e),text:t}}if(this.consume(),o)for(var c=0;cli { + margin-left: 22px; +} + +ol>li { + margin-left: 27.2px; +} + +li>*:first-child { + margin-top: 0 +} + +/* Text alignements, this should be forbidden. */ + +.left { + text-align: left; +} + +.right { + text-align: right; +} + +.center { + text-align: center; +} + +/* Links and anchors */ + +a { + text-decoration: none; + color: var(--link-color); +} + +a:hover { + box-shadow: 0 1px 0 0 var(--link-color); +} + +/* Linked highlight */ +*:target { + background-color: var(--target-background) !important; + box-shadow: 0 0px 0 1px var(--target-shadow) !important; + border-radius: 1px; +} + +*:hover > a.anchor { + visibility: visible; +} + +a.anchor:before { + content: "#"; +} + +a.anchor:hover { + box-shadow: none; + text-decoration: none; + color: var(--anchor-hover); +} + +a.anchor { + visibility: hidden; + position: absolute; + /* top: 0px; */ + /* margin-left: -3ex; */ + margin-left: -1.3em; + font-weight: normal; + font-style: normal; + padding-right: 0.4em; + padding-left: 0.4em; + /* To remain selectable */ + color: var(--anchor-color); +} + +.spec > a.anchor { + margin-left: -2.3em; + padding-right: 0.9em; +} + +.xref-unresolved { + color: #2C94BD; +} +.xref-unresolved:hover { + box-shadow: 0 1px 0 0 var(--xref-shadow); +} + +/* Section and document divisions. + Until at least 4.03 many of the modules of the stdlib start at .h7, + we restart the sequence there like h2 */ + +h1, h2, h3, h4, h5, h6, .h7, .h8, .h9, .h10 { + font-family: "Fira Sans", Helvetica, Arial, sans-serif; + font-weight: 400; + padding-top: 0.1em; + line-height: 1.2; + overflow-wrap: break-word; +} + +h1 { + font-weight: 500; + font-size: 2.441em; +} + +h1 { + font-weight: 500; + font-size: 1.953em; + box-shadow: 0 1px 0 0 var(--header-shadow); +} + +h2 { + font-size: 1.563em; +} + +h3 { + font-size: 1.25em; +} + +small, .font_small { + font-size: 0.8em; +} + +h1 code, h1 tt { + font-size: inherit; + font-weight: inherit; +} + +h2 code, h2 tt { + font-size: inherit; + font-weight: inherit; +} + +h3 code, h3 tt { + font-size: inherit; + font-weight: inherit; +} + +h3 code, h3 tt { + font-size: inherit; + font-weight: inherit; +} + +h4 { + font-size: 1.12em; +} + +/* Comment delimiters, hidden but accessible to screen readers and + selected for copy/pasting */ + +/* Taken from bootstrap */ +/* See also https://stackoverflow.com/a/27769435/4220738 */ +.comment-delim { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* Preformatted and code */ + +tt, code, pre { + font-family: "Fira Mono", courier; + font-weight: 400; +} + +pre { + padding: 0.1em; + border: 1px solid var(--pre-border-color); + border-radius: 5px; + overflow-x: auto; +} + +p code, +li code { + background-color: var(--li-code-background); + color: var(--li-code-color); + border-radius: 3px; + padding: 0 0.3ex; +} + +p a > code { + color: var(--link-color); +} + +code { + white-space: pre-wrap; +} + +/* Code blocks (e.g. Examples) */ + +pre code { + font-size: 0.893rem; +} + +/* Code lexemes */ + +.keyword { + font-weight: 500; +} + +.arrow { white-space: nowrap } + +/* Module member specification */ + +.spec { + background-color: var(--spec-summary-background); + border-radius: 3px; + border-left: 4px solid var(--spec-summary-border-color); + border-right: 5px solid transparent; + padding: 0.35em 0.5em; +} + +li:not(:last-child) > .def-doc { + margin-bottom: 15px; +} + +/* Spacing between items */ +div.odoc-spec,.odoc-include { + margin-bottom: 2em; +} + +.spec.type .variant p, .spec.type .record p { + margin: 5px; +} + +.spec.type .variant, .spec.type .record { + margin-left: 2ch; + list-style: none; + display: flex; + flex-wrap: wrap; + row-gap: 4px; +} + +.spec.type .record > code, .spec.type .variant > code { + min-width: 40%; +} + +.spec.type > ol { + margin-top: 0; + margin-bottom: 0; +} + +.spec.type .record > .def-doc, .spec.type .variant > .def-doc { + min-width:50%; + padding: 0.25em 0.5em; + margin-left: 10%; + border-radius: 3px; + flex-grow:1; + background: var(--main-background); + box-shadow: 2px 2px 4px lightgrey; +} + +div.def { + margin-top: 0; + text-indent: -2ex; + padding-left: 2ex; +} + +div.def-doc>*:first-child { + margin-top: 0; +} + +/* Collapsible inlined include and module */ + +.odoc-include details { + position: relative; +} + +.odoc-include.shadowed-include { + display: none; +} + +.odoc-include details:after { + z-index: -100; + display: block; + content: " "; + position: absolute; + border-radius: 0 1ex 1ex 0; + right: -20px; + top: 1px; + bottom: 1px; + width: 15px; + background: var(--spec-details-after-background, rgba(0, 4, 15, 0.05)); + box-shadow: 0 0px 0 1px var(--spec-details-after-shadow, rgba(204, 204, 204, 0.53)); +} + +.odoc-include summary { + position: relative; + margin-bottom: 1em; + cursor: pointer; + outline: none; +} + +.odoc-include summary:hover { + background-color: var(--spec-summary-hover-background); +} + +/* FIXME: Does not work in Firefox. */ +.odoc-include summary::-webkit-details-marker { + color: #888; + transform: scaleX(-1); + position: absolute; + top: calc(50% - 5px); + height: 11px; + right: -29px; +} + +/* Records and variants FIXME */ + +div.def table { + text-indent: 0em; + padding: 0; + margin-left: -2ex; +} + +td.def { + padding-left: 2ex; +} + +td.def-doc *:first-child { + margin-top: 0em; +} + +/* Lists of @tags */ + +.at-tags { list-style-type: none; margin-left: -3ex; } +.at-tags li { padding-left: 3ex; text-indent: -3ex; } +.at-tags .at-tag { text-transform: capitalize } + +/* Lists of modules */ + +.modules { list-style-type: none; margin-left: -3ex; } +.modules li { padding-left: 3ex; text-indent: -3ex; margin-top: 5px } +.modules .synopsis { padding-left: 1ch; } + +/* Odig package index */ + +.packages { list-style-type: none; margin-left: -3ex; } +.packages li { padding-left: 3ex; text-indent: -3ex } +.packages li a.anchor { padding-right: 0.5ch; padding-left: 3ch; } +.packages .version { font-size: 10px; color: var(--by-name-version-color); } +.packages .synopsis { padding-left: 1ch } + +.by-name nav a { + text-transform: uppercase; + font-size: 18px; + margin-right: 1ex; + color: var(--by-name-nav-link-color,); + display: inline-block; +} + +.by-tag nav a { + margin-right: 1ex; + color: var(--by-name-nav-link-color); + display: inline-block; +} + +.by-tag ol { list-style-type: none; } +.by-tag ol.tags li { margin-left: 1ch; display: inline-block } +.by-tag td:first-child { text-transform: uppercase; } + +/* Odig package page */ + +.package nav { + display: inline; + font-size: 14px; + font-weight: normal; +} + +.package .version { + font-size: 14px; +} + +.package.info { + margin: 0; +} + +.package.info td:first-child { + font-style: italic; + padding-right: 2ex; +} + +.package.info ul { + list-style-type: none; + display: inline; + margin: 0; +} + +.package.info li { + display: inline-block; + margin: 0; + margin-right: 1ex; +} + +#info-authors li, #info-maintainers li { + display: block; +} + +/* Sidebar and TOC */ + +.odoc-toc:before { + display: block; + content: "Contents"; + text-transform: uppercase; + font-size: 1em; + margin: 1.414em 0 0.5em; + font-weight: 500; + color: var(--toc-before-color); + line-height: 1.2; +} + +.odoc-toc { + position: fixed; + top: 0px; + bottom: 0px; + left: 0px; + max-width: 30ex; + min-width: 26ex; + width: 20%; + background: var(--toc-background); + overflow: auto; + color: var(--toc-color); + padding-left: 2ex; + padding-right: 2ex; +} + +.odoc-toc ul li a { + font-family: "Fira Sans", sans-serif; + font-size: 0.95em; + color: var(--color); + font-weight: 400; + line-height: 1.6em; + display: block; +} + +.odoc-toc ul li a:hover { + box-shadow: none; + text-decoration: underline; +} + +/* First level titles */ + +.odoc-toc>ul>li>a { + font-weight: 500; +} + +.odoc-toc li ul { + margin: 0px; +} + +.odoc-toc ul { + list-style-type: none; +} + +.odoc-toc ul li { + margin: 0; +} +.odoc-toc>ul>li { + margin-bottom: 0.3em; +} + +.odoc-toc ul li li { + border-left: 1px solid var(--toc-list-border); + margin-left: 5px; + padding-left: 12px; +} + +/* Mobile adjustements. */ + +@media only screen and (max-width: 95ex) { + body.odoc { + margin: 2em; + } + .odoc-toc { + position: static; + width: auto; + min-width: unset; + max-width: unset; + border: none; + padding: 0.2em 1em; + border-radius: 5px; + margin-bottom: 2em; + } +} + +/* Print adjustements. */ + +@media print { + body { + color: black; + background: white; + } + body nav:first-child { + visibility: hidden; + } +} + +/* Syntax highlighting (based on github-gist) */ + +.hljs { + display: block; + background: var(--code-background); + padding: 0.5em; + color: var(--color); + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag { + color: #a71d5d; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: 500; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/*--------------------------------------------------------------------------- + Copyright (c) 2016 The odoc contributors + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + ---------------------------------------------------------------------------*/ diff --git a/doc/code/gensig/README.md b/docs/code/gensig/README.md similarity index 100% rename from doc/code/gensig/README.md rename to docs/code/gensig/README.md diff --git a/doc/code/gensig/ctask/README.md b/docs/code/gensig/ctask/README.md similarity index 100% rename from doc/code/gensig/ctask/README.md rename to docs/code/gensig/ctask/README.md diff --git a/doc/code/gensig/ctask/gensig.c b/docs/code/gensig/ctask/gensig.c similarity index 100% rename from doc/code/gensig/ctask/gensig.c rename to docs/code/gensig/ctask/gensig.c diff --git a/doc/code/gensig/systemc/README.md b/docs/code/gensig/systemc/README.md similarity index 100% rename from doc/code/gensig/systemc/README.md rename to docs/code/gensig/systemc/README.md diff --git a/doc/code/gensig/systemc/g.cpp b/docs/code/gensig/systemc/g.cpp similarity index 100% rename from doc/code/gensig/systemc/g.cpp rename to docs/code/gensig/systemc/g.cpp diff --git a/doc/code/gensig/systemc/g.h b/docs/code/gensig/systemc/g.h similarity index 100% rename from doc/code/gensig/systemc/g.h rename to docs/code/gensig/systemc/g.h diff --git a/doc/code/gensig/systemc/gensig.cpp b/docs/code/gensig/systemc/gensig.cpp similarity index 100% rename from doc/code/gensig/systemc/gensig.cpp rename to docs/code/gensig/systemc/gensig.cpp diff --git a/doc/code/gensig/systemc/gensig.h b/docs/code/gensig/systemc/gensig.h similarity index 100% rename from doc/code/gensig/systemc/gensig.h rename to docs/code/gensig/systemc/gensig.h diff --git a/doc/code/gensig/systemc/inp_E.cpp b/docs/code/gensig/systemc/inp_E.cpp similarity index 100% rename from doc/code/gensig/systemc/inp_E.cpp rename to docs/code/gensig/systemc/inp_E.cpp diff --git a/doc/code/gensig/systemc/inp_E.h b/docs/code/gensig/systemc/inp_E.h similarity index 100% rename from doc/code/gensig/systemc/inp_E.h rename to docs/code/gensig/systemc/inp_E.h diff --git a/doc/code/gensig/systemc/inp_H.cpp b/docs/code/gensig/systemc/inp_H.cpp similarity index 100% rename from doc/code/gensig/systemc/inp_H.cpp rename to docs/code/gensig/systemc/inp_H.cpp diff --git a/doc/code/gensig/systemc/inp_H.h b/docs/code/gensig/systemc/inp_H.h similarity index 100% rename from doc/code/gensig/systemc/inp_H.h rename to docs/code/gensig/systemc/inp_H.h diff --git a/doc/code/gensig/systemc/main.cpp b/docs/code/gensig/systemc/main.cpp similarity index 100% rename from doc/code/gensig/systemc/main.cpp rename to docs/code/gensig/systemc/main.cpp diff --git a/doc/code/gensig/vhdl/README.md b/docs/code/gensig/vhdl/README.md similarity index 100% rename from doc/code/gensig/vhdl/README.md rename to docs/code/gensig/vhdl/README.md diff --git a/doc/code/gensig/vhdl/g.vhd b/docs/code/gensig/vhdl/g.vhd similarity index 100% rename from doc/code/gensig/vhdl/g.vhd rename to docs/code/gensig/vhdl/g.vhd diff --git a/doc/code/gensig/vhdl/main_tb.vhd b/docs/code/gensig/vhdl/main_tb.vhd similarity index 100% rename from doc/code/gensig/vhdl/main_tb.vhd rename to docs/code/gensig/vhdl/main_tb.vhd diff --git a/doc/code/gensig/vhdl/main_top.vhd b/docs/code/gensig/vhdl/main_top.vhd similarity index 100% rename from doc/code/gensig/vhdl/main_top.vhd rename to docs/code/gensig/vhdl/main_top.vhd diff --git a/doc/figs/ctrmod8-chrono.png b/docs/figs/ctrmod8-chrono.png similarity index 100% rename from doc/figs/ctrmod8-chrono.png rename to docs/figs/ctrmod8-chrono.png diff --git a/doc/figs/ctrmod8-top.png b/docs/figs/ctrmod8-top.png similarity index 100% rename from doc/figs/ctrmod8-top.png rename to docs/figs/ctrmod8-top.png diff --git a/doc/figs/gensig-chrono.png b/docs/figs/gensig-chrono.png similarity index 100% rename from doc/figs/gensig-chrono.png rename to docs/figs/gensig-chrono.png diff --git a/doc/figs/gensig-model-moore.png b/docs/figs/gensig-model-moore.png similarity index 100% rename from doc/figs/gensig-model-moore.png rename to docs/figs/gensig-model-moore.png diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..728f6c54 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,19 @@ + + + + index + + + + + +

+
+

OCaml package documentation

+
    +
  1. rfsm
  2. +
+
+
+ + \ No newline at end of file diff --git a/docs/ref_manual/Makefile b/docs/ref_manual/Makefile new file mode 100644 index 00000000..c6a3b5fc --- /dev/null +++ b/docs/ref_manual/Makefile @@ -0,0 +1,33 @@ +DOC=rfsm_rm + +SRCS= bnf.tex \ + options.tex \ + semantics.tex \ + rfsm_rm.tex +GEN_SRCS = rfsmc-options.tex # grammar.tex + +all: $(DOC).pdf + +$(DOC).pdf: $(SRCS) $(GEN_SRCS) + pdflatex $(DOC).tex > pdflatex.log + pdflatex $(DOC).tex > pdflatex.log + +clean: + \rm -f *.dvi *.log *.rel *.aux *.toc + +.PHONY: grammar.tex + +gen_tex_option = \ + awk -F ";" '{ printf("%s & %s\\\\\n", $$3, $$6) }' < $(1) | sed 's/_/\\_/g' > $(2) + +rfsmc-options.tex: ../../src/host/lib/options_spec.txt + $(call gen_tex_option,$<,$@) + +# grammar.tex: ../../src/host/lib/host_parser.mly +# @read -p "** About to regenerate ./grammar.tex. Are you sure ? " r;\ +# if [ $$r = "yes" ]; then (cp ./grammar.tex grammar.sav.tex; obelisk latex -i -prefix rfsm -o grammar.tex -package grammar-defns $<; echo "** Done. Now diff-edit grammar.sav.tex and grammar.tex (resp. sav/grammar-defns.sty and grammar-defns.sty) to integrate changes"); fi + +realclean: clobber + +clobber: clean + \rm -f $(DOC).pdf *~ diff --git a/docs/ref_manual/bcprules.sty b/docs/ref_manual/bcprules.sty new file mode 100644 index 00000000..3c0279fd --- /dev/null +++ b/docs/ref_manual/bcprules.sty @@ -0,0 +1,317 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% %%% +%%% BCP's latex tricks for typesetting inference rules %%% +%%% %%% +%%% Version 1.4 %%% +%%% %%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%% +%%% This package supports two styles of rules: named and unnamed. +%%% Unnamed rules are centered on the page. Named rules are set so +%%% that a series of them will have the rules centered in a vertical +%%% column taking most of the page and the labels right-justified. +%%% When a label would overlap its rule, the label is moved down. +%%% +%%% The width of the column of labels can be varied using a command of the +%%% form +%%% +%%% \typicallabel{T-Arrow-I} +%%% +%%% The default setting is: +%%% +%%% \typicallabel{} +%%% +%%% In other words, the column of rules takes up the whole width of +%%% the page: rules are centered on the centerline of the text, and no +%%% extra space is left for the labels. +%%% +%%% The minimum distance between a rule and its label can be altered by a +%%% command of the form +%%% +%%% \setlength{\labelminsep}{0.5em} +%%% +%%% (This is the default value.) +%%% +%%% Examples: +%%% +%%% An axiom with a label in the right-hand column: +%%% +%%% \infax[The name]{x - x = 0} +%%% +%%% An inference rule with a name: +%%% +%%% \infrule[Another name] +%%% {\mbox{false}} +%%% {x - x = 1} +%%% +%%% A rule with multiple premises on the same line: +%%% +%%% \infrule[Wide premises] +%%% {x > 0 \andalso y > 0 \andalso z > 0} +%%% {x + y + z > 0} +%%% +%%% A rule with several lines of premises: +%%% +%%% \infrule[Long premises] +%%% {x > 0 \\ y > 0 \\ z > 0} +%%% {x + y + z > 0} +%%% +%%% A rule without a name, but centered on the same vertical line as rules +%%% and axioms with names: +%%% +%%% \infrule[] +%%% {x - y = 5} +%%% {y - x = -5} +%%% +%%% A rule without a name, centered on the page: +%%% +%%% \infrule +%%% {x = 5} +%%% {x - 1 > 0} +%%% +%%% +%%% Setting the flag \indexrulestrue causes an index entry to be +%%% generated for each named rule. +%%% +%%% Setting the flag \suppressrulenamestrue causes the names of all rules +%%% to be left blank +%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%% A switch controlling the sizes of rule names +\newif\ifsmallrulenames \smallrulenamesfalse +\newcommand{\smallrulenames}{\smallrulenamestrue} +\newcommand{\choosernsize}[2]{\ifsmallrulenames#1\else#2\fi} + +%%% The font for setting inference rule names +\newcommand{\rn}[1]{% + \ifmmode + \mathchoice + {\mbox{\choosernsize{\small}{}\sc #1}} + {\mbox{\choosernsize{\small}{}\sc #1}} + {\mbox{\choosernsize{\tiny}{\small}\sc #1}} + {\mbox{\choosernsize{\tiny}{\tiny}\uppercase{#1}}}% + \else + \hbox{\choosernsize{\small}{}\sc #1}% + \fi} + +\newif\ifsuppressrulenames +\suppressrulenamesfalse + +\newif\ifbcprulessavespace +\bcprulessavespacefalse + +\newif\ifbcprulestwocol +\bcprulestwocolfalse + +%%% How to display a rule's name to the right of the rule +\newcommand{\inflabel}[1]{% + \ifsuppressrulenames\else + \def\lab{#1}% + \ifx\lab\empty + \relax + \else + (\rn{\lab})% + \fi\fi +} + +%%% Amount of extra space to add before and after a rule +\newlength{\afterruleskip} +\setlength{\afterruleskip}{\bigskipamount} + +%%% Minimum distance between a rule and its label +\newlength{\labelminsep} +\setlength{\labelminsep}{0.2em} + +%%% The ``typical'' width of the column of labels: labels are allowed +%%% to project further to the left if necessary; the rules will be +%%% centered in a column of width \linewidth - \labelcolwidth +\newdimen\labelcolwidth + +%%% Set the label column width by providing a ``typical'' label -- +%%% i.e. a label of average length +\newcommand{\typicallabel}[1]{ + \setbox \@tempboxa \hbox{\inflabel{#1}} + \labelcolwidth \wd\@tempboxa + } +\typicallabel{} + +%%% A flag controlling generation of index entries +\newif \ifindexrules \indexrulesfalse + +%%% Allocate some temporary registers +\newbox\@labelbox +\newbox\rulebox +\newdimen\ruledim +\newdimen\labeldim + +%%% Put a rule and its label on the same line if this can be done +%%% without overlapping them; otherwise, put the label on the next +%%% line. Put a small amount of vertical space above and below. +\newcommand{\layoutruleverbose}[2]% + {\unvbox\voidb@x % to make sure we're in vmode + \addvspace{\afterruleskip}% + + \setbox \rulebox \hbox{$\displaystyle #2$} + + \setbox \@labelbox \hbox{#1} + \ruledim \wd \rulebox + \labeldim \wd \@labelbox + + %%% Will it all fit comfortably on one line? + \@tempdima \linewidth + \advance \@tempdima -\labelcolwidth + \ifdim \@tempdima < \ruledim + \@tempdima \ruledim + \else + \advance \@tempdima by \ruledim + \divide \@tempdima by 2 + \fi + \advance \@tempdima by \labelminsep + \advance \@tempdima by \labeldim + \ifdim \@tempdima < \linewidth + % Yes, everything fits on a line + \@tempdima \linewidth + \advance \@tempdima -\labelcolwidth + \hbox to \linewidth{% + \hbox to \@tempdima{% + \hfil + \box\rulebox + \hfil}% + \hfill + \hbox to 0pt{\hss\box\@labelbox}% + }% + \else + % + % Will it all fit _UN_comfortably on one line? + \@tempdima 0pt + \advance \@tempdima by \ruledim + \advance \@tempdima by \labelminsep + \advance \@tempdima by \labeldim + \ifdim \@tempdima < \linewidth + % Yes, everything fits, but not centered + \hbox to \linewidth{% + \hfil + \box\rulebox + \hskip \labelminsep + \box\@labelbox}% + \else + % + % Better put the label on the next line + \@tempdima \linewidth + \advance \@tempdima -\labelcolwidth + \hbox to \linewidth{% + \hbox to \@tempdima{% + \hfil + \box\rulebox + \hfil} + \hfil}% + \penalty10000 + \hbox to \linewidth{% + \hfil + \box\@labelbox}% + \fi\fi + + \addvspace{\afterruleskip}% + \@doendpe % use LaTeX's trick of inhibiting paragraph indent for + % text immediately following a rule + \ignorespaces + } + +% Simplified form for when there is no label +\newcommand{\layoutrulenolabel}[1]% + {\unvbox\voidb@x % to make sure we're in vmode + \addvspace{\afterruleskip}% + + \setbox \rulebox \hbox{$\displaystyle #1$} + + \@tempdima \linewidth + \advance \@tempdima -\labelcolwidth + \hbox to \@tempdima{% + \hfil + \box\rulebox + \hfil}% + + \addvspace{\afterruleskip}% + \@doendpe % use LaTeX's trick of inhibiting paragraph indent for + % text immediately following a rule + \ignorespaces + } + +% Alternate form, for when we need to save space +%\newcommand{\layoutruleterse}[2]% +% {\noindent +% \parbox[b]{0.5\linewidth}{\layoutruleverbose{#1}{#2}}} + +\newcommand{\layoutruleterse}[2]% + {\setbox \rulebox \hbox{$\displaystyle #2$} + \noindent + \parbox[b]{0.5\linewidth} + {\vspace*{0.4em} \hfill\box\rulebox\hfill~} + } + +%%% Select low-level layout driver based on \bcprulessavespace flag +\newcommand{\layoutrule}[2]{% + \ifbcprulessavespace + \layoutruleterse{#1}{#2} + \else + \layoutruleverbose{#1}{#2} + \fi +} + +%%% Highlighting for new versions of rules +\newif\ifnewrule \newrulefalse +\newcommand{\setrulebody}[1]{% + \ifnewrule + \@ifundefined{HIGHLIGHT}{% + \fbox{\ensuremath{#1}}% + }{% + \HIGHLIGHT{#1}}% + \else + #1 + \fi +} + +%%% Commands for setting axioms and rules +\newcommand{\typesetax}[1]{% + \setrulebody{% + \begin{array}{@{}c@{}}#1\end{array}}} +\newcommand{\typesetrule}[2]{% + \setrulebody{% + \frac{\begin{array}{@{}c@{}}#1\end{array}}% + {\begin{array}{@{}c@{}}#2\end{array}}}} + +%%% Indexing +\newcommand{\ruleindexprefix}[1]{% + \gdef\ruleindexprefixstring{#1}} +\ruleindexprefix{} +\newcommand{\maybeindex}[1]{% + \ifindexrules + \index{\ruleindexprefixstring#1@\rn{#1}}% + \fi} + +%%% Setting axioms, with or without names +\def\infax{\@ifnextchar[{\@infaxy}{\@infaxx}} +\def\@infaxx#1{% + \ifbcprulessavespace $\typesetax{#1}$% + \else \layoutrulenolabel{\typesetax{#1}}% + \fi\newrulefalse\ignorespaces} +\def\@infaxy[#1]{\maybeindex{#1}\@infax{\inflabel{#1}}} +\def\@infax#1#2{\layoutrule{#1}{\typesetax{#2}}\ignorespaces} + +%%% Setting rules, with or without names +\def\infrule{\@ifnextchar[{\@infruley}{\@infrulex}} +\def\@infrulex#1#2{% + \ifbcprulessavespace $\typesetrule{#1}{#2}$% + \else \layoutrulenolabel{\typesetrule{#1}{#2}}% + \fi\newrulefalse\ignorespaces} +\def\@infruley[#1]{\maybeindex{#1}\@infrule{\inflabel{#1}}} +\def\@infrule#1#2#3{\layoutrule{#1}{\typesetrule{#2}{#3}}\ignorespaces} + +%%% Miscellaneous helpful definitions +\newcommand{\andalso}{\quad\quad} + +% Abbreviations +\newcommand{\infabbrev}[2]{\infax{#1 \quad\eqdef\quad #2}} + diff --git a/docs/ref_manual/bnf.tex b/docs/ref_manual/bnf.tex new file mode 100644 index 00000000..d3a360ff --- /dev/null +++ b/docs/ref_manual/bnf.tex @@ -0,0 +1,28 @@ +\chapter{ Formal syntax of RFSM programs} +\label{cha:bnf} + +This appendix gives a BNF definition of the concrete syntax RFSM programs. +As stated in the introduction, this syntax is that of the so-called \emph{standard} RFSM language. +Variant languages will essentially differ in the definition of the +$\rfsmtypedecl*{}$, +$\rfsmtypeexpr*{}$, +$\rfsmexpr*{}$, +$\rfsmconstant*{}$, +and $\rfsmconst*{}$ +syntactical categories. + +\medskip +The meta-syntax is conventional. Keywords are written in \textbf{boldface}. Non-terminals are +enclosed in angle brackets ({\tt <} \ldots {\tt >}). Vertical bars ({\tt |}) indicate +alternatives. Constructs enclosed in non-bold brackets ({\tt [} \ldots {\tt ]}) are optional. +The notation $E^*$ (resp $E^+$) means zero (resp one) or more repetitions of $E$, separated by spaces. +The notation $E^*_x$ (resp $E^+_x$) means zero (resp one) or more repetitions of $E$, separated by +symbol $x$. Terminals \verb|lid| and \verb|uid| respectively designate identifiers +starting with a lowercase and uppercase letter. + +\include{grammar} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "rfsm" +%%% End: diff --git a/docs/ref_manual/dune b/docs/ref_manual/dune new file mode 100644 index 00000000..22502f9e --- /dev/null +++ b/docs/ref_manual/dune @@ -0,0 +1,3 @@ +(install + (files rfsm_rm.pdf) + (section doc)) diff --git a/docs/ref_manual/grammar-defns.sty b/docs/ref_manual/grammar-defns.sty new file mode 100644 index 00000000..64196e57 --- /dev/null +++ b/docs/ref_manual/grammar-defns.sty @@ -0,0 +1,299 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{grammar-defns} + +\RequirePackage{suffix} +\RequirePackage{longtable} +\RequirePackage{tabu} + +\newenvironment{rfsmgrammar}{ + \begin{trivlist} + \item[] + \begin{longtabu}{r@{}c@{}X@{}} +}{ + \end{longtabu} + \end{trivlist} +} + +\newcommand\rfsmgramsp{\quad} +\newcommand\rfsmgramdef{$\rfsmgramsp::=\rfsmgramsp$} +\newcommand\rfsmgrambar{$\rfsmgramsp|\rfsmgramsp$} +\newcommand\rfsmgrameps{\ensuremath{\epsilon}} +\newcommand\rfsmgramnonterm[1]{\ensuremath{\langle\textnormal{#1}\rangle}} +\newcommand\rfsmgramfunc[1]{\rfsmgramnonterm{#1}} +\newcommand\rfsmgramterm[1]{#1} + +\newcommand\rfsmARROW{\Verb|\textbf{->}|} +\newcommand\rfsmBAR{\Verb+\textbf{|}+} +\newcommand\rfsmEMARK{\Verb+\textbf{!}+} +\newcommand\rfsmCHAR{\textbf{char}} +\newcommand\rfsmCOLEQ{\Verb|\textbf{:=}|} +\newcommand\rfsmCOLON{\Verb|\textbf{:}|} +\newcommand\rfsmCOLONCOLON{\Verb|\textbf{::}|} +\newcommand\rfsmCOMMA{\textbf{,}} +\newcommand\rfsmCONSTANT{\textbf{constant}} +\newcommand\rfsmDIV{\Verb|\textbf{/}|} +\newcommand\rfsmDOT{\textbf{.}} +\newcommand\rfsmENUM{\textbf{enum}} +\newcommand\rfsmEOF{} +\newcommand\rfsmEQUAL{\textbf{=}} +\newcommand\rfsmFDIV{\Verb|\textbf{/.}|} +\newcommand\rfsmFLOAT{\textbf{float}} +\newcommand\rfsmBOOL{\textbf{bool}} +\newcommand\rfsmFMINUS{\Verb|\textbf{-.}|} +\newcommand\rfsmFPLUS{\Verb|\textbf{+.}|} +\newcommand\rfsmFSM{\textbf{fsm}} +\newcommand\rfsmFTIMES{\Verb|\textbf{*.}|} +\newcommand\rfsmFUNCTION{\textbf{function}} +\newcommand\rfsmGT{\Verb|\textbf{>}|} +\newcommand\rfsmGTE{\Verb|\textbf{>=}|} +\newcommand\rfsmIN{\textbf{in}} +\newcommand\rfsmINOUT{\textbf{inout}} +\newcommand\rfsmINPUT{\textbf{input}} +\newcommand\rfsmINT{\textbf{int}} +\newcommand\rfsmITRANS{\textbf{itrans}} +\newcommand\rfsmLAND{\Verb|\textbf{\&}|} +\newcommand\rfsmLBRACE{\Verb|\textbf{\{}|} +\newcommand\rfsmLBRACKET{\Verb|\textbf{[}|} +\newcommand\rfsmLID{lid} +\newcommand\rfsmLOR{\Verb|\textbf{||}|} +\newcommand\rfsmLPAREN{\Verb|\textbf{(}|} +\newcommand\rfsmLT{\Verb|\textbf{<}|} +\newcommand\rfsmLTE{\Verb|\textbf{<=}|} +\newcommand\rfsmLXOR{\Verb|\textbf{\^}|} +\newcommand\rfsmMINUS{\Verb|\textbf{-}|} +\newcommand\rfsmMOD{\Verb|\textbf{\%}|} +\newcommand\rfsmMODEL{\textbf{model}} +\newcommand\rfsmNOTEQUAL{\Verb|\textbf{!=}|} +\newcommand\rfsmOUT{\textbf{out}} +\newcommand\rfsmOUTPUT{\textbf{output}} +\newcommand\rfsmPERIODIC{\textbf{periodic}} +\newcommand\rfsmPLUS{\Verb|\textbf{+}|} +\newcommand\rfsmQMARK{\Verb|\textbf{?}|} +\newcommand\rfsmRBRACE{\Verb|\textbf{\}}|} +\newcommand\rfsmRBRACKET{\Verb|\textbf{]}|} +\newcommand\rfsmRECORD{\textbf{record}} +\newcommand\rfsmRETURN{\textbf{return}} +\newcommand\rfsmRPAREN{\Verb|\textbf{)}|} +\newcommand\rfsmSEMICOLON{\Verb|\textbf{;}|} +\newcommand\rfsmSHARED{\textbf{shared}} +\newcommand\rfsmSHL{\Verb|\textbf{<<}|} +\newcommand\rfsmSHR{\Verb|\textbf{>>}|} +\newcommand\rfsmSPORADIC{\textbf{sporadic}} +\newcommand\rfsmSTATES{\textbf{states}} +\newcommand\rfsmWHERE{\textbf{where}} +\newcommand\rfsmWHEN{\textbf{when}} +\newcommand\rfsmWITH{\textbf{with}} +\newcommand\rfsmON{\textbf{on}} +\newcommand\rfsmAND{\textbf{and}} +\newcommand\rfsmTIMES{\Verb|\textbf{*}|} +\newcommand\rfsmTRANS{\textbf{trans}} +\newcommand\rfsmTYARRAY{\textbf{array}} +\newcommand\rfsmTYBOOL{\textbf{bool}} +\newcommand\rfsmTYCHAR{\textbf{char}} +\newcommand\rfsmTYEVENT{\textbf{event}} +\newcommand\rfsmTYFLOAT{\textbf{float}} +\newcommand\rfsmTYINT{\textbf{int}} +\newcommand\rfsmTYPE{\textbf{type}} +\newcommand\rfsmUID{uid} +\newcommand\rfsmVALUECHANGES{\textbf{value\_changes}} +\newcommand\rfsmVARS{\textbf{vars}} +\newcommand\rfsmaction{action} +\newcommand\rfsmactions{actions} +\newcommand\rfsmarrayconst{array\_const} +\newcommand\rfsmarraysize{array\_size} +\newcommand\rfsmbraced[1]{\rfsmLBRACE\ #1\ \rfsmRBRACE} +\newcommand\rfsmcharconst{char\_const} +\newcommand\rfsmcondition{condition} +\newcommand\rfsmguards{guards} +\newcommand\rfsmconst{const} +\newcommand\rfsmstimconst{stim\_const} +\newcommand\rfsmconstant{constant} +\newcommand\rfsmcstdecl{cst\_decl} +\newcommand\rfsmdecl{decl} +\newcommand\rfsmexpr{expr} +\newcommand\rfsmfarg{farg} +\newcommand\rfsmfbody{fbody} +\newcommand\rfsmfloatconst{float\_const} +\newcommand\rfsmfndecl{fn\_decl} +\newcommand\rfsmfres{fres} +\newcommand\rfsmfsminst{fsm\_inst} +\newcommand\rfsmfsmmodel{fsm\_model} +\newcommand\rfsmglobal{global} +\newcommand\rfsmid{id} +\newcommand\rfsmstate{state} +\newcommand\rfsmoutpval{outp\_val} +\newcommand\rfsmparamvalue{param\_value} +\newcommand\rfsmintannot{int\_annot} +\newcommand\rfsmintconst{int\_const} +\newcommand\rfsmio{io} +\newcommand\rfsmiodesc{io\_desc} +\newcommand\rfsmitransition{itransition} +\newcommand\rfsmlhs{lhs} +\newcommand\rfsmmylist{my\_list} +\newcommand\rfsmmynonemptylist{my\_nonempty\_list} +\newcommand\rfsmmyseparatedlist{my\_separated\_list} +\newcommand\rfsmmyseparatednonemptylist{my\_separated\_nonempty\_list} +\newcommand\rfsmoptinstparams{opt\_inst\_params} +\newcommand\rfsmoptional{optional} +\newcommand\rfsmparam{param} +\newcommand\rfsmparams{params} +\newcommand\rfsmparen[1]{\rfsmLPAREN\ #1\ \rfsmRPAREN} +\newcommand\rfsmprio{prio} +\newcommand\rfsmprogram{program} +\newcommand\rfsmrecordconst{record\_const} +\newcommand\rfsmrecordfield{record\_field} +\newcommand\rfsmrecordfieldconst{record\_field\_const} +\newcommand\rfsmscalarconst{scalar\_const} +\newcommand\rfsmsimpleexpr{simple\_expr} +\newcommand\rfsmstimuli{stimuli} +\newcommand\rfsmsubtractive{subtractive} +\newcommand\rfsmtransition{transition} +\newcommand\rfsmrulepfx{rule\_prefix} +\newcommand\rfsmtypedecl{type\_decl} +\newcommand\rfsmtypeexpr{type\_expr} +\newcommand\rfsmtypesize{type\_size} +\newcommand\rfsmvaluechange{value\_change} +\newcommand\rfsmvar{var} +\newcommand\rfsmvars{vars} +\WithSuffix\newcommand\rfsmARROW*{\rfsmgramterm{\rfsmARROW}} +\WithSuffix\newcommand\rfsmBAR*{\rfsmgramterm{\rfsmBAR}} +\WithSuffix\newcommand\rfsmEMARK*{\rfsmgramterm{\rfsmEMARK}} +\WithSuffix\newcommand\rfsmWHEN*{\rfsmgramterm{\rfsmWHEN}} +\WithSuffix\newcommand\rfsmWITH*{\rfsmgramterm{\rfsmWITH}} +\WithSuffix\newcommand\rfsmON*{\rfsmgramterm{\rfsmON}} +\WithSuffix\newcommand\rfsmCHAR*{\rfsmgramterm{\rfsmCHAR}} +\WithSuffix\newcommand\rfsmCOLEQ*{\rfsmgramterm{\rfsmCOLEQ}} +\WithSuffix\newcommand\rfsmCOLON*{\rfsmgramterm{\rfsmCOLON}} +\WithSuffix\newcommand\rfsmCOLONCOLON*{\rfsmgramterm{\rfsmCOLONCOLON}} +\WithSuffix\newcommand\rfsmCOMMA*{\rfsmgramterm{\rfsmCOMMA}} +\WithSuffix\newcommand\rfsmCONSTANT*{\rfsmgramterm{\rfsmCONSTANT}} +\WithSuffix\newcommand\rfsmDIV*{\rfsmgramterm{\rfsmDIV}} +\WithSuffix\newcommand\rfsmDOT*{\rfsmgramterm{\rfsmDOT}} +\WithSuffix\newcommand\rfsmENUM*{\rfsmgramterm{\rfsmENUM}} +\WithSuffix\newcommand\rfsmEOF*{\rfsmgramterm{\rfsmEOF}} +\WithSuffix\newcommand\rfsmEQUAL*{\rfsmgramterm{\rfsmEQUAL}} +\WithSuffix\newcommand\rfsmFDIV*{\rfsmgramterm{\rfsmFDIV}} +\WithSuffix\newcommand\rfsmFLOAT*{\rfsmgramterm{\rfsmFLOAT}} +\WithSuffix\newcommand\rfsmBOOL*{\rfsmgramterm{\rfsmBOOL}} +\WithSuffix\newcommand\rfsmFMINUS*{\rfsmgramterm{\rfsmFMINUS}} +\WithSuffix\newcommand\rfsmFPLUS*{\rfsmgramterm{\rfsmFPLUS}} +\WithSuffix\newcommand\rfsmFSM*{\rfsmgramterm{\rfsmFSM}} +\WithSuffix\newcommand\rfsmFTIMES*{\rfsmgramterm{\rfsmFTIMES}} +\WithSuffix\newcommand\rfsmFUNCTION*{\rfsmgramterm{\rfsmFUNCTION}} +\WithSuffix\newcommand\rfsmGT*{\rfsmgramterm{\rfsmGT}} +\WithSuffix\newcommand\rfsmGTE*{\rfsmgramterm{\rfsmGTE}} +\WithSuffix\newcommand\rfsmIN*{\rfsmgramterm{\rfsmIN}} +\WithSuffix\newcommand\rfsmINOUT*{\rfsmgramterm{\rfsmINOUT}} +\WithSuffix\newcommand\rfsmINPUT*{\rfsmgramterm{\rfsmINPUT}} +\WithSuffix\newcommand\rfsmINT*{\rfsmgramterm{\rfsmINT}} +\WithSuffix\newcommand\rfsmITRANS*{\rfsmgramterm{\rfsmITRANS}} +\WithSuffix\newcommand\rfsmLAND*{\rfsmgramterm{\rfsmLAND}} +\WithSuffix\newcommand\rfsmLBRACE*{\rfsmgramterm{\rfsmLBRACE}} +\WithSuffix\newcommand\rfsmLBRACKET*{\rfsmgramterm{\rfsmLBRACKET}} +\WithSuffix\newcommand\rfsmLID*{\rfsmgramterm{\rfsmLID}} +\WithSuffix\newcommand\rfsmLOR*{\rfsmgramterm{\rfsmLOR}} +\WithSuffix\newcommand\rfsmLPAREN*{\rfsmgramterm{\rfsmLPAREN}} +\WithSuffix\newcommand\rfsmLT*{\rfsmgramterm{\rfsmLT}} +\WithSuffix\newcommand\rfsmLTE*{\rfsmgramterm{\rfsmLTE}} +\WithSuffix\newcommand\rfsmLXOR*{\rfsmgramterm{\rfsmLXOR}} +\WithSuffix\newcommand\rfsmMINUS*{\rfsmgramterm{\rfsmMINUS}} +\WithSuffix\newcommand\rfsmMOD*{\rfsmgramterm{\rfsmMOD}} +\WithSuffix\newcommand\rfsmMODEL*{\rfsmgramterm{\rfsmMODEL}} +\WithSuffix\newcommand\rfsmNOTEQUAL*{\rfsmgramterm{\rfsmNOTEQUAL}} +\WithSuffix\newcommand\rfsmOUT*{\rfsmgramterm{\rfsmOUT}} +\WithSuffix\newcommand\rfsmOUTPUT*{\rfsmgramterm{\rfsmOUTPUT}} +\WithSuffix\newcommand\rfsmPERIODIC*{\rfsmgramterm{\rfsmPERIODIC}} +\WithSuffix\newcommand\rfsmPLUS*{\rfsmgramterm{\rfsmPLUS}} +\WithSuffix\newcommand\rfsmQMARK*{\rfsmgramterm{\rfsmQMARK}} +\WithSuffix\newcommand\rfsmRBRACE*{\rfsmgramterm{\rfsmRBRACE}} +\WithSuffix\newcommand\rfsmRBRACKET*{\rfsmgramterm{\rfsmRBRACKET}} +\WithSuffix\newcommand\rfsmRECORD*{\rfsmgramterm{\rfsmRECORD}} +\WithSuffix\newcommand\rfsmRETURN*{\rfsmgramterm{\rfsmRETURN}} +\WithSuffix\newcommand\rfsmRPAREN*{\rfsmgramterm{\rfsmRPAREN}} +\WithSuffix\newcommand\rfsmSEMICOLON*{\rfsmgramterm{\rfsmSEMICOLON}} +\WithSuffix\newcommand\rfsmSHARED*{\rfsmgramterm{\rfsmSHARED}} +\WithSuffix\newcommand\rfsmSHL*{\rfsmgramterm{\rfsmSHL}} +\WithSuffix\newcommand\rfsmSHR*{\rfsmgramterm{\rfsmSHR}} +\WithSuffix\newcommand\rfsmSPORADIC*{\rfsmgramterm{\rfsmSPORADIC}} +\WithSuffix\newcommand\rfsmSTATES*{\rfsmgramterm{\rfsmSTATES}} +\WithSuffix\newcommand\rfsmTIMES*{\rfsmgramterm{\rfsmTIMES}} +\WithSuffix\newcommand\rfsmTRANS*{\rfsmgramterm{\rfsmTRANS}} +\WithSuffix\newcommand\rfsmTYARRAY*{\rfsmgramterm{\rfsmTYARRAY}} +\WithSuffix\newcommand\rfsmTYBOOL*{\rfsmgramterm{\rfsmTYBOOL}} +\WithSuffix\newcommand\rfsmTYCHAR*{\rfsmgramterm{\rfsmTYCHAR}} +\WithSuffix\newcommand\rfsmTYEVENT*{\rfsmgramterm{\rfsmTYEVENT}} +\WithSuffix\newcommand\rfsmTYFLOAT*{\rfsmgramterm{\rfsmTYFLOAT}} +\WithSuffix\newcommand\rfsmTYINT*{\rfsmgramterm{\rfsmTYINT}} +\WithSuffix\newcommand\rfsmTYPE*{\rfsmgramterm{\rfsmTYPE}} +\WithSuffix\newcommand\rfsmUID*{\rfsmgramterm{\rfsmUID}} +\WithSuffix\newcommand\rfsmVALUECHANGES*{\rfsmgramterm{\rfsmVALUECHANGES}} +\WithSuffix\newcommand\rfsmVARS*{\rfsmgramterm{\rfsmVARS}} +\WithSuffix\newcommand\rfsmaction*{\rfsmgramnonterm{\rfsmaction}} +\WithSuffix\newcommand\rfsmactions*{\rfsmgramnonterm{\rfsmactions}} +\WithSuffix\newcommand\rfsmarrayconst*{\rfsmgramnonterm{\rfsmarrayconst}} +\WithSuffix\newcommand\rfsmarraysize*{\rfsmgramnonterm{\rfsmarraysize}} +\WithSuffix\newcommand\rfsmcharconst*{\rfsmgramnonterm{\rfsmcharconst}} +\WithSuffix\newcommand\rfsmcondition*{\rfsmgramnonterm{\rfsmcondition}} +\WithSuffix\newcommand\rfsmguards*{\rfsmgramnonterm{\rfsmguards}} +\WithSuffix\newcommand\rfsmconst*{\rfsmgramnonterm{\rfsmconst}} +\WithSuffix\newcommand\rfsmstimconst*{\rfsmgramnonterm{\rfsmstimconst}} +\WithSuffix\newcommand\rfsmscalarconst*{\rfsmgramnonterm{\rfsmscalarconst}} +\WithSuffix\newcommand\rfsmconstant*{\rfsmgramnonterm{\rfsmconstant}} +\WithSuffix\newcommand\rfsmcstdecl*{\rfsmgramnonterm{\rfsmcstdecl}} +\WithSuffix\newcommand\rfsmdecl*{\rfsmgramnonterm{\rfsmdecl}} +\WithSuffix\newcommand\rfsmexpr*{\rfsmgramnonterm{\rfsmexpr}} +\WithSuffix\newcommand\rfsmfarg*{\rfsmgramnonterm{\rfsmfarg}} +\WithSuffix\newcommand\rfsmfbody*{\rfsmgramnonterm{\rfsmfbody}} +\WithSuffix\newcommand\rfsmfloatconst*{\rfsmgramnonterm{\rfsmfloatconst}} +\WithSuffix\newcommand\rfsmfndecl*{\rfsmgramnonterm{\rfsmfndecl}} +\WithSuffix\newcommand\rfsmfres*{\rfsmgramnonterm{\rfsmfres}} +\WithSuffix\newcommand\rfsmfsminst*{\rfsmgramnonterm{\rfsmfsminst}} +\WithSuffix\newcommand\rfsmfsmmodel*{\rfsmgramnonterm{\rfsmfsmmodel}} +\WithSuffix\newcommand\rfsmglobal*{\rfsmgramnonterm{\rfsmglobal}} +\WithSuffix\newcommand\rfsmid*{\rfsmgramnonterm{\rfsmid}} +\WithSuffix\newcommand\rfsmstate*{\rfsmgramnonterm{\rfsmstate}} +\WithSuffix\newcommand\rfsmoutpval*{\rfsmgramnonterm{\rfsmoutpval}} +\WithSuffix\newcommand\rfsmparamvalue*{\rfsmgramnonterm{\rfsmparamvalue}} +\WithSuffix\newcommand\rfsmintannot*{\rfsmgramnonterm{\rfsmintannot}} +\WithSuffix\newcommand\rfsmintconst*{\rfsmgramnonterm{\rfsmintconst}} +\WithSuffix\newcommand\rfsmio*{\rfsmgramnonterm{\rfsmio}} +\WithSuffix\newcommand\rfsmiodesc*{\rfsmgramnonterm{\rfsmiodesc}} +\WithSuffix\newcommand\rfsmitransition*{\rfsmgramnonterm{\rfsmitransition}} +\WithSuffix\newcommand\rfsmlhs*{\rfsmgramnonterm{\rfsmlhs}} +\WithSuffix\newcommand\rfsmoptinstparams*{\rfsmgramnonterm{\rfsmoptinstparams}} +\WithSuffix\newcommand\rfsmparam*{\rfsmgramnonterm{\rfsmparam}} +\WithSuffix\newcommand\rfsmparams*{\rfsmgramnonterm{\rfsmparams}} +\WithSuffix\newcommand\rfsmprio*{\rfsmgramnonterm{\rfsmprio}} +\WithSuffix\newcommand\rfsmprogram*{\rfsmgramnonterm{\rfsmprogram}} +\WithSuffix\newcommand\rfsmrecordconst*{\rfsmgramnonterm{\rfsmrecordconst}} +\WithSuffix\newcommand\rfsmrecordfield*{\rfsmgramnonterm{\rfsmrecordfield}} +\WithSuffix\newcommand\rfsmrecordfieldconst*{\rfsmgramnonterm{\rfsmrecordfieldconst}} +\WithSuffix\newcommand\rfsmsimpleexpr*{\rfsmgramnonterm{\rfsmsimpleexpr}} +\WithSuffix\newcommand\rfsmstimuli*{\rfsmgramnonterm{\rfsmstimuli}} +\WithSuffix\newcommand\rfsmsubtractive*{\rfsmgramnonterm{\rfsmsubtractive}} +\WithSuffix\newcommand\rfsmrulepfx*{\rfsmgramnonterm{\rfsmrulepfx}} +\WithSuffix\newcommand\rfsmtransition*{\rfsmgramnonterm{\rfsmtransition}} +\WithSuffix\newcommand\rfsmtypedecl*{\rfsmgramnonterm{\rfsmtypedecl}} +\WithSuffix\newcommand\rfsmtypeexpr*{\rfsmgramnonterm{\rfsmtypeexpr}} +\WithSuffix\newcommand\rfsmtypesize*{\rfsmgramnonterm{\rfsmtypesize}} +\WithSuffix\newcommand\rfsmvaluechange*{\rfsmgramnonterm{\rfsmvaluechange}} +\WithSuffix\newcommand\rfsmvar*{\rfsmgramnonterm{\rfsmvar}} +\WithSuffix\newcommand\rfsmvars*{\rfsmgramnonterm{\rfsmvars}} +\WithSuffix\newcommand\rfsmbraced*[1]{\rfsmbraced{#1}} +\WithSuffix\newcommand\rfsmmylist*{\rfsmgramfunc{\rfsmmylist}} +\WithSuffix\newcommand\rfsmmynonemptylist*{\rfsmgramfunc{\rfsmmynonemptylist}} +\WithSuffix\newcommand\rfsmmyseparatedlist*{\rfsmgramfunc{\rfsmmyseparatedlist}} +\WithSuffix\newcommand\rfsmmyseparatednonemptylist*{\rfsmgramfunc{\rfsmmyseparatednonemptylist}} +\WithSuffix\newcommand\rfsmoptional*{\rfsmgramfunc{\rfsmoptional}} +\WithSuffix\newcommand\rfsmparen*[1]{\rfsmparen{#1}} + +\newcommand\rfsmgramopt[1]{[#1]} +\newcommand\rfsmgramplus[1]{#1\ensuremath{^+}} +\newcommand\rfsmgramstar[1]{#1\ensuremath{^*}} +\newcommand\rfsmgramseplist[2]{#2\ensuremath{_{\textnormal{#1}}^*}} +\newcommand\rfsmgramsepnelist[2]{#2\ensuremath{_{\textnormal{#1}}^+}} +\WithSuffix\newcommand\rfsmgramopt*[1]{\paren{\rfsmgramopt{#1}}} +\WithSuffix\newcommand\rfsmgramplus*[1]{\paren{\rfsmgramplus{#1}}} +\WithSuffix\newcommand\rfsmgramstar*[1]{\paren{\rfsmgramstar{#1}}} +\WithSuffix\newcommand\rfsmgramseplist*[2]{\paren{\rfsmgramseplist{#1}{#2}}} +\WithSuffix\newcommand\rfsmgramsepnelist*[2]{\paren{\rfsmgramsepnelist{#1}{#2}}} diff --git a/docs/ref_manual/grammar.tex b/docs/ref_manual/grammar.tex new file mode 100644 index 00000000..59eda2d1 --- /dev/null +++ b/docs/ref_manual/grammar.tex @@ -0,0 +1,283 @@ +\begin{rfsmgrammar} +\rfsmgramfunc{\rfsmprogram{}}& \rfsmgramdef & \rfsmgramstar{\rfsmtypedecl*{}} \\ & & + \rfsmgramstar{\rfsmcstdecl*{}} \\ & & + \rfsmgramstar{\rfsmfndecl*{}} \\ & & + \rfsmgramstar{\rfsmfsmmodel*{}} \\ & & + \rfsmgramstar{\rfsmfsmmodel*{}} \\ & & + \rfsmgramstar{\rfsmglobal*{}} \\ & & + \rfsmgramstar{\rfsmfsminst*{}} + \rfsmEOF*{} + \\& & \\ + +\rfsmgramfunc{\rfsmtypedecl{}}& \rfsmgramdef & \rfsmTYPE*{} \rfsmLID*{} + \rfsmEQUAL*{} \rfsmtypeexpr*{}\\ + & \rfsmgrambar &\rfsmTYPE*{} \rfsmLID*{} \rfsmEQUAL*{} \rfsmENUM*{} + \rfsmbraced{\rfsmgramseplist{\rfsmCOMMA*{}}{\rfsmUID*{}}}\\ + & \rfsmgrambar &\rfsmTYPE*{} \rfsmLID*{} \rfsmEQUAL*{} \rfsmRECORD*{} + \rfsmLBRACE*{} + \rfsmgramsepnelist{\rfsmCOMMA*{}}{\rfsmrecordfield*{}} + \rfsmRBRACE*{} + \\& & \\ + +\rfsmgramfunc{\rfsmrecordfield{}}& \rfsmgramdef & \rfsmLID*{} \rfsmCOLON*{} + \rfsmtypeexpr*{} + \\& & \\ + +\rfsmgramfunc{\rfsmcstdecl{}}& \rfsmgramdef & \rfsmCONSTANT*{} \rfsmLID*{} + \rfsmCOLON*{} \rfsmtypeexpr*{} + \rfsmEQUAL*{} \rfsmconst*{} + \\& & \\ + +\rfsmgramfunc{\rfsmfndecl{}}& \rfsmgramdef & \rfsmFUNCTION*{} \rfsmLID*{} + \rfsmLPAREN*{} + \rfsmgramseplist{\rfsmCOMMA*{}}{\rfsmfarg*{}} + \rfsmRPAREN*{} \rfsmCOLON*{} + \rfsmtypeexpr*{} \rfsmLBRACE*{} + \rfsmRETURN*{} \rfsmexpr*{} + \rfsmRBRACE*{} + \\& & \\ + +\rfsmgramfunc{\rfsmfarg{}}& \rfsmgramdef & \rfsmLID*{} \rfsmCOLON*{} + \rfsmtypeexpr*{} + \\& & \\ + +\rfsmgramfunc{\rfsmfsmmodel{}}& \rfsmgramdef & \rfsmFSM*{} \rfsmMODEL*{} + \rfsmid*{} + \rfsmgramopt{\rfsmparams*{}} + \rfsmLPAREN*{} + \rfsmgramseplist{\rfsmCOMMA*{}}{\rfsmio*{}} + \rfsmRPAREN*{} \rfsmLBRACE*{} \\ & & + \rfsmSTATES*{} \rfsmCOLON*{} + \rfsmgramseplist{\rfsmCOMMA*{}}{\rfsmstate*{}} + \rfsmSEMICOLON*{} \\ & & + \rfsmgramopt{\rfsmvars*{}} \\ & & + \rfsmTRANS*{} \rfsmCOLON*{} + \rfsmgramseplist{\rfsmCOMMA*{}}{\rfsmtransition*{}} + \rfsmSEMICOLON*{} \\ & & + \rfsmITRANS*{} \rfsmCOLON*{} + \rfsmitransition*{} + \rfsmSEMICOLON*{} \\ & & + \rfsmRBRACE*{} + \\& & \\ + + \rfsmgramfunc{\rfsmstate{}}& \rfsmgramdef & \rfsmUID*{} + \rfsmgramopt{\rfsmWHERE \rfsmgramsepnelist{\rfsmAND{}}{\rfsmoutpval*{}}} + + \\& & \\ +\rfsmgramfunc{\rfsmoutpval{}}& \rfsmgramdef & \rfsmLID*{} \rfsmEQUAL*{} \rfsmscalarconst*{} + + + \\& & \\ + +\rfsmgramfunc{\rfsmparams{}}& \rfsmgramdef & \rfsmLT*{} + \rfsmgramseplist{\rfsmCOMMA*{}}{\rfsmparam*{}} + \rfsmGT*{} + \\& & \\ + +\rfsmgramfunc{\rfsmparam{}}& \rfsmgramdef & \rfsmLID*{} \rfsmCOLON*{} + \rfsmtypeexpr*{} + \\& & \\ + +\rfsmgramfunc{\rfsmio{}}& \rfsmgramdef & \rfsmIN*{} \rfsmiodesc*{}\\ + & \rfsmgrambar &\rfsmOUT*{} \rfsmiodesc*{}\\ + & \rfsmgrambar &\rfsmINOUT*{} \rfsmiodesc*{} + \\& & \\ + +\rfsmgramfunc{\rfsmiodesc{}}& \rfsmgramdef & \rfsmLID*{} \rfsmCOLON*{} + \rfsmtypeexpr*{} + \\& & \\ + +\rfsmgramfunc{\rfsmvars{}}& \rfsmgramdef & \rfsmVARS*{} \rfsmCOLON*{} + \rfsmgramseplist{\rfsmCOMMA*{}}{\rfsmvar*{}} + \rfsmSEMICOLON*{} + \\& & \\ + +\rfsmgramfunc{\rfsmvar{}}& \rfsmgramdef & \rfsmgramsepnelist{\rfsmCOMMA*{}}{\rfsmLID*{}} + \rfsmCOLON*{} \rfsmtypeexpr*{} + \\& & \\ + +\rfsmgramfunc{\rfsmtransition{}}& \rfsmgramdef & \rfsmrulepfx*{} + \rfsmUID*{} + \rfsmARROW*{} + \rfsmUID*{} + \rfsmcondition*{} + \rfsmgramopt{\rfsmactions*{}} + \\& & \\ + + \rfsmgramfunc{\rfsmrulepfx{}}& \rfsmgramdef & \rfsmBAR*{} \rfsmgrambar \rfsmEMARK*{} + + \\& & \\ + +\rfsmgramfunc{\rfsmcondition{}}& \rfsmgramdef & \rfsmON*{} \rfsmLID*{} \rfsmgramopt{\rfsmguards*{}} \\ + + \\& & \\ + +\rfsmgramfunc{\rfsmguards{}}& \rfsmgramdef & \rfsmWHEN*{} \rfsmgramsepnelist{\rfsmDOT*{}}{\rfsmexpr*{}} + + \\& & \\ + +\rfsmgramfunc{\rfsmactions{}}& \rfsmgramdef & \rfsmWITH*{} \rfsmgramsepnelist{\rfsmSEMICOLON*{}}{\rfsmaction*{}} + \\& & \\ + +\rfsmgramfunc{\rfsmaction{}}& \rfsmgramdef & \rfsmLID*{}\\ + & \rfsmgrambar &\rfsmlhs*{} \rfsmCOLEQ*{} \rfsmexpr*{} + \\& & \\ + +\rfsmgramfunc{\rfsmlhs{}}& \rfsmgramdef & \rfsmLID*{}\\ + & \rfsmgrambar &\rfsmLID*{} \rfsmLBRACKET*{} \rfsmexpr*{} \rfsmRBRACKET*{}\\ + & \rfsmgrambar &\rfsmLID*{} \rfsmLBRACKET*{} \rfsmexpr*{} \rfsmCOLON*{} + \rfsmexpr*{} \rfsmRBRACKET*{}\\ + & \rfsmgrambar &\rfsmLID*{} \rfsmDOT*{} \rfsmLID*{} + \\& & \\ + + \rfsmgramfunc{\rfsmitransition{}}& \rfsmgramdef & \rfsmBAR*{} \rfsmARROW*{} \rfsmUID*{} \rfsmgramopt{\rfsmactions*{}} + + \\& & \\ + +\rfsmgramfunc{\rfsmglobal{}}& \rfsmgramdef & \rfsmINPUT*{} \rfsmid*{} + \rfsmCOLON*{} \rfsmtypeexpr*{} + \rfsmEQUAL*{} \rfsmstimuli*{}\\ + & \rfsmgrambar &\rfsmOUTPUT*{} + \rfsmgramsepnelist{\rfsmCOMMA*{}}{\rfsmid*{}} \rfsmCOLON*{} + \rfsmtypeexpr*{}\\ + & \rfsmgrambar &\rfsmSHARED*{} + \rfsmgramsepnelist{\rfsmCOMMA*{}}{\rfsmid*{}} \rfsmCOLON*{} + \rfsmtypeexpr*{} + \\& & \\ + +\rfsmgramfunc{\rfsmstimuli{}}& \rfsmgramdef & \rfsmPERIODIC*{} \rfsmLPAREN*{} + \rfsmINT*{} \rfsmCOMMA*{} + \rfsmINT*{} \rfsmCOMMA*{} + \rfsmINT*{} \rfsmRPAREN*{}\\ + & \rfsmgrambar &\rfsmSPORADIC*{} + \rfsmparen{\rfsmgramseplist{\rfsmCOMMA*{}}{\rfsmINT*{}}}\\ + & \rfsmgrambar &\rfsmVALUECHANGES*{} + \rfsmparen{\rfsmgramseplist{\rfsmCOMMA*{}}{\rfsmvaluechange*{}}} + \\& & \\ + +\rfsmgramfunc{\rfsmvaluechange{}}& \rfsmgramdef & \rfsmINT*{} \rfsmCOLON*{} + \rfsmstimconst*{} + \\& & \\ + +\rfsmgramfunc{\rfsmfsminst{}}& \rfsmgramdef & \rfsmFSM*{} \rfsmid*{} + \rfsmEQUAL*{} \rfsmid*{} + \rfsmgramopt{\rfsmLT*{} + \rfsmgramsepnelist{\rfsmCOMMA*{}}{\rfsmparamvalue*{}} + \rfsmGT*{}} + \rfsmparen{\rfsmgramseplist{\rfsmCOMMA*{}}{\rfsmid*{}}} + \\& & \\ + +\rfsmgramfunc{\rfsmparamvalue{}}& \rfsmgramdef & \rfsmscalarconst*{}\\ + & \rfsmgrambar &\rfsmLID*{} + + \\& & \\ + +\rfsmgramfunc{\rfsmtypeexpr{}}& \rfsmgramdef & \rfsmTYEVENT*{}\\ + & \rfsmgrambar &\rfsmTYINT*{} \rfsmintannot*{}\\ + & \rfsmgrambar &\rfsmTYFLOAT*{}\\ + & \rfsmgrambar &\rfsmTYCHAR*{}\\ + & \rfsmgrambar &\rfsmTYBOOL*{}\\ + & \rfsmgrambar &\rfsmLID*{}\\ + & \rfsmgrambar &\rfsmtypeexpr*{} \rfsmTYARRAY*{} \rfsmLBRACKET*{} + \rfsmarraysize*{} \rfsmRBRACKET*{} + \\& & \\ + +\rfsmgramfunc{\rfsmintannot{}}& \rfsmgramdef & \rfsmgrameps \\ + & \rfsmgrambar &\rfsmLT*{} \rfsmtypesize*{} \rfsmGT*{}\\ + & \rfsmgrambar &\rfsmLT*{} \rfsmtypesize*{} \rfsmCOLON*{} + \rfsmtypesize*{} \rfsmGT*{} + \\& & \\ + +\rfsmgramfunc{\rfsmarraysize{}}& \rfsmgramdef & \rfsmtypesize*{} + \\& & \\ + +\rfsmgramfunc{\rfsmtypesize{}}& \rfsmgramdef & \rfsmINT*{}\\ + & \rfsmgrambar &\rfsmLID*{}\\ + + \\& & \\ + +\rfsmgramfunc{\rfsmexpr{}}& \rfsmgramdef & \rfsmsimpleexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmPLUS*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmMINUS*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmTIMES*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmDIV*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmMOD*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmEQUAL*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmNOTEQUAL*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmGT*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmLT*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmGTE*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmLTE*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmLAND*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmLOR*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmLXOR*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmSHR*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmSHL*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmFPLUS*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmFMINUS*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmFTIMES*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmFDIV*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmsubtractive*{} \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmLID*{} \rfsmLBRACKET*{} \rfsmexpr*{} \rfsmRBRACKET*{}\\ + & \rfsmgrambar &\rfsmLID*{} \rfsmLBRACKET*{} \rfsmexpr*{} \rfsmCOLON*{} + \rfsmexpr*{} \rfsmRBRACKET*{}\\ + & \rfsmgrambar &\rfsmLID*{} \rfsmLPAREN*{} + \rfsmgramseplist{\rfsmCOMMA*{}}{\rfsmexpr*{}} + \rfsmRPAREN*{}\\ + & \rfsmgrambar &\rfsmLID*{} \rfsmDOT*{} \rfsmLID*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmQMARK*{} \rfsmexpr*{} \rfsmCOLON*{} + \rfsmexpr*{}\\ + & \rfsmgrambar &\rfsmexpr*{} \rfsmCOLONCOLON*{} \rfsmtypeexpr*{} + \\& & \\ + +\rfsmgramfunc{\rfsmsimpleexpr{}}& \rfsmgramdef & \rfsmLID*{}\\ + & \rfsmgrambar &\rfsmUID*{}\\ + & \rfsmgrambar &\rfsmscalarconst*{}\\ + & \rfsmgrambar &\rfsmLPAREN*{} \rfsmexpr*{} \rfsmRPAREN*{} + \\& & \\ + +\rfsmgramfunc{\rfsmsubtractive{}}& \rfsmgramdef & \rfsmMINUS*{}\\ + & \rfsmgrambar &\rfsmFMINUS*{} + \\& & \\ + +\rfsmgramfunc{\rfsmscalarconst{}}& \rfsmgramdef & \rfsmINT*{}\\ + & \rfsmgrambar &\rfsmBOOL*{}\\ + & \rfsmgrambar &\rfsmFLOAT*{}\\ + & \rfsmgrambar &\rfsmCHAR*{} + \\& & \\ + +\rfsmgramfunc{\rfsmconst{}}& \rfsmgramdef & \rfsmscalarconst*{}\\ + & \rfsmgrambar &\rfsmarrayconst*{}\\ + \\& & \\ + +\rfsmgramfunc{\rfsmarrayconst{}}& \rfsmgramdef & \rfsmLBRACKET*{} + \rfsmgramsepnelist{\rfsmCOMMA*{}}{\rfsmconst*{}} + \rfsmRBRACKET*{} + \\& & \\ + +\rfsmgramfunc{\rfsmstimconst{}}& \rfsmgramdef & \rfsmscalarconst*{}\\ + & \rfsmgrambar &\rfsmscalarconst*{} \rfsmCOLONCOLON*{} \rfsmtypeexpr*{}\\ + & \rfsmgrambar & \rfsmUID*{}\\ + & \rfsmgrambar & \rfsmrecordconst*{}\ + \\& & \\ + +\rfsmgramfunc{\rfsmrecordconst{}}& \rfsmgramdef & \rfsmLBRACE*{} + \rfsmgramsepnelist{\rfsmCOMMA*{}}{\rfsmrecordfieldconst*{}} + \rfsmRBRACE*{} + \\& & \\ + +\rfsmgramfunc{\rfsmrecordfieldconst{}}& \rfsmgramdef & \rfsmLID*{} + \rfsmEQUAL*{} + \rfsmstimconst*{} + \\& & \\ + +\rfsmgramfunc{\rfsmid{}}& \rfsmgramdef & \rfsmLID*{}\\ + & \rfsmgrambar &\rfsmUID*{} + \\& & \\ + +\end{rfsmgrammar} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "rfsm_rm" +%%% End: diff --git a/docs/ref_manual/options.tex b/docs/ref_manual/options.tex new file mode 100644 index 00000000..829b6e82 --- /dev/null +++ b/docs/ref_manual/options.tex @@ -0,0 +1,16 @@ +\chapter{Compiler options} +\label{cha:compiler-options} + +Compiler usage : \verb|rfsmc [options...] files| + +\medskip +\begin{tabular}[c]{ll} +\input{rfsmc-options.tex} +\end{tabular} + +\normalsize + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "rfsm_rm" +%%% End: diff --git a/doc/ref_manual/rfsm_rm.pdf b/docs/ref_manual/rfsm_rm.pdf similarity index 100% rename from doc/ref_manual/rfsm_rm.pdf rename to docs/ref_manual/rfsm_rm.pdf diff --git a/docs/ref_manual/rfsm_rm.tex b/docs/ref_manual/rfsm_rm.tex new file mode 100755 index 00000000..9ac2386b --- /dev/null +++ b/docs/ref_manual/rfsm_rm.tex @@ -0,0 +1,117 @@ +\documentclass[a4paper]{report} + +\usepackage{amsmath,amssymb,stmaryrd,latexsym} +\usepackage{titlepic} +\usepackage{syntax} +\usepackage{multicol} +\usepackage{alltt} +\usepackage{graphicx} % Including Graphics +%\usepackage{verbatim} +\usepackage{spverbatim} +\usepackage{alltt} +\usepackage{xspace} +\usepackage{listings} +\usepackage{ifthen} +\usepackage{adjustbox} +\usepackage{xhfill}% http://ctan.org/pkg/xhfill +\usepackage{color} +\usepackage{fancybox} +\usepackage{fancyvrb} +\usepackage{fixltx2e} +\usepackage[multiple]{footmisc} +\usepackage{grammar-defns} %% Generated by Obelisk +\usepackage{url} +\usepackage{bcprules} + +\newsavebox{\FVerbBox} +\newenvironment{FVerbatim} + {\VerbatimEnvironment + \begin{center} + \begin{lrbox}{\FVerbBox} + \begin{BVerbatim}} + {\end{BVerbatim} + \end{lrbox} + \fbox{\usebox{\FVerbBox}} + \end{center}} + +\newboolean{devel} +\setboolean{devel}{true} + +\lstloadlanguages{C++,Caml} +\lstset{frameround=tttt} +\lstset{captionpos=t} +\lstset{breaklines=true} +\lstset{escapechar=@} +%\lstset{aboveskip=2\medskipamount} +%\lstset{belowskip=1.5\medskipamount} +%\lstset{abovecaptionskip=\medskipamount} +\lstdefinelanguage{Rfsm}{keywords={type,enum,record,function,return,fsm,model,in,out,inout,vars,states,trans,itrans,on,when,with,periodic,sporadic,value_changes,event,bool,input,output,shared,where,and},morecomment=[l]{--}} +\lstdefinelanguage{ctask}{language=C,morekeywords={task,wait_ev,wait_evs,notify_ev,in,out,inout}} +\lstdefinelanguage{systemc}{language=C++,morekeywords={SC_MODULE,SC_METHOD,SC_THREAD,sc_in,sc_out,sc_inout}} +\lstdefinelanguage{menhir}{keywords={token,public}} + +%%% Better hyphenation: +%\sloppy +\setlength{\topmargin}{0pt} +\setlength{\oddsidemargin}{0pt} +\setlength{\textheight}{600pt} +\setlength{\textwidth}{448pt} + +%\Newcommand{\docdate}{\today} %%%!!!! +\newcommand{\step}{\noindent\medskip$\blacktriangleright$\xspace} + +\newcommand{\version}{2.0} + +\newcommand{\ie}{\emph{i.e.}\xspace} +\newcommand{\txt}[1]{\hbox{#1}} +\newcommand{\emtxt}[1]{\hbox{\em{#1}}} +\newcommand{\bftxt}[1]{\hbox{\bf{#1}}} +\ifthenelse{\boolean{devel}}{\newcommand{\note}[1]{\marginpar{\tiny #1}}}{\newcommand{\note}[1]{}} +\newcommand{\todo}[1]{\note{TODO: #1}} +\newcommand{\tofix}[1]{\note{TOFIX: #1}} +\ifthenelse{\boolean{devel}}{\newcommand{\tbw}[1]{$\spadesuit$ {\bf To be written\ldots}\xspace}}{\newcommand{\tbw}[1]{}} +\ifthenelse{\boolean{devel}}{\newcommand{\tbc}[1]{$\spadesuit$ {\bf To be continued\ldots}\xspace}}{\newcommand{\tbc}[1]{}} + +\newcommand{\rfsm}{RFSM\xspace} +\newcommand{\ocaml}{{\sc Objective Caml}\xspace} + +\newcommand{\example}[1]{\fcolorbox{white}{lightgray}{#1}} +\newcommand{\ifname}[3]{$\mathtt{#1}_{\mathtt{#2}}\mathtt{#3}$} + +%\newenvironment{example}{\medskip\noindent{\it Example :}\begin{alltt}}{\end{alltt}} + +\title{RFSM Reference Manual - \version} + +\author{J. S\'erot} + +\titlepic{\includegraphics[width=0.5\textwidth]{../figs/rfsm-logo}} +\date{} + +\begin{document} + +\maketitle + +%\tableofcontents + +\input{bnf} +\input{semantics} +\input{options} +\input{variants} + +% \input{source} +% \input{biblio} + +\newpage{} +\begin{thebibliography}{99} + +\bibitem{Leroy00} X.~Leroy. \emph{A Modular Module System}. J. Functional Programming, + 10(3):269-303, 2000. + +\end{thebibliography} + +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/docs/ref_manual/rfsmc-options.tex b/docs/ref_manual/rfsmc-options.tex new file mode 100644 index 00000000..a8eb0e87 --- /dev/null +++ b/docs/ref_manual/rfsmc-options.tex @@ -0,0 +1,32 @@ +-main & set prefix for the generated main files\\ +-dump\_typed & dump typed representation of model(s)/program to stdout\\ +-dump\_static & dump static representation of model(s)/program to stdout\\ +-target\_dir & set target directory (default: .)\\ +-lib & set location of the support library (default: /share/rfsm)\\ +-dot & generate .dot representation of model(s)/program\\ +-sim & run simulation (generating .vcd file)\\ +-ctask & generate CTask code\\ +-systemc & generate SystemC code\\ +-vhdl & generate VHDL code\\ +-version & print version of the compiler and quit\\ +-show\_models & generate separate representations for uninstanciated FSM models \\ +-dot\_qual\_ids & print qualified identifiers in DOT representations\\ +-gui & generate report and error messages for interacting with rfsm-light\\ +-dot\_no\_captions & Remove captions in .dot representation(s)\\ +-dot\_short\_trans & Print single-line transition labels (default is multi-lines)\\ +-dot\_abbrev\_types & Print abbreviated types (default is to print definitions)\\ +-dot\_boxed & Draw FSM instances in boxes\\ +-sim\_trace & set trace level for simulation (default: 0)\\ +-vcd\_int\_size & set default int size for VCD traces (default: 8)\\ +-synchronous\_actions & interpret actions synchronously\\ +-sc\_time\_unit & set time unit for the SystemC test-bench (default: SC\_NS)\\ +-sc\_trace & set trace mode for SystemC backend (default: false)\\ +-stop\_time & set stop time for the SystemC and VHDL test-bench (default: 100)\\ +-sc\_double\_float & implement float type as C++ double instead of float (default: false)\\ +-vhdl\_trace & set trace mode for VHDL backend (default: false)\\ +-vhdl\_time\_unit & set time unit for the VHDL test-bench\\ +-vhdl\_ev\_duration & set duration of event signals (default: 1 ns)\\ +-vhdl\_rst\_duration & set duration of reset signals (default: 1 ns)\\ +-vhdl\_numeric\_std & translate integers as numeric\_std [un]signed (default: false)\\ +-vhdl\_bool\_as\_bool & translate all booleans as boolean (default: false)\\ +-vhdl\_dump\_ghw & make GHDL generate trace files in .ghw format instead of .vcd\\ diff --git a/docs/ref_manual/semantics.tex b/docs/ref_manual/semantics.tex new file mode 100644 index 00000000..faed3c0c --- /dev/null +++ b/docs/ref_manual/semantics.tex @@ -0,0 +1,693 @@ +\chapter{Formal semantics} +\label{cha:semantics} + +\newcommand{\truev}{\mathsf{T}} +\newcommand{\tuple}[1]{\langle#1\rangle} +\newcommand{\ttuple}[2]{\langle#1, #2\rangle} +\newcommand{\tttuple}[3]{\langle#1, #2, #3\rangle} +\newcommand{\ttttuple}[4]{\langle#1, #2, #3, #4\rangle} +\newcommand{\tttttuple}[5]{\langle#1, #2, #3, #4, #5\rangle} +\newcommand{\ttttttuple}[6]{\langle#1, #2, #3, #4, #5, #6\rangle} +\newcommand{\tttttttuple}[7]{\langle#1, #2, #3, #4, #5, #6\rangle} +\newcommand{\ttttttttuple}[8]{\langle#1, #2, #3, #4, #5, #6\rangle} +\newcommand{\tuplen}[1]{\langle#1_1,\ldots,#1_n\rangle} +\newcommand{\tuplez}{\langle\rangle} +\newcommand{\cupp}[3]{\displaystyle{\bigcup_{#1}^{#2}}~#3} +\newcommand{\capp}[3]{\displaystyle{\bigcap_{#1}^{#2}}~#3} +\newcommand{\oplusn}[3]{\displaystyle{\bigoplus_{#1}^{#2}}~#3} +\newcommand{\valred}[2]{\rho_{#2}(#1)} +\newcommand{\emptyseq}{\langle\rangle} +\newcommand{\sequ}[1]{\langle#1\rangle} +\newcommand{\ssequ}[2]{\langle#1; #2\rangle} +\newcommand{\sssequ}[3]{\langle#1; #2; #3\rangle} +\newcommand{\sequn}[1]{\langle#1_1;\ldots;#1_n\rangle} +\newcommand{\sequm}[2]{\langle#1_1;\ldots;#1_#2\rangle} +\newcommand{\squn}[1]{#1_1,\ldots,#1_n} + +\newcommand{\delt}[4]{\ttttuple{#1}{#2}{#3}{#4}} +%\newcommand{\delt}[4]{(#1,#2)=(#4,#3)} +\newcommand{\trans}[3]{#1 \xrightarrow{#2} #3} +\newcommand{\transs}[4]{#1 \xrightarrow[#3]{#2} #4} +\newcommand\doubleplus{+\kern-1.3ex+\kern0.8ex} + +\newcommand{\larrow}{\xrightarrow} +\newcommand{\seqn}[3]{#3_#1,\ldots,#3_#2} +\newcommand{\cuppn}[1]{\cupp{i=1}{n}{#1}} +\newcommand{\setn}[1]{\{#1_1,\ldots,#1_n\}} +\newcommand{\mm}{\mathcal{M}} +\newcommand{\ssigma}{\overline{\sigma}} +\newcommand{\ssigm}{\overline{s}} +\newcommand{\eval}[2]{\mathcal{E}_{#1}\llbracket #2 \rrbracket} +\newcommand{\falln}[3]{\forall #1\in\{#2,\ldots,#3\}\quad} +% \newcommand{\falln}[3]{\forall #1=#2,\ldots,#3\quad} +\newcommand{\semfn}[3]{\mathcal{#1}_{#2}\llbracket #3 \rrbracket} +\newcommand{\vars}{\mathcal{V}} +\newcommand{\env}{\Gamma} +\newcommand{\expr}{\mathsf{e}} +\newcommand{\cupdot}{\mathbin{\mathaccent\cdot\cup}} + +We here give the formal \emph{static} and \emph{dynamic} semantics for a simplified version of the +\textsc{Rfsm} language, called \textsc{Core Rfsm}. Compared to the ``standard'' \textsc{Rfsm} +language\footnote{Described in the User Manual.}, +it lacks type, constant and function declarations, state valuation and has only basic types. +Its abstract syntax is described below. We note $X^*$ (resp. $X^+$) the repetition of 0 +(resp. 1) or more $X$. The syntax of expressions is deliberately not explicited here. + +\newcommand{\tm}[1]{\mathtt{#1}} +\newcommand{\ut}[1]{\emph{#1}} +\newcommand{\cat}[1]{\text{#1}} + +\bigskip +$ \begin{array}{lll} + \ut{program} ::= & \tm{program}~\ut{fsm\_model}^+~\ut{io\_decl}^+~\ut{fsm\_inst}^+ & \\ + \\ + \ut{fsm\_model} ::= & \tm{fsm\ model}~\cat{id}~\ut{inp}^*~\ut{outp}^*~\ut{state}^+~\ut{var}^*~\ut{trans}^+~\ut{itrans} &\\ + \\ + \ut{state} ::= & \cat{id} \\ + \ut{inp},\ut{outp},\ut{var} ::= & \cat{id}~\tm{:}~\ut{typ} & \\ + \ut{trans} ::= & \ttttuple{\cat{id}}{\ut{cond}}{\ut{action}^*}{\cat{id}} & \ttttuple{\emtxt{src + state}}{\ut{cond}}{\ut{actions}}{\emtxt{dst + state}} \\ + \ut{cond} ::= & \ttuple{\cat{id}}{\ut{guard}^*} & \ttuple{\emtxt{triggering even}}{\ut{guards}} \\ + \ut{guard} ::= & \ut{expr} & \emtxt{boolean expression} \\ + \ut{action} ::= & ~|\ \cat{id} & \emtxt{emit event} \\ + & ~|\ \cat{id}~\tm{:=}~\ut{expr} & \emtxt{update local, shared or output + variable}\\ + \\ + \ut{io\_decl} ::= & \ut{io\_cat}~\tm{id}~\tm{:}~\ut{typ} &\\ + \ut{io\_cat} ::= & \tm{input} ~|~ \tm{input} ~|~ \tm{shared} & \\ + \\ + \ut{fsm\_inst} ::= & \tm{fsm}~\cat{id}~\ut{i}^*~\ut{o}^* & \emtxt{model},\ \emtxt{IO bindings}\\ + \\ + \ut{typ} ::= & \tm{event}~|~\tm{int}~|~\tm{bool} \\ + \end{array} $ + +\section{Common definitions} +\label{sec:general-definitions} + +Both the static and static semantics will use \emph{environments}. +An \textbf{environment} is a (partial) map from \emph{names} to \emph{values}. +If $\env$ is an environment and $x$ a name, we will, classically, note +\begin{itemize} +\item $x \in \env$ if $x \in \text{dom}(\env)$, +\item $\env(x)$ the value mapped to $x$ in $\env$ ($\env(x)=\bot$ if $x \not\in \env$), +% \item $[x \mapsto v]$ the singleton environment mapping $x$ to $v$, +\item $\env[x \mapsto v]$ the environment that maps $x$ to $v$ and behaves like $\env$ +otherwise (possibly overriding an existing mapping of $x$), +\item $\emptyset$ the empty environment, +% \item $\env \oplus \env'$ the environment obtained by coherent merging of $\env$ and $\env'$, +% \emph{i.e.} +% $$ +% (\env \oplus \env')(x)=\begin{cases} +% v \qquad\text{if}\ \env(x)=v \wedge \env'(x)=\bot \vee \env(x)=\bot \wedge \env'(x)=v \\ +% \bot \qquad\text{if}\ \env(x)=\bot \wedge \env'(x)=\bot \vee \env(x)=v +% \wedge \env'(x)=v' \wedge v \not= v' +% \end{cases} +% $$ +\end{itemize} + +\section{Static semantics} +\label{sec:static-semantics} + +The static interpretation of a \textsc{Core Rfsm} program is a pair + +\begin{equation*} + \mathcal{H} = \ttuple{M}{C} +\end{equation*} + +where +\begin{itemize} +\item $M$ is a set of \textbf{automata}, +\item $C$ is a \textbf{context}. +\end{itemize} + +\medskip\step +A \textbf{context} is a 6-tuple $\ttttttuple{I_e}{I_v}{O_e}{O_v}{H_e}{H_v}$ where +\begin{itemize} +\item $I_e$ (resp. $O_e$, $H_e$) is the set of global inputs (resp. outputs, shared values) with an \emph{event} type, +\item $I_v$ (resp. $O_v$, $H_v$) is the set of global inputs (resp. outputs, shared values) with a + \emph{non-event} type. +\end{itemize} + + +\medskip\step +An \textbf{automaton} $\mu \in M$ is a 3-tuple + +\begin{equation*} + \mu = \tttuple{\mm}{q}{\vars} +\end{equation*} + +where +\begin{itemize} +\item $\mm$ is the associated (static) model, +\item $q$ its current state, +\item $\vars$ an environment giving the current value of its local variables. +\end{itemize} + +\medskip\step +A \textbf{model} $\mm$ is a 6-tuple + +\begin{equation*} + \mm = \ttttttuple{Q}{I}{O}{V}{T}{\tau_0} +\end{equation*} + +where + +\begin{itemize} +\item $Q$ is a (finite) set of \emph{states}, +\item $I$ and $O$ are environments respectively mapping input and output names to types, +\item $V$ is an environment mapping local variable names to types, +\item $I_e = \{ x \in I ~|~ I(x)=\tm{event} \}$ and $I_v = \{ x \in I ~|~ I(x)\not=\tm{event} \}$, +\item $O_e = \{ x \in O ~|~ O(x)=\tm{event} \}$ and $O_v = \{ x \in O ~|~ O(x)\not=\tm{event} \}$, +% each $v_i \in V$ taking its values in a finite domain $D_i$, +\item $T \subset Q \times C \times \mathcal{S}(A) \times Q$ is a set of \textbf{transitions}, where + \begin{itemize} + \item $C=I_e \times 2^{\mathcal{B}(I_v \cup V)}$, + \item $\mathcal{B}(E)$ is the set of \emph{boolean expressions} built from a set of variables $E$ and the + classical boolean operators\footnote{This set can be formally derived from the abstract syntax.}, + \item $\mathcal{S}(A)$ is the set of \emph{sequences} built from elements of the set $A$, where a + \emph{sequence} $\vec{a}$ is an ordered collection $\sequn{a}$\footnote{For example, if + $A=\{1,2\}$, then + $\mathcal{S}(A)=\{\emptyseq,\sequ{1},\sequ{2},\ssequ{1}{1},\ssequ{1}{2},\ssequ{2}{1},\ssequ{2}{2},\sssequ{1}{2}{1},\ldots\}$, + where $\tuplez$ denotes the empty sequence.}, + \item $A=\mathcal{U}(O_v \cup V, I_v \cup V) \cup O_e$, +\item $\mathcal{U}(E,E')$ is the set of + \emph{assignations} of variables taken in a set $E$ by \emph{expressions} built from a set of + variable $E'$ and the classical boolean and arithmetic operators and constants\footnote{Again, +this can be formally derived from the abstract syntax.}. + \end{itemize} +\item $\tau_0 \in Q \times \mathcal{S}({\mathcal{U}(O_v \cup V,\emptyset)})$ is the \textbf{initial transition}. +\end{itemize} + +\medskip +Having $\tau=(q,c,\vec{a},q')$ in $T$ means that there's a transition from state $q$ to state +$q'$ enabled by the condition $c$ and triggering a (possibly empty) sequence $\vec{a}$, where +\begin{itemize} +\item the condition $c \in C$ is made of +\begin{itemize} +\item a trigerring event $e \in I_e$, +\item a (possibly empty) set of boolean expressions (guards), involving inputs having a non-event + type or local variables, +\end{itemize} +\item the actions in $\vec{a}$ consist either in the emission of an event or the modification of an output or +local variable. +\end{itemize} + +\medskip The initial transition $\tau_0$ consists in a state (the initial state) and a (possibly +empty) sequence of initial actions. Contrary to actions associated to ``regular'' transitions, +initial actions cannot not emit events and the +assigned values cannot depend on inputs or local variables. + +% \medskip Because we want the described systems to be \emph{reactive} and \emph{deterministic}, for +% each state $q \in Q$ and condition $c \in C$, there should be exactly one transition +% $t=(q,c,a,q') \in T$\footnote{This condition can be enforced, if not the case, by adding implicit +% transitions looping on the current state and with an empty set of actions.}. In this case, the set +% $T$ can by replaced by a (total) \emph{function} $\delta$ defined as follows~: + +% \begin{center} +% $\delta: Q \times C \rightarrow Q \times 2^A$ \\ +% $\delta(q,c)=(q',a)\quad \text{iff}\quad (q,c,a,q') \in T$. +% \end{center} + +% \medskip +% We will sometimes write +% \begin{itemize} +% \item $\delt{q}{c}{a}{q'}$ as $\trans{q}{c/a}{q'}$ and +% \item $\delt{q}{c}{\emptyset}{q'}$ as $\trans{q}{c}{q'}$. +% \end{itemize} + +\medskip \textbf{Example}. The model of the automaton depicted below\footnote{This model, a + calibrated pulse generator has been introduced in the \emph{Overview} chapter of the user manual.} +can be formally described as $\mathcal{M}=\ttttttuple{Q}{I}{O}{V}{T}{\tau_0}$ where~: + +\begin{tabular}[c]{cc} + \begin{minipage}[b]{0.5\linewidth} +\begin{itemize} +\item $Q = \{ E0, E1 \}$ +\item $I = \{ h \mapsto \mathsf{event}, e \mapsto \mathsf{bool} \}$ +\item $O = \{ s \mapsto \mathsf{bool} \}$ +\item $V = \{ k \mapsto \mathsf{bool} \}$ +\item $T = \{\\ + \delt{E0}{\ttuple{H}{\{e=0\}}}{\emptyseq}{E0},\\ + \delt{E0}{\ttuple{H}{\{e=1\}}}{\ssequ{s \gets 1}{k \gets 1}}{E1},\\ + \delt{E1}{\ttuple{H}{\{k<3\}}}{\sequ{k \gets k+1}}{E1},\\ + \delt{E1}{\ttuple{H}{\{k=3\}}}{\sequ{s \gets 0}}{E0} \}$ +\item $\tau_0 = \ttuple{E0}{\sequ{s \gets 0}}$ +\end{itemize} + \end{minipage} & + \includegraphics[width=0.25\linewidth]{./figs/gensig-model} +\end{tabular} + +\newpage +\subsection*{Rules} +\label{sec:static-rules} + +\newcommand{\senv}[1]{\Gamma_{\!\mathsf{#1}}} + +\step Rule \textsc{Program} gives the static interpretation of a program. The static environment +$\senv{M}$ (resp. $\senv{I}$) records the (typed) declarations of models (resp. IOs). + +\infrule[Program] +{\ut{fsm\_model}^+ \xrightarrow{} \senv{M} \\ + \ut{io\_decl}^+ \xrightarrow{} \senv{I} \\ + \senv{M},\senv{I} \vdash\ \ut{fsm_inst}^+ \xrightarrow{} M \\ + C=\mathcal{L}(\senv{I})} +{\tm{program}~\ut{fsm\_model}^+~\ut{io\_decl}^+~\ut{fsm\_inst}^+ \xrightarrow{} M, C} + +The $\mathcal{L}$ function builds a static context $C$ from the IO environment $\senv{I}$~: +\begin{eqnarray*} +\mathcal{L}(\senv{I}) = \ttttttuple{I_e}{I_v}{O_e}{O_v}{H_e}{H_v} +\end{eqnarray*} +\noindent +where +\begin{eqnarray*} +I_e=\{x \in \text{dom}(\senv{I}) ~|~ \senv{I}(x)=\ttuple{\cat{input}}{\tm{event}}\} & +I_v=\{x \in \text{dom}(\senv{I}) ~|~ \senv{I}(x)=\ttuple{\cat{input}}{\tau},\ \tau\not=\tm{event}\}\\ +O_e=\{x \in \text{dom}(\senv{I}) ~|~ \senv{I}(x)=\ttuple{\cat{output}}{\tm{event}}\} & +O_v=\{x \in \text{dom}(\senv{I}) ~|~ \senv{I}(x)=\ttuple{\cat{output}}{\tau},\ \tau\not=\tm{event}\}\\ +H_e=\{x \in \text{dom}(\senv{I}) ~|~ \senv{I}(x)=\ttuple{\cat{shared}}{\tm{event}}\} & +H_v=\{x \in \text{dom}(\senv{I}) ~|~ \senv{I}(x)=\ttuple{\cat{shared}}{\tau},\ \tau\not=\tm{event}\} +\end{eqnarray*} + +\medskip\step +Rule \textsc{Models} gives the interpretation of model declarations, giving an environment +$\senv{M}$. + +\infrule[Models] +{\falln{i}{1}{n}\quad \senv{M}^{i-1},\ \ut{fsm\_model}_i \xrightarrow{} \senv{M}^i \\ + \senv{M}^0 = \emptyset\quad + \senv{M} = \senv{M}^n} +{\squn{\ut{fsm\_model}} \xrightarrow{} \senv{M}} + +\medskip\step +Rule \textsc{Model} gives the interpretation of a single model declaration. It just records the +corresponding description in the environment $\senv{M}$, after performing some sanity checks, using +the $\mathsf{valid\_model}$ function, not detailed here. This function checks that~: +\begin{itemize} +\item all variable names occuring in guards are listed as input or local variable, +\item all expressions occuring in the guards of a transition have type $\mathsf{bool}$, +\item \ldots \todo{TBC} +\end{itemize} + +\infrule[Model] +{\mm=\ttttttuple{Q}{I}{O}{V}{T}{\tau_0}\quad + \mathsf{valid\_model}(\mm)} +{\tm{fsm\ model}~\cat{id}~I~O~Q~V~T~\tau_0 \xrightarrow{} \senv{M}[\cat{id}\mapsto\mm]} + +\medskip\step +Rules \textsc{IOs} and \textsc{IO} give the interpretation of IO declarations, producing an environment +$\senv{I}$ binding names to a pair $\ttuple{\ut{io\_cat}}{\ut{typ}}$. + +\infrule[IOs] +{\falln{i}{1}{n}\quad \senv{I}^{i-1},\ \ut{io_decl}_i \xrightarrow{} \senv{I}^i \\ + \senv{I}^0 = \emptyset\quad + \senv{I} = \senv{I}^n} +{\squn{\ut{io\_decl}} \xrightarrow{} \senv{I}} + +\infrule[IO] +{} +{\senv{I},\ \ut{cat}~\tm{id}~\tm{:}~\ut{typ} \xrightarrow{} \senv{I}[\tm{id}\mapsto + \ttuple{\ut{cat}}{\ut{typ}}]} + +\medskip\step +Rules \textsc{Insts} gives the interpretation of FSM instance declarations. + +\infrule[Insts] +{\falln{i}{1}{n}\quad \senv{M},\senv{I} \vdash\ \ut{fsm\_inst}_i \xrightarrow{} \mu_i\\ + M=\sequn{\mu}} +{\squn{\ut{fsm\_inst}} \xrightarrow{} \mathcal{H}=\ttuple{M}{C}} + +\step Rule \textsc{Inst} gives the interpretation of a single FSM instance as an automaton. + +\newcommand{\tysequm}[3]{\langle#1_1\tm{:}#2_1,\ldots;#1_#3\tm{:}#2_#3\rangle} + +\infrule[Inst] +{\senv{M}(\cat{id}) = \ttttttuple{\tysequm{i'}{\tau'}{m}}{\tysequm{o'}{\tau''}{n}}{Q}{V}{T}{\ttuple{q_0}{\vec{a_0}}}\\ + \Phi=\{i'_1 \mapsto i_1, \ldots, i'_m \mapsto i_m, o'_1 \mapsto o_1, \ldots, \o'_n \mapsto o_n \}\\ + \falln{i}{1}{m}\, \senv{I}(i_i)=\ttuple{\cat{cat}_i}{\tau_i},\ \cat{cat}_i \in + \{\tm{input},\tm{shared}\} \wedge \tau_i=\tau'_i\\ + \falln{i}{1}{n}\, \senv{I}(o_i)=\ttuple{\cat{cat}_i}{\tau_i},\ \cat{cat}_i \in + \{\tm{output},\tm{shared}\} \wedge \tau_i=\tau''_i\\ + \mm'=\ttttttuple{\tysequm{i}{\tau'}{m}}{\tysequm{o}{\tau''}{n}}{Q}{V}{\Phi_T(T)}{\ttuple{q_0}{\Phi_A(\vec{a_0})}}\\ + \mu=\tttuple{\mm'}{q_0}{\mathcal{I}(V)}} +{\senv{M},\senv{I} \vdash\ \tm{fsm}~\cat{id}~\sequm{i}{m}~\sequm{o}{n} \xrightarrow{} \mu} + +Rule \textsc{Inst} checks the arity and the type conformance of the inputs and outputs supplied to +the instanciated model. The rule builds a \emph{substitution} $\Phi$ for binding \emph{local} input and +output names to \emph{global} ones. This substitution is applied to each transition (including the +initial one) of the resulting automaton~ using the derived functions $\Phi_T$ and $\Phi_A$ (not +detailed here). +% \begin{eqnarray*} +% \Phi_T(\{\tau_1,\ldots,\tau_n\}) & = & \{ \Phi_\tau(\tau_1), \ldots, \Phi_\tau(\tau_n) \}\\ +% \Phi_\tau(\ttttuple{q}{\ttuple{e}{\{exp_1,\ldots,exp_m\}}}{\sequn{a}}{q'}) & = & +% \ttttuple{q}{\ttuple{\Phi(e)}{\{\Phi_E(exp_1),\ldots,\Phi_E(exp_m)\}}}{\sequn{\Phi_A(a)}}{q'}) +% \end{eqnarray*} +The $\mathcal{I}$ function builds an environment from a set of names, initializing each + binding with the $\bot$ (``undefined'') value~: + $$ + \mathcal{I}(\setn{x}) = \{x_1 \mapsto \bot, \ldots, x_n \mapsto \bot \} + $$ + +\section{Dynamic semantic} +\label{sec:dynamic-semantics} + +The dynamic semantics of a \textsc{Core Rfsm} program will be given in terms of (instantaneous) +\textbf{reactions}. +% TO BE INSERTED LATER ? +% It is similar to that of so-called \emph{synchronous languages} like +% \textsc{Esterel} or \textsc{Lustre}. Each reaction takes place at a given \emph{instant}. An instant +% is defined by the occurrence of an event (or of several simultaneous events). There's no reference +% to a notion of duration and time is only defined by the succession of instants (and hence of +% events). At each instant, each FSM composing the program takes at most one transition. + +\begin{eqnarray*} + \mathcal{C} \vdash\ M,\ \env \xrightarrow[\rho]{\sigma} M',\ \env' +\end{eqnarray*} + +meaning + +\begin{center} +``in the static context $\mathcal{C}$ and given a (dynamic) environment $\Gamma$, a set of +automata $M$ reacts to a \emph{stimulus} $\sigma$ leading to an updated set of automata $M'$, an +updated environment $\Gamma'$ and producing a \emph{response} $\rho$'' +\end{center} + +\subsection*{Definitions} +\label{sec:dynsem-defs} + +\step Given an expression $\expr$ and an environment $\env$, $\eval{\env}{\expr}$ denotes the value obtained by +\textbf{evaluating} expression $\expr$ within environment $\env$. For example + +$$ +\eval{\{x\mapsto 1,y\mapsto 2\}}{x+y} = 3 +$$ + +\medskip \step An \textbf{event} $e$ is either the occurrence of a \emph{pure event} +$\epsilon$ or the assignation of a \textbf{value} \emph{v} to a \textbf{name} (input, output or +local variable)~: + +\begin{equation*} + e = \begin{cases} + \epsilon \\ + x \gets v + \end{cases} +\end{equation*} + +\medskip +\step An \textbf{event set} $E$ is a dated set of events + +\begin{eqnarray*} + E = \ttuple{t}{\setn{e}} +\end{eqnarray*} + +where $t$ gives the occurrence \textbf{time} (logical instant). + +\medskip +For example $E=\ttuple{10}{\{h,e \gets 0\}}$ means + +\begin{center} +``At time t=10, event \texttt{h} occurs and (input) $e$ is set to 0'' . +\end{center} + +\medskip +The union of \emph{event sets} is defined as + \begin{eqnarray*} + \ttuple{t}{e} \cup \ttuple{t'}{e'} = + \begin{cases} + \ttuple{t}{e \cup e'} \qquad \text{if}\ t=t' \\ + \bot\qquad \text{otherwise} + \end{cases} + \end{eqnarray*} + +\medskip\step A \textbf{stimulus} $\sigma$ (resp. \textbf{response} $\rho$) is just an event set involving inputs + (resp. outputs). +\todo{Input et output par rapport à quoi : automate ou contexte ?} + +% \medskip +% \step A \textbf{program} $M$ is a set of automata + +% \begin{equation*} +% M = \setn{\mu} +% \end{equation*} + +\subsection*{Rules} +\label{sec:dynsem-rules} + +\step +Given a static description $\mathcal{H}=\ttuple{M}{C}$ of a program, the \textbf{execution} of this +program submitted to a sequence of stimuli $\vec{\sigma}=\sigma_1,\ldots,\sigma_n$ is formalized by +rule \textsc{Exec} + +% Rule \textsc{Exec} formalizes the execution of a program the reaction of a set of automata $M$ +% in response to a sequence of stimuli $\sigma_1,\ldots,\sigma_n$ + +\infrule[Exec] +{ C \vdash\ M \xrightarrow{} M_0,\ \env_0\\ + \falln{i}{1}{n}\quad C \vdash\ M_{i-1},\ \env_{i-1} \xrightarrow[\rho_i]{\sigma_i} M_i,\ \env_i} +{\mathcal{H}=\ttuple{M}{C} \xrightarrow[\vec{\rho}=\sequn{\rho}]{\vec{\sigma}=\sequn{\sigma}} M_n,\ \env_n} + +In other words, the execution of the program is described as as a sequence of \textbf{instantaneous +reactions}, which can be denoted as\footnote{Omitting context $C$, which is constant during an +execution.}~: + +\begin{eqnarray*} + M_0,\ \env_0 \xrightarrow[\rho_1]{\sigma_1} M_1,\ \env_1 \rightarrow \ldots + \xrightarrow[\rho_n]{\sigma_n} M_n,\ \env_n +\end{eqnarray*} + +\noindent where +\begin{itemize} +\item the \emph{global environment} $\Gamma$ here records the value of inputs and shared + variables\footnote{This environment is required to handle events describing modifications of these + values, as described below (see rule \textsc{ReactUpd}).}, +\item $\rho_1, \ldots, \rho_n$ is the sequence of responses, + \item $M_n$ and $\Gamma_n$ respectively give the final state of the automata and global + environment. +\end{itemize} + +\medskip \step +Rule \textsc{Init} describes how the initial set of automata $M_0$ and global environment +$\env_0$ are initialized by executing the initial transition of each automaton (producing a set of +initial responses $\rho_0$. + +\infrule[Init] +{\falln{i}{1}{n} \mu_i=\tttuple{\mm_i}{q_i}{\vars_i}\quad + \mm_i=\ttttttuple{.}{.}{.}{.}{.}{\ttuple{.}{\vec{a_i}}}\quad + C \vdash\ \vars_i,\ \gamma_{i-1} \xrightarrow[\ttuple{0}{\emptyset}]{\vec{a_i},0} \vars'_i,\ \gamma_i\quad + \mu'_i=\tttuple{\mm_i}{q_i}{\vars'_i}\\ + C=\ttttttuple{.}{I_v}{.}{O_v}{.}{H_v}\quad + \gamma_0 = \mathcal{I}(I_v \cup O_v \cup H_v)} +{C \vdash\ M=\setn{\mu} \xrightarrow{} M_0=\setn{\mu'},\ \env_0=\gamma_n} + + +\noindent +where the $I_v$, $O_v$ and $H_v$ sets, taken from the static context $C$, respectively give the name of + inputs, outputs and shared variables. + +\medskip +\textbf{Note}. Rule \textsc{Init} does \emph{not} produce any response +$\rho$. This is because the initial actions of an automaton cannot emit events hence can only update the +its local environment or the global one. + +\medskip \step Rule \textsc{Acts} describes how a sequence of actions $\vec{a}$ (at time +$t$) updates the local and global environments, possibly emitting a set of responses\footnote{This + set of responses is always empty when rule \textsc{Acts} is invoked in the context of \textsc{Init}.}. + +\infrule[Acts] +{ \falln{i}{1}{n}\quad C \vdash\ \vars_{i-1},\ \env_{i-1} \xrightarrow[\rho_i]{a_i,\ t} \vars_i,\ \env_i\\ + \vars_0=\vars\quad \env_0=\env \quad \rho_e = \cuppn{\rho_i}} +{C \vdash\ \vars,\ \env \xrightarrow[\rho_e]{\sequn{a},\ t} \vars_n,\ \env_n} + +\medskip \textbf{Note}. The definition of rule \textsc{Acts} given above enforces a \emph{sequential + interpretation} of actions. For example +$$ +\{x \mapsto 1,\ s \mapsto \bot \},\ \env \xrightarrow{\ssequ{x \gets x+1}{s \gets x},t} +\{x \mapsto 2,\ s \mapsto 2 \}, \env +$$ +Rule \textsc{Acts} could easily be reformulated to describe other interpretations, such as a +\emph{synchronous} one, in which all RHS values are first evaluated +and then assigned to LHS in parallel\footnote{As happens in hardware synchronous implementations for + example.}. +% for example~: +% $$ +% \{x \mapsto 1,\ s \mapsto \bot \},\ \env \xrightarrow{\ttuple{\vec{a}}{d}}_A +% \{x \mapsto 2,\ s \mapsto 1 \}, \env +% $$ + + +\medskip \step Rules \textsc{ActUpdL} and \textsc{ActUpdG} respectively describe the +effect of an action updating a local or global variable (shared variable or output)\footnote{The + effect of an action emitting an event will be described by rules \textsc{ActEmitS} and \textsc{ActEmitG}, + given latter.}. + +\begin{multicols}{2} +\infrule[ActUpdL] +{x \in \text{dom}(\vars) \quad v = \eval{\vars\cup\env}{\expr}} +{C \vdash\ \vars,\ \env \xrightarrow[\ttuple{t}{\emptyset}]{x\gets \expr,\ t} \vars[x\mapsto v],\ \env} + +\infrule[ActUpdG] +{x \in \text{dom}(\env) \quad v = \eval{\vars\cup\env}{\expr}} +{C \vdash\ \vars,\ \env \xrightarrow[\ttuple{t}{\emptyset}]{x\gets \expr,\ t} \vars,\ \env[x\mapsto v]} +\end{multicols} + +\step Rule \textsc{React} describes how a program $M$ within a global environment $\env$ +(instantaneously) reacts to a stimulus (event set) $\sigma$, producing a response (event set) +$\rho$, an updated program $M'$ and an updated environment $\env'$. + +\infrule[React] +{\sigma_e,\sigma_v = \Sigma(\sigma)\qquad + C \vdash\ M,\ \env \xrightarrow{\sigma_v} M,\ \env_v\qquad + C \vdash\ M,\ \env_v \xrightarrow[\rho_e]{\sigma_e} M',\ \env'} +{C \vdash\ M,\ \env \xrightarrow[\rho_e]{\sigma} M',\ \env'} + +where the function $\Sigma$ partitions a \emph{event set} into one containing the stimuli +corresponding to \emph{pure} events ($\epsilon$) and another containing those corresponding to updates to +global inputs~: + +\begin{equation*} + \Sigma(\ttuple{t}{\setn{e}}) = \ttuple{t}{\{ e_i ~|~ e_i = \epsilon_i \}},\quad\ttuple{t}{\{ + e_i ~|~ e_i = x_i \gets v_i \}} +\end{equation*} + +\step Rule \textsc{ReactUpd} describes how a program $M$ within a global environment $\env$ reacts to set +of events describing updates to global inputs. These updates are just recorded in the environment and do not produce +responses, nor trigger any reaction of the automata~: + +\infrule[ReactUpd] +{} +{C \vdash\ M,\ \env \xrightarrow{\sigma_v=\ttuple{t}{\{x_1\gets v_1,\ldots,x_m\gets v_m\}}} M,\ \env[x_1\mapsto + v_1]\ldots[x_m\mapsto v_m]} + +\step +Rule \textsc{ReactEv} describes how a program reacts to a set of pure events. + +\infrule[ReactEv] +{\falln{i}{1}{n} C \vdash\ \mu_{\pi(i)},\ \env_{i-1} \xrightarrow[\rho_i]{\sigma_i} \mu'_{\pi(i)},\ \env_i\qquad + \sigma_i=\sigma_{i-1} \cup \rho_i\\ + \env_0 = \env\qquad + \sigma_0 = \sigma_e\qquad + \rho_e = \cuppn{\rho_i}\qquad + \env'=\env_n} +{C \vdash\ M=\setn{\mu}, \env \xrightarrow[\rho]{\sigma_e=\ttuple{t}{\{\epsilon_1,\ldots,\epsilon_m\}}}_e + M'=\setn{\mu'},\ \env'} + +Each automaton reacts +separately but \emph{in a specific order}. This order is derived from the dependencies between +automata. We say that an automaton $\mu'$ \emph{depends on} another automaton $\mu$ at a given +instant $t$, and note + +\begin{eqnarray*} + \mu \leq \mu' +\end{eqnarray*} + +if the reaction of $\mu$ at this instant can trigger or modify the reaction of $\mu'$ +at the same instant. Concretely, this happens when $\mu$ and $\mu'$ are respectively in states $q$ +and $q'$ and there's (at least) one pair of transitions $(\tau,\tau')$ starting respectively from +$q$ and $q'$ so that +\begin{itemize} +\item $\tau'$ is triggered by an event emitted by $\tau$, or +\item a variable occuring in the guards associated to $\tau'$ is written by the actions associated + to $\tau$. +\end{itemize} + +The function $\pi$ used in \textsc{ReactEv} is a permutation of $\{1,\ldots,n\}$ defined so that +\begin{eqnarray*} + \mu_{\pi(1)} \leq \mu_{\pi(2)} \leq \ldots \leq \mu_{\pi(n)} +\end{eqnarray*} + +Having the automata of $M$ react in the order $\pi(1),\ldots,\pi(n)$ ensures that any event emitted or local +variable update performed by an automaton during a given reaction is effectively perceived by any +other automaton \emph{at the same reaction}, a principle called \emph{instantaneous broadcats}. + +The permutation $\pi$ can easily be computed by a \emph{topological sort} of the dependency graph +derived from the conditions expressed above. In practice, this will be carried out by a static +analysis of the program. + +\step Rules \textsc{React1}, \textsc{React0} and \textsc{ReactN} describe how a single automaton reacts to a +set of pure events, updating both its internal and global states and producing another set of (pure) +events in response. + +\begin{multicols}{2} +\infrule[React1] +{ \Delta_{\env \cup \vars}(\mm,q,e) = \{ \tau \}\\ + C \vdash\ \mu,\ \env \xrightarrow[\rho_e]{\tau,\ t} \mu', \env'} +{C \vdash\ \mu=\tttuple{\mm}{q}{\vars},\ \env \xrightarrow[\rho_e]{\sigma_e=\ttuple{t}{e}} \mu',\ \env'} + +\infrule[React0] +{ \Delta_{\env \cup \vars}(\mm,q,e) = \emptyset} +{C \vdash\ \mu=\tttuple{\mm}{q}{\vars},\ \env \xrightarrow[\ttuple{t}{\emptyset}]{\sigma_e=\ttuple{t}{e}} \mu,\ \env} +\end{multicols} + +\infrule[ReactN] +{ \Delta_{\env \cup \vars}(\mm,q,e) = \setn{\tau}\\ + \tau = \mathsf{choice}(\setn{\tau})\\ + C \vdash\ \mu,\ \env \xrightarrow[\rho_e]{\tau,\ t} \mu', \env'} +{C \vdash\ \mu=\tttuple{\mm}{q}{\vars},\ \env \xrightarrow[\rho_e]{\sigma_e=\ttuple{t}{e}} \mu',\ \env'} + +Given a automaton modelised by $\mm$ and currently in state $q$, $\Delta_\env(\mm,q,e)$, where +$e=\setn{\epsilon}$, returns +the set of \emph{fireable} transitions, \emph{i.e.} all the transitions triggered by the event set +$e$ starting from $q$ and for which the all the associated boolean guards evaluate, in environment $\env$, to +\textsf{true}. + +\begin{equation*} + \Delta_\env(\mathcal{M},q,\setn{\epsilon}) = \cupp{i=1}{n}{\Delta_\env(\mathcal{M},q,\epsilon_i)} +\end{equation*} +where +\begin{equation*} + \Delta_\env(\ttttttuple{.}{.}{.}{.}{T}{.},q,\epsilon) = \{ (q_s,c,a,q_d) \in T ~|~ + q=q_s ~\wedge~ c = \ttuple{\epsilon}{\setn{e}} ~\wedge~ \falln{i}{1}{n} \eval{\env}{e_i} = \mathsf{true} \} +\end{equation*} + + +Rule \textsc{React1} describes the case when the set of events triggers exactly \emph{one} transition +of the automaton. Its state and local variables are updated according to the actions listed in the +transition and the remaining actions are used to generated the set of responses. + +Rule \textsc{React0} describes the case when the set of events does not trigger any transition. The +automaton and the global environment are left unchanged. + +Rule \textsc{ReactN} describes the case when the set of events triggers more than one transition. This +situation corresponds to a non-deterministic behavior of the automaton. The +function \textsf{choice} is here used to choose one transition\footnote{This can done, for example, + by adding a \emph{priority} to each transition.}. + +\medskip \step +Rule \textsc{Trans} describes the effect of performing a transition, updating the automaton local +and global states and returning a set of (pure) events as responses. + +\infrule[Trans] +{\mu=\tttuple{\mm}{q}{\vars} \qquad \tau=\ttttuple{q}{c}{\vec{a}}{q'} \\ + C \vdash\ \vars,\ \env \xrightarrow[\rho_e]{\vec{a},t}_a \vars',\ \env'\\ + \mu'=\tttuple{\mm}{q'}{\vars'}} +{C \vdash\ \mu,\ \env \xrightarrow[\rho_e]{\tau,\ t} \mu',\ \env'} + +\medskip\step Rules \textsc{ActEmitS} and \textsc{ActEmitG} complement the rules \textsc{ActUpdL} and \textsc{ActUpdG} +given previously by describing the effect of an action emitting a shared or output event. The +$H_e$ set, taken from context $C$, is here used to distinguish between to to. The formers can trigger the reaction of other(s) +automaton(s), the latters are just ignored here (see note below). + +\begin{multicols}{2} +\infrule[ActEmitS] +{C=\ttttttuple{.}{.}{.}{.}{H_e}{.}\quad + \epsilon \in H_e} +{C \vdash\ \vars,\ \env \xrightarrow[\ttuple{t}{\{\epsilon\}}]{\epsilon,\ t} \vars,\ \env} + +\infrule[ActEmitG] +{C=\ttttttuple{.}{.}{.}{.}{H_e}{.}\quad + \epsilon \not\in H_e} +{C \vdash\ \vars,\ \env \xrightarrow[\ttuple{t}{\emptyset}]{\epsilon,\ t} \vars,\ \env} +\end{multicols} + +\bigskip +\textbf{Note}. +The semantics described here only defines how a program execution progresses, from the initial +program to the final program state $M$. In practice, an interpreter will also build a \emph{trace} +of such an execution, recording all significant events (stimuli, responses, state moves, +\emph{etc.}). Building such a trace is easily performed by modifying the semantic rules given above. It +has not been done here for the sake of simplicity. + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "rfsm_rm" +%%% End: diff --git a/docs/ref_manual/variants.tex b/docs/ref_manual/variants.tex new file mode 100644 index 00000000..6d4237f9 --- /dev/null +++ b/docs/ref_manual/variants.tex @@ -0,0 +1,330 @@ +\chapter{ Building language variants} +\label{cha:variants} + +Following the approach described in~\cite{Leroy00} for example, the RFSM compiler is implemented in +a \emph{modular} way. The language is split into a \emph{host} language, describing the general +structure and behavior of FSMs (states, transitions, \ldots) and a \emph{guest} +language\footnote{``Base'' in the terminology of \cite{Leroy00}.} describing the syntax and +semantics of \emph{expressions} used in transition guards and semantics. +Technically, this ``separation of concern'' is realized by providing the host language in the form +of a \emph{functor} taking as argument the module implementing the guest language. + +This approach makes it fairly easy to produce variants of the ``standard'' RFSM language -- with +dedicated type systems and expression languages typically -- by simply defining the module defining +the guest language and applying the aforementioned functor. Actually, the ``standard'', RFSM + language was designed using this approach, starting from a very simple ``core'' guest + language gradually enriched with new features at the expression level\footnote{Traces of the + incremental design process can be found in the \texttt{srs/guests/core}, + \texttt{src/guests/others/szdints} and \texttt{src/guests/others/szvars} directories for example.}. + +The directory \verb|src/guests/templ| in the distribution provides the basic structure for deploying +this approach. In practice, to implement a language variant, one has to +\begin{itemize} +\item write the implementation of the guest language in the form of a collection of modules in the + \texttt{lib} subdirectory\footnote{These modules will be encapsulated in a single module and the + latter will be passed to the host functor to build the target language.}, +\item write the lexer and the parser for this guest language (expressions, type expressions, \ldots), +\item build the compiler by simply invoking \emph{make} +\end{itemize} + +\medskip +To illustrate this process, we describe in the sequel the implementation of a very simple language +language for which the guest language has only two types, `event` and `bool`, +and expressions are limited to boolean constants and variables\footnote{This language is essentially + that provided in \texttt{src/guests/others/mini}.}. We focus here on the most salient features. +The \texttt{Readme} file in the \texttt{templ} directory describes the procedure in +details. Other examples, given in \verb|src/guests/core| and \verb|src/guests/others|\footnote{And, of + course, in \texttt{src/guests/std}.}, can also be used as guidelines. + +\section{Implementing the \texttt{Guest} module} + +The module implementing the guest language must match the following signature~: + +\begin{lstlisting}[language={[Objective]Caml},frame=single,basicstyle=\small,label={lst:guest-sig}] +module type T = sig + module Info : INFO + module Types : TYPES + module Syntax : SYNTAX with module Types = Types + module Typing : TYPING with module Syntax = Syntax and module Types = Types + module Value : VALUE with type typ = Types.typ + module Static : STATIC with type expr = Syntax.expr and type value = Value.t + module Eval : EVAL with module Syntax = Syntax and module Value = Value + module Ctask: CTASK with module Syntax = Syntax + module Systemc: SYSTEMC with module Syntax = Syntax and module Static = Static and type value = Value.t + module Vhdl: VHDL with module Syntax = Syntax and module Static = Static and type value = Value.t + module Error : ERROR + module Options : OPTIONS +end +\end{lstlisting} + +\noindent +where +\begin{itemize} +\item module \texttt{Info} gives the name and version of the guest language, +\item module \texttt{Syntax} describes the (abstract) syntax of the guest language, +\item modules \texttt{Types} and \texttt{Typing} respectively describe the types and the typing + rules of the guest language, +\item module \texttt{Static} describes the static semantics of the guest language (basically, the + interpretation of model parameters), +\item modules \texttt{Value} and \texttt{Eval} respectively describe the values and the dynamic + semantics manipulating these values, +\item modules \texttt{CTask}, \texttt{Systemc} and \texttt{Vhdl} respectively describe the + guest-level part of the C, SystemC and VHDL backends, +\item module \texttt{Error} describes how guest-specific errors are handled, +\item module \texttt{Options} describes guest-specific compiler options. +\end{itemize} + +Listings~\ref{lst:mini-types}, \ref{lst:mini-syntax},\ref{lst:mini-value} and \ref{lst:mini-eval} +respectively show the contents of of the \texttt{Types}, +\texttt{Syntax}, \texttt{Value} and \texttt{Eval} modules for the \texttt{mini} language. +The definition of non essential fonctions has been omitted\footnote{See the corresponding source files in + \texttt{src/guests/others/mini/lib} for a complete listing.}. + +\begin{lstlisting}[language={[Objective]Caml},frame=single,basicstyle=\small,caption={Module + \texttt{Guest.Types} (excerpt)},label={lst:mini-types}] +type typ = + | TyEvent + | TyBool + | TyUnknown + +let no_type = TyUnknown + +let is_event_type (t: typ) = match t with TyEvent -> true | _ -> false +let is_bool_type (t: typ) = match t with TyBool -> true | _ -> false + +let pp_typ ?(abbrev=false) fmt (t: typ) = ... +\end{lstlisting} + +In module \texttt{Types}, the key definition is that of type \texttt{typ}, which describes the +guest-level types, \emph{i.e.} the types which can be attributed to guest-level expressions and +variables. The type \texttt{TyUnknown} is used to define the value \texttt{no_type} which is +attributed by the host language to (yet) untyped syntax elements. + +\begin{lstlisting}[language={[Objective]Caml},frame=single,basicstyle=\small,caption={Module + \texttt{Guest.Syntax} (excerpt)}, label={lst:mini-syntax}] +module Types = Types + +module Location = Rfsm.Location +module Annot = Rfsm.Annot +module Ident = Rfsm.Ident + +let mk ~loc x = Annot.mk ~loc ~typ:Types.no_type x + +(* Type expressions *) + +type type_expr = (type_expr_desc,Types.typ) Annot.t +and type_expr_desc = TeConstr of string (* name, no args here *) + +let is_bool_type (te: type_expr) = ... +let is_event_type (te: type_expr) = ... + +let pp_type_expr fmt (te: type_expr) = ... + +(* Expressions *) + +type expr = (expr_desc,Types.typ) Annot.t +and expr_desc = + | EVar of Ident.t + | EBool of bool + +let vars_of_expr (e: expr) = ... +and pp_expr fmt (e: expr) = ... + +(* LHSs *) + +type lhs = (lhs_desc,Types.typ) Annot.t +and lhs_desc = Ident.t + +let lhs_var (l: lhs) = ... +let vars_of_lhs (l: lhs) = ... +let is_simple_lhs (l: lhs) = true + +let mk_simple_lhs (v: Ident.t) = + Annot.{ desc=v; typ=Types.no_type; loc=Location.no_location } + +let pp_lhs fmt l = ... +\end{lstlisting} + +The module \texttt{Syntax} use the modules \texttt{Location}, \texttt{Annot} and \texttt{Ident} +provided by the \texttt{Rfsm} host library. These modules provide types and functions to handle +source code locations, syntax annotations and identifiers respectively. The type +\verb|('a,Types.typ) Annot.t| is associated to syntax nodes of type +\verb|'a|. The types \verb|type_expr|, \verb|expr| and \verb|lhs| respectively describe guest-level +type expressions, expressions and left-hand-sides (LHS). LHS are used in the definition of +actions. In this language they are limited to simple identifiers (ex: \verb|x:=|) but the +guest language can use other forms (like in the RFSM ``standard'' language which support arrays and +records in LHS). + +\begin{lstlisting}[language={[Objective]Caml},frame=single,basicstyle=\small,caption={Module + \texttt{Guest.Values} (excerpt)},label={lst:mini-value}] +type typ = + | TyEvent + | TyBool + | TyUnknown + +let no_type = TyUnknown + +let is_event_type t = match t with TyEvent -> true | _ -> false +let is_bool_type t = match t with TyBool -> true | _ -> false +let mk_type_fun ty_args ty_res = ... + +let pp_typ ?(abbrev=false) fmt t = ... +\end{lstlisting} + +\begin{lstlisting}[language={[Objective]Caml},frame=single,basicstyle=\small,caption={Module + \texttt{Guest.Value} (excerpt)},label={lst:mini-value}] +type t = + | Val_bool of bool + | Val_unknown + +let default_value ty = match ty with + | _ -> Val_unknown + +exception Unsupported_vcd of t + +let vcd_type (v: t) = match v with + | Val_bool _ -> Rfsm.Vcd_types.TyBool + | _ -> raise (Unsupported_vcd v) + +let vcd_value (v: t) = match v with + | Val_bool v -> Rfsm.Vcd_types.Val_bool v + | _ -> raise (Unsupported_vcd v) + +let pp fmt (v: t) = ... +\end{lstlisting} + +The module \verb|Guest.Value| define the values, associated to guest-level expressions by the +dynamic semantics. The value \verb|Val_unknown| is used to represent undefined or unitialized +value. The functions \verb|vcd_type| and \verb|vcd_value| provide the interface to the VCD backend, +generating simulation traces~: they should return a VCD compatible representation (defined in the +host library \verb|Vcd_types| module) of a value. + +\begin{lstlisting}[language={[Objective]Caml},frame=single,basicstyle=\small,caption={Module + \texttt{Guest.Eval} (excerpt)},label={lst:mini-eval}] +module Syntax = Syntax +module Value = Value +module Env = Rfsm.Env +module Annot = Rfsm.Annot + +type env = Value.t Env.t + +exception Illegal_expr of Syntax.expr +exception Uninitialized of Rfsm.Location.t + +let mk_env () = Env.init [] + +let upd_env lhs v env = Env.upd lhs.Annot.desc v env + +let lookup ~loc v env = + match Rfsm.Env.find v env with + | Value.Val_unknown -> raise (Uninitialized loc) + | v -> v + +let eval_expr env e = match e.Annot.desc with + | Syntax.EVar v -> lookup ~loc:e.Annot.loc v env + | Syntax.EBool i -> Val_bool i + +let eval_bool env e = + match eval_expr env e with + | Val_bool b -> b + | _ -> raise (Illegal_expr e) + +let pp_env fmt env = ... +\end{lstlisting} + +The module \verb|Guest.Eval| defines the guest-level dynamic semantics, \emph{i.e.} the definition +of the dynamic environment \texttt{env}, used to bind identifiers to values and of the +functions \verb|eval_expr| and \verb|exal_bool| used to evaluate guest-level expressions. The +presence of a distinct, \verb|eval_bool| function is required because the boolean type and +expressions are not part of the host-level syntax. The definition of the \texttt{env} type here uses +that provided by the host library but any definition matching the corresponding signature would do. + +\section{Implementing the \texttt{Guest} parser} + +The parser for the guest language defines the concrete syntax for guest-level type expressions, +expressions and LHS. It is written in a separate \texttt{.mly} file which will be combined with the +parser for the host language\footnote{Using \texttt{menhir} facility to split parser specifications + into multiple files.}. There are only two guest specific tokens here, denoting the boolean +constants \texttt{true} and \texttt{false}. The \texttt{open} directive in the prologue section +gives access to the abstract syntax definitions given in \texttt{Guest.Syntax} module. The function +\texttt{mk}, defined in this module, builds annotated syntax nodes, inserting the source code +location. + +\begin{lstlisting}[language={menhir},frame=single,basicstyle=\small,caption={File + guest_parser.mly},label={lst:mini-eval}] +%token TRUE +%token FALSE + +%{ +open Mini.Top.Syntax +%} + +%% +%public type_expr: + | tc = LID { mk ~loc:$sloc (TeConstr tc) } + +%public lhs: + | v = LID { mk ~loc:$sloc (mk_ident v) } + +%public expr: + | v = LID { mk ~loc:$sloc (EVar (mk_ident v)) } + | c = scalar_const { c } + +%public scalar_const: + | TRUE { mk ~loc:$sloc (EBool true) } + | FALSE { mk ~loc:$sloc (EBool false) } + +%public const: + | c = scalar_const { c } + +%public stim_const: + | c = scalar_const { c } + +\end{lstlisting} + +\section{Implementing the \texttt{Guest} lexer} + +The \texttt{ocamllex} tool, used for defining the lexer, does not support multi-file definitions. +The lexer for the guest-specific part of the target language is therefore supplied in the form of +code fragments to be inserted in the host lexer definition file\footnote{Technically, this insertion is + performed using the \texttt{cppo} tool.}. These fragments are listed in two separate files, +present in the \texttt{bin} subdirectory of the guest directory~: +\begin{itemize} +\item the file \texttt{guest_km} contains the lexer definition of the guest-specific keywords, +\item the file \texttt{guest_rules} contains the guest-specific rules. +\end{itemize} + +In the case of the \texttt{mini} language defined here, the latter is empty and the former only +contains the two following lines. + +\begin{verbatim} +"true", TRUE; +"false", FALSE; +\end{verbatim} + +\section{Building the compiler} + +Defining the target language implementation and building the associated compiler is then simply +obtained by the two following functor applications\footnote{For technical reasons, these two + statements are placed in distinct files, \texttt{bin\/lang.ml} and \texttt{bin\/rfsmc.ml}.}~: + +\begin{lstlisting}[language={[Objective]caml},frame=single,basicstyle=\small] +module L = Rfsm.Host.Make(Mini.Top) + +module Compiler = + Rfsm.Compiler.Make + (L) + (Lexer) + (struct include Parser type program = L.Syntax.program end) +\end{lstlisting} + +Invoking the compiler now boils down to executing + +\begin{lstlisting}[language={[Objective]caml},frame=single,basicstyle=\small] +let _ = Printexc.print Compiler.main () +\end{lstlisting} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "rfsm_rm" +%%% End: diff --git a/docs/rfsm/Rfsm/.dummy b/docs/rfsm/Rfsm/.dummy new file mode 100644 index 00000000..e69de29b diff --git a/docs/rfsm/Rfsm/Annot/index.html b/docs/rfsm/Rfsm/Annot/index.html new file mode 100644 index 00000000..ea814310 --- /dev/null +++ b/docs/rfsm/Rfsm/Annot/index.html @@ -0,0 +1,6 @@ + +Annot (rfsm.Rfsm.Annot)

Module Rfsm.Annot

Annotations

type ('a, 'b) t = {
  1. mutable desc : 'a;
    (*

    Annotated value

    *)
  2. mutable typ : 'b;
    (*

    Type annotation (type 'b will be bound to the guest language type)

    *)
  3. loc : Location.t;
    (*

    Location in source code

    *)
}

The type ('a,'b) t is used to attach type and location annotations to values of type 'a.

val mk : + loc:(Stdlib.Lexing.position * Stdlib.Lexing.position) -> + typ:'b -> + 'a -> + ('a, 'b) t

mk ~loc ~ty x returns value x annotated with type ty and location loc

val map : ('a -> 'c) -> ('b -> 'd) -> ('a, 'b) t -> ('c, 'd) t

map f g v returns the annotated value obtained by applying f and g to the desc and typ fields of v resp., without changing the loc field.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Bits/index.html b/docs/rfsm/Rfsm/Bits/index.html new file mode 100644 index 00000000..d5b60850 --- /dev/null +++ b/docs/rfsm/Rfsm/Bits/index.html @@ -0,0 +1,2 @@ + +Bits (rfsm.Rfsm.Bits)

Module Rfsm.Bits

Bit-level manipulation of integers

val of_int : int -> int -> string

of_int s n returns the bit-level representation of nsigned integer n as a string of length s

val get_bits : hi:int -> lo:int -> int -> int

get_bits hi lo n returns the integer represented by the bits ranging from hi to lo in integer n. Example: get_bits ~hi:3 ~lo:1 13 returns 6.

val set_bits : hi:int -> lo:int -> dst:int -> int -> int

set_bits hi lo dst v returns the integer obtained by setting the bits ranging from hi to lo in integer n to v. Example: set_bits ~hi:3 ~lo:1 ~dst:0 7 returns 14.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..a3b5d4ca --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Cmodel.Make.Static.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Syntax/Guest/index.html new file mode 100644 index 00000000..b15b59c3 --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Cmodel.Make.Static.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Syntax/index.html b/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Syntax/index.html new file mode 100644 index 00000000..32424487 --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Cmodel.Make.Static.Syntax)

Module Static.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Typing/index.html b/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Typing/index.html new file mode 100644 index 00000000..42387d22 --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Cmodel.Make.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Value/index.html b/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Value/index.html new file mode 100644 index 00000000..7af87625 --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Cmodel.Make.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/index.html b/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/index.html new file mode 100644 index 00000000..24c79378 --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/Make/argument-1-Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Cmodel.Make.Static)

Parameter Make.Static

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/Make/index.html b/docs/rfsm/Rfsm/Cmodel/Make/index.html new file mode 100644 index 00000000..c35e3f40 --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/Make/index.html @@ -0,0 +1,2 @@ + +Make (rfsm.Rfsm.Cmodel.Make)

Module Cmodel.Make

Parameters

module Static : Static.T

Signature

module Static = Static
type type_expr = Static.Syntax.type_expr
type c_type_defn =
  1. | CTyEnum of string list
type t = {
  1. c_mname : Ident.t;
  2. c_name : Ident.t;
  3. c_states : c_state list;
  4. c_params : (Ident.t * type_expr) list;
  5. c_inps : (Ident.t * type_expr) list;
  6. c_outps : (Ident.t * type_expr) list;
  7. c_inouts : (Ident.t * type_expr) list;
  8. c_vars : (Ident.t * type_expr) list;
  9. c_init : Static.Syntax.itransition_desc;
  10. c_body : c_state_case list;
  11. c_ddepth : int;
}
and c_state = Ident.t * (Ident.t * expr) list
and c_state_case = {
  1. st_src : Ident.t;
  2. st_sensibility_list : Ident.t list;
  3. st_transitions : (Ident.t * Static.Syntax.transition_desc list) list;
}
val pp : Stdlib.Format.formatter -> t -> unit
val of_fsm_model : Static.Syntax.model -> t
val of_fsm_inst : Static.t -> Static.fsm -> t
exception Error of string * string
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/index.html b/docs/rfsm/Rfsm/Cmodel/index.html new file mode 100644 index 00000000..80bcf8eb --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/index.html @@ -0,0 +1,4 @@ + +Cmodel (rfsm.Rfsm.Cmodel)

Module Rfsm.Cmodel

Target-independent C-oriented model

module type CMODEL = sig ... end
module Make + (Static : Static.T) : + CMODEL with module Static = Static and type typ = Static.Syntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..e44d9ffa --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Cmodel.CMODEL.Static.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Syntax/Guest/index.html new file mode 100644 index 00000000..4874af94 --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Cmodel.CMODEL.Static.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Syntax/index.html b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Syntax/index.html new file mode 100644 index 00000000..662d5d2a --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Cmodel.CMODEL.Static.Syntax)

Module Static.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Typing/index.html b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Typing/index.html new file mode 100644 index 00000000..b8cd4e9c --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Cmodel.CMODEL.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Value/index.html b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Value/index.html new file mode 100644 index 00000000..9eeb94d7 --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Cmodel.CMODEL.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/index.html b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/index.html new file mode 100644 index 00000000..87fdc0c4 --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Cmodel.CMODEL.Static)

Module CMODEL.Static

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/index.html b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/index.html new file mode 100644 index 00000000..cc3e4f08 --- /dev/null +++ b/docs/rfsm/Rfsm/Cmodel/module-type-CMODEL/index.html @@ -0,0 +1,2 @@ + +CMODEL (rfsm.Rfsm.Cmodel.CMODEL)

Module type Cmodel.CMODEL

module Static : Static.T
type type_expr = Static.Syntax.type_expr
type c_type_defn =
  1. | CTyEnum of string list
type t = {
  1. c_mname : Ident.t;
  2. c_name : Ident.t;
  3. c_states : c_state list;
  4. c_params : (Ident.t * type_expr) list;
  5. c_inps : (Ident.t * type_expr) list;
  6. c_outps : (Ident.t * type_expr) list;
  7. c_inouts : (Ident.t * type_expr) list;
  8. c_vars : (Ident.t * type_expr) list;
  9. c_init : Static.Syntax.itransition_desc;
  10. c_body : c_state_case list;
  11. c_ddepth : int;
}
and c_state = Ident.t * (Ident.t * expr) list
and c_state_case = {
  1. st_src : Ident.t;
  2. st_sensibility_list : Ident.t list;
  3. st_transitions : (Ident.t * Static.Syntax.transition_desc list) list;
}
val pp : Stdlib.Format.formatter -> t -> unit
val of_fsm_model : Static.Syntax.model -> t
val of_fsm_inst : Static.t -> Static.fsm -> t
exception Error of string * string
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/G/Syntax/Types/index.html new file mode 100644 index 00000000..b7673de8 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Compiler.Make.L.Ctask.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/G/Syntax/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/G/Syntax/index.html new file mode 100644 index 00000000..d1da97a5 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Compiler.Make.L.Ctask.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/G/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/G/index.html new file mode 100644 index 00000000..c3c6b1dd --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/G/index.html @@ -0,0 +1,5 @@ + +G (rfsm.Rfsm.Compiler.Make.L.Ctask.G)

Module Ctask.G

val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the C declaration of symbol id with type ty. For example, for an int named "x", this should be "int x", and for an array of 8 ints named "a", this should be "int a[8]".

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the C type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the C statement corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the C expression corresponding to expression e.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/index.html new file mode 100644 index 00000000..54d3198c --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Ctask/index.html @@ -0,0 +1,2 @@ + +Ctask (rfsm.Rfsm.Compiler.Make.L.Ctask)

Module L.Ctask

module Static = Static
module G : Guest.CTASK
exception Error of string * string
val output : dir:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dot/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dot/index.html new file mode 100644 index 00000000..730721bb --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dot/index.html @@ -0,0 +1,2 @@ + +Dot (rfsm.Rfsm.Compiler.Make.L.Dot)

Module L.Dot

module Static = Static
val output_static : dir:string -> name:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/Syntax/Types/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/Syntax/Types/index.html new file mode 100644 index 00000000..bdfc5682 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Compiler.Make.L.Dynamic.EvSeq.Evset.Event.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/Syntax/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/Syntax/index.html new file mode 100644 index 00000000..c50d6674 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Compiler.Make.L.Dynamic.EvSeq.Evset.Event.Syntax)

Module Event.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/Value/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/Value/index.html new file mode 100644 index 00000000..00af77db --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Compiler.Make.L.Dynamic.EvSeq.Evset.Event.Value)

Module Event.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/index.html new file mode 100644 index 00000000..4b23d87b --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/Event/index.html @@ -0,0 +1,2 @@ + +Event (rfsm.Rfsm.Compiler.Make.L.Dynamic.EvSeq.Evset.Event)

Module Evset.Event

type t =
  1. | Ev of Ident.t
    (*

    pure event

    *)
  2. | Upd of Syntax.lhs * Value.t
    (*

    assignation (lhs <- v)

    *)
  3. | StateMove of string * string
    (*

    state move (src,dst)

    *)
val is_pure_event : t -> bool
val compare : t -> t -> int
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/index.html new file mode 100644 index 00000000..20556131 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/Evset/index.html @@ -0,0 +1,2 @@ + +Evset (rfsm.Rfsm.Compiler.Make.L.Dynamic.EvSeq.Evset)

Module EvSeq.Evset

module Event : Event.T
type date = int
type t
exception Union of t * t
val mk : date -> Event.t list -> t
val empty : date -> t
val date : t -> date
val events : t -> Event.t list
val is_empty : t -> bool
exception Add of Event.t
val add : t -> Event.t -> t
val union : t -> t -> t
val union_all : date -> t list -> t
val partition : f:(Event.t -> bool) -> t -> t * t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/index.html new file mode 100644 index 00000000..f380c13b --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/EvSeq/index.html @@ -0,0 +1,2 @@ + +EvSeq (rfsm.Rfsm.Compiler.Make.L.Dynamic.EvSeq)

Module Dynamic.EvSeq

module Evset : Evset.T
type t = Evset.t list
type value
val merge : t -> t -> t
val (@@) : t -> t -> t

@@ is the infix notation for merge

val merge_all : t list -> t
val mk_periodic : Ident.t -> int -> int -> int -> t
val mk_changes : Ident.t -> (int * value) list -> t
val mk_sporadic : Ident.t -> int list -> t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/Syntax/Types/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/Syntax/Types/index.html new file mode 100644 index 00000000..19d79145 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Compiler.Make.L.Dynamic.Eval.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/Syntax/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/Syntax/index.html new file mode 100644 index 00000000..52b9f4a3 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Compiler.Make.L.Dynamic.Eval.Syntax)

Module Eval.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/Value/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/Value/index.html new file mode 100644 index 00000000..dc87646a --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Compiler.Make.L.Dynamic.Eval.Value)

Module Eval.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/index.html new file mode 100644 index 00000000..91e25c40 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/Eval/index.html @@ -0,0 +1,2 @@ + +Eval (rfsm.Rfsm.Compiler.Make.L.Dynamic.Eval)

Module Dynamic.Eval

type env = Value.t Env.t

The type of dynamic environments, mapping identifiers to values.

val mk_env : unit -> env

mk_env () should return a new, empty dynamic environment

val upd_env : Syntax.lhs -> Value.t -> env -> env

upd_env l v env should return the environment obtained by adding the binding (l,v) to env. If l is already bound in env, the associated value is updated.

Evaluators

exception Illegal_expr of Syntax.expr
val eval_expr : env -> Syntax.expr -> Value.t

eval_expr env e should return the value obtained by evaluating expression e in environment env. Should raise Illegal_expr in case of failure.

val eval_bool : env -> Syntax.expr -> bool

eval_bool env e should return the boolean value obtained by evaluating expression e in environment env. Should raise Illegal_expr if e does not denote a boolean value or in case of failure.

Printing

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of environment env on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/index.html new file mode 100644 index 00000000..5b4a9bb8 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Dynamic/index.html @@ -0,0 +1,2 @@ + +Dynamic (rfsm.Rfsm.Compiler.Make.L.Dynamic)

Module L.Dynamic

module Syntax = Syntax
module Static = Static
module Eval : Guest.EVAL
exception Illegal_stimulus_value of Location.t
exception Non_deterministic_transition of string * int * Syntax.transition list

FSM name, date, transitions

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Ctask/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Ctask/index.html new file mode 100644 index 00000000..f5d6dfdf --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Ctask/index.html @@ -0,0 +1,5 @@ + +Ctask (rfsm.Rfsm.Compiler.Make.L.Guest.Ctask)

Module Guest.Ctask

module Syntax = Syntax
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the C declaration of symbol id with type ty. For example, for an int named "x", this should be "int x", and for an array of 8 ints named "a", this should be "int a[8]".

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the C type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the C statement corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the C expression corresponding to expression e.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Error/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Error/index.html new file mode 100644 index 00000000..5d5d00fc --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Error/index.html @@ -0,0 +1,2 @@ + +Error (rfsm.Rfsm.Compiler.Make.L.Guest.Error)

Module Guest.Error

val handle : exn -> unit

This function will be called to handle guest-level exceptions, i.e. exceptions raised by guest specific functions and not handled by the host language.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Eval/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Eval/index.html new file mode 100644 index 00000000..c3227798 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Eval/index.html @@ -0,0 +1,2 @@ + +Eval (rfsm.Rfsm.Compiler.Make.L.Guest.Eval)

Module Guest.Eval

module Syntax = Syntax
module Value = Value
type env = Value.t Env.t

The type of dynamic environments, mapping identifiers to values.

val mk_env : unit -> env

mk_env () should return a new, empty dynamic environment

val upd_env : Syntax.lhs -> Value.t -> env -> env

upd_env l v env should return the environment obtained by adding the binding (l,v) to env. If l is already bound in env, the associated value is updated.

Evaluators

exception Illegal_expr of Syntax.expr
val eval_expr : env -> Syntax.expr -> Value.t

eval_expr env e should return the value obtained by evaluating expression e in environment env. Should raise Illegal_expr in case of failure.

val eval_bool : env -> Syntax.expr -> bool

eval_bool env e should return the boolean value obtained by evaluating expression e in environment env. Should raise Illegal_expr if e does not denote a boolean value or in case of failure.

Printing

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of environment env on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Info/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Info/index.html new file mode 100644 index 00000000..c3fe47e4 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Info/index.html @@ -0,0 +1,2 @@ + +Info (rfsm.Rfsm.Compiler.Make.L.Guest.Info)

Module Guest.Info

val name : string

Name of the guest language

val version : string

Version

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Options/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Options/index.html new file mode 100644 index 00000000..3b329bd6 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Options/index.html @@ -0,0 +1,2 @@ + +Options (rfsm.Rfsm.Compiler.Make.L.Guest.Options)

Module Guest.Options

val specs : (string * Stdlib.Arg.spec * string) list

specs should list all guest-specific compiler options. These options will be added to those related to the host language.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Static/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Static/index.html new file mode 100644 index 00000000..266f1999 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Compiler.Make.L.Guest.Static)

Module Guest.Static

type expr = Syntax.expr

The type of guest-level expressions

type value = Value.t

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Syntax/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Syntax/index.html new file mode 100644 index 00000000..44d4e35c --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Compiler.Make.L.Guest.Syntax)

Module Guest.Syntax

module Types = Types

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Systemc/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Systemc/index.html new file mode 100644 index 00000000..e207e0ea --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Systemc/index.html @@ -0,0 +1,5 @@ + +Systemc (rfsm.Rfsm.Compiler.Make.L.Guest.Systemc)

Module Guest.Systemc

module Static = Static
module Syntax = Syntax
type value = Value.t
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the SystemC declaration of symbol id with type ty.

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the SystemC type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td (resp. pp_type_impl fmt td) should print, on formatter fmt, the SystemC declaration and implementation (in the .h and .cpp file resp.) corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the SystemC expression corresponding to expression e.

val pp_typ : Stdlib.Format.formatter -> Syntax.Types.typ -> unit

pp_typ fmt ty should print, on formatter fmt, the SystemC type corresponding to type ty.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the SystemC representation of LHS l.

val pp_value : Stdlib.Format.formatter -> value -> unit

pp_value fmt v should print, on formatter fmt, the SystemC value corresponding to value v.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Types/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Types/index.html new file mode 100644 index 00000000..f820cefd --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Compiler.Make.L.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Typing/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Typing/index.html new file mode 100644 index 00000000..d98c793a --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Compiler.Make.L.Guest.Typing)

Module Guest.Typing

module Syntax = Syntax
module Types = Types

Typing environment

type env
val mk_env : unit -> env

mk_env () should return the initial typing environment. This environment should contain, in particular, bindings for builtins primitives, type and value constructors.

val lookup_var : loc:Location.t -> Ident.t -> env -> Types.typ

lookup_var l x env should return the type bound to identifier x in environment env. The behaviour when x is not bound in env is left to guest definition. A possibility is to raise Ident.Undefined for example.

val add_var : scope:Ident.scope -> env -> (Ident.t * Types.typ) -> env

add_var scope env (x,t) should return the environment obtained by the binding (x,t) to env. The scope parameter is a hint to the guest type inference system. Typically, it will be used to determine, in the case the added type contains type variables, whether these variables will be generalized (scope=Local) or not (scope=Global). The behaviour when x is already bound in env is left to guest definition.

val add_param : env -> (Ident.t * Syntax.expr) -> env

add_param env (x,t) should return the environment obtained by the binding (x,t) as a model parameter to env.

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of typing environment env on formatter fmt.

Low-level interface to the the type-checking engine

val type_check : loc:Location.t -> Types.typ -> Types.typ -> unit

type_check loc t t' should be called whenever types t and t' have to be unified at program location loc.

High-level interface to the type-checking engine

val type_type_decl : env -> Syntax.type_decl -> env

type_type_decl env td should return the typing environment obtained by type checking the type declaration td in environment env.

val type_expression : env -> Syntax.expr -> Types.typ

type_expression env e should return the type of expression e in environment env.

val type_of_type_expr : env -> Syntax.type_expr -> Types.typ

type_of_type_expr env te should return the type denoted by the type expression te in environment env.

val type_lhs : env -> Syntax.lhs -> Types.typ

type_lhs env l should return the type of LHS l in environment env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Value/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Value/index.html new file mode 100644 index 00000000..2b6c14de --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Compiler.Make.L.Guest.Value)

Module Guest.Value

type t

The type of guest-level values

type typ = Types.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Vhdl/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Vhdl/index.html new file mode 100644 index 00000000..23e291e8 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/Vhdl/index.html @@ -0,0 +1,2 @@ + +Vhdl (rfsm.Rfsm.Compiler.Make.L.Guest.Vhdl)

Module Guest.Vhdl

module Syntax = Syntax
module Static = Static
type value = Value.t
val vhdl_type_of : Syntax.Types.typ -> Vhdl_types.t

vhdl_type_of ty should return the VHDL type corresponding to type ty.

val allowed_shared_type : Syntax.Types.typ -> bool

allowed_shared_type ty should indicate whether type ty can be attributed to a VHDL shared variable.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the VHDL translation of type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the VHDL expression corresponding to expression e.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the VHDL representation of LHS l.

val pp_value : Stdlib.Format.formatter -> (value * Vhdl_types.t) -> unit

pp_value fmt (v,t) should print, on formatter fmt, the VHDL value corresponding to value v, with type t.

val pp_type_fns_intf : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_fns_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_fns_intf td (resp. pp_type_fns_impl fmt td) should print, on formatter fmt, the VHDL declaration and implementation (in the entity and architecture definition resp.) corresponding to type declaration td.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/index.html new file mode 100644 index 00000000..e7f78248 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Guest/index.html @@ -0,0 +1,12 @@ + +Guest (rfsm.Rfsm.Compiler.Make.L.Guest)

Module L.Guest

module Info : Guest.INFO
module Syntax : Guest.SYNTAX with module Types = Types
module Typing : + Guest.TYPING with module Syntax = Syntax and module Types = Types
module Value : Guest.VALUE with type typ = Types.typ
module Static : + Guest.STATIC with type expr = Syntax.expr and type value = Value.t
module Eval : Guest.EVAL with module Syntax = Syntax and module Value = Value
module Ctask : Guest.CTASK with module Syntax = Syntax
module Systemc : + Guest.SYSTEMC + with module Syntax = Syntax + and module Static = Static + and type value = Value.t
module Vhdl : + Guest.VHDL + with module Syntax = Syntax + and module Static = Static + and type value = Value.t
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..16fa4942 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Compiler.Make.L.Static.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Syntax/Guest/index.html new file mode 100644 index 00000000..aa3d9561 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Compiler.Make.L.Static.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Syntax/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Syntax/index.html new file mode 100644 index 00000000..3a47dfff --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Compiler.Make.L.Static.Syntax)

Module Static.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Typing/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Typing/index.html new file mode 100644 index 00000000..794c9f5b --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Compiler.Make.L.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Value/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Value/index.html new file mode 100644 index 00000000..b2b1691f --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Compiler.Make.L.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/index.html new file mode 100644 index 00000000..3e62a688 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Compiler.Make.L.Static)

Module L.Static

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..fb13ad9d --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Compiler.Make.L.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Syntax/Guest/index.html new file mode 100644 index 00000000..7b4aa6b9 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Compiler.Make.L.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Syntax/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Syntax/index.html new file mode 100644 index 00000000..2a686c47 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Compiler.Make.L.Syntax)

Module L.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/Static/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/Static/index.html new file mode 100644 index 00000000..3c7c55a6 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Compiler.Make.L.Systemc.G.Static)

Module G.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/Syntax/Types/index.html new file mode 100644 index 00000000..16f9a497 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Compiler.Make.L.Systemc.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/Syntax/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/Syntax/index.html new file mode 100644 index 00000000..03f0aacc --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Compiler.Make.L.Systemc.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/index.html new file mode 100644 index 00000000..1d8b34b2 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/G/index.html @@ -0,0 +1,5 @@ + +G (rfsm.Rfsm.Compiler.Make.L.Systemc.G)

Module Systemc.G

type value
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the SystemC declaration of symbol id with type ty.

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the SystemC type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td (resp. pp_type_impl fmt td) should print, on formatter fmt, the SystemC declaration and implementation (in the .h and .cpp file resp.) corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the SystemC expression corresponding to expression e.

val pp_typ : Stdlib.Format.formatter -> Syntax.Types.typ -> unit

pp_typ fmt ty should print, on formatter fmt, the SystemC type corresponding to type ty.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the SystemC representation of LHS l.

val pp_value : Stdlib.Format.formatter -> value -> unit

pp_value fmt v should print, on formatter fmt, the SystemC value corresponding to value v.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/index.html new file mode 100644 index 00000000..2f1f6709 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Systemc/index.html @@ -0,0 +1,2 @@ + +Systemc (rfsm.Rfsm.Compiler.Make.L.Systemc)

Module L.Systemc

module Static = Static
module G : Guest.SYSTEMC
exception Invalid_output_assign of string * Location.t
val output : dir:string -> ?pfx:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/HostSyntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/HostSyntax/Guest/Types/index.html new file mode 100644 index 00000000..185e72a0 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/HostSyntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Compiler.Make.L.Typing.HostSyntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/HostSyntax/Guest/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/HostSyntax/Guest/index.html new file mode 100644 index 00000000..8a4acdad --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/HostSyntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Compiler.Make.L.Typing.HostSyntax.Guest)

Module HostSyntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/HostSyntax/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/HostSyntax/index.html new file mode 100644 index 00000000..eb542b3f --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/HostSyntax/index.html @@ -0,0 +1,5 @@ + +HostSyntax (rfsm.Rfsm.Compiler.Make.L.Typing.HostSyntax)

Module Typing.HostSyntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/index.html new file mode 100644 index 00000000..65b7a4da --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Compiler.Make.L.Typing)

Module L.Typing

type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vcd/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vcd/index.html new file mode 100644 index 00000000..597150c5 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vcd/index.html @@ -0,0 +1,2 @@ + +Vcd (rfsm.Rfsm.Compiler.Make.L.Vcd)

Module L.Vcd

type seq
exception Unsupported of Vcd_types.vcd_typ * Vcd_types.vcd_value
val output : fname:string -> seq -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/Static/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/Static/index.html new file mode 100644 index 00000000..ced3a16c --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Compiler.Make.L.Vhdl.G.Static)

Module G.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/Syntax/Types/index.html new file mode 100644 index 00000000..78678f2d --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Compiler.Make.L.Vhdl.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/Syntax/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/Syntax/index.html new file mode 100644 index 00000000..d39c33bf --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Compiler.Make.L.Vhdl.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/index.html new file mode 100644 index 00000000..cd3ba134 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/G/index.html @@ -0,0 +1,2 @@ + +G (rfsm.Rfsm.Compiler.Make.L.Vhdl.G)

Module Vhdl.G

type value
val vhdl_type_of : Syntax.Types.typ -> Vhdl_types.t

vhdl_type_of ty should return the VHDL type corresponding to type ty.

val allowed_shared_type : Syntax.Types.typ -> bool

allowed_shared_type ty should indicate whether type ty can be attributed to a VHDL shared variable.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the VHDL translation of type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the VHDL expression corresponding to expression e.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the VHDL representation of LHS l.

val pp_value : Stdlib.Format.formatter -> (value * Vhdl_types.t) -> unit

pp_value fmt (v,t) should print, on formatter fmt, the VHDL value corresponding to value v, with type t.

val pp_type_fns_intf : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_fns_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_fns_intf td (resp. pp_type_fns_impl fmt td) should print, on formatter fmt, the VHDL declaration and implementation (in the entity and architecture definition resp.) corresponding to type declaration td.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/index.html new file mode 100644 index 00000000..4132c548 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/Vhdl/index.html @@ -0,0 +1,2 @@ + +Vhdl (rfsm.Rfsm.Compiler.Make.L.Vhdl)

Module L.Vhdl

module Static = Static
module G : Guest.VHDL
exception Invalid_output_assign of string * Location.t
val output : dir:string -> ?pfx:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/index.html new file mode 100644 index 00000000..295f6819 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-1-L/index.html @@ -0,0 +1,3 @@ + +L (rfsm.Rfsm.Compiler.Make.L)

Parameter Make.L

module Guest : Guest.T
module Static : Static.T
module Dot : Dot.DOT with module Static = Static
module Dynamic : + Dynamic.DYNAMIC with module Syntax = Syntax and module Static = Static
module Vcd : Vcd.VCD
module Ctask : Ctask.CTASK with module Static = Static
module Systemc : Systemc.SYSTEMC with module Static = Static
module Vhdl : Vhdl.VHDL with module Static = Static
val run : ?vcd_file:string -> Syntax.program -> Static.t -> unit
val pp_program : Stdlib.Format.formatter -> Syntax.program -> unit
val pp_tenv : Stdlib.Format.formatter -> Typing.env -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-2-Lexer/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-2-Lexer/index.html new file mode 100644 index 00000000..ab8d2943 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-2-Lexer/index.html @@ -0,0 +1,2 @@ + +Lexer (rfsm.Rfsm.Compiler.Make.Lexer)

Parameter Make.Lexer

type token
type lexical_error =
  1. | Illegal_character
exception Lexical_error of lexical_error * int * int
val main : Stdlib.Lexing.lexbuf -> token
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/argument-3-Parser/index.html b/docs/rfsm/Rfsm/Compiler/Make/argument-3-Parser/index.html new file mode 100644 index 00000000..cb3c535d --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/argument-3-Parser/index.html @@ -0,0 +1,5 @@ + +Parser (rfsm.Rfsm.Compiler.Make.Parser)

Parameter Make.Parser

type token = Lexer.token
type program = L.Syntax.program
exception Error
val program : + (Stdlib.Lexing.lexbuf -> token) -> + Stdlib.Lexing.lexbuf -> + program
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/Make/index.html b/docs/rfsm/Rfsm/Compiler/Make/index.html new file mode 100644 index 00000000..bbb3c0ca --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/Make/index.html @@ -0,0 +1,2 @@ + +Make (rfsm.Rfsm.Compiler.Make)

Module Compiler.Make

Functor building the compiler structure given a language definition, a lexer and a parser implementation

Parameters

module L : Host.T
module Lexer : LEXER
module Parser : PARSER with type token = Lexer.token and type program = L.Syntax.program

Signature

val main : unit -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/index.html b/docs/rfsm/Rfsm/Compiler/index.html new file mode 100644 index 00000000..ec740013 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/index.html @@ -0,0 +1,7 @@ + +Compiler (rfsm.Rfsm.Compiler)

Module Rfsm.Compiler

The command-line compiler

module type T = sig ... end

Output signature of the functor Compiler.Make

module type PARSER = sig ... end

Signature for the Parser input to the functor Compiler.Make

module type LEXER = sig ... end

Signature for the Lexer input to the functor Compiler.Make

module Make + (L : Host.T) + (Lexer : LEXER) + (Parser : + PARSER with type token = Lexer.token and type program = L.Syntax.program) : + T

Functor building the compiler structure given a language definition, a lexer and a parser implementation

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/module-type-LEXER/index.html b/docs/rfsm/Rfsm/Compiler/module-type-LEXER/index.html new file mode 100644 index 00000000..dd791544 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/module-type-LEXER/index.html @@ -0,0 +1,2 @@ + +LEXER (rfsm.Rfsm.Compiler.LEXER)

Module type Compiler.LEXER

Signature for the Lexer input to the functor Compiler.Make

type token
type lexical_error =
  1. | Illegal_character
exception Lexical_error of lexical_error * int * int
val main : Stdlib.Lexing.lexbuf -> token
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/module-type-PARSER/index.html b/docs/rfsm/Rfsm/Compiler/module-type-PARSER/index.html new file mode 100644 index 00000000..5bfe5e0f --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/module-type-PARSER/index.html @@ -0,0 +1,5 @@ + +PARSER (rfsm.Rfsm.Compiler.PARSER)

Module type Compiler.PARSER

Signature for the Parser input to the functor Compiler.Make

type token
type program
exception Error
val program : + (Stdlib.Lexing.lexbuf -> token) -> + Stdlib.Lexing.lexbuf -> + program
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Compiler/module-type-T/index.html b/docs/rfsm/Rfsm/Compiler/module-type-T/index.html new file mode 100644 index 00000000..c29e2098 --- /dev/null +++ b/docs/rfsm/Rfsm/Compiler/module-type-T/index.html @@ -0,0 +1,2 @@ + +T (rfsm.Rfsm.Compiler.T)

Module type Compiler.T

Output signature of the functor Compiler.Make

val main : unit -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/Make/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Ctask/Make/G/Syntax/Types/index.html new file mode 100644 index 00000000..b4c16033 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/Make/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Ctask.Make.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/Make/G/Syntax/index.html b/docs/rfsm/Rfsm/Ctask/Make/G/Syntax/index.html new file mode 100644 index 00000000..cd83fc79 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/Make/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Ctask.Make.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/Make/G/index.html b/docs/rfsm/Rfsm/Ctask/Make/G/index.html new file mode 100644 index 00000000..033ec903 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/Make/G/index.html @@ -0,0 +1,5 @@ + +G (rfsm.Rfsm.Ctask.Make.G)

Module Make.G

val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the C declaration of symbol id with type ty. For example, for an int named "x", this should be "int x", and for an array of 8 ints named "a", this should be "int a[8]".

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the C type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the C statement corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the C expression corresponding to expression e.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..0e1c5717 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Ctask.Make.Static.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Syntax/Guest/index.html new file mode 100644 index 00000000..503197d0 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Ctask.Make.Static.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Syntax/index.html b/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Syntax/index.html new file mode 100644 index 00000000..9ce8ef6c --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Ctask.Make.Static.Syntax)

Module Static.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Typing/index.html b/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Typing/index.html new file mode 100644 index 00000000..3ab82895 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Ctask.Make.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Value/index.html b/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Value/index.html new file mode 100644 index 00000000..f1d777a7 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Ctask.Make.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/index.html b/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/index.html new file mode 100644 index 00000000..0474f290 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/Make/argument-1-Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Ctask.Make.Static)

Parameter Make.Static

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/Make/argument-2-Guest/index.html b/docs/rfsm/Rfsm/Ctask/Make/argument-2-Guest/index.html new file mode 100644 index 00000000..33df7942 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/Make/argument-2-Guest/index.html @@ -0,0 +1,5 @@ + +Guest (rfsm.Rfsm.Ctask.Make.Guest)

Parameter Make.Guest

module Syntax = Static.Syntax.Guest
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the C declaration of symbol id with type ty. For example, for an int named "x", this should be "int x", and for an array of 8 ints named "a", this should be "int a[8]".

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the C type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the C statement corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the C expression corresponding to expression e.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/Make/index.html b/docs/rfsm/Rfsm/Ctask/Make/index.html new file mode 100644 index 00000000..99c183df --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/Make/index.html @@ -0,0 +1,2 @@ + +Make (rfsm.Rfsm.Ctask.Make)

Module Ctask.Make

Parameters

module Static : Static.T

Signature

module Static = Static
module G : Guest.CTASK
exception Error of string * string
val output : dir:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/index.html b/docs/rfsm/Rfsm/Ctask/index.html new file mode 100644 index 00000000..2e394120 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/index.html @@ -0,0 +1,5 @@ + +Ctask (rfsm.Rfsm.Ctask)

Module Rfsm.Ctask

CTask backend

type cfg = {
  1. state_var_name : string;
  2. recvd_ev_name : string;
  3. globals_name : string;
  4. mutable show_models : bool;
}
val cfg : cfg
module type CTASK = sig ... end
module Make + (Static : Static.T) + (Guest : Guest.CTASK with module Syntax = Static.Syntax.Guest) : + CTASK with module Static = Static
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/module-type-CTASK/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/G/Syntax/Types/index.html new file mode 100644 index 00000000..14681e48 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Ctask.CTASK.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/module-type-CTASK/G/Syntax/index.html b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/G/Syntax/index.html new file mode 100644 index 00000000..a7153022 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Ctask.CTASK.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/module-type-CTASK/G/index.html b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/G/index.html new file mode 100644 index 00000000..9c182092 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/G/index.html @@ -0,0 +1,5 @@ + +G (rfsm.Rfsm.Ctask.CTASK.G)

Module CTASK.G

val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the C declaration of symbol id with type ty. For example, for an int named "x", this should be "int x", and for an array of 8 ints named "a", this should be "int a[8]".

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the C type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the C statement corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the C expression corresponding to expression e.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..f6c5dd40 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Ctask.CTASK.Static.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Syntax/Guest/index.html new file mode 100644 index 00000000..8a07adcb --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Ctask.CTASK.Static.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Syntax/index.html b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Syntax/index.html new file mode 100644 index 00000000..d799159e --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Ctask.CTASK.Static.Syntax)

Module Static.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Typing/index.html b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Typing/index.html new file mode 100644 index 00000000..bf12a8f2 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Ctask.CTASK.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Value/index.html b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Value/index.html new file mode 100644 index 00000000..54cdd8a4 --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Ctask.CTASK.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/index.html b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/index.html new file mode 100644 index 00000000..da6e6edd --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Ctask.CTASK.Static)

Module CTASK.Static

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ctask/module-type-CTASK/index.html b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/index.html new file mode 100644 index 00000000..0103ba7c --- /dev/null +++ b/docs/rfsm/Rfsm/Ctask/module-type-CTASK/index.html @@ -0,0 +1,2 @@ + +CTASK (rfsm.Rfsm.Ctask.CTASK)

Module type Ctask.CTASK

module Static : Static.T
module G : Guest.CTASK
exception Error of string * string
val output : dir:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Depg/G/E/index.html b/docs/rfsm/Rfsm/Depg/G/E/index.html new file mode 100644 index 00000000..35553c03 --- /dev/null +++ b/docs/rfsm/Rfsm/Depg/G/E/index.html @@ -0,0 +1,2 @@ + +E (rfsm.Rfsm.Depg.G.E)

Module G.E

type t = Graph__Imperative.Digraph.Abstract(Rfsm.Ident).E.t
val compare : t -> t -> int
type vertex = vertex
val src : t -> vertex
val dst : t -> vertex
type label = unit
val create : vertex -> label -> vertex -> t
val label : t -> label
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Depg/G/Mark/index.html b/docs/rfsm/Rfsm/Depg/G/Mark/index.html new file mode 100644 index 00000000..99ae6e3d --- /dev/null +++ b/docs/rfsm/Rfsm/Depg/G/Mark/index.html @@ -0,0 +1,2 @@ + +Mark (rfsm.Rfsm.Depg.G.Mark)

Module G.Mark

type graph = t
type vertex = vertex
val clear : graph -> unit
val get : vertex -> int
val set : vertex -> int -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Depg/G/V/index.html b/docs/rfsm/Rfsm/Depg/G/V/index.html new file mode 100644 index 00000000..e3643195 --- /dev/null +++ b/docs/rfsm/Rfsm/Depg/G/V/index.html @@ -0,0 +1,2 @@ + +V (rfsm.Rfsm.Depg.G.V)

Module G.V

type t = Graph__Imperative.Digraph.Abstract(Rfsm.Ident).V.t
val compare : t -> t -> int
val hash : t -> int
val equal : t -> t -> bool
type label = Ident.t
val create : label -> t
val label : t -> label
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Depg/G/index.html b/docs/rfsm/Rfsm/Depg/G/index.html new file mode 100644 index 00000000..08e26fa8 --- /dev/null +++ b/docs/rfsm/Rfsm/Depg/G/index.html @@ -0,0 +1,2 @@ + +G (rfsm.Rfsm.Depg.G)

Module Depg.G

Graphs for which vertices are simple names

type t = Graph__Imperative.Digraph.Abstract(Rfsm.Ident).t
module V : sig ... end
type vertex = V.t
module E : sig ... end
type edge = E.t
val is_directed : bool
val is_empty : t -> bool
val nb_vertex : t -> int
val nb_edges : t -> int
val out_degree : t -> vertex -> int
val in_degree : t -> vertex -> int
val mem_vertex : t -> vertex -> bool
val mem_edge : t -> vertex -> vertex -> bool
val mem_edge_e : t -> edge -> bool
val find_edge : t -> vertex -> vertex -> edge
val find_all_edges : t -> vertex -> vertex -> edge list
val succ : t -> vertex -> vertex list
val pred : t -> vertex -> vertex list
val succ_e : t -> vertex -> edge list
val pred_e : t -> vertex -> edge list
val iter_vertex : (vertex -> unit) -> t -> unit
val fold_vertex : (vertex -> 'a -> 'a) -> t -> 'a -> 'a
val iter_edges : (vertex -> vertex -> unit) -> t -> unit
val fold_edges : (vertex -> vertex -> 'a -> 'a) -> t -> 'a -> 'a
val iter_edges_e : (edge -> unit) -> t -> unit
val fold_edges_e : (edge -> 'a -> 'a) -> t -> 'a -> 'a
val map_vertex : (vertex -> vertex) -> t -> t
val iter_succ : (vertex -> unit) -> t -> vertex -> unit
val iter_pred : (vertex -> unit) -> t -> vertex -> unit
val fold_succ : (vertex -> 'a -> 'a) -> t -> vertex -> 'a -> 'a
val fold_pred : (vertex -> 'a -> 'a) -> t -> vertex -> 'a -> 'a
val iter_succ_e : (edge -> unit) -> t -> vertex -> unit
val fold_succ_e : (edge -> 'a -> 'a) -> t -> vertex -> 'a -> 'a
val iter_pred_e : (edge -> unit) -> t -> vertex -> unit
val fold_pred_e : (edge -> 'a -> 'a) -> t -> vertex -> 'a -> 'a
val create : ?size:int -> unit -> t
val clear : t -> unit
val copy : t -> t
val add_vertex : t -> vertex -> unit
val remove_vertex : t -> vertex -> unit
val add_edge : t -> vertex -> vertex -> unit
val add_edge_e : t -> edge -> unit
val remove_edge : t -> vertex -> vertex -> unit
val remove_edge_e : t -> edge -> unit
module Mark : sig ... end
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Depg/M/index.html b/docs/rfsm/Rfsm/Depg/M/index.html new file mode 100644 index 00000000..675fec56 --- /dev/null +++ b/docs/rfsm/Rfsm/Depg/M/index.html @@ -0,0 +1,6 @@ + +M (rfsm.Rfsm.Depg.M)

Module Depg.M

Graphs for which vertices are simple names

For mapping names to vertices and to full descriptors

type key = Ident.t
type !'a t = 'a Stdlib__Map.Make(Rfsm.Ident).t
val empty : 'a t
val is_empty : 'a t -> bool
val mem : key -> 'a t -> bool
val add : key -> 'a -> 'a t -> 'a t
val update : key -> ('a option -> 'a option) -> 'a t -> 'a t
val singleton : key -> 'a -> 'a t
val remove : key -> 'a t -> 'a t
val merge : + (key -> 'a option -> 'b option -> 'c option) -> + 'a t -> + 'b t -> + 'c t
val union : (key -> 'a -> 'a -> 'a option) -> 'a t -> 'a t -> 'a t
val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int
val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
val iter : (key -> 'a -> unit) -> 'a t -> unit
val fold : (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
val for_all : (key -> 'a -> bool) -> 'a t -> bool
val exists : (key -> 'a -> bool) -> 'a t -> bool
val filter : (key -> 'a -> bool) -> 'a t -> 'a t
val filter_map : (key -> 'a -> 'b option) -> 'a t -> 'b t
val partition : (key -> 'a -> bool) -> 'a t -> 'a t * 'a t
val cardinal : 'a t -> int
val bindings : 'a t -> (key * 'a) list
val min_binding : 'a t -> key * 'a
val min_binding_opt : 'a t -> (key * 'a) option
val max_binding : 'a t -> key * 'a
val max_binding_opt : 'a t -> (key * 'a) option
val choose : 'a t -> key * 'a
val choose_opt : 'a t -> (key * 'a) option
val split : key -> 'a t -> 'a t * 'a option * 'a t
val find : key -> 'a t -> 'a
val find_opt : key -> 'a t -> 'a option
val find_first : (key -> bool) -> 'a t -> key * 'a
val find_first_opt : (key -> bool) -> 'a t -> (key * 'a) option
val find_last : (key -> bool) -> 'a t -> key * 'a
val find_last_opt : (key -> bool) -> 'a t -> (key * 'a) option
val map : ('a -> 'b) -> 'a t -> 'b t
val mapi : (key -> 'a -> 'b) -> 'a t -> 'b t
val to_seq : 'a t -> (key * 'a) Stdlib.Seq.t
val to_rev_seq : 'a t -> (key * 'a) Stdlib.Seq.t
val to_seq_from : key -> 'a t -> (key * 'a) Stdlib.Seq.t
val add_seq : (key * 'a) Stdlib.Seq.t -> 'a t -> 'a t
val of_seq : (key * 'a) Stdlib.Seq.t -> 'a t
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Depg/Make/argument-1-N/index.html b/docs/rfsm/Rfsm/Depg/Make/argument-1-N/index.html new file mode 100644 index 00000000..6d23d5d2 --- /dev/null +++ b/docs/rfsm/Rfsm/Depg/Make/argument-1-N/index.html @@ -0,0 +1,2 @@ + +N (rfsm.Rfsm.Depg.Make.N)

Parameter Make.N

type t
type context
val name_of : t -> Ident.t

name_of n should return a unique name for node n

val depends_on : context -> t -> t -> bool

name_of n should return a unique name for node n

depends_on c n n' returns true if node n depends on node n' in context c, false otherwise.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Depg/Make/index.html b/docs/rfsm/Rfsm/Depg/Make/index.html new file mode 100644 index 00000000..75c646a6 --- /dev/null +++ b/docs/rfsm/Rfsm/Depg/Make/index.html @@ -0,0 +1,2 @@ + +Make (rfsm.Rfsm.Depg.Make)

Module Depg.Make

Parameters

module N : NODE

Signature

type node = N.t
type context = N.context
val dep_sort : context -> node list -> node list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Depg/TS/index.html b/docs/rfsm/Rfsm/Depg/TS/index.html new file mode 100644 index 00000000..f67f06e8 --- /dev/null +++ b/docs/rfsm/Rfsm/Depg/TS/index.html @@ -0,0 +1,2 @@ + +TS (rfsm.Rfsm.Depg.TS)

Module Depg.TS

For mapping names to vertices and to full descriptors

For topological sorting

val fold : (G.V.t -> 'a -> 'a) -> G.t -> 'a -> 'a
val iter : (G.V.t -> unit) -> G.t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Depg/index.html b/docs/rfsm/Rfsm/Depg/index.html new file mode 100644 index 00000000..6d6c5820 --- /dev/null +++ b/docs/rfsm/Rfsm/Depg/index.html @@ -0,0 +1,2 @@ + +Depg (rfsm.Rfsm.Depg)

Module Rfsm.Depg

Dependency graphs

module G : sig ... end

Graphs for which vertices are simple names

module M : sig ... end

Graphs for which vertices are simple names

module TS : sig ... end

For mapping names to vertices and to full descriptors

The signature for graph nodes

module type NODE = sig ... end

The signature of the module performing dependency sorting of a graph of nodes

module type T = sig ... end

The functor building such a module

module Make (N : NODE) : T with type node = N.t and type context = N.context
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Depg/module-type-NODE/index.html b/docs/rfsm/Rfsm/Depg/module-type-NODE/index.html new file mode 100644 index 00000000..9b7c6152 --- /dev/null +++ b/docs/rfsm/Rfsm/Depg/module-type-NODE/index.html @@ -0,0 +1,2 @@ + +NODE (rfsm.Rfsm.Depg.NODE)

Module type Depg.NODE

type t
type context
val name_of : t -> Ident.t

name_of n should return a unique name for node n

val depends_on : context -> t -> t -> bool

name_of n should return a unique name for node n

depends_on c n n' returns true if node n depends on node n' in context c, false otherwise.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Depg/module-type-T/index.html b/docs/rfsm/Rfsm/Depg/module-type-T/index.html new file mode 100644 index 00000000..59b0ba5c --- /dev/null +++ b/docs/rfsm/Rfsm/Depg/module-type-T/index.html @@ -0,0 +1,2 @@ + +T (rfsm.Rfsm.Depg.T)

Module type Depg.T

type node
type context
val dep_sort : context -> node list -> node list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..ffbb4935 --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Dot.Make.S.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Syntax/Guest/index.html new file mode 100644 index 00000000..ce7601de --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Dot.Make.S.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Syntax/index.html b/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Syntax/index.html new file mode 100644 index 00000000..9fe678f3 --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Dot.Make.S.Syntax)

Module S.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Typing/index.html b/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Typing/index.html new file mode 100644 index 00000000..16104173 --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Dot.Make.S.Typing)

Module S.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Value/index.html b/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Value/index.html new file mode 100644 index 00000000..b3306f18 --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/Make/argument-1-S/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Dot.Make.S.Value)

Module S.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/Make/argument-1-S/index.html b/docs/rfsm/Rfsm/Dot/Make/argument-1-S/index.html new file mode 100644 index 00000000..dda9b878 --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/Make/argument-1-S/index.html @@ -0,0 +1,2 @@ + +S (rfsm.Rfsm.Dot.Make.S)

Parameter Make.S

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/Make/index.html b/docs/rfsm/Rfsm/Dot/Make/index.html new file mode 100644 index 00000000..c80d5f8b --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/Make/index.html @@ -0,0 +1,2 @@ + +Make (rfsm.Rfsm.Dot.Make)

Module Dot.Make

Parameters

module S : Static.T

Signature

module Static = S
val output_static : dir:string -> name:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/index.html b/docs/rfsm/Rfsm/Dot/index.html new file mode 100644 index 00000000..36c8d6e6 --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/index.html @@ -0,0 +1,2 @@ + +Dot (rfsm.Rfsm.Dot)

Module Rfsm.Dot

DOT backend

module type DOT = sig ... end
type cfg = {
  1. mutable node_shape : string;
  2. mutable node_style : string;
  3. mutable layout : string;
  4. mutable rankdir : string;
  5. mutable mindist : float;
  6. mutable trans_vlayout : bool;
  7. mutable qual_ids : bool;
  8. mutable abbrev_types : bool;
  9. mutable show_models : bool;
  10. mutable show_captions : bool;
  11. mutable boxed : bool;
}
val cfg : cfg
module Make (S : Static.T) : DOT with module Static = S
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..30bd36d0 --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Dot.DOT.Static.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Syntax/Guest/index.html new file mode 100644 index 00000000..c67df9ce --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Dot.DOT.Static.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Syntax/index.html b/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Syntax/index.html new file mode 100644 index 00000000..45527edd --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Dot.DOT.Static.Syntax)

Module Static.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Typing/index.html b/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Typing/index.html new file mode 100644 index 00000000..d79dea67 --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Dot.DOT.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Value/index.html b/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Value/index.html new file mode 100644 index 00000000..925e40c9 --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Dot.DOT.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/index.html b/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/index.html new file mode 100644 index 00000000..18fa569f --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/module-type-DOT/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Dot.DOT.Static)

Module DOT.Static

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dot/module-type-DOT/index.html b/docs/rfsm/Rfsm/Dot/module-type-DOT/index.html new file mode 100644 index 00000000..205f6760 --- /dev/null +++ b/docs/rfsm/Rfsm/Dot/module-type-DOT/index.html @@ -0,0 +1,2 @@ + +DOT (rfsm.Rfsm.Dot.DOT)

Module type Dot.DOT

module Static : Static.T
val output_static : dir:string -> name:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/Syntax/Types/index.html b/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/Syntax/Types/index.html new file mode 100644 index 00000000..6b22386e --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Dynamic.Make.EvSeq.Evset.Event.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/Syntax/index.html b/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/Syntax/index.html new file mode 100644 index 00000000..cb8ef242 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Dynamic.Make.EvSeq.Evset.Event.Syntax)

Module Event.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/Value/index.html b/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/Value/index.html new file mode 100644 index 00000000..a2e4733e --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Dynamic.Make.EvSeq.Evset.Event.Value)

Module Event.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/index.html b/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/index.html new file mode 100644 index 00000000..3c4e2bbe --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/Event/index.html @@ -0,0 +1,2 @@ + +Event (rfsm.Rfsm.Dynamic.Make.EvSeq.Evset.Event)

Module Evset.Event

type t =
  1. | Ev of Ident.t
    (*

    pure event

    *)
  2. | Upd of Syntax.lhs * Value.t
    (*

    assignation (lhs <- v)

    *)
  3. | StateMove of string * string
    (*

    state move (src,dst)

    *)
val is_pure_event : t -> bool
val compare : t -> t -> int
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/index.html b/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/index.html new file mode 100644 index 00000000..149e929a --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/Evset/index.html @@ -0,0 +1,2 @@ + +Evset (rfsm.Rfsm.Dynamic.Make.EvSeq.Evset)

Module EvSeq.Evset

module Event : Event.T
type date = int
type t
exception Union of t * t
val mk : date -> Event.t list -> t
val empty : date -> t
val date : t -> date
val events : t -> Event.t list
val is_empty : t -> bool
exception Add of Event.t
val add : t -> Event.t -> t
val union : t -> t -> t
val union_all : date -> t list -> t
val partition : f:(Event.t -> bool) -> t -> t * t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/index.html b/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/index.html new file mode 100644 index 00000000..26d0b4a0 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/EvSeq/index.html @@ -0,0 +1,2 @@ + +EvSeq (rfsm.Rfsm.Dynamic.Make.EvSeq)

Module Make.EvSeq

module Evset : Evset.T
type t = Evset.t list
type value
val merge : t -> t -> t
val (@@) : t -> t -> t

@@ is the infix notation for merge

val merge_all : t list -> t
val mk_periodic : Ident.t -> int -> int -> int -> t
val mk_changes : Ident.t -> (int * value) list -> t
val mk_sporadic : Ident.t -> int list -> t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/argument-1-Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Dynamic/Make/argument-1-Syntax/Guest/Types/index.html new file mode 100644 index 00000000..02ddae24 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/argument-1-Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Dynamic.Make.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/argument-1-Syntax/Guest/index.html b/docs/rfsm/Rfsm/Dynamic/Make/argument-1-Syntax/Guest/index.html new file mode 100644 index 00000000..e03be956 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/argument-1-Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Dynamic.Make.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/argument-1-Syntax/index.html b/docs/rfsm/Rfsm/Dynamic/Make/argument-1-Syntax/index.html new file mode 100644 index 00000000..4b4e69e1 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/argument-1-Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Dynamic.Make.Syntax)

Parameter Make.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/argument-2-Static/Typing/index.html b/docs/rfsm/Rfsm/Dynamic/Make/argument-2-Static/Typing/index.html new file mode 100644 index 00000000..5cb3ffac --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/argument-2-Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Dynamic.Make.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/argument-2-Static/Value/index.html b/docs/rfsm/Rfsm/Dynamic/Make/argument-2-Static/Value/index.html new file mode 100644 index 00000000..19c81320 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/argument-2-Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Dynamic.Make.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/argument-2-Static/index.html b/docs/rfsm/Rfsm/Dynamic/Make/argument-2-Static/index.html new file mode 100644 index 00000000..65ec82a0 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/argument-2-Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Dynamic.Make.Static)

Parameter Make.Static

module Syntax = Syntax
module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/argument-3-Eval/index.html b/docs/rfsm/Rfsm/Dynamic/Make/argument-3-Eval/index.html new file mode 100644 index 00000000..8e8f33f2 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/argument-3-Eval/index.html @@ -0,0 +1,2 @@ + +Eval (rfsm.Rfsm.Dynamic.Make.Eval)

Parameter Make.Eval

module Syntax = Syntax.Guest
module Value = Static.Value
type env = Value.t Env.t

The type of dynamic environments, mapping identifiers to values.

val mk_env : unit -> env

mk_env () should return a new, empty dynamic environment

val upd_env : Syntax.lhs -> Value.t -> env -> env

upd_env l v env should return the environment obtained by adding the binding (l,v) to env. If l is already bound in env, the associated value is updated.

Evaluators

exception Illegal_expr of Syntax.expr
val eval_expr : env -> Syntax.expr -> Value.t

eval_expr env e should return the value obtained by evaluating expression e in environment env. Should raise Illegal_expr in case of failure.

val eval_bool : env -> Syntax.expr -> bool

eval_bool env e should return the boolean value obtained by evaluating expression e in environment env. Should raise Illegal_expr if e does not denote a boolean value or in case of failure.

Printing

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of environment env on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/Make/index.html b/docs/rfsm/Rfsm/Dynamic/Make/index.html new file mode 100644 index 00000000..87d48d24 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/Make/index.html @@ -0,0 +1,2 @@ + +Make (rfsm.Rfsm.Dynamic.Make)

Module Dynamic.Make

Parameters

module Static : Static.T with module Syntax = Syntax
module Eval : Guest.EVAL with module Syntax = Syntax.Guest and module Value = Static.Value

Signature

module Syntax = Syntax
module Static = Static
module Eval = Eval
exception Illegal_stimulus_value of Location.t
exception Non_deterministic_transition of string * int * Syntax.transition list

FSM name, date, transitions

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/index.html b/docs/rfsm/Rfsm/Dynamic/index.html new file mode 100644 index 00000000..54aad179 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/index.html @@ -0,0 +1,12 @@ + +Dynamic (rfsm.Rfsm.Dynamic)

Module Rfsm.Dynamic

Dynamic semantics. Used for simulating programs

This is a direct translation of the formal semantics described in the reference manual

type cfg = {
  1. mutable act_semantics : Misc.act_semantics;
  2. mutable verbose_level : int;
}
val cfg : cfg
module type DYNAMIC = sig ... end
module Make + (Syntax : Syntax.SYNTAX) + (Static : Static.T with module Syntax = Syntax) + (Eval : + Guest.EVAL + with module Syntax = Syntax.Guest + and module Value = Static.Value) : + DYNAMIC + with module Syntax = Syntax + and module Static = Static + and module Eval = Eval
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/Syntax/Types/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/Syntax/Types/index.html new file mode 100644 index 00000000..6f0a10b5 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Dynamic.DYNAMIC.EvSeq.Evset.Event.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/Syntax/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/Syntax/index.html new file mode 100644 index 00000000..5d493952 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Dynamic.DYNAMIC.EvSeq.Evset.Event.Syntax)

Module Event.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/Value/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/Value/index.html new file mode 100644 index 00000000..ac593ebe --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Dynamic.DYNAMIC.EvSeq.Evset.Event.Value)

Module Event.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/index.html new file mode 100644 index 00000000..18170087 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/Event/index.html @@ -0,0 +1,2 @@ + +Event (rfsm.Rfsm.Dynamic.DYNAMIC.EvSeq.Evset.Event)

Module Evset.Event

type t =
  1. | Ev of Ident.t
    (*

    pure event

    *)
  2. | Upd of Syntax.lhs * Value.t
    (*

    assignation (lhs <- v)

    *)
  3. | StateMove of string * string
    (*

    state move (src,dst)

    *)
val is_pure_event : t -> bool
val compare : t -> t -> int
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/index.html new file mode 100644 index 00000000..cb17fdeb --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/Evset/index.html @@ -0,0 +1,2 @@ + +Evset (rfsm.Rfsm.Dynamic.DYNAMIC.EvSeq.Evset)

Module EvSeq.Evset

module Event : Event.T
type date = int
type t
exception Union of t * t
val mk : date -> Event.t list -> t
val empty : date -> t
val date : t -> date
val events : t -> Event.t list
val is_empty : t -> bool
exception Add of Event.t
val add : t -> Event.t -> t
val union : t -> t -> t
val union_all : date -> t list -> t
val partition : f:(Event.t -> bool) -> t -> t * t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/index.html new file mode 100644 index 00000000..3ff34fbf --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/EvSeq/index.html @@ -0,0 +1,2 @@ + +EvSeq (rfsm.Rfsm.Dynamic.DYNAMIC.EvSeq)

Module DYNAMIC.EvSeq

module Evset : Evset.T
type t = Evset.t list
type value
val merge : t -> t -> t
val (@@) : t -> t -> t

@@ is the infix notation for merge

val merge_all : t list -> t
val mk_periodic : Ident.t -> int -> int -> int -> t
val mk_changes : Ident.t -> (int * value) list -> t
val mk_sporadic : Ident.t -> int list -> t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/Syntax/Types/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/Syntax/Types/index.html new file mode 100644 index 00000000..8cc9c9f5 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Dynamic.DYNAMIC.Eval.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/Syntax/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/Syntax/index.html new file mode 100644 index 00000000..2914c52f --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Dynamic.DYNAMIC.Eval.Syntax)

Module Eval.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/Value/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/Value/index.html new file mode 100644 index 00000000..76d1b553 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Dynamic.DYNAMIC.Eval.Value)

Module Eval.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/index.html new file mode 100644 index 00000000..8996dcc2 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Eval/index.html @@ -0,0 +1,2 @@ + +Eval (rfsm.Rfsm.Dynamic.DYNAMIC.Eval)

Module DYNAMIC.Eval

type env = Value.t Env.t

The type of dynamic environments, mapping identifiers to values.

val mk_env : unit -> env

mk_env () should return a new, empty dynamic environment

val upd_env : Syntax.lhs -> Value.t -> env -> env

upd_env l v env should return the environment obtained by adding the binding (l,v) to env. If l is already bound in env, the associated value is updated.

Evaluators

exception Illegal_expr of Syntax.expr
val eval_expr : env -> Syntax.expr -> Value.t

eval_expr env e should return the value obtained by evaluating expression e in environment env. Should raise Illegal_expr in case of failure.

val eval_bool : env -> Syntax.expr -> bool

eval_bool env e should return the boolean value obtained by evaluating expression e in environment env. Should raise Illegal_expr if e does not denote a boolean value or in case of failure.

Printing

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of environment env on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..f4f78bcc --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Dynamic.DYNAMIC.Static.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Syntax/Guest/index.html new file mode 100644 index 00000000..960ee6b1 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Dynamic.DYNAMIC.Static.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Syntax/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Syntax/index.html new file mode 100644 index 00000000..fb203e7b --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Dynamic.DYNAMIC.Static.Syntax)

Module Static.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Typing/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Typing/index.html new file mode 100644 index 00000000..d02ee72d --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Dynamic.DYNAMIC.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Value/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Value/index.html new file mode 100644 index 00000000..3b40c0ad --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Dynamic.DYNAMIC.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/index.html new file mode 100644 index 00000000..62034472 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Dynamic.DYNAMIC.Static)

Module DYNAMIC.Static

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..7c58692a --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Dynamic.DYNAMIC.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Syntax/Guest/index.html new file mode 100644 index 00000000..9c468b3a --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Dynamic.DYNAMIC.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Syntax/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Syntax/index.html new file mode 100644 index 00000000..000338cc --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Dynamic.DYNAMIC.Syntax)

Module DYNAMIC.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/index.html b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/index.html new file mode 100644 index 00000000..113c0fc5 --- /dev/null +++ b/docs/rfsm/Rfsm/Dynamic/module-type-DYNAMIC/index.html @@ -0,0 +1,2 @@ + +DYNAMIC (rfsm.Rfsm.Dynamic.DYNAMIC)

Module type Dynamic.DYNAMIC

module Static : Static.T
module Eval : Guest.EVAL
exception Illegal_stimulus_value of Location.t
exception Non_deterministic_transition of string * int * Syntax.transition list

FSM name, date, transitions

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Env/index.html b/docs/rfsm/Rfsm/Env/index.html new file mode 100644 index 00000000..ad33954d --- /dev/null +++ b/docs/rfsm/Rfsm/Env/index.html @@ -0,0 +1,13 @@ + +Env (rfsm.Rfsm.Env)

Module Rfsm.Env

Environments

type 'a t

The type of environments, mapping identifiers, of type Ident.t to values of type 'a

val empty : 'a t

The empty environment

val is_empty : 'a t -> bool

is_empty e is true iff e is empty

val bindings : 'a t -> (Ident.t * 'a) list

bindings e returns the list of bindings in e

val dom : 'a t -> Ident.t list

dom e returns the domain of e, i.e. the list of identifiers bounds in e

val init : (Ident.t * 'a) list -> 'a t

init builds an environment from a list of bindings

val add : Ident.t -> 'a -> 'a t -> 'a t

add i v e returns the environment obtained by adding binding i->v to e. The benavior is the same as for Stdlib.Map.S.add: if i was already bound in e to a value that is physically equal to v, e is returned unchanged. Otherwise, the previous binding of i in e disappears.

val union : 'a t -> 'a t -> 'a t

union e1 e2 returns the union of environments e1 and e2. If an identifier is bound both in e1 and e2, that from e1 disappears.

val mem : Ident.t -> 'a t -> bool

mem i e returns true if e contains a binding for i, false otherwise.

val find : Ident.t -> 'a t -> 'a

find i e returns the value bound to i in e. Raises Not_found if no binding for i exists.

val upd : Ident.t -> 'a -> 'a t -> 'a t

upd i v e returns a environment in which the value bound to i in e has been replaced by v. Returns e unchanged if i is not bound in e.

val filter : (Ident.t -> 'a -> bool) -> 'a t -> 'a t
val fold : (Ident.t -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
val iter : (Ident.t -> 'a -> unit) -> 'a t -> unit
val map : ('a -> 'b) -> 'a t -> 'b t

filter, fold, iter and map are the classical higher-order functions operating on environments.

val pp : + ?sep:string -> + ?vlayout:bool -> + ?qual:bool -> + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit

pp p fmt e prints environment e using the formatter fmt and the pretty-printing function p for printing the bound values. Optional arguments sep, vlayout and qual are respectively used to specify

  • the binding symbol (default: "=")
  • whether bindings are printed on a single horizontal box (default) or on vertically aligned boxes
  • whether to print qualfied identifiers or not (default)
val pp_dom : + pp_ident:(Stdlib.Format.formatter -> Ident.t -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit

pp_dom ~pp_ident fmt e printfs the domain of environment e using the formatter fmt and the pretty-printing function pp_ident to print identifiers

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Event/Make/argument-1-GS/Types/index.html b/docs/rfsm/Rfsm/Event/Make/argument-1-GS/Types/index.html new file mode 100644 index 00000000..eed30cf3 --- /dev/null +++ b/docs/rfsm/Rfsm/Event/Make/argument-1-GS/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Event.Make.GS.Types)

Module GS.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Event/Make/argument-1-GS/index.html b/docs/rfsm/Rfsm/Event/Make/argument-1-GS/index.html new file mode 100644 index 00000000..f942a95a --- /dev/null +++ b/docs/rfsm/Rfsm/Event/Make/argument-1-GS/index.html @@ -0,0 +1,2 @@ + +GS (rfsm.Rfsm.Event.Make.GS)

Parameter Make.GS

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Event/Make/argument-2-GV/index.html b/docs/rfsm/Rfsm/Event/Make/argument-2-GV/index.html new file mode 100644 index 00000000..c4953cf0 --- /dev/null +++ b/docs/rfsm/Rfsm/Event/Make/argument-2-GV/index.html @@ -0,0 +1,2 @@ + +GV (rfsm.Rfsm.Event.Make.GV)

Parameter Make.GV

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Event/Make/index.html b/docs/rfsm/Rfsm/Event/Make/index.html new file mode 100644 index 00000000..e5b57553 --- /dev/null +++ b/docs/rfsm/Rfsm/Event/Make/index.html @@ -0,0 +1,2 @@ + +Make (rfsm.Rfsm.Event.Make)

Module Event.Make

Parameters

module GS : Guest.SYNTAX
module GV : Guest.VALUE

Signature

module Syntax = GS
module Value = GV
type t =
  1. | Ev of Ident.t
    (*

    pure event

    *)
  2. | Upd of Syntax.lhs * Value.t
    (*

    assignation (lhs <- v)

    *)
  3. | StateMove of string * string
    (*

    state move (src,dst)

    *)
val is_pure_event : t -> bool
val compare : t -> t -> int
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Event/index.html b/docs/rfsm/Rfsm/Event/index.html new file mode 100644 index 00000000..07ac6c4e --- /dev/null +++ b/docs/rfsm/Rfsm/Event/index.html @@ -0,0 +1,5 @@ + +Event (rfsm.Rfsm.Event)

Module Rfsm.Event

Events

module type T = sig ... end
module Make + (GS : Guest.SYNTAX) + (GV : Guest.VALUE) : + T with module Syntax = GS and module Value = GV
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Event/module-type-T/Syntax/Types/index.html b/docs/rfsm/Rfsm/Event/module-type-T/Syntax/Types/index.html new file mode 100644 index 00000000..ce1fe7b3 --- /dev/null +++ b/docs/rfsm/Rfsm/Event/module-type-T/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Event.T.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Event/module-type-T/Syntax/index.html b/docs/rfsm/Rfsm/Event/module-type-T/Syntax/index.html new file mode 100644 index 00000000..c85c920e --- /dev/null +++ b/docs/rfsm/Rfsm/Event/module-type-T/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Event.T.Syntax)

Module T.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Event/module-type-T/Value/index.html b/docs/rfsm/Rfsm/Event/module-type-T/Value/index.html new file mode 100644 index 00000000..fd93ac2d --- /dev/null +++ b/docs/rfsm/Rfsm/Event/module-type-T/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Event.T.Value)

Module T.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Event/module-type-T/index.html b/docs/rfsm/Rfsm/Event/module-type-T/index.html new file mode 100644 index 00000000..2792846b --- /dev/null +++ b/docs/rfsm/Rfsm/Event/module-type-T/index.html @@ -0,0 +1,2 @@ + +T (rfsm.Rfsm.Event.T)

Module type Event.T

type t =
  1. | Ev of Ident.t
    (*

    pure event

    *)
  2. | Upd of Syntax.lhs * Value.t
    (*

    assignation (lhs <- v)

    *)
  3. | StateMove of string * string
    (*

    state move (src,dst)

    *)
val is_pure_event : t -> bool
val compare : t -> t -> int
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/Syntax/Types/index.html b/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/Syntax/Types/index.html new file mode 100644 index 00000000..1ad84a46 --- /dev/null +++ b/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Evseq.Make.ES.Event.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/Syntax/index.html b/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/Syntax/index.html new file mode 100644 index 00000000..1e93fc8e --- /dev/null +++ b/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Evseq.Make.ES.Event.Syntax)

Module Event.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/Value/index.html b/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/Value/index.html new file mode 100644 index 00000000..dae00c15 --- /dev/null +++ b/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Evseq.Make.ES.Event.Value)

Module Event.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/index.html b/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/index.html new file mode 100644 index 00000000..3ad5f23a --- /dev/null +++ b/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/Event/index.html @@ -0,0 +1,2 @@ + +Event (rfsm.Rfsm.Evseq.Make.ES.Event)

Module ES.Event

type t =
  1. | Ev of Ident.t
    (*

    pure event

    *)
  2. | Upd of Syntax.lhs * Value.t
    (*

    assignation (lhs <- v)

    *)
  3. | StateMove of string * string
    (*

    state move (src,dst)

    *)
val is_pure_event : t -> bool
val compare : t -> t -> int
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/index.html b/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/index.html new file mode 100644 index 00000000..dd3db10f --- /dev/null +++ b/docs/rfsm/Rfsm/Evseq/Make/argument-1-ES/index.html @@ -0,0 +1,2 @@ + +ES (rfsm.Rfsm.Evseq.Make.ES)

Parameter Make.ES

module Event : Event.T
type date = int
type t
exception Union of t * t
val mk : date -> Event.t list -> t
val empty : date -> t
val date : t -> date
val events : t -> Event.t list
val is_empty : t -> bool
exception Add of Event.t
val add : t -> Event.t -> t
val union : t -> t -> t
val union_all : date -> t list -> t
val partition : f:(Event.t -> bool) -> t -> t * t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evseq/Make/index.html b/docs/rfsm/Rfsm/Evseq/Make/index.html new file mode 100644 index 00000000..78287559 --- /dev/null +++ b/docs/rfsm/Rfsm/Evseq/Make/index.html @@ -0,0 +1,2 @@ + +Make (rfsm.Rfsm.Evseq.Make)

Module Evseq.Make

Parameters

module ES : Evset.T

Signature

module Evset = ES
type t = Evset.t list
type value = ES.Event.Value.t
val merge : t -> t -> t
val (@@) : t -> t -> t

@@ is the infix notation for merge

val merge_all : t list -> t
val mk_periodic : Ident.t -> int -> int -> int -> t
val mk_changes : Ident.t -> (int * value) list -> t
val mk_sporadic : Ident.t -> int list -> t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evseq/index.html b/docs/rfsm/Rfsm/Evseq/index.html new file mode 100644 index 00000000..a872c7e0 --- /dev/null +++ b/docs/rfsm/Rfsm/Evseq/index.html @@ -0,0 +1,4 @@ + +Evseq (rfsm.Rfsm.Evseq)

Module Rfsm.Evseq

Event sequences

An event sequence is a sequence of dated event sets. Ex: [{H,x<-1}@t=10; {H}@t=20, ...]. Event sequences are to describe both stimuli and responses.

module type EVSEQ = sig ... end
module Make + (ES : Evset.T) : + EVSEQ with module Evset = ES and type value = ES.Event.Value.t
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/Syntax/Types/index.html b/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/Syntax/Types/index.html new file mode 100644 index 00000000..24379fa8 --- /dev/null +++ b/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Evseq.EVSEQ.Evset.Event.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/Syntax/index.html b/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/Syntax/index.html new file mode 100644 index 00000000..66d85950 --- /dev/null +++ b/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Evseq.EVSEQ.Evset.Event.Syntax)

Module Event.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/Value/index.html b/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/Value/index.html new file mode 100644 index 00000000..f763711e --- /dev/null +++ b/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Evseq.EVSEQ.Evset.Event.Value)

Module Event.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/index.html b/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/index.html new file mode 100644 index 00000000..7ccedfca --- /dev/null +++ b/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/Event/index.html @@ -0,0 +1,2 @@ + +Event (rfsm.Rfsm.Evseq.EVSEQ.Evset.Event)

Module Evset.Event

type t =
  1. | Ev of Ident.t
    (*

    pure event

    *)
  2. | Upd of Syntax.lhs * Value.t
    (*

    assignation (lhs <- v)

    *)
  3. | StateMove of string * string
    (*

    state move (src,dst)

    *)
val is_pure_event : t -> bool
val compare : t -> t -> int
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/index.html b/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/index.html new file mode 100644 index 00000000..e406a44e --- /dev/null +++ b/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/Evset/index.html @@ -0,0 +1,2 @@ + +Evset (rfsm.Rfsm.Evseq.EVSEQ.Evset)

Module EVSEQ.Evset

module Event : Event.T
type date = int
type t
exception Union of t * t
val mk : date -> Event.t list -> t
val empty : date -> t
val date : t -> date
val events : t -> Event.t list
val is_empty : t -> bool
exception Add of Event.t
val add : t -> Event.t -> t
val union : t -> t -> t
val union_all : date -> t list -> t
val partition : f:(Event.t -> bool) -> t -> t * t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/index.html b/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/index.html new file mode 100644 index 00000000..94acd128 --- /dev/null +++ b/docs/rfsm/Rfsm/Evseq/module-type-EVSEQ/index.html @@ -0,0 +1,2 @@ + +EVSEQ (rfsm.Rfsm.Evseq.EVSEQ)

Module type Evseq.EVSEQ

module Evset : Evset.T
type t = Evset.t list
type value
val merge : t -> t -> t
val (@@) : t -> t -> t

@@ is the infix notation for merge

val merge_all : t list -> t
val mk_periodic : Ident.t -> int -> int -> int -> t
val mk_changes : Ident.t -> (int * value) list -> t
val mk_sporadic : Ident.t -> int list -> t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evset/Make/argument-1-E/Syntax/Types/index.html b/docs/rfsm/Rfsm/Evset/Make/argument-1-E/Syntax/Types/index.html new file mode 100644 index 00000000..a0535239 --- /dev/null +++ b/docs/rfsm/Rfsm/Evset/Make/argument-1-E/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Evset.Make.E.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evset/Make/argument-1-E/Syntax/index.html b/docs/rfsm/Rfsm/Evset/Make/argument-1-E/Syntax/index.html new file mode 100644 index 00000000..23b8773b --- /dev/null +++ b/docs/rfsm/Rfsm/Evset/Make/argument-1-E/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Evset.Make.E.Syntax)

Module E.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evset/Make/argument-1-E/Value/index.html b/docs/rfsm/Rfsm/Evset/Make/argument-1-E/Value/index.html new file mode 100644 index 00000000..8cfe23c8 --- /dev/null +++ b/docs/rfsm/Rfsm/Evset/Make/argument-1-E/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Evset.Make.E.Value)

Module E.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evset/Make/argument-1-E/index.html b/docs/rfsm/Rfsm/Evset/Make/argument-1-E/index.html new file mode 100644 index 00000000..5ae6add0 --- /dev/null +++ b/docs/rfsm/Rfsm/Evset/Make/argument-1-E/index.html @@ -0,0 +1,2 @@ + +E (rfsm.Rfsm.Evset.Make.E)

Parameter Make.E

type t =
  1. | Ev of Ident.t
    (*

    pure event

    *)
  2. | Upd of Syntax.lhs * Value.t
    (*

    assignation (lhs <- v)

    *)
  3. | StateMove of string * string
    (*

    state move (src,dst)

    *)
val is_pure_event : t -> bool
val compare : t -> t -> int
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evset/Make/index.html b/docs/rfsm/Rfsm/Evset/Make/index.html new file mode 100644 index 00000000..a6a2180c --- /dev/null +++ b/docs/rfsm/Rfsm/Evset/Make/index.html @@ -0,0 +1,2 @@ + +Make (rfsm.Rfsm.Evset.Make)

Module Evset.Make

Parameters

module E : Event.T

Signature

module Event = E
type date = int
type t
exception Union of t * t
val mk : date -> Event.t list -> t
val empty : date -> t
val date : t -> date
val events : t -> Event.t list
val is_empty : t -> bool
exception Add of Event.t
val add : t -> Event.t -> t
val union : t -> t -> t
val union_all : date -> t list -> t
val partition : f:(Event.t -> bool) -> t -> t * t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evset/index.html b/docs/rfsm/Rfsm/Evset/index.html new file mode 100644 index 00000000..36adfbef --- /dev/null +++ b/docs/rfsm/Rfsm/Evset/index.html @@ -0,0 +1,2 @@ + +Evset (rfsm.Rfsm.Evset)

Module Rfsm.Evset

Event sets

An event set is a set of events all occuring at the same instant

module type T = sig ... end
module Make (E : Event.T) : T with module Event = E
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evset/module-type-T/Event/Syntax/Types/index.html b/docs/rfsm/Rfsm/Evset/module-type-T/Event/Syntax/Types/index.html new file mode 100644 index 00000000..520ae563 --- /dev/null +++ b/docs/rfsm/Rfsm/Evset/module-type-T/Event/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Evset.T.Event.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evset/module-type-T/Event/Syntax/index.html b/docs/rfsm/Rfsm/Evset/module-type-T/Event/Syntax/index.html new file mode 100644 index 00000000..f164e17f --- /dev/null +++ b/docs/rfsm/Rfsm/Evset/module-type-T/Event/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Evset.T.Event.Syntax)

Module Event.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evset/module-type-T/Event/Value/index.html b/docs/rfsm/Rfsm/Evset/module-type-T/Event/Value/index.html new file mode 100644 index 00000000..a11ed2bd --- /dev/null +++ b/docs/rfsm/Rfsm/Evset/module-type-T/Event/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Evset.T.Event.Value)

Module Event.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evset/module-type-T/Event/index.html b/docs/rfsm/Rfsm/Evset/module-type-T/Event/index.html new file mode 100644 index 00000000..67640ab7 --- /dev/null +++ b/docs/rfsm/Rfsm/Evset/module-type-T/Event/index.html @@ -0,0 +1,2 @@ + +Event (rfsm.Rfsm.Evset.T.Event)

Module T.Event

type t =
  1. | Ev of Ident.t
    (*

    pure event

    *)
  2. | Upd of Syntax.lhs * Value.t
    (*

    assignation (lhs <- v)

    *)
  3. | StateMove of string * string
    (*

    state move (src,dst)

    *)
val is_pure_event : t -> bool
val compare : t -> t -> int
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Evset/module-type-T/index.html b/docs/rfsm/Rfsm/Evset/module-type-T/index.html new file mode 100644 index 00000000..70c0317f --- /dev/null +++ b/docs/rfsm/Rfsm/Evset/module-type-T/index.html @@ -0,0 +1,2 @@ + +T (rfsm.Rfsm.Evset.T)

Module type Evset.T

module Event : Event.T
type date = int
type t
exception Union of t * t
val mk : date -> Event.t list -> t
val empty : date -> t
val date : t -> date
val events : t -> Event.t list
val is_empty : t -> bool
exception Add of Event.t
val add : t -> Event.t -> t
val union : t -> t -> t
val union_all : date -> t list -> t
val partition : f:(Event.t -> bool) -> t -> t * t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ext/Base/index.html b/docs/rfsm/Rfsm/Ext/Base/index.html new file mode 100644 index 00000000..22843fe7 --- /dev/null +++ b/docs/rfsm/Rfsm/Ext/Base/index.html @@ -0,0 +1,19 @@ + +Base (rfsm.Rfsm.Ext.Base)

Module Ext.Base

val pow2 : int -> int

pow2 n is 2^n. Not tail recursive. Raises Invalid_argument if n<0

val neg : ('a -> bool) -> 'a -> bool

neg f x is not (f x)

val swap : ('a * 'b) -> 'b * 'a

swap (x,y) is (y,x)

val clone : 't -> 't

clone v returns a deep copy of value v

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ext/File/index.html b/docs/rfsm/Rfsm/Ext/File/index.html new file mode 100644 index 00000000..64eb096a --- /dev/null +++ b/docs/rfsm/Rfsm/Ext/File/index.html @@ -0,0 +1,6 @@ + +File (rfsm.Rfsm.Ext.File)

Module Ext.File

val check_dir : string -> unit
val open_file : string -> Stdlib.out_channel * Stdlib.Format.formatter
val close_file : (Stdlib.out_channel * Stdlib.Format.formatter) -> unit
val copy_with_subst : + (string * string) list -> + Stdlib.in_channel -> + Stdlib.out_channel -> + unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ext/Format/index.html b/docs/rfsm/Rfsm/Ext/Format/index.html new file mode 100644 index 00000000..dca84899 --- /dev/null +++ b/docs/rfsm/Rfsm/Ext/Format/index.html @@ -0,0 +1,2 @@ + +Format (rfsm.Rfsm.Ext.Format)

Module Ext.Format

val pp_spc : Stdlib.Format.formatter -> unit -> unit
val pp_cut : Stdlib.Format.formatter -> unit -> unit
val to_string : (Stdlib.Format.formatter -> 'a -> unit) -> 'a -> string
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ext/List/index.html b/docs/rfsm/Rfsm/Ext/List/index.html new file mode 100644 index 00000000..a010266b --- /dev/null +++ b/docs/rfsm/Rfsm/Ext/List/index.html @@ -0,0 +1,26 @@ + +List (rfsm.Rfsm.Ext.List)

Module Ext.List

val cart_prod : 'a list -> 'b list -> ('a * 'b) list

cart_prod l1 l2 returns the cartesian product of lists l1 and l2. For instance, if l1=[1;2] and l2=["a";"b"], then cart_prod l1 l2 is [(1,"a");(1,"b");(2,"a");(2,"b")]

val replace_assoc : 'a -> 'b -> ('a * 'b) list -> ('a * 'b) list

replace_assoc k v l replaces the value bound to key k in association list l by v. If k was bound in l, the binding (k,v) is added to l.

val add_list_assoc : 'a -> 'b -> ('a * 'b list) list -> ('a * 'b list) list

add_list_assoc k v add value v to the _list of values_ bound to k in l. If key k is not bound in l, add it, with associated value [v].

val scatter : ('a -> 'b) -> 'a list -> ('b * 'a list) list

scatter f l applies f to each element of l and returns the list of distinct results, with each result paired with the list of corresponding elements. For example: scatter String.length ["a";"abc";"bac";"abcdef"] is [(6, ["abcdef"]); (3, ["bac"; "abc"]); (1, ["a"])]

val iter_fst : (bool -> 'a -> unit) -> 'a list -> unit

iter_fst f l behaves like Stdlib.List.iter f l but the f function takes an extra argument indicating whether the argument is the first of the source list or not

val fold_leftr : ('a -> 'b -> 'a) -> 'b list -> 'a -> 'a

fold_leftr f l z is Stdlib.fold_left f z l

val pp_v : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a list -> + unit

pp_v pp fmt l prints list l on formatter fmt using printer pp for each element, one line per element

val pp_h : + ?sep:string -> + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a list -> + unit

pp_h pp fmt l prints list l on formatter fmt using printer pp for each element, on a single line, and printing the optional string sep between elements.

val pp_opt : + lr:(string * string) -> + sep:string -> + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a list -> + unit

pp_opt lr:(l,r) sep pp l is prints l using pp_h sep pp between l and r delimiters but prints nothing if l is empty.

val pp_assoc : + ((Stdlib.Format.formatter -> + 'a -> + unit) + * (Stdlib.Format.formatter -> + 'b -> + unit)) -> + Stdlib.Format.formatter -> + ('a * 'b) list -> + unit

pp_assoc (pp_k,pp_v) fmt l prints association list l on formatter fmt using printer pp_k (resp. pp_v for printing keys (resp. values).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ext/Option/index.html b/docs/rfsm/Rfsm/Ext/Option/index.html new file mode 100644 index 00000000..b1cadc78 --- /dev/null +++ b/docs/rfsm/Rfsm/Ext/Option/index.html @@ -0,0 +1,7 @@ + +Option (rfsm.Rfsm.Ext.Option)

Module Ext.Option

val pp : + ?none:string -> + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a option -> + unit

pp ?none pp_v fmt o prints value v if o is Some v, using pp_v and prints the string none (defaulting to "") if o is None

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ext/index.html b/docs/rfsm/Rfsm/Ext/index.html new file mode 100644 index 00000000..8e2e7bef --- /dev/null +++ b/docs/rfsm/Rfsm/Ext/index.html @@ -0,0 +1,19 @@ + +Ext (rfsm.Rfsm.Ext)

Module Rfsm.Ext

Extensions to Stdlib operations and modules

module Base : sig ... end
module Format : sig ... end
module List : sig ... end
module Option : sig ... end
module File : sig ... end
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/index.html b/docs/rfsm/Rfsm/Guest/index.html new file mode 100644 index 00000000..8792ede3 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Guest)

Module Rfsm.Guest

Required signatures for the guest language

module type INFO = sig ... end
module type TYPES = sig ... end
module type SYNTAX = sig ... end
module type TYPING = sig ... end
module type VALUE = sig ... end
module type STATIC = sig ... end
module type EVAL = sig ... end
module type CTASK = sig ... end
module type SYSTEMC = sig ... end
module type VHDL = sig ... end
module type ERROR = sig ... end
module type OPTIONS = sig ... end

language global signature

Each guest language must provide a set of modules conforming to module signature T.

module type T = sig ... end
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-CTASK/Syntax/Types/index.html b/docs/rfsm/Rfsm/Guest/module-type-CTASK/Syntax/Types/index.html new file mode 100644 index 00000000..fff3e265 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-CTASK/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Guest.CTASK.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-CTASK/Syntax/index.html b/docs/rfsm/Rfsm/Guest/module-type-CTASK/Syntax/index.html new file mode 100644 index 00000000..703e62a8 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-CTASK/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Guest.CTASK.Syntax)

Module CTASK.Syntax

module Types : TYPES

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-CTASK/index.html b/docs/rfsm/Rfsm/Guest/module-type-CTASK/index.html new file mode 100644 index 00000000..19d3711c --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-CTASK/index.html @@ -0,0 +1,5 @@ + +CTASK (rfsm.Rfsm.Guest.CTASK)

Module type Guest.CTASK

CTask backend

module Syntax : SYNTAX
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the C declaration of symbol id with type ty. For example, for an int named "x", this should be "int x", and for an array of 8 ints named "a", this should be "int a[8]".

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the C type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the C statement corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the C expression corresponding to expression e.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-ERROR/index.html b/docs/rfsm/Rfsm/Guest/module-type-ERROR/index.html new file mode 100644 index 00000000..a40f1a58 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-ERROR/index.html @@ -0,0 +1,2 @@ + +ERROR (rfsm.Rfsm.Guest.ERROR)

Module type Guest.ERROR

Error handling

val handle : exn -> unit

This function will be called to handle guest-level exceptions, i.e. exceptions raised by guest specific functions and not handled by the host language.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-EVAL/Syntax/Types/index.html b/docs/rfsm/Rfsm/Guest/module-type-EVAL/Syntax/Types/index.html new file mode 100644 index 00000000..1a177838 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-EVAL/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Guest.EVAL.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-EVAL/Syntax/index.html b/docs/rfsm/Rfsm/Guest/module-type-EVAL/Syntax/index.html new file mode 100644 index 00000000..a28105bf --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-EVAL/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Guest.EVAL.Syntax)

Module EVAL.Syntax

module Types : TYPES

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-EVAL/Value/index.html b/docs/rfsm/Rfsm/Guest/module-type-EVAL/Value/index.html new file mode 100644 index 00000000..e9e8359f --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-EVAL/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Guest.EVAL.Value)

Module EVAL.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-EVAL/index.html b/docs/rfsm/Rfsm/Guest/module-type-EVAL/index.html new file mode 100644 index 00000000..4759ed75 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-EVAL/index.html @@ -0,0 +1,2 @@ + +EVAL (rfsm.Rfsm.Guest.EVAL)

Module type Guest.EVAL

Dynamic semantics

module Syntax : SYNTAX
module Value : VALUE
type env = Value.t Env.t

The type of dynamic environments, mapping identifiers to values.

val mk_env : unit -> env

mk_env () should return a new, empty dynamic environment

val upd_env : Syntax.lhs -> Value.t -> env -> env

upd_env l v env should return the environment obtained by adding the binding (l,v) to env. If l is already bound in env, the associated value is updated.

Evaluators

exception Illegal_expr of Syntax.expr
val eval_expr : env -> Syntax.expr -> Value.t

eval_expr env e should return the value obtained by evaluating expression e in environment env. Should raise Illegal_expr in case of failure.

val eval_bool : env -> Syntax.expr -> bool

eval_bool env e should return the boolean value obtained by evaluating expression e in environment env. Should raise Illegal_expr if e does not denote a boolean value or in case of failure.

Printing

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of environment env on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-INFO/index.html b/docs/rfsm/Rfsm/Guest/module-type-INFO/index.html new file mode 100644 index 00000000..5abdf2ab --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-INFO/index.html @@ -0,0 +1,2 @@ + +INFO (rfsm.Rfsm.Guest.INFO)

Module type Guest.INFO

Language description

val name : string

Name of the guest language

val version : string

Version

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-OPTIONS/index.html b/docs/rfsm/Rfsm/Guest/module-type-OPTIONS/index.html new file mode 100644 index 00000000..af0361eb --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-OPTIONS/index.html @@ -0,0 +1,2 @@ + +OPTIONS (rfsm.Rfsm.Guest.OPTIONS)

Module type Guest.OPTIONS

Compiler options

val specs : (string * Stdlib.Arg.spec * string) list

specs should list all guest-specific compiler options. These options will be added to those related to the host language.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-STATIC/index.html b/docs/rfsm/Rfsm/Guest/module-type-STATIC/index.html new file mode 100644 index 00000000..aaae250d --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-STATIC/index.html @@ -0,0 +1,2 @@ + +STATIC (rfsm.Rfsm.Guest.STATIC)

Module type Guest.STATIC

Static program representation

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-SYNTAX/Types/index.html b/docs/rfsm/Rfsm/Guest/module-type-SYNTAX/Types/index.html new file mode 100644 index 00000000..eb066f73 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-SYNTAX/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Guest.SYNTAX.Types)

Module SYNTAX.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-SYNTAX/index.html b/docs/rfsm/Rfsm/Guest/module-type-SYNTAX/index.html new file mode 100644 index 00000000..503ead8a --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-SYNTAX/index.html @@ -0,0 +1,2 @@ + +SYNTAX (rfsm.Rfsm.Guest.SYNTAX)

Module type Guest.SYNTAX

Syntax

module Types : TYPES

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/Static/index.html b/docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/Static/index.html new file mode 100644 index 00000000..cd6cb384 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Guest.SYSTEMC.Static)

Module SYSTEMC.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/Syntax/Types/index.html b/docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/Syntax/Types/index.html new file mode 100644 index 00000000..9b60ea59 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Guest.SYSTEMC.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/Syntax/index.html b/docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/Syntax/index.html new file mode 100644 index 00000000..11e95fb5 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Guest.SYSTEMC.Syntax)

Module SYSTEMC.Syntax

module Types : TYPES

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/index.html b/docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/index.html new file mode 100644 index 00000000..d6f78373 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-SYSTEMC/index.html @@ -0,0 +1,5 @@ + +SYSTEMC (rfsm.Rfsm.Guest.SYSTEMC)

Module type Guest.SYSTEMC

SystemC backend

module Static : STATIC
module Syntax : SYNTAX
type value
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the SystemC declaration of symbol id with type ty.

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the SystemC type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td (resp. pp_type_impl fmt td) should print, on formatter fmt, the SystemC declaration and implementation (in the .h and .cpp file resp.) corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the SystemC expression corresponding to expression e.

val pp_typ : Stdlib.Format.formatter -> Syntax.Types.typ -> unit

pp_typ fmt ty should print, on formatter fmt, the SystemC type corresponding to type ty.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the SystemC representation of LHS l.

val pp_value : Stdlib.Format.formatter -> value -> unit

pp_value fmt v should print, on formatter fmt, the SystemC value corresponding to value v.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-T/Ctask/index.html b/docs/rfsm/Rfsm/Guest/module-type-T/Ctask/index.html new file mode 100644 index 00000000..4a19af83 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-T/Ctask/index.html @@ -0,0 +1,5 @@ + +Ctask (rfsm.Rfsm.Guest.T.Ctask)

Module T.Ctask

module Syntax = Syntax
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the C declaration of symbol id with type ty. For example, for an int named "x", this should be "int x", and for an array of 8 ints named "a", this should be "int a[8]".

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the C type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the C statement corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the C expression corresponding to expression e.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-T/Error/index.html b/docs/rfsm/Rfsm/Guest/module-type-T/Error/index.html new file mode 100644 index 00000000..1f13686e --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-T/Error/index.html @@ -0,0 +1,2 @@ + +Error (rfsm.Rfsm.Guest.T.Error)

Module T.Error

val handle : exn -> unit

This function will be called to handle guest-level exceptions, i.e. exceptions raised by guest specific functions and not handled by the host language.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-T/Eval/index.html b/docs/rfsm/Rfsm/Guest/module-type-T/Eval/index.html new file mode 100644 index 00000000..4efdc05f --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-T/Eval/index.html @@ -0,0 +1,2 @@ + +Eval (rfsm.Rfsm.Guest.T.Eval)

Module T.Eval

module Syntax = Syntax
module Value = Value
type env = Value.t Env.t

The type of dynamic environments, mapping identifiers to values.

val mk_env : unit -> env

mk_env () should return a new, empty dynamic environment

val upd_env : Syntax.lhs -> Value.t -> env -> env

upd_env l v env should return the environment obtained by adding the binding (l,v) to env. If l is already bound in env, the associated value is updated.

Evaluators

exception Illegal_expr of Syntax.expr
val eval_expr : env -> Syntax.expr -> Value.t

eval_expr env e should return the value obtained by evaluating expression e in environment env. Should raise Illegal_expr in case of failure.

val eval_bool : env -> Syntax.expr -> bool

eval_bool env e should return the boolean value obtained by evaluating expression e in environment env. Should raise Illegal_expr if e does not denote a boolean value or in case of failure.

Printing

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of environment env on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-T/Info/index.html b/docs/rfsm/Rfsm/Guest/module-type-T/Info/index.html new file mode 100644 index 00000000..ced14f0a --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-T/Info/index.html @@ -0,0 +1,2 @@ + +Info (rfsm.Rfsm.Guest.T.Info)

Module T.Info

val name : string

Name of the guest language

val version : string

Version

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-T/Options/index.html b/docs/rfsm/Rfsm/Guest/module-type-T/Options/index.html new file mode 100644 index 00000000..008e9f1b --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-T/Options/index.html @@ -0,0 +1,2 @@ + +Options (rfsm.Rfsm.Guest.T.Options)

Module T.Options

val specs : (string * Stdlib.Arg.spec * string) list

specs should list all guest-specific compiler options. These options will be added to those related to the host language.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-T/Static/index.html b/docs/rfsm/Rfsm/Guest/module-type-T/Static/index.html new file mode 100644 index 00000000..43612eb4 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-T/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Guest.T.Static)

Module T.Static

type expr = Syntax.expr

The type of guest-level expressions

type value = Value.t

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-T/Syntax/index.html b/docs/rfsm/Rfsm/Guest/module-type-T/Syntax/index.html new file mode 100644 index 00000000..dfedcb48 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-T/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Guest.T.Syntax)

Module T.Syntax

module Types = Types

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-T/Systemc/index.html b/docs/rfsm/Rfsm/Guest/module-type-T/Systemc/index.html new file mode 100644 index 00000000..df67975a --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-T/Systemc/index.html @@ -0,0 +1,5 @@ + +Systemc (rfsm.Rfsm.Guest.T.Systemc)

Module T.Systemc

module Static = Static
module Syntax = Syntax
type value = Value.t
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the SystemC declaration of symbol id with type ty.

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the SystemC type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td (resp. pp_type_impl fmt td) should print, on formatter fmt, the SystemC declaration and implementation (in the .h and .cpp file resp.) corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the SystemC expression corresponding to expression e.

val pp_typ : Stdlib.Format.formatter -> Syntax.Types.typ -> unit

pp_typ fmt ty should print, on formatter fmt, the SystemC type corresponding to type ty.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the SystemC representation of LHS l.

val pp_value : Stdlib.Format.formatter -> value -> unit

pp_value fmt v should print, on formatter fmt, the SystemC value corresponding to value v.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-T/Types/index.html b/docs/rfsm/Rfsm/Guest/module-type-T/Types/index.html new file mode 100644 index 00000000..cd871c5e --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-T/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Guest.T.Types)

Module T.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-T/Typing/index.html b/docs/rfsm/Rfsm/Guest/module-type-T/Typing/index.html new file mode 100644 index 00000000..c5fbbfd5 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-T/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Guest.T.Typing)

Module T.Typing

module Syntax = Syntax
module Types = Types

Typing environment

type env
val mk_env : unit -> env

mk_env () should return the initial typing environment. This environment should contain, in particular, bindings for builtins primitives, type and value constructors.

val lookup_var : loc:Location.t -> Ident.t -> env -> Types.typ

lookup_var l x env should return the type bound to identifier x in environment env. The behaviour when x is not bound in env is left to guest definition. A possibility is to raise Ident.Undefined for example.

val add_var : scope:Ident.scope -> env -> (Ident.t * Types.typ) -> env

add_var scope env (x,t) should return the environment obtained by the binding (x,t) to env. The scope parameter is a hint to the guest type inference system. Typically, it will be used to determine, in the case the added type contains type variables, whether these variables will be generalized (scope=Local) or not (scope=Global). The behaviour when x is already bound in env is left to guest definition.

val add_param : env -> (Ident.t * Syntax.expr) -> env

add_param env (x,t) should return the environment obtained by the binding (x,t) as a model parameter to env.

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of typing environment env on formatter fmt.

Low-level interface to the the type-checking engine

val type_check : loc:Location.t -> Types.typ -> Types.typ -> unit

type_check loc t t' should be called whenever types t and t' have to be unified at program location loc.

High-level interface to the type-checking engine

val type_type_decl : env -> Syntax.type_decl -> env

type_type_decl env td should return the typing environment obtained by type checking the type declaration td in environment env.

val type_expression : env -> Syntax.expr -> Types.typ

type_expression env e should return the type of expression e in environment env.

val type_of_type_expr : env -> Syntax.type_expr -> Types.typ

type_of_type_expr env te should return the type denoted by the type expression te in environment env.

val type_lhs : env -> Syntax.lhs -> Types.typ

type_lhs env l should return the type of LHS l in environment env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-T/Value/index.html b/docs/rfsm/Rfsm/Guest/module-type-T/Value/index.html new file mode 100644 index 00000000..832c3862 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-T/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Guest.T.Value)

Module T.Value

type t

The type of guest-level values

type typ = Types.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-T/Vhdl/index.html b/docs/rfsm/Rfsm/Guest/module-type-T/Vhdl/index.html new file mode 100644 index 00000000..dd3e7fa0 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-T/Vhdl/index.html @@ -0,0 +1,2 @@ + +Vhdl (rfsm.Rfsm.Guest.T.Vhdl)

Module T.Vhdl

module Syntax = Syntax
module Static = Static
type value = Value.t
val vhdl_type_of : Syntax.Types.typ -> Vhdl_types.t

vhdl_type_of ty should return the VHDL type corresponding to type ty.

val allowed_shared_type : Syntax.Types.typ -> bool

allowed_shared_type ty should indicate whether type ty can be attributed to a VHDL shared variable.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the VHDL translation of type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the VHDL expression corresponding to expression e.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the VHDL representation of LHS l.

val pp_value : Stdlib.Format.formatter -> (value * Vhdl_types.t) -> unit

pp_value fmt (v,t) should print, on formatter fmt, the VHDL value corresponding to value v, with type t.

val pp_type_fns_intf : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_fns_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_fns_intf td (resp. pp_type_fns_impl fmt td) should print, on formatter fmt, the VHDL declaration and implementation (in the entity and architecture definition resp.) corresponding to type declaration td.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-T/index.html b/docs/rfsm/Rfsm/Guest/module-type-T/index.html new file mode 100644 index 00000000..64a0e1b7 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-T/index.html @@ -0,0 +1,10 @@ + +T (rfsm.Rfsm.Guest.T)

Module type Guest.T

module Info : INFO
module Types : TYPES
module Syntax : SYNTAX with module Types = Types
module Typing : TYPING with module Syntax = Syntax and module Types = Types
module Value : VALUE with type typ = Types.typ
module Static : STATIC with type expr = Syntax.expr and type value = Value.t
module Eval : EVAL with module Syntax = Syntax and module Value = Value
module Ctask : CTASK with module Syntax = Syntax
module Systemc : + SYSTEMC + with module Syntax = Syntax + and module Static = Static + and type value = Value.t
module Vhdl : + VHDL + with module Syntax = Syntax + and module Static = Static + and type value = Value.t
module Error : ERROR
module Options : OPTIONS
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-TYPES/index.html b/docs/rfsm/Rfsm/Guest/module-type-TYPES/index.html new file mode 100644 index 00000000..5ab97727 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-TYPES/index.html @@ -0,0 +1,2 @@ + +TYPES (rfsm.Rfsm.Guest.TYPES)

Module type Guest.TYPES

Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-TYPING/Syntax/Types/index.html b/docs/rfsm/Rfsm/Guest/module-type-TYPING/Syntax/Types/index.html new file mode 100644 index 00000000..a8a79b8e --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-TYPING/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Guest.TYPING.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-TYPING/Syntax/index.html b/docs/rfsm/Rfsm/Guest/module-type-TYPING/Syntax/index.html new file mode 100644 index 00000000..792cd909 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-TYPING/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Guest.TYPING.Syntax)

Module TYPING.Syntax

module Types : TYPES

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-TYPING/Types/index.html b/docs/rfsm/Rfsm/Guest/module-type-TYPING/Types/index.html new file mode 100644 index 00000000..8a12d383 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-TYPING/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Guest.TYPING.Types)

Module TYPING.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-TYPING/index.html b/docs/rfsm/Rfsm/Guest/module-type-TYPING/index.html new file mode 100644 index 00000000..727f2cb2 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-TYPING/index.html @@ -0,0 +1,2 @@ + +TYPING (rfsm.Rfsm.Guest.TYPING)

Module type Guest.TYPING

Typing

module Syntax : SYNTAX
module Types : TYPES

Typing environment

type env
val mk_env : unit -> env

mk_env () should return the initial typing environment. This environment should contain, in particular, bindings for builtins primitives, type and value constructors.

val lookup_var : loc:Location.t -> Ident.t -> env -> Types.typ

lookup_var l x env should return the type bound to identifier x in environment env. The behaviour when x is not bound in env is left to guest definition. A possibility is to raise Ident.Undefined for example.

val add_var : scope:Ident.scope -> env -> (Ident.t * Types.typ) -> env

add_var scope env (x,t) should return the environment obtained by the binding (x,t) to env. The scope parameter is a hint to the guest type inference system. Typically, it will be used to determine, in the case the added type contains type variables, whether these variables will be generalized (scope=Local) or not (scope=Global). The behaviour when x is already bound in env is left to guest definition.

val add_param : env -> (Ident.t * Syntax.expr) -> env

add_param env (x,t) should return the environment obtained by the binding (x,t) as a model parameter to env.

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of typing environment env on formatter fmt.

Low-level interface to the the type-checking engine

val type_check : loc:Location.t -> Types.typ -> Types.typ -> unit

type_check loc t t' should be called whenever types t and t' have to be unified at program location loc.

High-level interface to the type-checking engine

val type_type_decl : env -> Syntax.type_decl -> env

type_type_decl env td should return the typing environment obtained by type checking the type declaration td in environment env.

val type_expression : env -> Syntax.expr -> Types.typ

type_expression env e should return the type of expression e in environment env.

val type_of_type_expr : env -> Syntax.type_expr -> Types.typ

type_of_type_expr env te should return the type denoted by the type expression te in environment env.

val type_lhs : env -> Syntax.lhs -> Types.typ

type_lhs env l should return the type of LHS l in environment env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-VALUE/index.html b/docs/rfsm/Rfsm/Guest/module-type-VALUE/index.html new file mode 100644 index 00000000..ae3b53a3 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-VALUE/index.html @@ -0,0 +1,2 @@ + +VALUE (rfsm.Rfsm.Guest.VALUE)

Module type Guest.VALUE

Values

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-VHDL/Static/index.html b/docs/rfsm/Rfsm/Guest/module-type-VHDL/Static/index.html new file mode 100644 index 00000000..85b09a19 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-VHDL/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Guest.VHDL.Static)

Module VHDL.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-VHDL/Syntax/Types/index.html b/docs/rfsm/Rfsm/Guest/module-type-VHDL/Syntax/Types/index.html new file mode 100644 index 00000000..70ee4302 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-VHDL/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Guest.VHDL.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-VHDL/Syntax/index.html b/docs/rfsm/Rfsm/Guest/module-type-VHDL/Syntax/index.html new file mode 100644 index 00000000..1cae9b6c --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-VHDL/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Guest.VHDL.Syntax)

Module VHDL.Syntax

module Types : TYPES

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Guest/module-type-VHDL/index.html b/docs/rfsm/Rfsm/Guest/module-type-VHDL/index.html new file mode 100644 index 00000000..5dfc80b4 --- /dev/null +++ b/docs/rfsm/Rfsm/Guest/module-type-VHDL/index.html @@ -0,0 +1,2 @@ + +VHDL (rfsm.Rfsm.Guest.VHDL)

Module type Guest.VHDL

VHDL backend

module Syntax : SYNTAX
module Static : STATIC
type value
val vhdl_type_of : Syntax.Types.typ -> Vhdl_types.t

vhdl_type_of ty should return the VHDL type corresponding to type ty.

val allowed_shared_type : Syntax.Types.typ -> bool

allowed_shared_type ty should indicate whether type ty can be attributed to a VHDL shared variable.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the VHDL translation of type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the VHDL expression corresponding to expression e.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the VHDL representation of LHS l.

val pp_value : Stdlib.Format.formatter -> (value * Vhdl_types.t) -> unit

pp_value fmt (v,t) should print, on formatter fmt, the VHDL value corresponding to value v, with type t.

val pp_type_fns_intf : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_fns_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_fns_intf td (resp. pp_type_fns_impl fmt td) should print, on formatter fmt, the VHDL declaration and implementation (in the entity and architecture definition resp.) corresponding to type declaration td.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Ctask/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Host/Make/Ctask/G/Syntax/Types/index.html new file mode 100644 index 00000000..3e48072c --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Ctask/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.Make.Ctask.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Ctask/G/Syntax/index.html b/docs/rfsm/Rfsm/Host/Make/Ctask/G/Syntax/index.html new file mode 100644 index 00000000..7f922c8f --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Ctask/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Host.Make.Ctask.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Ctask/G/index.html b/docs/rfsm/Rfsm/Host/Make/Ctask/G/index.html new file mode 100644 index 00000000..5aee5f44 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Ctask/G/index.html @@ -0,0 +1,5 @@ + +G (rfsm.Rfsm.Host.Make.Ctask.G)

Module Ctask.G

val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the C declaration of symbol id with type ty. For example, for an int named "x", this should be "int x", and for an array of 8 ints named "a", this should be "int a[8]".

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the C type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the C statement corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the C expression corresponding to expression e.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Ctask/index.html b/docs/rfsm/Rfsm/Host/Make/Ctask/index.html new file mode 100644 index 00000000..81dd1f02 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Ctask/index.html @@ -0,0 +1,2 @@ + +Ctask (rfsm.Rfsm.Host.Make.Ctask)

Module Make.Ctask

module Static = Static
module G : Guest.CTASK
exception Error of string * string
val output : dir:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Dot/index.html b/docs/rfsm/Rfsm/Host/Make/Dot/index.html new file mode 100644 index 00000000..7f7c7219 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Dot/index.html @@ -0,0 +1,2 @@ + +Dot (rfsm.Rfsm.Host.Make.Dot)

Module Make.Dot

module Static = Static
val output_static : dir:string -> name:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/Syntax/Types/index.html b/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/Syntax/Types/index.html new file mode 100644 index 00000000..83f668cc --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.Make.Dynamic.EvSeq.Evset.Event.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/Syntax/index.html b/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/Syntax/index.html new file mode 100644 index 00000000..ef18be2e --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Host.Make.Dynamic.EvSeq.Evset.Event.Syntax)

Module Event.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/Value/index.html b/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/Value/index.html new file mode 100644 index 00000000..f9cdbb1f --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Host.Make.Dynamic.EvSeq.Evset.Event.Value)

Module Event.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/index.html b/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/index.html new file mode 100644 index 00000000..b51907fa --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/Event/index.html @@ -0,0 +1,2 @@ + +Event (rfsm.Rfsm.Host.Make.Dynamic.EvSeq.Evset.Event)

Module Evset.Event

type t =
  1. | Ev of Ident.t
    (*

    pure event

    *)
  2. | Upd of Syntax.lhs * Value.t
    (*

    assignation (lhs <- v)

    *)
  3. | StateMove of string * string
    (*

    state move (src,dst)

    *)
val is_pure_event : t -> bool
val compare : t -> t -> int
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/index.html b/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/index.html new file mode 100644 index 00000000..ab0065c0 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/Evset/index.html @@ -0,0 +1,2 @@ + +Evset (rfsm.Rfsm.Host.Make.Dynamic.EvSeq.Evset)

Module EvSeq.Evset

module Event : Event.T
type date = int
type t
exception Union of t * t
val mk : date -> Event.t list -> t
val empty : date -> t
val date : t -> date
val events : t -> Event.t list
val is_empty : t -> bool
exception Add of Event.t
val add : t -> Event.t -> t
val union : t -> t -> t
val union_all : date -> t list -> t
val partition : f:(Event.t -> bool) -> t -> t * t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/index.html b/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/index.html new file mode 100644 index 00000000..2a647873 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Dynamic/EvSeq/index.html @@ -0,0 +1,2 @@ + +EvSeq (rfsm.Rfsm.Host.Make.Dynamic.EvSeq)

Module Dynamic.EvSeq

module Evset : Evset.T
type t = Evset.t list
type value
val merge : t -> t -> t
val (@@) : t -> t -> t

@@ is the infix notation for merge

val merge_all : t list -> t
val mk_periodic : Ident.t -> int -> int -> int -> t
val mk_changes : Ident.t -> (int * value) list -> t
val mk_sporadic : Ident.t -> int list -> t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/Syntax/Types/index.html b/docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/Syntax/Types/index.html new file mode 100644 index 00000000..79ad5644 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.Make.Dynamic.Eval.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/Syntax/index.html b/docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/Syntax/index.html new file mode 100644 index 00000000..89951834 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Host.Make.Dynamic.Eval.Syntax)

Module Eval.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/Value/index.html b/docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/Value/index.html new file mode 100644 index 00000000..e4cc1b61 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Host.Make.Dynamic.Eval.Value)

Module Eval.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/index.html b/docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/index.html new file mode 100644 index 00000000..a9deea0a --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Dynamic/Eval/index.html @@ -0,0 +1,2 @@ + +Eval (rfsm.Rfsm.Host.Make.Dynamic.Eval)

Module Dynamic.Eval

type env = Value.t Env.t

The type of dynamic environments, mapping identifiers to values.

val mk_env : unit -> env

mk_env () should return a new, empty dynamic environment

val upd_env : Syntax.lhs -> Value.t -> env -> env

upd_env l v env should return the environment obtained by adding the binding (l,v) to env. If l is already bound in env, the associated value is updated.

Evaluators

exception Illegal_expr of Syntax.expr
val eval_expr : env -> Syntax.expr -> Value.t

eval_expr env e should return the value obtained by evaluating expression e in environment env. Should raise Illegal_expr in case of failure.

val eval_bool : env -> Syntax.expr -> bool

eval_bool env e should return the boolean value obtained by evaluating expression e in environment env. Should raise Illegal_expr if e does not denote a boolean value or in case of failure.

Printing

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of environment env on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Dynamic/index.html b/docs/rfsm/Rfsm/Host/Make/Dynamic/index.html new file mode 100644 index 00000000..5231bea4 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Dynamic/index.html @@ -0,0 +1,2 @@ + +Dynamic (rfsm.Rfsm.Host.Make.Dynamic)

Module Make.Dynamic

module Syntax = Syntax
module Static = Static
module Eval : Guest.EVAL
exception Illegal_stimulus_value of Location.t
exception Non_deterministic_transition of string * int * Syntax.transition list

FSM name, date, transitions

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Static/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Host/Make/Static/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..07865e0e --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Static/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.Make.Static.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Static/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Host/Make/Static/Syntax/Guest/index.html new file mode 100644 index 00000000..e14a9f1a --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Static/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Host.Make.Static.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Static/Syntax/index.html b/docs/rfsm/Rfsm/Host/Make/Static/Syntax/index.html new file mode 100644 index 00000000..925f4efb --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Static/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Host.Make.Static.Syntax)

Module Static.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Static/Typing/index.html b/docs/rfsm/Rfsm/Host/Make/Static/Typing/index.html new file mode 100644 index 00000000..70f4adb7 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Host.Make.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Static/Value/index.html b/docs/rfsm/Rfsm/Host/Make/Static/Value/index.html new file mode 100644 index 00000000..43c98a64 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Host.Make.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Static/index.html b/docs/rfsm/Rfsm/Host/Make/Static/index.html new file mode 100644 index 00000000..8a5d8e33 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Host.Make.Static)

Module Make.Static

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Systemc/G/Static/index.html b/docs/rfsm/Rfsm/Host/Make/Systemc/G/Static/index.html new file mode 100644 index 00000000..8758003c --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Systemc/G/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Host.Make.Systemc.G.Static)

Module G.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Systemc/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Host/Make/Systemc/G/Syntax/Types/index.html new file mode 100644 index 00000000..29d290fe --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Systemc/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.Make.Systemc.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Systemc/G/Syntax/index.html b/docs/rfsm/Rfsm/Host/Make/Systemc/G/Syntax/index.html new file mode 100644 index 00000000..05507827 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Systemc/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Host.Make.Systemc.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Systemc/G/index.html b/docs/rfsm/Rfsm/Host/Make/Systemc/G/index.html new file mode 100644 index 00000000..c8570576 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Systemc/G/index.html @@ -0,0 +1,5 @@ + +G (rfsm.Rfsm.Host.Make.Systemc.G)

Module Systemc.G

type value
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the SystemC declaration of symbol id with type ty.

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the SystemC type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td (resp. pp_type_impl fmt td) should print, on formatter fmt, the SystemC declaration and implementation (in the .h and .cpp file resp.) corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the SystemC expression corresponding to expression e.

val pp_typ : Stdlib.Format.formatter -> Syntax.Types.typ -> unit

pp_typ fmt ty should print, on formatter fmt, the SystemC type corresponding to type ty.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the SystemC representation of LHS l.

val pp_value : Stdlib.Format.formatter -> value -> unit

pp_value fmt v should print, on formatter fmt, the SystemC value corresponding to value v.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Systemc/index.html b/docs/rfsm/Rfsm/Host/Make/Systemc/index.html new file mode 100644 index 00000000..73e0c6de --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Systemc/index.html @@ -0,0 +1,2 @@ + +Systemc (rfsm.Rfsm.Host.Make.Systemc)

Module Make.Systemc

module Static = Static
module G : Guest.SYSTEMC
exception Invalid_output_assign of string * Location.t
val output : dir:string -> ?pfx:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Typing/HostSyntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Host/Make/Typing/HostSyntax/Guest/Types/index.html new file mode 100644 index 00000000..7c0b537f --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Typing/HostSyntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.Make.Typing.HostSyntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Typing/HostSyntax/Guest/index.html b/docs/rfsm/Rfsm/Host/Make/Typing/HostSyntax/Guest/index.html new file mode 100644 index 00000000..bc34277c --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Typing/HostSyntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Host.Make.Typing.HostSyntax.Guest)

Module HostSyntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Typing/HostSyntax/index.html b/docs/rfsm/Rfsm/Host/Make/Typing/HostSyntax/index.html new file mode 100644 index 00000000..bfb4a5ae --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Typing/HostSyntax/index.html @@ -0,0 +1,5 @@ + +HostSyntax (rfsm.Rfsm.Host.Make.Typing.HostSyntax)

Module Typing.HostSyntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Typing/index.html b/docs/rfsm/Rfsm/Host/Make/Typing/index.html new file mode 100644 index 00000000..1a5a3878 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Host.Make.Typing)

Module Make.Typing

type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Vcd/index.html b/docs/rfsm/Rfsm/Host/Make/Vcd/index.html new file mode 100644 index 00000000..f6e7c4ca --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Vcd/index.html @@ -0,0 +1,2 @@ + +Vcd (rfsm.Rfsm.Host.Make.Vcd)

Module Make.Vcd

type seq
exception Unsupported of Vcd_types.vcd_typ * Vcd_types.vcd_value
val output : fname:string -> seq -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Vhdl/G/Static/index.html b/docs/rfsm/Rfsm/Host/Make/Vhdl/G/Static/index.html new file mode 100644 index 00000000..ebe59e85 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Vhdl/G/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Host.Make.Vhdl.G.Static)

Module G.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Vhdl/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Host/Make/Vhdl/G/Syntax/Types/index.html new file mode 100644 index 00000000..4f1482c3 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Vhdl/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.Make.Vhdl.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Vhdl/G/Syntax/index.html b/docs/rfsm/Rfsm/Host/Make/Vhdl/G/Syntax/index.html new file mode 100644 index 00000000..1b7dfbaa --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Vhdl/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Host.Make.Vhdl.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Vhdl/G/index.html b/docs/rfsm/Rfsm/Host/Make/Vhdl/G/index.html new file mode 100644 index 00000000..29670314 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Vhdl/G/index.html @@ -0,0 +1,2 @@ + +G (rfsm.Rfsm.Host.Make.Vhdl.G)

Module Vhdl.G

type value
val vhdl_type_of : Syntax.Types.typ -> Vhdl_types.t

vhdl_type_of ty should return the VHDL type corresponding to type ty.

val allowed_shared_type : Syntax.Types.typ -> bool

allowed_shared_type ty should indicate whether type ty can be attributed to a VHDL shared variable.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the VHDL translation of type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the VHDL expression corresponding to expression e.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the VHDL representation of LHS l.

val pp_value : Stdlib.Format.formatter -> (value * Vhdl_types.t) -> unit

pp_value fmt (v,t) should print, on formatter fmt, the VHDL value corresponding to value v, with type t.

val pp_type_fns_intf : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_fns_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_fns_intf td (resp. pp_type_fns_impl fmt td) should print, on formatter fmt, the VHDL declaration and implementation (in the entity and architecture definition resp.) corresponding to type declaration td.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/Vhdl/index.html b/docs/rfsm/Rfsm/Host/Make/Vhdl/index.html new file mode 100644 index 00000000..e14a0516 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/Vhdl/index.html @@ -0,0 +1,2 @@ + +Vhdl (rfsm.Rfsm.Host.Make.Vhdl)

Module Make.Vhdl

module Static = Static
module G : Guest.VHDL
exception Invalid_output_assign of string * Location.t
val output : dir:string -> ?pfx:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/argument-1-G/Ctask/index.html b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Ctask/index.html new file mode 100644 index 00000000..f41c94e1 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Ctask/index.html @@ -0,0 +1,5 @@ + +Ctask (rfsm.Rfsm.Host.Make.G.Ctask)

Module G.Ctask

module Syntax = Syntax
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the C declaration of symbol id with type ty. For example, for an int named "x", this should be "int x", and for an array of 8 ints named "a", this should be "int a[8]".

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the C type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the C statement corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the C expression corresponding to expression e.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/argument-1-G/Error/index.html b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Error/index.html new file mode 100644 index 00000000..dd8d8a24 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Error/index.html @@ -0,0 +1,2 @@ + +Error (rfsm.Rfsm.Host.Make.G.Error)

Module G.Error

val handle : exn -> unit

This function will be called to handle guest-level exceptions, i.e. exceptions raised by guest specific functions and not handled by the host language.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/argument-1-G/Eval/index.html b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Eval/index.html new file mode 100644 index 00000000..676c3fa7 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Eval/index.html @@ -0,0 +1,2 @@ + +Eval (rfsm.Rfsm.Host.Make.G.Eval)

Module G.Eval

module Syntax = Syntax
module Value = Value
type env = Value.t Env.t

The type of dynamic environments, mapping identifiers to values.

val mk_env : unit -> env

mk_env () should return a new, empty dynamic environment

val upd_env : Syntax.lhs -> Value.t -> env -> env

upd_env l v env should return the environment obtained by adding the binding (l,v) to env. If l is already bound in env, the associated value is updated.

Evaluators

exception Illegal_expr of Syntax.expr
val eval_expr : env -> Syntax.expr -> Value.t

eval_expr env e should return the value obtained by evaluating expression e in environment env. Should raise Illegal_expr in case of failure.

val eval_bool : env -> Syntax.expr -> bool

eval_bool env e should return the boolean value obtained by evaluating expression e in environment env. Should raise Illegal_expr if e does not denote a boolean value or in case of failure.

Printing

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of environment env on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/argument-1-G/Info/index.html b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Info/index.html new file mode 100644 index 00000000..23404d8e --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Info/index.html @@ -0,0 +1,2 @@ + +Info (rfsm.Rfsm.Host.Make.G.Info)

Module G.Info

val name : string

Name of the guest language

val version : string

Version

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/argument-1-G/Options/index.html b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Options/index.html new file mode 100644 index 00000000..83b82d0d --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Options/index.html @@ -0,0 +1,2 @@ + +Options (rfsm.Rfsm.Host.Make.G.Options)

Module G.Options

val specs : (string * Stdlib.Arg.spec * string) list

specs should list all guest-specific compiler options. These options will be added to those related to the host language.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/argument-1-G/Static/index.html b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Static/index.html new file mode 100644 index 00000000..50447ec7 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Host.Make.G.Static)

Module G.Static

type expr = Syntax.expr

The type of guest-level expressions

type value = Value.t

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/argument-1-G/Syntax/index.html b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Syntax/index.html new file mode 100644 index 00000000..34ff0b2a --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Host.Make.G.Syntax)

Module G.Syntax

module Types = Types

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/argument-1-G/Systemc/index.html b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Systemc/index.html new file mode 100644 index 00000000..74747a43 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Systemc/index.html @@ -0,0 +1,5 @@ + +Systemc (rfsm.Rfsm.Host.Make.G.Systemc)

Module G.Systemc

module Static = Static
module Syntax = Syntax
type value = Value.t
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the SystemC declaration of symbol id with type ty.

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the SystemC type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td (resp. pp_type_impl fmt td) should print, on formatter fmt, the SystemC declaration and implementation (in the .h and .cpp file resp.) corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the SystemC expression corresponding to expression e.

val pp_typ : Stdlib.Format.formatter -> Syntax.Types.typ -> unit

pp_typ fmt ty should print, on formatter fmt, the SystemC type corresponding to type ty.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the SystemC representation of LHS l.

val pp_value : Stdlib.Format.formatter -> value -> unit

pp_value fmt v should print, on formatter fmt, the SystemC value corresponding to value v.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/argument-1-G/Types/index.html b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Types/index.html new file mode 100644 index 00000000..2943be23 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.Make.G.Types)

Module G.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/argument-1-G/Typing/index.html b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Typing/index.html new file mode 100644 index 00000000..157f4680 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Host.Make.G.Typing)

Module G.Typing

module Syntax = Syntax
module Types = Types

Typing environment

type env
val mk_env : unit -> env

mk_env () should return the initial typing environment. This environment should contain, in particular, bindings for builtins primitives, type and value constructors.

val lookup_var : loc:Location.t -> Ident.t -> env -> Types.typ

lookup_var l x env should return the type bound to identifier x in environment env. The behaviour when x is not bound in env is left to guest definition. A possibility is to raise Ident.Undefined for example.

val add_var : scope:Ident.scope -> env -> (Ident.t * Types.typ) -> env

add_var scope env (x,t) should return the environment obtained by the binding (x,t) to env. The scope parameter is a hint to the guest type inference system. Typically, it will be used to determine, in the case the added type contains type variables, whether these variables will be generalized (scope=Local) or not (scope=Global). The behaviour when x is already bound in env is left to guest definition.

val add_param : env -> (Ident.t * Syntax.expr) -> env

add_param env (x,t) should return the environment obtained by the binding (x,t) as a model parameter to env.

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of typing environment env on formatter fmt.

Low-level interface to the the type-checking engine

val type_check : loc:Location.t -> Types.typ -> Types.typ -> unit

type_check loc t t' should be called whenever types t and t' have to be unified at program location loc.

High-level interface to the type-checking engine

val type_type_decl : env -> Syntax.type_decl -> env

type_type_decl env td should return the typing environment obtained by type checking the type declaration td in environment env.

val type_expression : env -> Syntax.expr -> Types.typ

type_expression env e should return the type of expression e in environment env.

val type_of_type_expr : env -> Syntax.type_expr -> Types.typ

type_of_type_expr env te should return the type denoted by the type expression te in environment env.

val type_lhs : env -> Syntax.lhs -> Types.typ

type_lhs env l should return the type of LHS l in environment env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/argument-1-G/Value/index.html b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Value/index.html new file mode 100644 index 00000000..12d8e7c7 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Host.Make.G.Value)

Module G.Value

type t

The type of guest-level values

type typ = Types.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/argument-1-G/Vhdl/index.html b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Vhdl/index.html new file mode 100644 index 00000000..4a794956 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/argument-1-G/Vhdl/index.html @@ -0,0 +1,2 @@ + +Vhdl (rfsm.Rfsm.Host.Make.G.Vhdl)

Module G.Vhdl

module Syntax = Syntax
module Static = Static
type value = Value.t
val vhdl_type_of : Syntax.Types.typ -> Vhdl_types.t

vhdl_type_of ty should return the VHDL type corresponding to type ty.

val allowed_shared_type : Syntax.Types.typ -> bool

allowed_shared_type ty should indicate whether type ty can be attributed to a VHDL shared variable.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the VHDL translation of type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the VHDL expression corresponding to expression e.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the VHDL representation of LHS l.

val pp_value : Stdlib.Format.formatter -> (value * Vhdl_types.t) -> unit

pp_value fmt (v,t) should print, on formatter fmt, the VHDL value corresponding to value v, with type t.

val pp_type_fns_intf : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_fns_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_fns_intf td (resp. pp_type_fns_impl fmt td) should print, on formatter fmt, the VHDL declaration and implementation (in the entity and architecture definition resp.) corresponding to type declaration td.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/argument-1-G/index.html b/docs/rfsm/Rfsm/Host/Make/argument-1-G/index.html new file mode 100644 index 00000000..268cf757 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/argument-1-G/index.html @@ -0,0 +1,12 @@ + +G (rfsm.Rfsm.Host.Make.G)

Parameter Make.G

module Info : Guest.INFO
module Syntax : Guest.SYNTAX with module Types = Types
module Typing : + Guest.TYPING with module Syntax = Syntax and module Types = Types
module Value : Guest.VALUE with type typ = Types.typ
module Static : + Guest.STATIC with type expr = Syntax.expr and type value = Value.t
module Eval : Guest.EVAL with module Syntax = Syntax and module Value = Value
module Ctask : Guest.CTASK with module Syntax = Syntax
module Systemc : + Guest.SYSTEMC + with module Syntax = Syntax + and module Static = Static + and type value = Value.t
module Vhdl : + Guest.VHDL + with module Syntax = Syntax + and module Static = Static + and type value = Value.t
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/Make/index.html b/docs/rfsm/Rfsm/Host/Make/index.html new file mode 100644 index 00000000..1039b5e9 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/Make/index.html @@ -0,0 +1,3 @@ + +Make (rfsm.Rfsm.Host.Make)

Module Host.Make

Functor building the host language implementation given a guest language implementation

Parameters

module G : Guest.T

Signature

module Guest = G
module Syntax = Syntax.Make(G.Syntax)
module Static : Static.T
module Dot : Dot.DOT with module Static = Static
module Dynamic : + Dynamic.DYNAMIC with module Syntax = Syntax and module Static = Static
module Vcd : Vcd.VCD
module Ctask : Ctask.CTASK with module Static = Static
module Systemc : Systemc.SYSTEMC with module Static = Static
module Vhdl : Vhdl.VHDL with module Static = Static
val run : ?vcd_file:string -> Syntax.program -> Static.t -> unit
val pp_program : Stdlib.Format.formatter -> Syntax.program -> unit
val pp_tenv : Stdlib.Format.formatter -> Typing.env -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/index.html b/docs/rfsm/Rfsm/Host/index.html new file mode 100644 index 00000000..dd24d9da --- /dev/null +++ b/docs/rfsm/Rfsm/Host/index.html @@ -0,0 +1,4 @@ + +Host (rfsm.Rfsm.Host)

Module Rfsm.Host

Host language definition

module type T = sig ... end

Output signature of the functor Host.Make

module Make + (G : Guest.T) : + T with module Guest = G and module Syntax = Syntax.Make(G.Syntax)

Functor building the host language implementation given a guest language implementation

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Ctask/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Ctask/G/Syntax/Types/index.html new file mode 100644 index 00000000..fca4d475 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Ctask/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.T.Ctask.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Ctask/G/Syntax/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Ctask/G/Syntax/index.html new file mode 100644 index 00000000..b3a1333d --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Ctask/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Host.T.Ctask.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Ctask/G/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Ctask/G/index.html new file mode 100644 index 00000000..4cb81569 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Ctask/G/index.html @@ -0,0 +1,5 @@ + +G (rfsm.Rfsm.Host.T.Ctask.G)

Module Ctask.G

val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the C declaration of symbol id with type ty. For example, for an int named "x", this should be "int x", and for an array of 8 ints named "a", this should be "int a[8]".

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the C type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the C statement corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the C expression corresponding to expression e.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Ctask/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Ctask/index.html new file mode 100644 index 00000000..f4756b11 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Ctask/index.html @@ -0,0 +1,2 @@ + +Ctask (rfsm.Rfsm.Host.T.Ctask)

Module T.Ctask

module Static = Static
module G : Guest.CTASK
exception Error of string * string
val output : dir:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Dot/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Dot/index.html new file mode 100644 index 00000000..f004c0ad --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Dot/index.html @@ -0,0 +1,2 @@ + +Dot (rfsm.Rfsm.Host.T.Dot)

Module T.Dot

module Static = Static
val output_static : dir:string -> name:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/Syntax/Types/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/Syntax/Types/index.html new file mode 100644 index 00000000..2c3b52f7 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.T.Dynamic.EvSeq.Evset.Event.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/Syntax/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/Syntax/index.html new file mode 100644 index 00000000..265d27d1 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Host.T.Dynamic.EvSeq.Evset.Event.Syntax)

Module Event.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/Value/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/Value/index.html new file mode 100644 index 00000000..56829b56 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Host.T.Dynamic.EvSeq.Evset.Event.Value)

Module Event.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/index.html new file mode 100644 index 00000000..4778ce60 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/Event/index.html @@ -0,0 +1,2 @@ + +Event (rfsm.Rfsm.Host.T.Dynamic.EvSeq.Evset.Event)

Module Evset.Event

type t =
  1. | Ev of Ident.t
    (*

    pure event

    *)
  2. | Upd of Syntax.lhs * Value.t
    (*

    assignation (lhs <- v)

    *)
  3. | StateMove of string * string
    (*

    state move (src,dst)

    *)
val is_pure_event : t -> bool
val compare : t -> t -> int
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/index.html new file mode 100644 index 00000000..eccaf44a --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/Evset/index.html @@ -0,0 +1,2 @@ + +Evset (rfsm.Rfsm.Host.T.Dynamic.EvSeq.Evset)

Module EvSeq.Evset

module Event : Event.T
type date = int
type t
exception Union of t * t
val mk : date -> Event.t list -> t
val empty : date -> t
val date : t -> date
val events : t -> Event.t list
val is_empty : t -> bool
exception Add of Event.t
val add : t -> Event.t -> t
val union : t -> t -> t
val union_all : date -> t list -> t
val partition : f:(Event.t -> bool) -> t -> t * t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/index.html new file mode 100644 index 00000000..50d3d556 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/EvSeq/index.html @@ -0,0 +1,2 @@ + +EvSeq (rfsm.Rfsm.Host.T.Dynamic.EvSeq)

Module Dynamic.EvSeq

module Evset : Evset.T
type t = Evset.t list
type value
val merge : t -> t -> t
val (@@) : t -> t -> t

@@ is the infix notation for merge

val merge_all : t list -> t
val mk_periodic : Ident.t -> int -> int -> int -> t
val mk_changes : Ident.t -> (int * value) list -> t
val mk_sporadic : Ident.t -> int list -> t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/Syntax/Types/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/Syntax/Types/index.html new file mode 100644 index 00000000..670d5600 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.T.Dynamic.Eval.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/Syntax/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/Syntax/index.html new file mode 100644 index 00000000..17e98c42 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Host.T.Dynamic.Eval.Syntax)

Module Eval.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/Value/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/Value/index.html new file mode 100644 index 00000000..cde056c8 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Host.T.Dynamic.Eval.Value)

Module Eval.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/index.html new file mode 100644 index 00000000..236a069a --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/Eval/index.html @@ -0,0 +1,2 @@ + +Eval (rfsm.Rfsm.Host.T.Dynamic.Eval)

Module Dynamic.Eval

type env = Value.t Env.t

The type of dynamic environments, mapping identifiers to values.

val mk_env : unit -> env

mk_env () should return a new, empty dynamic environment

val upd_env : Syntax.lhs -> Value.t -> env -> env

upd_env l v env should return the environment obtained by adding the binding (l,v) to env. If l is already bound in env, the associated value is updated.

Evaluators

exception Illegal_expr of Syntax.expr
val eval_expr : env -> Syntax.expr -> Value.t

eval_expr env e should return the value obtained by evaluating expression e in environment env. Should raise Illegal_expr in case of failure.

val eval_bool : env -> Syntax.expr -> bool

eval_bool env e should return the boolean value obtained by evaluating expression e in environment env. Should raise Illegal_expr if e does not denote a boolean value or in case of failure.

Printing

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of environment env on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/index.html new file mode 100644 index 00000000..79bb9e46 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Dynamic/index.html @@ -0,0 +1,2 @@ + +Dynamic (rfsm.Rfsm.Host.T.Dynamic)

Module T.Dynamic

module Syntax = Syntax
module Static = Static
module Eval : Guest.EVAL
exception Illegal_stimulus_value of Location.t
exception Non_deterministic_transition of string * int * Syntax.transition list

FSM name, date, transitions

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Guest/Ctask/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Ctask/index.html new file mode 100644 index 00000000..a8710b5b --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Ctask/index.html @@ -0,0 +1,5 @@ + +Ctask (rfsm.Rfsm.Host.T.Guest.Ctask)

Module Guest.Ctask

module Syntax = Syntax
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the C declaration of symbol id with type ty. For example, for an int named "x", this should be "int x", and for an array of 8 ints named "a", this should be "int a[8]".

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the C type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the C statement corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the C expression corresponding to expression e.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Guest/Error/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Error/index.html new file mode 100644 index 00000000..753e4f0c --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Error/index.html @@ -0,0 +1,2 @@ + +Error (rfsm.Rfsm.Host.T.Guest.Error)

Module Guest.Error

val handle : exn -> unit

This function will be called to handle guest-level exceptions, i.e. exceptions raised by guest specific functions and not handled by the host language.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Guest/Eval/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Eval/index.html new file mode 100644 index 00000000..bbf9b3c6 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Eval/index.html @@ -0,0 +1,2 @@ + +Eval (rfsm.Rfsm.Host.T.Guest.Eval)

Module Guest.Eval

module Syntax = Syntax
module Value = Value
type env = Value.t Env.t

The type of dynamic environments, mapping identifiers to values.

val mk_env : unit -> env

mk_env () should return a new, empty dynamic environment

val upd_env : Syntax.lhs -> Value.t -> env -> env

upd_env l v env should return the environment obtained by adding the binding (l,v) to env. If l is already bound in env, the associated value is updated.

Evaluators

exception Illegal_expr of Syntax.expr
val eval_expr : env -> Syntax.expr -> Value.t

eval_expr env e should return the value obtained by evaluating expression e in environment env. Should raise Illegal_expr in case of failure.

val eval_bool : env -> Syntax.expr -> bool

eval_bool env e should return the boolean value obtained by evaluating expression e in environment env. Should raise Illegal_expr if e does not denote a boolean value or in case of failure.

Printing

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of environment env on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Guest/Info/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Info/index.html new file mode 100644 index 00000000..49742b50 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Info/index.html @@ -0,0 +1,2 @@ + +Info (rfsm.Rfsm.Host.T.Guest.Info)

Module Guest.Info

val name : string

Name of the guest language

val version : string

Version

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Guest/Options/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Options/index.html new file mode 100644 index 00000000..17acaef8 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Options/index.html @@ -0,0 +1,2 @@ + +Options (rfsm.Rfsm.Host.T.Guest.Options)

Module Guest.Options

val specs : (string * Stdlib.Arg.spec * string) list

specs should list all guest-specific compiler options. These options will be added to those related to the host language.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Guest/Static/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Static/index.html new file mode 100644 index 00000000..766abdde --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Host.T.Guest.Static)

Module Guest.Static

type expr = Syntax.expr

The type of guest-level expressions

type value = Value.t

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Guest/Syntax/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Syntax/index.html new file mode 100644 index 00000000..89b9d5bb --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Host.T.Guest.Syntax)

Module Guest.Syntax

module Types = Types

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Guest/Systemc/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Systemc/index.html new file mode 100644 index 00000000..e24ba43a --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Systemc/index.html @@ -0,0 +1,5 @@ + +Systemc (rfsm.Rfsm.Host.T.Guest.Systemc)

Module Guest.Systemc

module Static = Static
module Syntax = Syntax
type value = Value.t
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the SystemC declaration of symbol id with type ty.

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the SystemC type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td (resp. pp_type_impl fmt td) should print, on formatter fmt, the SystemC declaration and implementation (in the .h and .cpp file resp.) corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the SystemC expression corresponding to expression e.

val pp_typ : Stdlib.Format.formatter -> Syntax.Types.typ -> unit

pp_typ fmt ty should print, on formatter fmt, the SystemC type corresponding to type ty.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the SystemC representation of LHS l.

val pp_value : Stdlib.Format.formatter -> value -> unit

pp_value fmt v should print, on formatter fmt, the SystemC value corresponding to value v.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Guest/Types/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Types/index.html new file mode 100644 index 00000000..7e48bec6 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.T.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Guest/Typing/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Typing/index.html new file mode 100644 index 00000000..deeaa68c --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Host.T.Guest.Typing)

Module Guest.Typing

module Syntax = Syntax
module Types = Types

Typing environment

type env
val mk_env : unit -> env

mk_env () should return the initial typing environment. This environment should contain, in particular, bindings for builtins primitives, type and value constructors.

val lookup_var : loc:Location.t -> Ident.t -> env -> Types.typ

lookup_var l x env should return the type bound to identifier x in environment env. The behaviour when x is not bound in env is left to guest definition. A possibility is to raise Ident.Undefined for example.

val add_var : scope:Ident.scope -> env -> (Ident.t * Types.typ) -> env

add_var scope env (x,t) should return the environment obtained by the binding (x,t) to env. The scope parameter is a hint to the guest type inference system. Typically, it will be used to determine, in the case the added type contains type variables, whether these variables will be generalized (scope=Local) or not (scope=Global). The behaviour when x is already bound in env is left to guest definition.

val add_param : env -> (Ident.t * Syntax.expr) -> env

add_param env (x,t) should return the environment obtained by the binding (x,t) as a model parameter to env.

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of typing environment env on formatter fmt.

Low-level interface to the the type-checking engine

val type_check : loc:Location.t -> Types.typ -> Types.typ -> unit

type_check loc t t' should be called whenever types t and t' have to be unified at program location loc.

High-level interface to the type-checking engine

val type_type_decl : env -> Syntax.type_decl -> env

type_type_decl env td should return the typing environment obtained by type checking the type declaration td in environment env.

val type_expression : env -> Syntax.expr -> Types.typ

type_expression env e should return the type of expression e in environment env.

val type_of_type_expr : env -> Syntax.type_expr -> Types.typ

type_of_type_expr env te should return the type denoted by the type expression te in environment env.

val type_lhs : env -> Syntax.lhs -> Types.typ

type_lhs env l should return the type of LHS l in environment env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Guest/Value/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Value/index.html new file mode 100644 index 00000000..e69ffbca --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Host.T.Guest.Value)

Module Guest.Value

type t

The type of guest-level values

type typ = Types.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Guest/Vhdl/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Vhdl/index.html new file mode 100644 index 00000000..a2df1e32 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Guest/Vhdl/index.html @@ -0,0 +1,2 @@ + +Vhdl (rfsm.Rfsm.Host.T.Guest.Vhdl)

Module Guest.Vhdl

module Syntax = Syntax
module Static = Static
type value = Value.t
val vhdl_type_of : Syntax.Types.typ -> Vhdl_types.t

vhdl_type_of ty should return the VHDL type corresponding to type ty.

val allowed_shared_type : Syntax.Types.typ -> bool

allowed_shared_type ty should indicate whether type ty can be attributed to a VHDL shared variable.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the VHDL translation of type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the VHDL expression corresponding to expression e.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the VHDL representation of LHS l.

val pp_value : Stdlib.Format.formatter -> (value * Vhdl_types.t) -> unit

pp_value fmt (v,t) should print, on formatter fmt, the VHDL value corresponding to value v, with type t.

val pp_type_fns_intf : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_fns_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_fns_intf td (resp. pp_type_fns_impl fmt td) should print, on formatter fmt, the VHDL declaration and implementation (in the entity and architecture definition resp.) corresponding to type declaration td.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Guest/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Guest/index.html new file mode 100644 index 00000000..f9555619 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Guest/index.html @@ -0,0 +1,12 @@ + +Guest (rfsm.Rfsm.Host.T.Guest)

Module T.Guest

module Info : Guest.INFO
module Syntax : Guest.SYNTAX with module Types = Types
module Typing : + Guest.TYPING with module Syntax = Syntax and module Types = Types
module Value : Guest.VALUE with type typ = Types.typ
module Static : + Guest.STATIC with type expr = Syntax.expr and type value = Value.t
module Eval : Guest.EVAL with module Syntax = Syntax and module Value = Value
module Ctask : Guest.CTASK with module Syntax = Syntax
module Systemc : + Guest.SYSTEMC + with module Syntax = Syntax + and module Static = Static + and type value = Value.t
module Vhdl : + Guest.VHDL + with module Syntax = Syntax + and module Static = Static + and type value = Value.t
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Static/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Static/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..cca0b03a --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Static/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.T.Static.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Static/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Static/Syntax/Guest/index.html new file mode 100644 index 00000000..c2be5bd8 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Static/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Host.T.Static.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Static/Syntax/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Static/Syntax/index.html new file mode 100644 index 00000000..5a9272b4 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Static/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Host.T.Static.Syntax)

Module Static.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Static/Typing/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Static/Typing/index.html new file mode 100644 index 00000000..3ed8bb0b --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Host.T.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Static/Value/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Static/Value/index.html new file mode 100644 index 00000000..35dc9f82 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Host.T.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Static/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Static/index.html new file mode 100644 index 00000000..c401bf20 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Host.T.Static)

Module T.Static

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..84d18543 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.T.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Syntax/Guest/index.html new file mode 100644 index 00000000..1bad23b9 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Host.T.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Syntax/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Syntax/index.html new file mode 100644 index 00000000..f2b1952b --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Host.T.Syntax)

Module T.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/Static/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/Static/index.html new file mode 100644 index 00000000..1e87de58 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Host.T.Systemc.G.Static)

Module G.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/Syntax/Types/index.html new file mode 100644 index 00000000..3b111069 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.T.Systemc.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/Syntax/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/Syntax/index.html new file mode 100644 index 00000000..0d0c010b --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Host.T.Systemc.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/index.html new file mode 100644 index 00000000..4956dfcb --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Systemc/G/index.html @@ -0,0 +1,5 @@ + +G (rfsm.Rfsm.Host.T.Systemc.G)

Module Systemc.G

type value
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the SystemC declaration of symbol id with type ty.

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the SystemC type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td (resp. pp_type_impl fmt td) should print, on formatter fmt, the SystemC declaration and implementation (in the .h and .cpp file resp.) corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the SystemC expression corresponding to expression e.

val pp_typ : Stdlib.Format.formatter -> Syntax.Types.typ -> unit

pp_typ fmt ty should print, on formatter fmt, the SystemC type corresponding to type ty.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the SystemC representation of LHS l.

val pp_value : Stdlib.Format.formatter -> value -> unit

pp_value fmt v should print, on formatter fmt, the SystemC value corresponding to value v.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Systemc/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Systemc/index.html new file mode 100644 index 00000000..6e1224bc --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Systemc/index.html @@ -0,0 +1,2 @@ + +Systemc (rfsm.Rfsm.Host.T.Systemc)

Module T.Systemc

module Static = Static
module G : Guest.SYSTEMC
exception Invalid_output_assign of string * Location.t
val output : dir:string -> ?pfx:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Typing/HostSyntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Typing/HostSyntax/Guest/Types/index.html new file mode 100644 index 00000000..abac5490 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Typing/HostSyntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.T.Typing.HostSyntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Typing/HostSyntax/Guest/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Typing/HostSyntax/Guest/index.html new file mode 100644 index 00000000..70687c44 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Typing/HostSyntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Host.T.Typing.HostSyntax.Guest)

Module HostSyntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Typing/HostSyntax/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Typing/HostSyntax/index.html new file mode 100644 index 00000000..24c09407 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Typing/HostSyntax/index.html @@ -0,0 +1,5 @@ + +HostSyntax (rfsm.Rfsm.Host.T.Typing.HostSyntax)

Module Typing.HostSyntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Typing/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Typing/index.html new file mode 100644 index 00000000..1a39423d --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Host.T.Typing)

Module T.Typing

type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Vcd/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Vcd/index.html new file mode 100644 index 00000000..b225b8dc --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Vcd/index.html @@ -0,0 +1,2 @@ + +Vcd (rfsm.Rfsm.Host.T.Vcd)

Module T.Vcd

type seq
exception Unsupported of Vcd_types.vcd_typ * Vcd_types.vcd_value
val output : fname:string -> seq -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/Static/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/Static/index.html new file mode 100644 index 00000000..c2d833ad --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Host.T.Vhdl.G.Static)

Module G.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/Syntax/Types/index.html new file mode 100644 index 00000000..7fa61024 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Host.T.Vhdl.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/Syntax/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/Syntax/index.html new file mode 100644 index 00000000..a36a8de2 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Host.T.Vhdl.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/index.html new file mode 100644 index 00000000..52028a53 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/G/index.html @@ -0,0 +1,2 @@ + +G (rfsm.Rfsm.Host.T.Vhdl.G)

Module Vhdl.G

type value
val vhdl_type_of : Syntax.Types.typ -> Vhdl_types.t

vhdl_type_of ty should return the VHDL type corresponding to type ty.

val allowed_shared_type : Syntax.Types.typ -> bool

allowed_shared_type ty should indicate whether type ty can be attributed to a VHDL shared variable.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the VHDL translation of type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the VHDL expression corresponding to expression e.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the VHDL representation of LHS l.

val pp_value : Stdlib.Format.formatter -> (value * Vhdl_types.t) -> unit

pp_value fmt (v,t) should print, on formatter fmt, the VHDL value corresponding to value v, with type t.

val pp_type_fns_intf : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_fns_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_fns_intf td (resp. pp_type_fns_impl fmt td) should print, on formatter fmt, the VHDL declaration and implementation (in the entity and architecture definition resp.) corresponding to type declaration td.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/index.html b/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/index.html new file mode 100644 index 00000000..19f4aeb7 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/Vhdl/index.html @@ -0,0 +1,2 @@ + +Vhdl (rfsm.Rfsm.Host.T.Vhdl)

Module T.Vhdl

module Static = Static
module G : Guest.VHDL
exception Invalid_output_assign of string * Location.t
val output : dir:string -> ?pfx:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Host/module-type-T/index.html b/docs/rfsm/Rfsm/Host/module-type-T/index.html new file mode 100644 index 00000000..4b753304 --- /dev/null +++ b/docs/rfsm/Rfsm/Host/module-type-T/index.html @@ -0,0 +1,3 @@ + +T (rfsm.Rfsm.Host.T)

Module type Host.T

Output signature of the functor Host.Make

module Guest : Guest.T
module Static : Static.T
module Dot : Dot.DOT with module Static = Static
module Dynamic : + Dynamic.DYNAMIC with module Syntax = Syntax and module Static = Static
module Vcd : Vcd.VCD
module Ctask : Ctask.CTASK with module Static = Static
module Systemc : Systemc.SYSTEMC with module Static = Static
module Vhdl : Vhdl.VHDL with module Static = Static
val run : ?vcd_file:string -> Syntax.program -> Static.t -> unit
val pp_program : Stdlib.Format.formatter -> Syntax.program -> unit
val pp_tenv : Stdlib.Format.formatter -> Typing.env -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Ident/index.html b/docs/rfsm/Rfsm/Ident/index.html new file mode 100644 index 00000000..395f476e --- /dev/null +++ b/docs/rfsm/Rfsm/Ident/index.html @@ -0,0 +1,2 @@ + +Ident (rfsm.Rfsm.Ident)

Module Rfsm.Ident

Identifiers

type t = {
  1. scope : scope;
  2. id : string;
}
and scope =
  1. | Local
  2. | Global
exception Undefined of string * Location.t * t

What, where, identifier

exception Duplicate of string * Location.t * t

What, where, identifier

val mk : ?scope:scope -> string -> t
val mk_global : t -> t

mk_global i is {id = i.id; scope=Global}

val mk_local : t -> t

mk_local i is {id = i.id; scope=Local}

val upd_id : (string -> string) -> t -> t

upd_id f i is {id = f i.id; scope = i.scope}

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt i prints identifier i using formatter fmt

val pp_qual : Stdlib.Format.formatter -> t -> unit

For identifiers with a local scope, pp_qual fmt i is pp fmt i. For identifiers with a global scope, a leading "$" is prepended to the name.

val to_string : t -> string
val compare : t -> t -> int

Used to define sets and maps of identifiers. Warning: scope is _not_ taken into account.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Location/index.html b/docs/rfsm/Rfsm/Location/index.html new file mode 100644 index 00000000..b3796ebc --- /dev/null +++ b/docs/rfsm/Rfsm/Location/index.html @@ -0,0 +1,2 @@ + +Location (rfsm.Rfsm.Location)

Module Rfsm.Location

Source program locations

type t =
  1. | Loc of string * int * int
    (*

    Filename, position of the first character, position of the next character following the last one

    *)
val mk : (Stdlib.Lexing.position * Stdlib.Lexing.position) -> t
val get_current_location : unit -> t
val no_location : t
val input_name : string Stdlib.ref
val input_chan : Stdlib.in_channel Stdlib.ref
val input_lexbuf : Stdlib.Lexing.lexbuf Stdlib.ref
val pp_location : Stdlib.Format.formatter -> t -> unit
val pp_input_name : Stdlib.Format.formatter -> unit
val string_of_location : t -> string
val text_of_location : t -> string
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Logfile/index.html b/docs/rfsm/Rfsm/Logfile/index.html new file mode 100644 index 00000000..7687e008 --- /dev/null +++ b/docs/rfsm/Rfsm/Logfile/index.html @@ -0,0 +1,2 @@ + +Logfile (rfsm.Rfsm.Logfile)

Module Rfsm.Logfile

Compiler log files

val fname : string
val channel : Stdlib.out_channel option Stdlib.ref
val stop : unit -> unit
val start : unit -> unit
val write : string -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Misc/index.html b/docs/rfsm/Rfsm/Misc/index.html new file mode 100644 index 00000000..1023b93a --- /dev/null +++ b/docs/rfsm/Rfsm/Misc/index.html @@ -0,0 +1,2 @@ + +Misc (rfsm.Rfsm.Misc)

Module Rfsm.Misc

exception Not_implemented of string
exception Fatal_error of string
type act_semantics =
  1. | Sequential
  2. | Synchronous
val not_implemented : string -> 'a
val fatal_error : string -> 'a
val warning : string -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Options/index.html b/docs/rfsm/Rfsm/Options/index.html new file mode 100644 index 00000000..e25f390a --- /dev/null +++ b/docs/rfsm/Rfsm/Options/index.html @@ -0,0 +1,2 @@ + +Options (rfsm.Rfsm.Options)

Module Rfsm.Options

Compiler options

type target =
  1. | Dot
  2. | Sim
  3. | CTask
  4. | SystemC
  5. | Vhdl
val main_prefix : string Stdlib.ref
val target : target option Stdlib.ref
val use_old_syntax : bool Stdlib.ref
val target_dir : string Stdlib.ref
val main_name : string Stdlib.ref
val print_version : bool Stdlib.ref
val do_run : bool Stdlib.ref
val dump_tenv : bool Stdlib.ref
val dump_typed : bool Stdlib.ref
val dump_static : bool Stdlib.ref
val dot_abbrev_types : bool Stdlib.ref
val normalize : bool Stdlib.ref
val dump_backtrace : bool Stdlib.ref
val gui : bool Stdlib.ref
val set_main_prefix : string -> unit
val set_old_syntax : unit -> unit
val set_sim : unit -> unit
val set_dot : unit -> unit
val set_ctask : unit -> unit
val set_systemc : unit -> unit
val set_vhdl : unit -> unit
val set_print_version : unit -> unit
val set_dump_typed : unit -> unit
val set_dump_tenv : unit -> unit
val set_dump_static : unit -> unit
val set_target_dir : string -> unit
val set_main_name : string -> unit
val set_normalize : unit -> unit
val set_gui : unit -> unit
val set_synchronous_actions : unit -> unit
val set_sequential_actions : unit -> unit
val set_sim_trace : int -> unit
val set_dot_no_captions : unit -> unit
val set_dot_short_trans : unit -> unit
val set_show_models : unit -> unit
val set_dot_abbrev_types : unit -> unit
val set_dot_qual_ids : unit -> unit
val set_dot_boxed : unit -> unit
val set_vcd_default_int_size : int -> unit
val set_lib_dir : string -> unit
val set_stop_time : int -> unit
val set_systemc_time_unit : string -> unit
val set_sc_trace : unit -> unit
val set_sc_double_float : unit -> unit
val set_vhdl_time_unit : string -> unit
val set_vhdl_ev_duration : int -> unit
val set_vhdl_rst_duration : int -> unit
val set_vhdl_use_numeric_std : unit -> unit
val set_vhdl_bool_as_bool : unit -> unit
val set_vhdl_trace : unit -> unit
val set_vhdl_dump_ghw : unit -> unit
val spec : (string * Stdlib.Arg.spec * string) list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/Make/argument-1-HS/Guest/Types/index.html b/docs/rfsm/Rfsm/Static/Make/argument-1-HS/Guest/Types/index.html new file mode 100644 index 00000000..e2ed3153 --- /dev/null +++ b/docs/rfsm/Rfsm/Static/Make/argument-1-HS/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Static.Make.HS.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/Make/argument-1-HS/Guest/index.html b/docs/rfsm/Rfsm/Static/Make/argument-1-HS/Guest/index.html new file mode 100644 index 00000000..f1d2bce2 --- /dev/null +++ b/docs/rfsm/Rfsm/Static/Make/argument-1-HS/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Static.Make.HS.Guest)

Module HS.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/Make/argument-1-HS/index.html b/docs/rfsm/Rfsm/Static/Make/argument-1-HS/index.html new file mode 100644 index 00000000..e6f9945d --- /dev/null +++ b/docs/rfsm/Rfsm/Static/Make/argument-1-HS/index.html @@ -0,0 +1,5 @@ + +HS (rfsm.Rfsm.Static.Make.HS)

Parameter Make.HS

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/Make/argument-2-HT/index.html b/docs/rfsm/Rfsm/Static/Make/argument-2-HT/index.html new file mode 100644 index 00000000..213b9eed --- /dev/null +++ b/docs/rfsm/Rfsm/Static/Make/argument-2-HT/index.html @@ -0,0 +1,2 @@ + +HT (rfsm.Rfsm.Static.Make.HT)

Parameter Make.HT

module HostSyntax = HS
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/Make/argument-3-GV/index.html b/docs/rfsm/Rfsm/Static/Make/argument-3-GV/index.html new file mode 100644 index 00000000..4bf53bee --- /dev/null +++ b/docs/rfsm/Rfsm/Static/Make/argument-3-GV/index.html @@ -0,0 +1,2 @@ + +GV (rfsm.Rfsm.Static.Make.GV)

Parameter Make.GV

type t

The type of guest-level values

type typ = HS.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/Make/argument-4-GS/index.html b/docs/rfsm/Rfsm/Static/Make/argument-4-GS/index.html new file mode 100644 index 00000000..d4f99b6e --- /dev/null +++ b/docs/rfsm/Rfsm/Static/Make/argument-4-GS/index.html @@ -0,0 +1,2 @@ + +GS (rfsm.Rfsm.Static.Make.GS)

Parameter Make.GS

type expr = HS.expr

The type of guest-level expressions

type value = GV.t

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/Make/index.html b/docs/rfsm/Rfsm/Static/Make/index.html new file mode 100644 index 00000000..9964966f --- /dev/null +++ b/docs/rfsm/Rfsm/Static/Make/index.html @@ -0,0 +1,2 @@ + +Make (rfsm.Rfsm.Static.Make)

Module Static.Make

Parameters

module HS : Syntax.SYNTAX
module HT : Typing.TYPING with module HostSyntax = HS
module GV : Guest.VALUE with type typ = HS.typ
module GS : Guest.STATIC with type expr = HS.expr and type value = GV.t

Signature

module Syntax = HS
module Typing = HT
module Value = GV
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/index.html b/docs/rfsm/Rfsm/Static/index.html new file mode 100644 index 00000000..6d7515a4 --- /dev/null +++ b/docs/rfsm/Rfsm/Static/index.html @@ -0,0 +1,30 @@ + +Static (rfsm.Rfsm.Static)

Module Rfsm.Static

Static elaboration

This step takes a typed program consisting of

  • types, functions and constant declarations
  • global IO declarations
  • typed FSM instances and produce a representation, consisting of
  • the same types, functions and constant declarations
  • a elaborated set of FSM instances In the latter i) the formal IOs of the corresponding model have been bound to the global IOs; for ex, if the input program is like + fsm model f (in x: bool, out y: int, ...) ... rules | q -> q' when h.(x=1) with y:=0 ... + ... + input X: bool + output Y: int + ... + fsm f0 = f(X,Y,...) + then, the model describing f0 in the result representation will be like + fsm model f (in X: bool, out X: int, ...) ... rules | q -> q' when h.(X=1) with Y:=0 ... + Note: the compatibility between formal and actual IOs has already been checked by the typing phase. ii) the (generic) parameters have been replaced by their actual value for ex, if the input program is like + fsm model f <n: int> (in x: int<n>, ...) ... vars z: int ... rules | q -> q' when h.(x=1).(z<n) ... + ... + input X: int<8> + ... + fsm f8 = f<8>(X,,...) + then, the model describing f8 in the result representation will be like + fsm model f (in X: int<8>, ...) ... vars z: int ... rules | q -> q' when h.(X=1).(z<8) ... + Note: the compatibility between formal and actual parameters has already been checked by the typing phase. iii) Moore-style descriptions (with output assignations attached to states) have been turned to to Mealy-style ones (with output assignations attached to transitions). for ex, if the input program is like + fsm model f (out o: int, ...) states { ..., q' with o=1 } ... rules | q -> q' ... + ... + fsm f0 = f(...) + then, the model describing f0 in the result representation will be like + fsm model f (out o: int, ...) states { ..., q } ... rules | q -> q' with o:=1 ... +

The elaboration step also computes the dependency order induced by shared variables between FSMs. An FSM f depends on another FSM f' if f reads a variable that is written by f'. Note that this order is here purely static because all rules are considered for reading and writing, independentely of the actual FSM state. The resulting order will used by the SystemC (and possibly other) backend to implement instantaneous broadcast using delta cycles.

module type T = sig ... end
module Make + (HS : Syntax.SYNTAX) + (HT : Typing.TYPING with module HostSyntax = HS) + (GV : Guest.VALUE with type typ = HS.typ) + (GS : Guest.STATIC with type expr = HS.expr and type value = GV.t) : + T with module Syntax = HS and module Typing = HT and module Value = GV
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/module-type-T/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Static/module-type-T/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..e57f9084 --- /dev/null +++ b/docs/rfsm/Rfsm/Static/module-type-T/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Static.T.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/module-type-T/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Static/module-type-T/Syntax/Guest/index.html new file mode 100644 index 00000000..c7aa1363 --- /dev/null +++ b/docs/rfsm/Rfsm/Static/module-type-T/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Static.T.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/module-type-T/Syntax/index.html b/docs/rfsm/Rfsm/Static/module-type-T/Syntax/index.html new file mode 100644 index 00000000..151ff852 --- /dev/null +++ b/docs/rfsm/Rfsm/Static/module-type-T/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Static.T.Syntax)

Module T.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/module-type-T/Typing/index.html b/docs/rfsm/Rfsm/Static/module-type-T/Typing/index.html new file mode 100644 index 00000000..24829f14 --- /dev/null +++ b/docs/rfsm/Rfsm/Static/module-type-T/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Static.T.Typing)

Module T.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/module-type-T/Value/index.html b/docs/rfsm/Rfsm/Static/module-type-T/Value/index.html new file mode 100644 index 00000000..026205f9 --- /dev/null +++ b/docs/rfsm/Rfsm/Static/module-type-T/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Static.T.Value)

Module T.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Static/module-type-T/index.html b/docs/rfsm/Rfsm/Static/module-type-T/index.html new file mode 100644 index 00000000..b17bde2a --- /dev/null +++ b/docs/rfsm/Rfsm/Static/module-type-T/index.html @@ -0,0 +1,2 @@ + +T (rfsm.Rfsm.Static.T)

Module type Static.T

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Subst/index.html b/docs/rfsm/Rfsm/Subst/index.html new file mode 100644 index 00000000..802160f3 --- /dev/null +++ b/docs/rfsm/Rfsm/Subst/index.html @@ -0,0 +1,6 @@ + +Subst (rfsm.Rfsm.Subst)

Module Rfsm.Subst

Substitutions

type 'a t = (Ident.t * 'a) list

The type of substitution, substituting identifiers by values of type 'a

val apply : 'a t -> Ident.t -> 'a

apply s i is s(i). Raises Not_found if i is not bound in s.

val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Syntax/Make/argument-1-G/Types/index.html b/docs/rfsm/Rfsm/Syntax/Make/argument-1-G/Types/index.html new file mode 100644 index 00000000..2d1d19ef --- /dev/null +++ b/docs/rfsm/Rfsm/Syntax/Make/argument-1-G/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Syntax.Make.G.Types)

Module G.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Syntax/Make/argument-1-G/index.html b/docs/rfsm/Rfsm/Syntax/Make/argument-1-G/index.html new file mode 100644 index 00000000..5fd1516b --- /dev/null +++ b/docs/rfsm/Rfsm/Syntax/Make/argument-1-G/index.html @@ -0,0 +1,2 @@ + +G (rfsm.Rfsm.Syntax.Make.G)

Parameter Make.G

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Syntax/Make/index.html b/docs/rfsm/Rfsm/Syntax/Make/index.html new file mode 100644 index 00000000..69a3f91e --- /dev/null +++ b/docs/rfsm/Rfsm/Syntax/Make/index.html @@ -0,0 +1,5 @@ + +Make (rfsm.Rfsm.Syntax.Make)

Module Syntax.Make

Parameters

module G : Guest.SYNTAX

Signature

module Guest = G
type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Syntax/index.html b/docs/rfsm/Rfsm/Syntax/index.html new file mode 100644 index 00000000..63e85e1f --- /dev/null +++ b/docs/rfsm/Rfsm/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Syntax)

Module Rfsm.Syntax

Abstract syntax of the host language

module type SYNTAX = sig ... end
module Make (G : Guest.SYNTAX) : SYNTAX with module Guest = G
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Syntax/module-type-SYNTAX/Guest/Types/index.html b/docs/rfsm/Rfsm/Syntax/module-type-SYNTAX/Guest/Types/index.html new file mode 100644 index 00000000..1967e586 --- /dev/null +++ b/docs/rfsm/Rfsm/Syntax/module-type-SYNTAX/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Syntax.SYNTAX.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Syntax/module-type-SYNTAX/Guest/index.html b/docs/rfsm/Rfsm/Syntax/module-type-SYNTAX/Guest/index.html new file mode 100644 index 00000000..6ae3b9a0 --- /dev/null +++ b/docs/rfsm/Rfsm/Syntax/module-type-SYNTAX/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Syntax.SYNTAX.Guest)

Module SYNTAX.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Syntax/module-type-SYNTAX/index.html b/docs/rfsm/Rfsm/Syntax/module-type-SYNTAX/index.html new file mode 100644 index 00000000..bbd4bcd6 --- /dev/null +++ b/docs/rfsm/Rfsm/Syntax/module-type-SYNTAX/index.html @@ -0,0 +1,5 @@ + +SYNTAX (rfsm.Rfsm.Syntax.SYNTAX)

Module type Syntax.SYNTAX

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/Make/G/Static/index.html b/docs/rfsm/Rfsm/Systemc/Make/G/Static/index.html new file mode 100644 index 00000000..b6754302 --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/Make/G/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Systemc.Make.G.Static)

Module G.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/Make/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Systemc/Make/G/Syntax/Types/index.html new file mode 100644 index 00000000..202d4a0e --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/Make/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Systemc.Make.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/Make/G/Syntax/index.html b/docs/rfsm/Rfsm/Systemc/Make/G/Syntax/index.html new file mode 100644 index 00000000..f57b367f --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/Make/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Systemc.Make.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/Make/G/index.html b/docs/rfsm/Rfsm/Systemc/Make/G/index.html new file mode 100644 index 00000000..7923c2bf --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/Make/G/index.html @@ -0,0 +1,5 @@ + +G (rfsm.Rfsm.Systemc.Make.G)

Module Make.G

type value
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the SystemC declaration of symbol id with type ty.

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the SystemC type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td (resp. pp_type_impl fmt td) should print, on formatter fmt, the SystemC declaration and implementation (in the .h and .cpp file resp.) corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the SystemC expression corresponding to expression e.

val pp_typ : Stdlib.Format.formatter -> Syntax.Types.typ -> unit

pp_typ fmt ty should print, on formatter fmt, the SystemC type corresponding to type ty.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the SystemC representation of LHS l.

val pp_value : Stdlib.Format.formatter -> value -> unit

pp_value fmt v should print, on formatter fmt, the SystemC value corresponding to value v.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..56a4531d --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Systemc.Make.Static.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Syntax/Guest/index.html new file mode 100644 index 00000000..9cb211b6 --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Systemc.Make.Static.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Syntax/index.html b/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Syntax/index.html new file mode 100644 index 00000000..0b3530de --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Systemc.Make.Static.Syntax)

Module Static.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Typing/index.html b/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Typing/index.html new file mode 100644 index 00000000..94c28ed9 --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Systemc.Make.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Value/index.html b/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Value/index.html new file mode 100644 index 00000000..43d2b9a9 --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Systemc.Make.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/index.html b/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/index.html new file mode 100644 index 00000000..7dfed938 --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/Make/argument-1-Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Systemc.Make.Static)

Parameter Make.Static

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/Make/argument-2-Guest/Static/index.html b/docs/rfsm/Rfsm/Systemc/Make/argument-2-Guest/Static/index.html new file mode 100644 index 00000000..9a746cf3 --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/Make/argument-2-Guest/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Systemc.Make.Guest.Static)

Module Guest.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/Make/argument-2-Guest/index.html b/docs/rfsm/Rfsm/Systemc/Make/argument-2-Guest/index.html new file mode 100644 index 00000000..3766ccdb --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/Make/argument-2-Guest/index.html @@ -0,0 +1,5 @@ + +Guest (rfsm.Rfsm.Systemc.Make.Guest)

Parameter Make.Guest

module Syntax = Static.Syntax.Guest
type value = Static.Value.t
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the SystemC declaration of symbol id with type ty.

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the SystemC type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td (resp. pp_type_impl fmt td) should print, on formatter fmt, the SystemC declaration and implementation (in the .h and .cpp file resp.) corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the SystemC expression corresponding to expression e.

val pp_typ : Stdlib.Format.formatter -> Syntax.Types.typ -> unit

pp_typ fmt ty should print, on formatter fmt, the SystemC type corresponding to type ty.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the SystemC representation of LHS l.

val pp_value : Stdlib.Format.formatter -> value -> unit

pp_value fmt v should print, on formatter fmt, the SystemC value corresponding to value v.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/Make/index.html b/docs/rfsm/Rfsm/Systemc/Make/index.html new file mode 100644 index 00000000..c951af6b --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/Make/index.html @@ -0,0 +1,5 @@ + +Make (rfsm.Rfsm.Systemc.Make)

Module Systemc.Make

Parameters

module Static : Static.T
module Guest : + Guest.SYSTEMC + with module Syntax = Static.Syntax.Guest + and type value = Static.Value.t

Signature

module Static = Static
module G : Guest.SYSTEMC
exception Invalid_output_assign of string * Location.t
val output : dir:string -> ?pfx:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/index.html b/docs/rfsm/Rfsm/Systemc/index.html new file mode 100644 index 00000000..52a8bab8 --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/index.html @@ -0,0 +1,8 @@ + +Systemc (rfsm.Rfsm.Systemc)

Module Rfsm.Systemc

SystemC backend

type sc_config = {
  1. mutable sc_lib_name : string;
  2. mutable sc_lib_dir : string;
  3. mutable sc_inpmod_prefix : string;
  4. mutable sc_tb_name : string;
  5. mutable sc_globals_name : string;
  6. mutable sc_state_var : string;
  7. mutable sc_proc_name : string;
  8. mutable sc_inp_proc_name : string;
  9. mutable sc_clk_step_proc_name : string;
  10. mutable sc_time_unit : string;
  11. mutable sc_stop_time : int;
  12. mutable sc_trace : bool;
  13. mutable sc_trace_state_var : string;
  14. mutable sc_double_float : bool;
  15. mutable sc_act_semantics : Misc.act_semantics;
  16. mutable show_models : bool;
}
val cfg : sc_config
module type SYSTEMC = sig ... end
module Make + (Static : Static.T) + (Guest : + Guest.SYSTEMC + with module Syntax = Static.Syntax.Guest + and type value = Static.Value.t) : + SYSTEMC with module Static = Static
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/Static/index.html b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/Static/index.html new file mode 100644 index 00000000..862540da --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Systemc.SYSTEMC.G.Static)

Module G.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/Syntax/Types/index.html new file mode 100644 index 00000000..bdb14ffd --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Systemc.SYSTEMC.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/Syntax/index.html b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/Syntax/index.html new file mode 100644 index 00000000..3b4f7b91 --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Systemc.SYSTEMC.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/index.html b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/index.html new file mode 100644 index 00000000..5193d05c --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/G/index.html @@ -0,0 +1,5 @@ + +G (rfsm.Rfsm.Systemc.SYSTEMC.G)

Module SYSTEMC.G

type value
val pp_typed_symbol : + Stdlib.Format.formatter -> + (Ident.t * Syntax.type_expr) -> + unit

pp_typed_symbol fmt (id,ty) should print, on formatter fmt, the SystemC declaration of symbol id with type ty.

val pp_type_expr : Stdlib.Format.formatter -> Syntax.type_expr -> unit

pp_type_expr fmt te should print, on formatter fmt, the SystemC type corresponding to type expression te.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td (resp. pp_type_impl fmt td) should print, on formatter fmt, the SystemC declaration and implementation (in the .h and .cpp file resp.) corresponding to type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the SystemC expression corresponding to expression e.

val pp_typ : Stdlib.Format.formatter -> Syntax.Types.typ -> unit

pp_typ fmt ty should print, on formatter fmt, the SystemC type corresponding to type ty.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the SystemC representation of LHS l.

val pp_value : Stdlib.Format.formatter -> value -> unit

pp_value fmt v should print, on formatter fmt, the SystemC value corresponding to value v.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..8a7b737c --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Systemc.SYSTEMC.Static.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Syntax/Guest/index.html new file mode 100644 index 00000000..3402e511 --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Systemc.SYSTEMC.Static.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Syntax/index.html b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Syntax/index.html new file mode 100644 index 00000000..e43a7f9f --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Systemc.SYSTEMC.Static.Syntax)

Module Static.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Typing/index.html b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Typing/index.html new file mode 100644 index 00000000..f1f54d3b --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Systemc.SYSTEMC.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Value/index.html b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Value/index.html new file mode 100644 index 00000000..845c71b5 --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Systemc.SYSTEMC.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/index.html b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/index.html new file mode 100644 index 00000000..df346a62 --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Systemc.SYSTEMC.Static)

Module SYSTEMC.Static

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/index.html b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/index.html new file mode 100644 index 00000000..91b3645a --- /dev/null +++ b/docs/rfsm/Rfsm/Systemc/module-type-SYSTEMC/index.html @@ -0,0 +1,2 @@ + +SYSTEMC (rfsm.Rfsm.Systemc.SYSTEMC)

Module type Systemc.SYSTEMC

module Static : Static.T
module G : Guest.SYSTEMC
exception Invalid_output_assign of string * Location.t
val output : dir:string -> ?pfx:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Typing/Make/argument-1-HS/Guest/Types/index.html b/docs/rfsm/Rfsm/Typing/Make/argument-1-HS/Guest/Types/index.html new file mode 100644 index 00000000..78f35794 --- /dev/null +++ b/docs/rfsm/Rfsm/Typing/Make/argument-1-HS/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Typing.Make.HS.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Typing/Make/argument-1-HS/Guest/index.html b/docs/rfsm/Rfsm/Typing/Make/argument-1-HS/Guest/index.html new file mode 100644 index 00000000..69a17b32 --- /dev/null +++ b/docs/rfsm/Rfsm/Typing/Make/argument-1-HS/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Typing.Make.HS.Guest)

Module HS.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Typing/Make/argument-1-HS/index.html b/docs/rfsm/Rfsm/Typing/Make/argument-1-HS/index.html new file mode 100644 index 00000000..e51453f4 --- /dev/null +++ b/docs/rfsm/Rfsm/Typing/Make/argument-1-HS/index.html @@ -0,0 +1,5 @@ + +HS (rfsm.Rfsm.Typing.Make.HS)

Parameter Make.HS

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Typing/Make/argument-2-GT/Types/index.html b/docs/rfsm/Rfsm/Typing/Make/argument-2-GT/Types/index.html new file mode 100644 index 00000000..64cc9cc0 --- /dev/null +++ b/docs/rfsm/Rfsm/Typing/Make/argument-2-GT/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Typing.Make.GT.Types)

Module GT.Types

type typ = HS.typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Typing/Make/argument-2-GT/index.html b/docs/rfsm/Rfsm/Typing/Make/argument-2-GT/index.html new file mode 100644 index 00000000..493980fa --- /dev/null +++ b/docs/rfsm/Rfsm/Typing/Make/argument-2-GT/index.html @@ -0,0 +1,2 @@ + +GT (rfsm.Rfsm.Typing.Make.GT)

Parameter Make.GT

module Syntax = HS.Guest
module Types : Guest.TYPES with type typ = HS.typ

Typing environment

type env
val mk_env : unit -> env

mk_env () should return the initial typing environment. This environment should contain, in particular, bindings for builtins primitives, type and value constructors.

val lookup_var : loc:Location.t -> Ident.t -> env -> Types.typ

lookup_var l x env should return the type bound to identifier x in environment env. The behaviour when x is not bound in env is left to guest definition. A possibility is to raise Ident.Undefined for example.

val add_var : scope:Ident.scope -> env -> (Ident.t * Types.typ) -> env

add_var scope env (x,t) should return the environment obtained by the binding (x,t) to env. The scope parameter is a hint to the guest type inference system. Typically, it will be used to determine, in the case the added type contains type variables, whether these variables will be generalized (scope=Local) or not (scope=Global). The behaviour when x is already bound in env is left to guest definition.

val add_param : env -> (Ident.t * Syntax.expr) -> env

add_param env (x,t) should return the environment obtained by the binding (x,t) as a model parameter to env.

val pp_env : Stdlib.Format.formatter -> env -> unit

pp_env fmt env should print a readable representation of typing environment env on formatter fmt.

Low-level interface to the the type-checking engine

val type_check : loc:Location.t -> Types.typ -> Types.typ -> unit

type_check loc t t' should be called whenever types t and t' have to be unified at program location loc.

High-level interface to the type-checking engine

val type_type_decl : env -> Syntax.type_decl -> env

type_type_decl env td should return the typing environment obtained by type checking the type declaration td in environment env.

val type_expression : env -> Syntax.expr -> Types.typ

type_expression env e should return the type of expression e in environment env.

val type_of_type_expr : env -> Syntax.type_expr -> Types.typ

type_of_type_expr env te should return the type denoted by the type expression te in environment env.

val type_lhs : env -> Syntax.lhs -> Types.typ

type_lhs env l should return the type of LHS l in environment env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Typing/Make/argument-3-GS/index.html b/docs/rfsm/Rfsm/Typing/Make/argument-3-GS/index.html new file mode 100644 index 00000000..f5941522 --- /dev/null +++ b/docs/rfsm/Rfsm/Typing/Make/argument-3-GS/index.html @@ -0,0 +1,2 @@ + +GS (rfsm.Rfsm.Typing.Make.GS)

Parameter Make.GS

type expr = HS.expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Typing/Make/index.html b/docs/rfsm/Rfsm/Typing/Make/index.html new file mode 100644 index 00000000..f8d6639f --- /dev/null +++ b/docs/rfsm/Rfsm/Typing/Make/index.html @@ -0,0 +1,88 @@ + +Make (rfsm.Rfsm.Typing.Make)

Module Typing.Make

Parameters

module HS : Syntax.SYNTAX
module GT : Guest.TYPING with module Syntax = HS.Guest and type Types.typ = HS.typ
module GS : Guest.STATIC with type expr = HS.expr

Signature

module HostSyntax = HS
module GuestTyping = GT
module A = Annot
type env = GuestTyping.env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val pp_typed_program : + Ppx_deriving_runtime.Format.formatter -> + typed_program -> + Ppx_deriving_runtime.unit
val show_typed_program : typed_program -> Ppx_deriving_runtime.string
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
val mk_env : unit -> GuestTyping.env
val type_fsm_action : + GuestTyping.env -> + 'a -> + (HostSyntax.action_desc, GuestTyping.Types.typ) A.t -> + unit
val check_type : + loc:Location.t -> + what:string -> + (HostSyntax.typ -> bool) -> + HostSyntax.typ -> + unit
val type_fsm_event : loc:Location.t -> GuestTyping.env -> Ident.t -> unit
val type_fsm_condition : + GuestTyping.env -> + (Ident.t + * (GuestTyping.Syntax.expr_desc, GuestTyping.Syntax.Types.typ) Annot.t list, + 'a) + A.t -> + unit
val check_fsm_state : + loc:Location.t -> + (HostSyntax.model_desc, 'a) A.t -> + Ident.t -> + unit
val type_fsm_transition : + GuestTyping.env -> + (HostSyntax.model_desc, 'a) A.t -> + (Ident.t + * (Ident.t + * (GuestTyping.Syntax.expr_desc, GuestTyping.Syntax.Types.typ) Annot.t + list, + 'b) + A.t + * (HostSyntax.action_desc, GuestTyping.Types.typ) A.t list + * Ident.t + * 'c, + 'd) + A.t -> + unit
val type_fsm_itransition : + GuestTyping.env -> + (HostSyntax.model_desc, 'a) A.t -> + (Ident.t * (HostSyntax.action_desc, GuestTyping.Types.typ) A.t list, 'b) A.t -> + unit
val type_fsm_state_valuation : + GuestTyping.env -> + HostSyntax.model -> + Ident.t -> + (Ident.t * (GuestTyping.Syntax.expr_desc, GuestTyping.Syntax.Types.typ) A.t) -> + unit
val type_fsm_state : + GuestTyping.env -> + HostSyntax.model -> + (Ident.t + * (Ident.t + * (GuestTyping.Syntax.expr_desc, GuestTyping.Syntax.Types.typ) A.t) + list, + 'a) + A.t -> + unit
val type_fsm_states : + GuestTyping.env -> + (HostSyntax.model_desc, HostSyntax.typ) A.t -> + unit
val type_fsm_ios : 'a -> (HostSyntax.model_desc, 'b) A.t -> unit
val type_fsm_inst : + GuestTyping.env -> + HostSyntax.program -> + ('a * Ident.t * GuestTyping.Syntax.expr list * Ident.t list, 'b) A.t -> + 'c * (HostSyntax.model_desc, HostSyntax.typ) A.t
val type_stimulus : + GuestTyping.env -> + 'a -> + HostSyntax.typ -> + (HostSyntax.stimulus_desc, HostSyntax.typ) A.t -> + unit
val type_global : + GuestTyping.env -> + ('a + * 'b + * GuestTyping.Syntax.type_expr + * (HostSyntax.stimulus_desc, HostSyntax.typ) A.t option, + GuestTyping.Types.typ) + A.t -> + unit
val pp_env : Stdlib.Format.formatter -> GuestTyping.env -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Typing/index.html b/docs/rfsm/Rfsm/Typing/index.html new file mode 100644 index 00000000..5f17872b --- /dev/null +++ b/docs/rfsm/Rfsm/Typing/index.html @@ -0,0 +1,6 @@ + +Typing (rfsm.Rfsm.Typing)

Module Rfsm.Typing

The type checker for the host language

module type TYPING = sig ... end
module Make + (HS : Syntax.SYNTAX) + (GT : Guest.TYPING with module Syntax = HS.Guest and type Types.typ = HS.typ) + (GS : Guest.STATIC with type expr = HS.expr) : + sig ... end
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Typing/module-type-TYPING/HostSyntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Typing/module-type-TYPING/HostSyntax/Guest/Types/index.html new file mode 100644 index 00000000..db98bfa5 --- /dev/null +++ b/docs/rfsm/Rfsm/Typing/module-type-TYPING/HostSyntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Typing.TYPING.HostSyntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Typing/module-type-TYPING/HostSyntax/Guest/index.html b/docs/rfsm/Rfsm/Typing/module-type-TYPING/HostSyntax/Guest/index.html new file mode 100644 index 00000000..8d544761 --- /dev/null +++ b/docs/rfsm/Rfsm/Typing/module-type-TYPING/HostSyntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Typing.TYPING.HostSyntax.Guest)

Module HostSyntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Typing/module-type-TYPING/HostSyntax/index.html b/docs/rfsm/Rfsm/Typing/module-type-TYPING/HostSyntax/index.html new file mode 100644 index 00000000..22337ffb --- /dev/null +++ b/docs/rfsm/Rfsm/Typing/module-type-TYPING/HostSyntax/index.html @@ -0,0 +1,5 @@ + +HostSyntax (rfsm.Rfsm.Typing.TYPING.HostSyntax)

Module TYPING.HostSyntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Typing/module-type-TYPING/index.html b/docs/rfsm/Rfsm/Typing/module-type-TYPING/index.html new file mode 100644 index 00000000..06c5a46e --- /dev/null +++ b/docs/rfsm/Rfsm/Typing/module-type-TYPING/index.html @@ -0,0 +1,2 @@ + +TYPING (rfsm.Rfsm.Typing.TYPING)

Module type Typing.TYPING

type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/Syntax/Types/index.html b/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/Syntax/Types/index.html new file mode 100644 index 00000000..6d299807 --- /dev/null +++ b/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Vcd.Make.EvSeq.Evset.Event.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/Syntax/index.html b/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/Syntax/index.html new file mode 100644 index 00000000..320dfa19 --- /dev/null +++ b/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Vcd.Make.EvSeq.Evset.Event.Syntax)

Module Event.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/Value/index.html b/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/Value/index.html new file mode 100644 index 00000000..00579faf --- /dev/null +++ b/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Vcd.Make.EvSeq.Evset.Event.Value)

Module Event.Value

type t

The type of guest-level values

type typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/index.html b/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/index.html new file mode 100644 index 00000000..5343bc7e --- /dev/null +++ b/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/Event/index.html @@ -0,0 +1,2 @@ + +Event (rfsm.Rfsm.Vcd.Make.EvSeq.Evset.Event)

Module Evset.Event

type t =
  1. | Ev of Ident.t
    (*

    pure event

    *)
  2. | Upd of Syntax.lhs * Value.t
    (*

    assignation (lhs <- v)

    *)
  3. | StateMove of string * string
    (*

    state move (src,dst)

    *)
val is_pure_event : t -> bool
val compare : t -> t -> int
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/index.html b/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/index.html new file mode 100644 index 00000000..1fe37543 --- /dev/null +++ b/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/Evset/index.html @@ -0,0 +1,2 @@ + +Evset (rfsm.Rfsm.Vcd.Make.EvSeq.Evset)

Module EvSeq.Evset

module Event : Event.T
type date = int
type t
exception Union of t * t
val mk : date -> Event.t list -> t
val empty : date -> t
val date : t -> date
val events : t -> Event.t list
val is_empty : t -> bool
exception Add of Event.t
val add : t -> Event.t -> t
val union : t -> t -> t
val union_all : date -> t list -> t
val partition : f:(Event.t -> bool) -> t -> t * t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/index.html b/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/index.html new file mode 100644 index 00000000..9812af82 --- /dev/null +++ b/docs/rfsm/Rfsm/Vcd/Make/argument-1-EvSeq/index.html @@ -0,0 +1,2 @@ + +EvSeq (rfsm.Rfsm.Vcd.Make.EvSeq)

Parameter Make.EvSeq

module Evset : Evset.T
type t = Evset.t list
type value
val merge : t -> t -> t
val (@@) : t -> t -> t

@@ is the infix notation for merge

val merge_all : t list -> t
val mk_periodic : Ident.t -> int -> int -> int -> t
val mk_changes : Ident.t -> (int * value) list -> t
val mk_sporadic : Ident.t -> int list -> t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vcd/Make/index.html b/docs/rfsm/Rfsm/Vcd/Make/index.html new file mode 100644 index 00000000..1cd69ba0 --- /dev/null +++ b/docs/rfsm/Rfsm/Vcd/Make/index.html @@ -0,0 +1,2 @@ + +Make (rfsm.Rfsm.Vcd.Make)

Module Vcd.Make

Parameters

Signature

type seq = EvSeq.t
exception Unsupported of Vcd_types.vcd_typ * Vcd_types.vcd_value
val output : fname:string -> seq -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vcd/index.html b/docs/rfsm/Rfsm/Vcd/index.html new file mode 100644 index 00000000..1bbb2805 --- /dev/null +++ b/docs/rfsm/Rfsm/Vcd/index.html @@ -0,0 +1,2 @@ + +Vcd (rfsm.Rfsm.Vcd)

Module Rfsm.Vcd

VCD output

type cfg = {
  1. mutable default_int_size : int;
  2. mutable float_precision : int;
}
val cfg : cfg
module type VCD = sig ... end
module Make (EvSeq : Evseq.EVSEQ) : VCD with type seq = EvSeq.t
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vcd/module-type-VCD/index.html b/docs/rfsm/Rfsm/Vcd/module-type-VCD/index.html new file mode 100644 index 00000000..efad862b --- /dev/null +++ b/docs/rfsm/Rfsm/Vcd/module-type-VCD/index.html @@ -0,0 +1,2 @@ + +VCD (rfsm.Rfsm.Vcd.VCD)

Module type Vcd.VCD

type seq
exception Unsupported of Vcd_types.vcd_typ * Vcd_types.vcd_value
val output : fname:string -> seq -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vcd_types/index.html b/docs/rfsm/Rfsm/Vcd_types/index.html new file mode 100644 index 00000000..5843950d --- /dev/null +++ b/docs/rfsm/Rfsm/Vcd_types/index.html @@ -0,0 +1,8 @@ + +Vcd_types (rfsm.Rfsm.Vcd_types)

Module Rfsm.Vcd_types

VCD Interface

type vcd_typ =
  1. | TyInt of int option
    (*

    with optional size in bits

    *)
  2. | TyBool
  3. | TyFloat
  4. | TyEvent
  5. | TyString
  6. | TyChar

The possible types for VCD values

and vcd_value =
  1. | Val_int of int
  2. | Val_bool of bool
  3. | Val_float of float
  4. | Val_char of char
  5. | Val_string of string

The possible VCD values

val pp_vcd_typ : + Ppx_deriving_runtime.Format.formatter -> + vcd_typ -> + Ppx_deriving_runtime.unit
val show_vcd_typ : vcd_typ -> Ppx_deriving_runtime.string
val pp_vcd_value : + Ppx_deriving_runtime.Format.formatter -> + vcd_value -> + Ppx_deriving_runtime.unit
val show_vcd_value : vcd_value -> Ppx_deriving_runtime.string
type vcd_signal = Ident.t * (char * vcd_typ)
val pp_vcd_signal : Stdlib.Format.formatter -> vcd_signal -> unit
exception Unsupported
val register_signal : vcd_signal list -> (Ident.t * vcd_typ) -> vcd_signal list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Version/index.html b/docs/rfsm/Rfsm/Version/index.html new file mode 100644 index 00000000..9a033c66 --- /dev/null +++ b/docs/rfsm/Rfsm/Version/index.html @@ -0,0 +1,2 @@ + +Version (rfsm.Rfsm.Version)

Module Rfsm.Version

Compiler version

val version : string
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/Make/G/Static/index.html b/docs/rfsm/Rfsm/Vhdl/Make/G/Static/index.html new file mode 100644 index 00000000..db03ea62 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/Make/G/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Vhdl.Make.G.Static)

Module G.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/Make/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Vhdl/Make/G/Syntax/Types/index.html new file mode 100644 index 00000000..73f7918d --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/Make/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Vhdl.Make.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/Make/G/Syntax/index.html b/docs/rfsm/Rfsm/Vhdl/Make/G/Syntax/index.html new file mode 100644 index 00000000..34475c77 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/Make/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Vhdl.Make.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/Make/G/index.html b/docs/rfsm/Rfsm/Vhdl/Make/G/index.html new file mode 100644 index 00000000..3f99a670 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/Make/G/index.html @@ -0,0 +1,2 @@ + +G (rfsm.Rfsm.Vhdl.Make.G)

Module Make.G

type value
val vhdl_type_of : Syntax.Types.typ -> Vhdl_types.t

vhdl_type_of ty should return the VHDL type corresponding to type ty.

val allowed_shared_type : Syntax.Types.typ -> bool

allowed_shared_type ty should indicate whether type ty can be attributed to a VHDL shared variable.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the VHDL translation of type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the VHDL expression corresponding to expression e.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the VHDL representation of LHS l.

val pp_value : Stdlib.Format.formatter -> (value * Vhdl_types.t) -> unit

pp_value fmt (v,t) should print, on formatter fmt, the VHDL value corresponding to value v, with type t.

val pp_type_fns_intf : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_fns_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_fns_intf td (resp. pp_type_fns_impl fmt td) should print, on formatter fmt, the VHDL declaration and implementation (in the entity and architecture definition resp.) corresponding to type declaration td.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..e34ed4e7 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Vhdl.Make.Static.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Syntax/Guest/index.html new file mode 100644 index 00000000..8c56ae26 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Vhdl.Make.Static.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Syntax/index.html b/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Syntax/index.html new file mode 100644 index 00000000..faf8b4e2 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Vhdl.Make.Static.Syntax)

Module Static.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Typing/index.html b/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Typing/index.html new file mode 100644 index 00000000..5e1bc48f --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Vhdl.Make.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Value/index.html b/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Value/index.html new file mode 100644 index 00000000..1698ddb4 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Vhdl.Make.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/index.html b/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/index.html new file mode 100644 index 00000000..96b076ac --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/Make/argument-1-Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Vhdl.Make.Static)

Parameter Make.Static

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/Make/argument-2-Guest/Static/index.html b/docs/rfsm/Rfsm/Vhdl/Make/argument-2-Guest/Static/index.html new file mode 100644 index 00000000..0198fb49 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/Make/argument-2-Guest/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Vhdl.Make.Guest.Static)

Module Guest.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/Make/argument-2-Guest/index.html b/docs/rfsm/Rfsm/Vhdl/Make/argument-2-Guest/index.html new file mode 100644 index 00000000..2bde0e74 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/Make/argument-2-Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Vhdl.Make.Guest)

Parameter Make.Guest

module Syntax = Static.Syntax.Guest
type value = Static.Value.t
val vhdl_type_of : Syntax.Types.typ -> Vhdl_types.t

vhdl_type_of ty should return the VHDL type corresponding to type ty.

val allowed_shared_type : Syntax.Types.typ -> bool

allowed_shared_type ty should indicate whether type ty can be attributed to a VHDL shared variable.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the VHDL translation of type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the VHDL expression corresponding to expression e.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the VHDL representation of LHS l.

val pp_value : Stdlib.Format.formatter -> (value * Vhdl_types.t) -> unit

pp_value fmt (v,t) should print, on formatter fmt, the VHDL value corresponding to value v, with type t.

val pp_type_fns_intf : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_fns_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_fns_intf td (resp. pp_type_fns_impl fmt td) should print, on formatter fmt, the VHDL declaration and implementation (in the entity and architecture definition resp.) corresponding to type declaration td.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/Make/index.html b/docs/rfsm/Rfsm/Vhdl/Make/index.html new file mode 100644 index 00000000..e929f5bc --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/Make/index.html @@ -0,0 +1,5 @@ + +Make (rfsm.Rfsm.Vhdl.Make)

Module Vhdl.Make

Parameters

module Static : Static.T
module Guest : + Guest.VHDL + with module Syntax = Static.Syntax.Guest + and type value = Static.Value.t

Signature

module Static = Static
module G : Guest.VHDL
exception Invalid_output_assign of string * Location.t
val output : dir:string -> ?pfx:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/index.html b/docs/rfsm/Rfsm/Vhdl/index.html new file mode 100644 index 00000000..49d13e18 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/index.html @@ -0,0 +1,8 @@ + +Vhdl (rfsm.Rfsm.Vhdl)

Module Rfsm.Vhdl

VHDL backend

type dump_format =
  1. | Vcd
  2. | Ghw
type vhdl_config = {
  1. mutable vhdl_lib_name : string;
  2. mutable vhdl_lib_dir : string;
  3. mutable vhdl_inpmod_prefix : string;
  4. mutable vhdl_tb_prefix : string;
  5. mutable vhdl_globals_name : string;
  6. mutable vhdl_state_var : string;
  7. mutable vhdl_stop_time : int;
  8. mutable vhdl_time_unit : string;
  9. mutable vhdl_reset_sig : string;
  10. mutable vhdl_reset_duration : int;
  11. mutable vhdl_ev_duration : int;
  12. mutable vhdl_bool_as_bool : bool;
  13. mutable vhdl_support_package : string;
  14. mutable vhdl_trace : bool;
  15. mutable vhdl_dump_format : dump_format;
  16. mutable vhdl_trace_state_var : string;
  17. mutable vhdl_act_semantics : Misc.act_semantics;
}
val cfg : vhdl_config
module type VHDL = sig ... end
module Make + (Static : Static.T) + (Guest : + Guest.VHDL + with module Syntax = Static.Syntax.Guest + and type value = Static.Value.t) : + VHDL with module Static = Static
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/Static/index.html b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/Static/index.html new file mode 100644 index 00000000..1795803e --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Vhdl.VHDL.G.Static)

Module G.Static

type expr

The type of guest-level expressions

type value

The type of guest-level values

exception Non_static_value of expr

Static evaluators

val eval_fn : string list -> expr -> value

eval_fn args body should return the value representing a function taking a list of arguments args and returning the value denoted by expression body. For guest languages not supporting functions (such as the core one, for example), the return value is undefined.

val eval : expr -> value

eval e should return the value corresponding to the static evaluation of expression e. This should function should raise Non_static_value is e cannot be evaluated statically (typically, if is not a litteral constant).

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/Syntax/Types/index.html b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/Syntax/Types/index.html new file mode 100644 index 00000000..a5a7921b --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/Syntax/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Vhdl.VHDL.G.Syntax.Types)

Module Syntax.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/Syntax/index.html b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/Syntax/index.html new file mode 100644 index 00000000..bb3a1d35 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/Syntax/index.html @@ -0,0 +1,2 @@ + +Syntax (rfsm.Rfsm.Vhdl.VHDL.G.Syntax)

Module G.Syntax

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/index.html b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/index.html new file mode 100644 index 00000000..5383b1c5 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/G/index.html @@ -0,0 +1,2 @@ + +G (rfsm.Rfsm.Vhdl.VHDL.G)

Module VHDL.G

type value
val vhdl_type_of : Syntax.Types.typ -> Vhdl_types.t

vhdl_type_of ty should return the VHDL type corresponding to type ty.

val allowed_shared_type : Syntax.Types.typ -> bool

allowed_shared_type ty should indicate whether type ty can be attributed to a VHDL shared variable.

val pp_type_decl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_decl fmt td should print, on formatter fmt, the VHDL translation of type declaration td.

val pp_expr : Stdlib.Format.formatter -> Syntax.expr -> unit

pp_expr fmt e should print, on formatter fmt, the VHDL expression corresponding to expression e.

val pp_lhs : Stdlib.Format.formatter -> Syntax.lhs -> unit

pp_lhs fmt l should print, on formatter fmt, the VHDL representation of LHS l.

val pp_value : Stdlib.Format.formatter -> (value * Vhdl_types.t) -> unit

pp_value fmt (v,t) should print, on formatter fmt, the VHDL value corresponding to value v, with type t.

val pp_type_fns_intf : Stdlib.Format.formatter -> Syntax.type_decl -> unit
val pp_type_fns_impl : Stdlib.Format.formatter -> Syntax.type_decl -> unit

pp_type_fns_intf td (resp. pp_type_fns_impl fmt td) should print, on formatter fmt, the VHDL declaration and implementation (in the entity and architecture definition resp.) corresponding to type declaration td.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Syntax/Guest/Types/index.html b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Syntax/Guest/Types/index.html new file mode 100644 index 00000000..553a6ed3 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Syntax/Guest/Types/index.html @@ -0,0 +1,2 @@ + +Types (rfsm.Rfsm.Vhdl.VHDL.Static.Syntax.Guest.Types)

Module Guest.Types

type typ

Guest-level types

Constructors

val no_type : typ

Special value denoting an undefined type

val mk_type_fun : typ list -> typ -> typ

mk_type_fun [t1;...;tn] t should return the type of a function taking n arguments with type t1, ..., tn and returning a result with type t.

Inspectors

val is_event_type : typ -> bool
val is_bool_type : typ -> bool

is_event_type t (resp. is_bool_type t) should return true iff type t is the event (resp. boolean) type. Returns false if the guest language has no such type.

Printing

val pp_typ : ?abbrev:bool -> Stdlib.Format.formatter -> typ -> unit

pp_type abbrev fmt t should print a readable representation of type t on formatter fmt. The optional abbrev argument can be used to require an abbreviated form (for example, for a record, to print only the name of the record, without the description of the fields.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Syntax/Guest/index.html b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Syntax/Guest/index.html new file mode 100644 index 00000000..ae80ba6a --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Syntax/Guest/index.html @@ -0,0 +1,2 @@ + +Guest (rfsm.Rfsm.Vhdl.VHDL.Static.Syntax.Guest)

Module Syntax.Guest

Type expressions

type type_expr = (type_expr_desc, Types.typ) Annot.t
and type_expr_desc

The type of guest-level type expressions, denoting types

val is_bool_type : type_expr -> bool
val is_event_type : type_expr -> bool
val is_array_type : type_expr -> bool

is_xxx_type te should return true iff the type denoted by te is xxx. Returns false if the guest language has no such type.

val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit

pp_type_expr fmt te prints type expression te on formatter fmt.

Type declarations

type type_decl = (type_decl_desc, Types.typ) Annot.t
and type_decl_desc

The type of guest-level type declarations (ex: type aliases, records, ...)

val mk_alias_type_decl : Ident.t -> type_expr -> type_decl

mk_alias_type_decl name te should return an alias type declaration, i.e. the type declaration making name a synonym for te.

val pp_type_decl : Stdlib.Format.formatter -> type_decl -> unit

pp_type_decl fmt td prints type declaration td on formatter fmt.

Expressions

type expr = (expr_desc, Types.typ) Annot.t
and expr_desc

The type of guest-level expressions

val vars_of_expr : expr -> Ident.t list

vars_of_expr e should return the list of variables occuring in expression e.

val pp_expr : Stdlib.Format.formatter -> expr -> unit

pp_expr fmt e prints expression e on formatter fmt.

LHS

type lhs_desc

The type of left-hand sides, occuring at the left of the := symbol in assignations. A guest language will typically have variables as LHS but can also support more elaborated forms, such as array indices (ex: a[i]:=...) or record fields (ex: r.f := ...).

val mk_simple_lhs : Ident.t -> lhs

mk_simple_lhs name should return the LHS designating a simple variable with name name.

val is_simple_lhs : lhs -> bool

is_simple_lhs l should return true iff LHS l is a simple variable

val lhs_base_name : lhs -> Ident.t

lhs_base_name l should return the base name of LHS l. If l is a simple variable, this is simply its name. For array or record access, this will typically the name of target array (resp. record).

val lhs_prefix : string -> lhs -> lhs

lhs_prefix p l should return the LHS obtained by adding prefix "p." to the base name of LHS l. For example, if l is a simple variable named "v", lhs_prefix "foo" l is the "foo.v". This function is used to generated name scopes when dumping VCD traces.

val lhs_vcd_repr : lhs -> Ident.t

lhs_vcd_repr l should return a representation of LHS l to be used in a VCD trace file. If l is a simple variable, this is simply its name. Other cases will depend on the LHS definition and the version of VCD format used. See for example the definition of lhs_vcd_repr for the full guest language.

val vars_of_lhs : lhs -> Ident.t list

vars_of_lhs l should return the list of variables occuring in LHS l. This includes simple variables but also the name of the target array, record, etc.

val pp_lhs : Stdlib.Format.formatter -> lhs -> unit

pp_lhs fmt l prints LHS l on formatter fmt.

val pp_qual_lhs : Stdlib.Format.formatter -> lhs -> unit

Same as pp_lhs but with an indication of the Ident.scope of the LHS

Substitutions

val subst_expr : Ident.t Subst.t -> expr -> expr

subst_id phi e applies substitution phi to expression e, substituting each occurrence of identifier id by identifier phi id

val subst_lhs : Ident.t Subst.t -> lhs -> lhs

subst_lhs phi l applies substitution phi to LHS l, substituting each occurrence of identifier id by identifier phi id

val subst_param_type_expr : expr Subst.t -> type_expr -> type_expr

subst_type_expr phi te applies substitution phi to type_expression te, replacing all occurences of parameter name id in type expression te by phi id.

val subst_param_expr : expr Subst.t -> expr -> expr

subst_expr phi e applies substitution phi to expression e, substituting each occurrence of parameter name id by expression phi id

Pre-processing

type ppr_env = type_expr Env.t

Since pre-processing takes place at the syntax level, before typing, type information has to be provided explicitely by mapping identifiers to type expressions.

val ppr_expr : ppr_env -> ?expected_type:type_expr option -> expr -> expr

ppr_expr env e should return the result of pre-processing expression e in env env. The optional argument expected_type can be used to perform type-dependent transformations. A typical usage is to rewrite 0 (resp 1) as false (resp. true). See guests/core/lib/syntax.ml for example

val ppr_lhs : ppr_env -> lhs -> lhs

ppr_lhs env e should return the result of pre-processing LHS e in env env.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Syntax/index.html b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Syntax/index.html new file mode 100644 index 00000000..827ca1d4 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Syntax/index.html @@ -0,0 +1,5 @@ + +Syntax (rfsm.Rfsm.Vhdl.VHDL.Static.Syntax)

Module Static.Syntax

type typ = Guest.Types.typ
type expr = Guest.expr
type type_expr = Guest.type_expr
type lhs = Guest.lhs
type type_decl = Guest.type_decl
type program = {
  1. type_decls : type_decl list;
  2. fun_decls : fun_decl list;
  3. cst_decls : cst_decl list;
  4. models : model list;
  5. globals : global list;
  6. insts : inst list;
}
and model = (model_desc, typ) Annot.t
and model_desc = {
  1. name : Ident.t;
  2. states : state list;
  3. params : (Ident.t * type_expr) list;
  4. ios : (Ident.t * (io_cat * type_expr)) list;
  5. inps : (Ident.t * type_expr) list;
  6. outps : (Ident.t * type_expr) list;
  7. inouts : (Ident.t * type_expr) list;
  8. vars : (Ident.t * type_expr) list;
  9. trans : transition list;
  10. itrans : itransition;
}
and io_cat =
  1. | In
  2. | Out
  3. | InOut
and state = (state_desc, unit) Annot.t
and state_desc = Ident.t * (Ident.t * expr) list
and cond = (cond_desc, typ) Annot.t
and cond_desc = Ident.t * expr list
and action = (action_desc, typ) Annot.t
and action_desc =
  1. | Emit of Ident.t
  2. | Assign of lhs * expr
and transition = (transition_desc, typ) Annot.t
and transition_desc = Ident.t * cond * action list * Ident.t * int
and itransition = (itransition_desc, typ) Annot.t
and itransition_desc = Ident.t * action list
and global = (global_desc, typ) Annot.t
and global_desc = Ident.t * global_cat * type_expr * stimulus option
and global_cat =
  1. | Input
  2. | Output
  3. | Shared
and stimulus = (stimulus_desc, typ) Annot.t
and stimulus_desc =
  1. | Periodic of int * int * int
  2. | Sporadic of int list
  3. | Value_change of (int * expr) list
and inst = (inst_desc, typ) Annot.t
and inst_desc = Ident.t * Ident.t * expr list * Ident.t list
and fun_decl = (fun_decl_desc, typ) Annot.t
and fun_decl_desc = {
  1. ff_name : Ident.t;
  2. ff_args : (Ident.t * type_expr) list;
  3. ff_res : type_expr;
  4. ff_body : expr;
}
and cst_decl = (cst_decl_desc, typ) Annot.t
and cst_decl_desc = {
  1. cc_name : Ident.t;
  2. cc_typ : type_expr;
  3. cc_val : expr;
}
val empty_program : program
val add_program : program -> program -> program
val subst_model_io : phi:Ident.t Subst.t -> model -> model
val subst_model_param : phi:expr Subst.t -> model -> model
val state_ios : + model -> + Ident.t -> + Ident.t list * Ident.t list * Ident.t list * Ident.t list
val normalize_model : model -> model
val ppr_program : program -> program
val pp_typ : Stdlib.Format.formatter -> typ -> unit
val pp_expr : Stdlib.Format.formatter -> expr -> unit
val pp_type_expr : Stdlib.Format.formatter -> type_expr -> unit
val pp_cond_desc : Stdlib.Format.formatter -> cond_desc -> unit
val pp_cond : Stdlib.Format.formatter -> cond -> unit
val ppf_cond : Stdlib.Format.formatter -> cond -> unit
val pp_action : Stdlib.Format.formatter -> action -> unit
val pp_action_desc : Stdlib.Format.formatter -> action_desc -> unit
val pp_transition : Stdlib.Format.formatter -> transition -> unit
val ppf_transition : Stdlib.Format.formatter -> transition -> unit
val pp_transition_desc : Stdlib.Format.formatter -> transition_desc -> unit
val pp_itransition : Stdlib.Format.formatter -> itransition -> unit
val pp_itransition_desc : Stdlib.Format.formatter -> itransition_desc -> unit
val pp_stimulus : Stdlib.Format.formatter -> stimulus -> unit
val pp_stimulus_desc : Stdlib.Format.formatter -> stimulus_desc -> unit
val pp_state : Stdlib.Format.formatter -> state -> unit
val pp_type_decl : Stdlib.Format.formatter -> Guest.type_decl -> unit
val pp_model : Stdlib.Format.formatter -> model -> unit
val pp_model_desc : Stdlib.Format.formatter -> model_desc -> unit
val pp_model_name : Stdlib.Format.formatter -> model -> unit
val pp_global : Stdlib.Format.formatter -> global -> unit
val pp_cst_decl : Stdlib.Format.formatter -> cst_decl -> unit
val pp_fun_decl : Stdlib.Format.formatter -> fun_decl -> unit
val pp_program : Stdlib.Format.formatter -> program -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Typing/index.html b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Typing/index.html new file mode 100644 index 00000000..b8dc27ef --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Typing/index.html @@ -0,0 +1,2 @@ + +Typing (rfsm.Rfsm.Vhdl.VHDL.Static.Typing)

Module Static.Typing

module HostSyntax = Syntax
type env
type typed_program = {
  1. tp_models : HostSyntax.model list;
  2. tp_insts : (Ident.t * HostSyntax.model) list;
}
val mk_env : unit -> env
val type_program : env -> HostSyntax.program -> typed_program
val pp_env : Stdlib.Format.formatter -> env -> unit
val pp_typed_program : Stdlib.Format.formatter -> typed_program -> unit
exception Duplicate_symbol of Location.t * Ident.t
exception Invalid_state of Location.t * Ident.t
exception Duplicate_state of Location.t * Ident.t
exception No_event_input of Location.t
exception Illegal_inst of Location.t
exception Illegal_state_output of Location.t * Ident.t * Ident.t
exception Type_mismatch of Location.t * string * HostSyntax.typ
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Value/index.html b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Value/index.html new file mode 100644 index 00000000..ea642703 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/Value/index.html @@ -0,0 +1,2 @@ + +Value (rfsm.Rfsm.Vhdl.VHDL.Static.Value)

Module Static.Value

type t

The type of guest-level values

type typ = Syntax.typ

The type of guest-level types

val default_value : typ -> t

default_value t should return a default value for type t

VCD interface

exception Unsupported_vcd of t
val vcd_type : t -> Vcd_types.vcd_typ

vcd_type v should return the VCD type corresponding to value v. For example, if v denotes an boolean value, vcd_type v should return Rfsm.Vcd_types.TyBool. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD type)

val vcd_value : t -> Vcd_types.vcd_value

vcd_value v should return the VCD encoding of value v. For example, if v denotes the boolean value b, vcd_value v should return Rfsm.Vcd_types.Val_bool b. This function should raise Unsupported_vcd in case of failure (if there's no corresponding VCD value)

val flatten : base:Ident.t -> t -> (Ident.t * t) list

flatten base:b v should decompose a structured value v into a list of qualified scalar values for VCD dumping. For example, if v is a record {x=1;y=2}, then flatten ~base:"a" v should be [("a.x",1);("a.y",2)]. If v is a scalar value, then flatten ~base:"a" v is just ["a",v]

Printing

val pp : Stdlib.Format.formatter -> t -> unit

pp fmt v prints value v on formatter fmt.

\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/index.html b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/index.html new file mode 100644 index 00000000..68962b16 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/Static/index.html @@ -0,0 +1,2 @@ + +Static (rfsm.Rfsm.Vhdl.VHDL.Static)

Module VHDL.Static

module Typing : Typing.TYPING with module HostSyntax = Syntax
module Value : Guest.VALUE with type typ = Syntax.typ
type fsm = {
  1. name : Ident.t;
  2. model : Syntax.model;
    (*

    Normalized, type-refined model

    *)
  3. q : Ident.t;
  4. vars : Value.t Env.t;
}

FSM instances

type ctx_comp = {
  1. ct_typ : Syntax.typ;
  2. ct_stim : Syntax.stimulus_desc option;
    (*

    For inputs only

    *)
  3. ct_rds : Ident.t list;
    (*

    Readers, for inputs and shareds

    *)
  4. ct_wrs : Ident.t list;
    (*

    Writers, for outputs and shareds

    *)
}
type ctx = {
  1. inputs : (Ident.t * ctx_comp) list;
  2. outputs : (Ident.t * ctx_comp) list;
  3. shared : (Ident.t * ctx_comp) list;
}
type t = {
  1. ctx : ctx;
  2. models : Syntax.model list;
    (*

    Original, un-type-refined and un-normalized models. Not used any longer

    *)
  3. fsms : fsm list;
  4. globals : Value.t Env.t;
    (*

    Functions and constants

    *)
  5. fns : Syntax.fun_decl list;
    (*

    Functions

    *)
  6. csts : Syntax.cst_decl list;
    (*

    Constants

    *)
  7. types : Syntax.Guest.type_decl list;
    (*

    User-defined types

    *)
  8. dep_order : (Ident.t * int) list;
}
val pp : verbose_level:int -> Stdlib.Format.formatter -> t -> unit
val pp_fsm : verbose_level:int -> Stdlib.Format.formatter -> fsm -> unit
val is_rtl : fsm -> bool
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/index.html b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/index.html new file mode 100644 index 00000000..54e6d166 --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl/module-type-VHDL/index.html @@ -0,0 +1,2 @@ + +VHDL (rfsm.Rfsm.Vhdl.VHDL)

Module type Vhdl.VHDL

module Static : Static.T
module G : Guest.VHDL
exception Invalid_output_assign of string * Location.t
val output : dir:string -> ?pfx:string -> Static.t -> string list
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/Vhdl_types/index.html b/docs/rfsm/Rfsm/Vhdl_types/index.html new file mode 100644 index 00000000..9308101b --- /dev/null +++ b/docs/rfsm/Rfsm/Vhdl_types/index.html @@ -0,0 +1,2 @@ + +Vhdl_types (rfsm.Rfsm.Vhdl_types)

Module Rfsm.Vhdl_types

VHDL interface

type cfg = {
  1. mutable vhdl_bool_as_bool : bool;
  2. mutable vhdl_enum_prefix : string;
  3. mutable vhdl_use_numeric_std : bool;
}
val cfg : cfg
type t =
  1. | Std_logic
  2. | Unsigned of int
  3. | Signed of int
  4. | Integer of int_range option
  5. | Real
  6. | Boolean
  7. | Char
  8. | Array of int * t
  9. | Enum of string * string list
  10. | Record of string * (string * t) list
  11. | Unknown
and int_range = int * int
type type_mark =
  1. | TM_Full
  2. | TM_Abbr
  3. | TM_None
val pp : ?type_mark:type_mark -> Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/docs/rfsm/Rfsm/index.html b/docs/rfsm/Rfsm/index.html new file mode 100644 index 00000000..ae2340bd --- /dev/null +++ b/docs/rfsm/Rfsm/index.html @@ -0,0 +1,19 @@ + +Rfsm (rfsm.Rfsm)

Module Rfsm

module Annot : sig ... end
module Bits : sig ... end
module Cmodel : sig ... end
module Compiler : sig ... end
module Ctask : sig ... end
module Depg : sig ... end
module Dot : sig ... end
module Dynamic : sig ... end
module Env : sig ... end
module Event : sig ... end
module Evseq : sig ... end
module Evset : sig ... end
module Ext : sig ... end
module Guest : sig ... end
module Host : sig ... end
module Ident : sig ... end
module Location : sig ... end
module Logfile : sig ... end
module Misc : sig ... end
module Options : sig ... end

Compiler options

module Static : sig ... end
module Subst : sig ... end
module Syntax : sig ... end
module Systemc : sig ... end
module Typing : sig ... end
module Vcd : sig ... end
module Vcd_types : sig ... end
module Version : sig ... end
module Vhdl : sig ... end
module Vhdl_types : sig ... end
\ No newline at end of file diff --git a/docs/rfsm/index.html b/docs/rfsm/index.html new file mode 100644 index 00000000..f88342c0 --- /dev/null +++ b/docs/rfsm/index.html @@ -0,0 +1,2 @@ + +index (rfsm.index)

rfsm index

Library rfsm

The entry point of this library is the module: Rfsm.

\ No newline at end of file diff --git a/docs/user_manual/Makefile b/docs/user_manual/Makefile new file mode 100644 index 00000000..d25d838b --- /dev/null +++ b/docs/user_manual/Makefile @@ -0,0 +1,23 @@ +DOC=rfsm_um + +SRCS= ex1-c.tex \ + ex1-systemc.tex \ + ex1-vhdl.tex \ + introduction.tex \ + overview.tex \ + language.tex \ + rfsm_um.tex + +all: $(DOC).pdf + +$(DOC).pdf: $(SRCS) $(GEN_SRCS) + pdflatex $(DOC).tex > pdflatex.log + pdflatex $(DOC).tex > pdflatex.log + +clean: + \rm -f *.dvi *.log *.rel *.aux *.toc + +realclean: clobber + +clobber: clean + \rm -f $(DOC).pdf *~ diff --git a/docs/user_manual/dune b/docs/user_manual/dune new file mode 100644 index 00000000..311b6f55 --- /dev/null +++ b/docs/user_manual/dune @@ -0,0 +1,3 @@ +(install + (files rfsm_um.pdf) + (section doc)) diff --git a/docs/user_manual/ex1-c.tex b/docs/user_manual/ex1-c.tex new file mode 100644 index 00000000..8f76969c --- /dev/null +++ b/docs/user_manual/ex1-c.tex @@ -0,0 +1,43 @@ +\chapter*{Appendix A1 - Example of generated C code} +\label{cha:ex1-c} + +This is the code generated from program given in Listing~\ref{lst:rfsm-gensig} by the C backend. + +\begin{lstlisting}[language=ctask,frame=single,numbers=none,basicstyle=\small] +task Gensig( + in event h; + in bool e; + out bool s; + ) +{ + int<1:n> k; + enum { E0,E1 } state = E0; + s = false; + while ( 1 ) { + switch ( state ) { + case E0: + wait_ev(h); + if ( e==true ) { + k = 1; + s = true; + state = E1; + } + break; + case E1: + wait_ev(h); + if ( k==n ) { + s = false; + state = E0; + } + else if ( k H; + sc_in E; + sc_out S; + // Local variables + t_state state; + int k; + + void react(); + + SC_CTOR(G) { + SC_THREAD(react); + } +}; + +\end{lstlisting} + +\begin{lstlisting}[language=systemc,frame=single,numbers=none,basicstyle=\small,caption=File g.cpp] +#include "g.h" +#include "rfsm.h" + +void G::react() +{ + state = E0; + S.write(false); + while ( 1 ) { + switch ( state ) { + case E0: + wait(H.posedge_event()); + if ( E.read()==true ) { + k = 1; + S.write(true); + state = E1; + } + wait(SC_ZERO_TIME); + break; + case E1: + wait(H.posedge_event()); + if ( k==3 ) { + S.write(false); + state = E0; + } + else if ( k<3 ) { + k = k+1; + } + wait(SC_ZERO_TIME); + break; + } + } +}; +\end{lstlisting} + +\begin{lstlisting}[language=systemc,frame=single,numbers=none,basicstyle=\small,caption=File inp_H.h] +#include "systemc.h" + +SC_MODULE(Inp_H) +{ + // Output + sc_out H; + + void gen(); + + SC_CTOR(Inp_H) { + SC_THREAD(gen); + } +}; +\end{lstlisting} + +\begin{lstlisting}[language=systemc,frame=single,numbers=none,basicstyle=\small,caption=File inp_H.cpp] +#include "inp_H.h" +#include "rfsm.h" + +typedef struct { int period; int t1; int t2; } _periodic_t; + +static _periodic_t _clk = { 10, 0, 80 }; + +void Inp_H::gen() +{ + int _t=0; + wait(_clk.t1, SC_NS); + notify_ev(H,"H"); + _t = _clk.t1; + while ( _t <= _clk.t2 ) { + wait(_clk.period, SC_NS); + notify_ev(H,"H"); + _t += _clk.period; + } +}; +\end{lstlisting} + +\begin{lstlisting}[language=systemc,frame=single,numbers=none,basicstyle=\small,caption=File inp_E.h] +#include "systemc.h" + +SC_MODULE(Inp_E) +{ + // Output + sc_out > E; + + void gen(); + + SC_CTOR(Inp_E) { + SC_THREAD(gen); + } +}; +\end{lstlisting} + +\begin{lstlisting}[language=systemc,frame=single,numbers=none,basicstyle=\small,caption=File inp_E.cpp] +#include "inp_E.h" +#include "rfsm.h" + +typedef struct { int date; int val; } _vc_t; +static _vc_t _vcs[3] = { {0,0}, {25,1}, {35,0} }; + +void Inp_E::gen() +{ + int _i=0, _t=0; + while ( _i < 3 ) { + wait(_vcs[_i].date-_t, SC_NS); + E = _vcs[_i].val; + _t = _vcs[_i].date; + _i++; + } +}; +\end{lstlisting} + +\begin{lstlisting}[language=systemc,frame=single,numbers=none,basicstyle=\small,caption=File main.cpp] +#include "systemc.h" +#include "rfsm.h" +#include "inp_H.h" +#include "inp_E.h" +#include "g.h" + +int sc_main(int argc, char *argv[]) +{ + sc_signal H; + sc_signal E; + sc_signal S; + sc_trace_file *trace_file; + trace_file = sc_create_vcd_trace_file ("main"); + sc_write_comment(trace_file, "Generated by RFSM v2.0"); + sc_trace(trace_file, H, "H"); + sc_trace(trace_file, E, "E"); + sc_trace(trace_file, S, "S"); + + Inp_H Inp_H("Inp_H"); + Inp_H(H); + Inp_E Inp_E("Inp_E"); + Inp_E(E); + + G g("g"); + g(H,E,S); + + sc_start(100, SC_NS); + + sc_close_vcd_trace_file (trace_file); + + return EXIT_SUCCESS; +} +\end{lstlisting} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "rfsm_um" +%%% End: diff --git a/docs/user_manual/ex1-vhdl.tex b/docs/user_manual/ex1-vhdl.tex new file mode 100644 index 00000000..76b30085 --- /dev/null +++ b/docs/user_manual/ex1-vhdl.tex @@ -0,0 +1,154 @@ +\chapter*{Appendix A3 - Example of generated VHDL code} +\label{cha:ex1-vhdl} + +This is the code generated from program given in Listing~\ref{lst:rfsm-gensig} by the VHDL backend. + +\begin{lstlisting}[language=VHDL,frame=single,numbers=none,basicstyle=\small,caption=File g.vhd] +library ieee; +use ieee.std_logic_1164.all; +use work.rfsm.all; + +entity G is + port( H: in std_logic; + E: in std_logic; + S: out std_logic; + rst: in std_logic + ); +end entity; + +architecture RTL of G is + type t_state is ( E0, E1 ); + signal state: t_state; +begin + process(rst, H) + variable k: integer; + begin + if ( rst='1' ) then + state <= E0; + S <= '0'; + elsif rising_edge(H) then + case state is + when E0 => + if ( E = '1' ) then + k := 1; + S <= '1'; + state <= E1; + end if; + when E1 => + if ( k = 3 ) then + S <= '0'; + state <= E0; + elsif ( k<3 ) then + k := k+1; + end if; + end case; + end if; + end process; +end architecture; + +\end{lstlisting} + +\begin{lstlisting}[language=VHDL,frame=single,numbers=none,basicstyle=\small,caption=File main_top.vhd] +library ieee; +use ieee.std_logic_1164.all; + +entity main_top is + port( + H: in std_logic; + E: in std_logic; + S: out std_logic; + rst: in std_logic ); +end entity; + +architecture struct of main_top is + +component G + port( + H: in std_logic; + E: in std_logic; + S: out std_logic; + rst: in std_logic + ); +end component; + + +begin + G0: G port map(H,E,S,rst); +end architecture; +\end{lstlisting} + +\begin{lstlisting}[language=VHDL,frame=single,numbers=none,basicstyle=\small,caption=File main_tb.vhd] +library ieee; +use ieee.std_logic_1164.all; + +use work.rfsm.all; +entity main_tb is +end entity; + +architecture struct of main_tb is + +component main_top is + port( + H: in std_logic; + E: in std_logic; + S: out std_logic; + rst: in std_logic ); +end component; + +signal H: std_logic; +signal E: std_logic; +signal S: std_logic; +signal rst: std_logic; + +begin + + inp_H: process + type t_periodic is record period: time; t1: time; t2: time; end record; + constant periodic : t_periodic := ( 10 ns, 10 ns, 80 ns ); + variable t : time := 0 ns; + begin + H <= '0'; + wait for periodic.t1; + t := t + periodic.t1; + while ( t < periodic.t2 ) loop + H <= '1'; + wait for periodic.period/2; + H <= '0'; + wait for periodic.period/2; + t := t + periodic.period; + end loop; + wait; + end process; + inp_E: process + type t_vc is record date: time; val: std_logic; end record; + type t_vcs is array ( 0 to 2 ) of t_vc; + constant vcs : t_vcs := ( (0 ns,'0'), (25 ns,'1'), (35 ns,'0') ); + variable i : natural := 0; + variable t : time := 0 ns; + begin + for i in 0 to 2 loop + wait for vcs(i).date-t; + E <= vcs(i).val; + t := vcs(i).date; + end loop; + wait; + end process; + reset: process + begin + rst <= '1'; + wait for 1 ns; + rst <= '0'; + wait for 100 ns; + wait; + end process; + + Top: main_top port map(H,E,S,rst); + +end architecture; + +\end{lstlisting} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "rfsm_um" +%%% End: diff --git a/docs/user_manual/figs/.gitignore b/docs/user_manual/figs/.gitignore new file mode 100644 index 00000000..f6cd0e9a --- /dev/null +++ b/docs/user_manual/figs/.gitignore @@ -0,0 +1,2 @@ +!*.pdf +!gui/*.pdf diff --git a/docs/user_manual/figs/ctlsouris-chrono.pdf b/docs/user_manual/figs/ctlsouris-chrono.pdf new file mode 100644 index 0000000000000000000000000000000000000000..554809514e1c97a7c5a90086129b07dfbf43270a GIT binary patch literal 44818 zcmZ^~by!qi)F?~{C?E)u($ZZ5(uky#f(%19NaxTg0@5AQDKT_+hqT1d-OSK1bbRBl z-uK?;e*es#=bU}^>b+vGP5)6!hMk*(7n8nc>vRiNaF+GErw{WDH5av=ktL>x2sNjo zsja#57ivDlBUNfn84GJ?Q%A&TZRl(&Wom3^VoEJ0hUw(&XliJK>4wbu`RQk-&%bfy z*gq(oPI(&yNXdW3_y3IY)VkE1KouiPQ)6f9Km3xn;ieY&3!0eNAJ+V{@SjKjF8mKm z-~Kg=^KWwgU4l~$WaRu8fq#Lc=G3q-L9qW1s+@AB7Uo}^|DcQjgCNY&-tLbWFr6Ji z2v)qev$k_ovo|z0r55~qWi=&3Co5|1KcpgPm$Yzp`e^F--pkhtv(Qrd;pX1ht$cCjWf4pR z4)AVnTCTUUv~;ZI4aIU|9SVDXbE=iw)>hV(-L}0OGv5~^BqWEd>PJA0_CG^bH9;W_ zpdgAa4~bao%;|( zaxFpilP>L{4XvFYNlC39OIr07lX~vPZ*iU+^K)|cH%-M?>TsKyUc1jO*R$`aQ?9#% zxD2}Ugj8coLU$vjW&&aV&=>vyljPvyumQNnlgK6aHO)VF}Ff za|c94JQw$UX#Vx<9>k{(osyJ9!J#S(jJkOUd9Aya`N%?jp0c}m){N(asQA-6;-g`AhIF-|i{`)!Zudb< z+E~f24752&Oz4;aud@vpyseF-ko(Yy?%<;2rduR<31p*A~|vUIH}clM}yWGOJ-Lr zmB(iUT8@g+^3C`l#WYhX69uDz{dQG6u8Y6sM+rSEJBg2Yh7degg>hzzBzt!5C$D*% zD14;oWxonPKc!t^86TTo9RUttwF$uxdJE7+%er?{(EMw54BiV`S!^ow2Zcp}FxAnr zsJCL~I>$#-qapPE8()2eId+xd%rG`N%xAAPLCyq7y%L5W=?JiU)o!`M=6I=t6Cs9nBPgyP4_u2aQLTy3R_@;qT`$`ECEi!g)nFSbYi@mAeN z?eQCeK!iD^>HG6*Qox`E%H9F_pllA{XNvU2 z1a~{f;%WO^$xGW*QP0Hs%gB-vscX5x(Y~0pxVU{7EJQ6^4=Z^GF^>?M?-Q0?H8S^N zX!|9j3VQx~j=TFq5tJSKG@F}?o`F8vh+2?raZ;%kjsWOpo4qW#YTy;}6#V2-x24_u zy>5{_##vuC{029`C+_ZGo}yn*QK%Z-YW}OQ&iG*w#zUIJ#7tdDI7!Z0CbDc)NkzT zSCOp=AtFeeT5QMhikH)=gjDhtW`!u10SHM@_;pSf;lfO1LaRGQb4AEfEXBTp?21<1 zeP#DDE_G5*PY-8%8n1Dm^O~PSf8>F1t82&eQJ{fc^|1|3!mPZQ$t)SVF`vY}aec_X z1n|19tP`kPKqa=Gc`)Bxruc*Ydwa8&w|zxDu&Lf~Pz38qiSk@t1`_DKQ9J7j8|&Q4 z+3wnhII-=BZB5bQ4lC#b2KEZQfF4H`JDBzzU06>{VAZz^GmweEK}SH}Sy6v^;#?Hu zQ}a9)DKG8qw=Emh>CssG)R{o~5a2<;VhDsZ|0S4r;_yoUTqe#)YZg)o?_Hw32%{(> zz2S|y?tfoRMvJBVZHMAaxmcgdG;K|Ldt0}PuWgie`goHrlacY-HVljoP9oT%D&wOr zo31r5Jk%N=P)2OB=+s&DXs~dWITBnHRTXCv$7sDzDPja*#g37%ZcpuO=eqprvKMoZ*`)Osv~oLOd*;j``2x)QMq1%VkAi|$^lfzVc5h7um};2G z>uf0cD(9v4YgWdxNcV%VRe!2m5#G7WrCyARi8jVsLv=U!lx{vOCtMicQgq$wej@TK zgm+RcJP4C_ftGzZy`JHZ-^_wB8)QH}>03K+e^&o0d3NfQlbgRFcOoFffZwcNQAoLz zL8gGGp)_t8Mr2Um7(h{?2R%uGQuv<79vP?~)i7Jk8K45nmwm+3Y^us4gIn`{78pbc z)wO-8ys0-IdqXK4s~<05G5==BGls_$XJQcKNn(@CGxim&L_xEV0u??~0MHZR*}b*% zhmn=1X*uon%qZ2qw3^6ZiE_^?<5B%?bXrOT#@H!I$D3=u(}`a*k{r0^+UWfpU0O4y z15%t{5pFSP7IGkQ_;7%Wh43(PL?N_TCg1jfm>0$%6K-B;%&F73I`PZU(cmfFQ3-BE z%8dYDs^3HgM?))bxUVSV#x)N@$ASU6;hc{g7iYV&uIB9Ouw2tUoo`%$Ni(U+RKiQ= zq8nwlr^Kbk0)Td(wJr#NN3VU}`R07@Cst|rL@Gy4OJZ`OGl)%ic!g5H#k5PG@%G*( zbd2##pxL+8;u;E9(6CEsbAy3->%>I|T;UIxt2e``6w8(&;j&OcTYn0Ji}LcvG-a88_0~wS zBI&JOMcSxD`hBl9Njkf!=|PIdlnO_y+ZE>y7_{GDFr{1A3Rmr3Wo0za5EiKwIX$Ee zqBCWSGmI-~6NbSwW4uGh0uyv+Go40-FVpOnwwyNtP2itEYX*uNGcVsCsWIZvDtEr4 zz#^jiZW8mhNE45!uJOjo?chWZbZ#2Inn?@2g_)9jXg)5)nb{Kt)X10j_oN?!Ir0J1!gUZ2NM;&7`u>Ii;eN53++lBACtj=`xq2-TSHw znF&}2py!4?%x@9y?R(eyYrMo)D&(Xz!X}|52c6JW6FNON4mr)-scJHZJg=d_I-2X@ zo6SjBoN}px_{JwkTdL4c1>V}MEMfD6{DCHEbCFEnzwbIy2vB!!$7|;eiSB4PbDW1I zKP*g|fz?&D-yrvqpnpk&5~@chBxWSWXC#_NF_-Y^>79_}-X@KEDlaxTv<*^C?m(x0 z67}t`KaO*xL9nXuCnqN`t8#vdmfY4?E;ya4X8S6~g!CU^mdh%LOoY;!I3`l-NNPN2pdW2T`|K?=MdQ1ROKl%iv#&!eLn z9vWcdWG|UWQrAe>u(NP@XL*{v!|17UDfh_oS)8%L(N=EjW>%|0$Zh!*VCIO7!T0sU zFW&0>!hy_RiS(a{mRj@^xNtLbH};POoAN~tHmQtfJL<$|1U61W{oV&PS(aE7^xu}w zHLOt5hNIOoJzJ`y%`Yse?2KOJ#_t|o7Gb3tvVNy`K%h3x%Y0In?MGh{*?X3@sCY4z z)N-d2&ClOqVs2jN`iUacf7thCui&Unxc@}cN;h3NKK>1=3u0rMhA8kabfS6Ka+9K@EoQN*d`X)x+N<9xHA_TvZX!4hh>TG0Ofi;Ip~gu6vUxZA4J zrb6aLJ<2ojf?{(jW=ddsHh8GDfd5wcNii=7-q>WvO82E7>S4N{8TmO37ftggzxJipQb}wB*aK8 zJ;WDVJgJ)dJ@*U+%1BSHZ}SY?Po<4!F11!0$MQ5pnN4b46^&+TulLuRgZ;#opQ8GG zxQp>3jU(F6-XNnp+2St6HUPl)A*nLYLE63K^`< z6j1wbpOhHFx><2HH-kB%XG+mapAID41aPl+XW*8Hl}i9alEgEg1}`K|4283*5v?q5 z)J9J?3($3?@c@+-FW)(wr5p=%hUq6N*##w}n>*ywZ$)KTUYt$W`xT!(1QRf&(T$Ge zI&M)f@nXe`8<~d7ejj}S-Q>nHBS9(qYd z;h^dA3!7!16SY{nCFdx=h`1QjD2(8v53wmf$CFz;CaN8|on1bu7GVcAhoU4_2zd}| zYmJQ!DJhD5gMjvffVD3*1b^B%sw#?HdjTvOAl3U(8C*Yoxr z7?i%4*c{#k=Qjo|B8O6mbU95S_Gos1o#hSDLc8nDRn6tHY6cI6#oDqe+0Wr>17w&g zk%zQRXWeP?qnP^H-bvL%LHLFWL{ZSm?P719SvKr;+El*5XKxoQd-h<)Hp?bOu*?Hc z5vlfAh}psQsXo2;qdZ|u3Z_gYnt01x;@~kmZjmip5co#%x!6}@%nsq>;{s%m+Qqc; zyah>X-QAD!FscZl(^?|1EQKce|G!cFm8n5jdCA`OlEpH3lZs0ef7*y&&CR5y1*E?y zLUIJm3kzCXWlDnxj4RNX%PL2QkkwJ7M)?0YRcr~f{y%8%J z_Cwqw>hCsMAwfnT*60ll+WG)Y6SofRX-{2=)#8(=L8rOs5gLE2Aeb{QTUpN+W0764 zL7U7Lw|o=$nKY|&6ETlg;)Ft-c==)r4ev@q2X~WxOI!7!v$u=UA!!NDN`sF*j$^XE z^W9Zvgzx0uB2KqktyfwN&mNHmKtnA#<+EGWOSj5&O-b#ZFW!~$Y%##}sIi}rY5cey z{i@a|c|g1BA#%iaU)t9Kw80goxyXxdD;FIt>90=3Kyv8U&8mrgQ5195iP+~4ND#-w9BrzSO&CwfM zHr8;<)W4>q7xtiEjib;1V`D7$?XS-A%`IUZ=2$ui0}Fd!@Z*6)qFqIc%0QoqsjC#M z(*kP1p|ar#RqaOY`mhB@2CRgD-(yn8*JPW1A3mlBZ{nUDdAG8&3C+c_Pyw$D6cz!h zJ)E9+AyDU+7vJ2PMHfYWCj_f}b9&L{7=E$f-GSb2VS8KmMST7f>3*qSU`Zssb4h;i zH?;fXZrnZ6qNnw)pVFV3Qaj~QivohGJ%-{8KLfodJCGJ60b|-u#2dayj0@&YpOzaV z$Iy~E_4`&9Tdd!1mfokAPD4&ir0;l`eU6{1co>E)r_Ek#TOXD418}{K-8?hreyJs1 z&dMpkX0ZcMk;&zzgP5z|2q#xH^-mMnGKXDv&&@wmf@cDHmNoECnu~jU3L>a7${zX$ z@R#y~h+jEo^kKFLu6g-&l$1)w)+pJ?FG7^?VEut~79 zF1xzDsUp@O5N&+h&RIV0v+)&|-2i@^l3J@Bzv3!=B0(4Ur`jS*^y}$dDfou9YT1(H z)ntRS=?yqjRzyRav0Tj}d?6()f}Pdpln#O&aWaJdb=px=mB*~5o-eG{uCWGBE9LcE z5A+8EyA6bH46Wv91T6a&&*71+GpI_u#t422H-INX96PdK@swXZfA3&cKxG)#gwNVG zt#Wcr4fbOg|v{Jpu+^E5c(9XDB~=YT_XZtgMebh6R4> zZnt;mq6Ti{v%9fz>69-i{7d&|e~(_&7_)jh7?$ykS;x1xYPnNm-|9WIVP4*TLj{O# z+@B28lWK0k^4rSZJRxD$7aN(;P(3TJ8?Xzuo_~u)+=uDDM&T*g(zoGsQbMp;_k%bv zo+?57q_)XTTR%v^Gp3SDPz?Rnch-SRY`~8qQ@RLaBb9wXetf_}(>fcmHJe%zRd`HE zmN@gK+48-5GidonLkG`RcWV%i@2@hOq`s(%getbWNUpv4{dB&;8SUPi`LSj}h|~1P zmVImsvYA80`BtF)uL&i&1iRIQK5qAsY!R>GJok=l<@qLBB2^~dR**6pn+b@3QW#R1 zLrK|4<$HN^TU#%56^R>=Ff)39WY#w<@ujT{M{HAg7CGx}ATebZ2U6X&;v8l2zIr=q zD68u{65Q3z_9ae(KV+xfG++mu`}wN(^*?qb+@Fh6`EAq(=h=c>h0w_NSK^5#OLjDk zI)hNNV)j`erRQbiyer(no6Pcz&LgT}V{vWV{CRu3v$LGi{39e0z0jDMod^6V)MU69 zI`I$_OpKb4#L#Y^^}uSd6T2=;L@ZWSn03^3w~Rfsvm^3`^VYvn)AxaA<3W)0(l_RT z@v`PtvUr;|kw=Lr2=9NHj0O7D-Lf3HCN-@|uwo3KQ8oz^cIXoWnUg7I-Y|wq7Ic@A z2+nYdy5m)STynjJqIJSX8Sf4V`B17={9LijyBp4a^vAxtrl!xrqUB3e`SYfAWx5&h za5!2t>`0RsggGc;@ihpWylHw$EAnjb4Ub1fYJbi)o*w*mVbcHP- z_-(Fpc^bLxvf=`ZZP=F&E%Btcv&K2f)WKvD` z)^^j)3m0!1%{FtH0`0}qcMVA4#a^xSXT<|pFPNF4QZ{=Bzf)W8m&M4d8&XzC-nb~j zBqHYL%Q-j$aOcY#((45I&@uxS8lMi*pk?rBHglb>LSVg|YIzYiXlGQ@@YLng>Zu#= z?@Ycl>L|Cd4gBa5iEw{YPMS{8I2r>iKVBJcbdKu=w~8a6PHM8L$tCGGlx1ncHVA_2 z5qX(jqDE)Y`6A3FJRH|J)oa4CaOSLx6Y%nvJ4Xpa}%MhE8j3v-T#D9 zZ!ArbCFV6%xVh;DsvOZqocqM_6*KE-;GO9cj<=he!v~Ih)r4M*1vgH;Ev8#vA+x;J z3f^N)s=V=^m&S6sH4weN_tPfs!A?y*Hc56kobMvuF}){!$`a##li4QMJSGZ{$}G6M zG#|JeRleyi>G3q9Z1Plgq9y8I&0%>Dah z29yTL9*DVt5}p_@8s7we_HAt2RbLC}+bJp>^{$S4@J#%iyHfoME#Aj)fRf~KVr+*_ zoM+?r67NgjsK3^Hx3)3Rl#`v^=kBzQ&K5%9uqk)8o;vW;L`KQ)(`YJtK(SFqu~mF~ zUIuifW$&{OW#D-U34JDOcjC@3rsaSO4e^RpOJixx zR?FQA%2vW2Q@83J*j%ly8CffBvl&~>=tDOm;SASK++(sJ2d-fHs|KxL7 zRGB7T^jRNU`R*^&!0WkLk^s_=dIsfvEJ8S0xBaZREusQXN$kw3o6HXPS;D|#EOu)_ zK@-I4AiNRncbnC;{Bn~@&=f`j7*xQH!IZq&BDKc*J^_v9xW^2ab03woLK1ky=Z-x1 z@U!2NRV91art)U(9K^(a`(&JjxG}Cg{<2UY@nHMbFuq$Zter;K1C`u_A!!DJQDRkQ zr~3qW&uihXV+406TFlXA6DPM&NZD>h|F9QtNYM9@pix3=CsTKJB24SU7d3T6)}G@> z1ZLb%MtUk9Q@tg3N34$AZBI~od%1e;i(Gj0<2v&xFYV}h#giHC6hpr*C4s9!PH_RO z74-Fv`LD6y&K>O1xvplU*~UhjMW0_l(F2&TY>HRGbNm*^tw9_++$;}EEfxt;OZe(k z`B8@=m@70z$HZ<xvnqb4}Z*j#N)(8VQE{a_@%2nFb8;+Q-tyNC;mwK!3L(SObJq&eL zeVHds3`ra?aqI(lbEsec$rb{ikaql4E&eOH|L4R=sG)51!&fVldzyMuyw>|6^YS6j z^ckj#JB1=WrdY2mH%|qz1>JMfP*MI>*X_)?w=~Cxy}=o0tZ5NUBXE|4KQ#mXLL(gT zQp#dG#%C`vUZ}4I6}g>Hsu1zVmj?4D@Sxb|6GZ2l!Gpz?Lq>DYb%6G2$|ZxxBZ6fd z-F6#Ivm$$)45cTk^N~J7Fl`l`b_c++Qmc^mtd@fqpUAZR%`KS*nD|b7>7@ajZ01s> zU+UV-3sOH*t}hBu|2T8L5doG4diHmDUY~?1^|N9Pwb}IMD_^6lX6dwi+LW*Y%zSMA zq^9`AsjXR8G==|q4NMc@Ui4WY~ z$mr7~gv|W8m|PuJg~tbFJfNtOubJ(~z-Hgx32*e3&8CN!u4QoSUn8T1MP)r)kyzxu z4t@(sx0F3NKQvQw{7x!rY&!upW;c>nZG*>dea_b>oUQo~GoQW62oPAtBPGT;dhD>zvBwQ*f{^vT;&LO>Ye`$e9f7IN~-K2MH~1ZL~X9OVm> zaQUGd$`Kaq3!bO0QPH;1g3$pZlGziO?nkSy7xQQ9l;K#ni-^e?2tPjsiBB}0? z!BkqaSVS(EzM2gqu@y0x-2_<_s03}d-SqM8tX%va99evM0RU(F7#t};9lvgPZIGd%v{O#XD0eI*y?Bh}fOXZdsA zGgt!a$c(i2G@%+`rYpIA{ny%QE*!Eo?mY%+L8SHKEbE6wtaG^+1Z?4ucgei#N9a{3 z32S~Fl^iF=cR7W2CpGG%zM1$=JIk@0eQ3-49J>Nt$Z3>hSD6o*;BO`;L^5e#171jb zkhziJOI7_HB=z6WVEP$laWTb~0@D+0WQ%V%?{VFTy_)#XB2lR*g zV4EN!^Max%P||dKp2nDe+{R#DDsU^L)}6PQCk=WMwSCWf<9#KWS(;I61}eD$FlCl= zEVa%;L6o>4Yae*JIyPHB%wuD8Z$u@qgLz*g_`pk@2@o}>pylIwL+t#XRJ%UD2Rg=~ z)L`)@pTBMCH@@03))X7c!+;RellZZUoesIvn(USq{no9yD0;WL;cCzPg0^2&VL(dG zhNB%7ha~*{mLx>Qc**CnYub(3bzJNy+*N89eV8ZGwr zYc}?8>F!%cC`)Yho|F`#PBAKyn^Tmf$}e84$!K(*;@uK82-$&YDmh(>sfKPdLwo9f zQ`r**|G?w{^cz)a_xN5B4x5#X-qja)iCL_8FF1*5CI~GG_+A7fyLM@MznRjo%8ydB z^aVx}{84V5!Pi?(87Tkgwv8r*=KiSGh5WAQLRDX>lBcI@=MF>t;c+aG;!2`;3EN~X z=6*cyxA?)J&Qw{RBCV9COuLr%k9XybV=G>UQh+3+qtH8WN=m!7$34`25rx*^PCZ$Q z)~Ece3j+RXyn~lFmzIq`nmQAj&X-%q%ssNrl41SceZ2Mh9;E4Y?GzUj9590D?U;jb zyKn<=$HWigfID$IxF0ju)tb2SEFllY4pum=VvGdh-`=do>5i$KQJwbs*C!UVH1nT@ zM782d^(G_`7+Lc2-qikR2EdHx8Ua4@@~v&*Xf-0zp1P*en!>p?J6*)p#tsqwxLS7$ zitwARudnx96%yc*-p_6BeZI6-PGxbvv~@6*G2DsTlXPiGVGC>;)G{urI=&bg1@!)O z7E(cuD~ZfTg+XVxP#DVDIJZr3gr~bJ57M-c4=B5aUxK&H(8*0TOiCj4zjyeMh-k|U zK)k4gQLQs|g>!SePFV4!(FBiWi3Xj4BtO8J#97tP3_ec9aP z{R3?io9<%Zhakrl;Ao%p10Xm+zb`gQ@}Yto?pp z1dx^abD011;eI~PH9G7bxWsA&y@_`f$GLuQfAPu`aZs-v@gk9K`KL>KMjx!uO1}jQ-?uC75vL6Z9F1+}z{h6Lh(}7lPxuXRzAyuPtVKnwfn`yPzkl8*< zYE8AtVqKT3z*dA-rm#WPN{PCUeDHduf$2z7Q|-&>>x|z&%p2IZdVafjOl3@i#KxEq}b*3|;P!j26a zM(fJW&GYFQ`}+H&*7?crh|c`)v-c(5@_140Z);LyQb%(hu4ukFeMD~0-MQznJS@-I zez2Nq@eN72v=R)j7r=chHFmFlzGw#MkGL-6lu;->$sY07V$Dg^eFiyLYA#D)s1`OK z{9^kHiyEN=Y#hTZ!`LihS;D&0FsQMbb+zVmozPJqLOr&6j11Xy8mH3$$EwU{kTI$fY^y60elqg4r4bxkB=oYxC`*v}~kvAODL#`Z9ZZA*t7EH5Nz zohc|U$OPh^{clg68D-i;%tPGgS6`L(5bYCFue0+a3QUV(qihsKNr05Zg&1LeFPL_DkJkNm)!@sZL{kzSb%Jd@icFHVdMpL5o^RGn1&X?;kQ79I`g{q;R_K>_`~*} zKF4_*{{oAyukGY?qN`z6ZdFK}tl}Jg)xadOgl7J3by^)6&%qBCkFok3gKfWLAf6PA z+9;aT%>L@STtDKsrW+gib-A#Hcc>lBi33vRM@5FwaEi?5kdQxVc$?Xh7Q6^YD~;W> zCjD+n)?M1d(9p*WAY)`^DRt2aVwN8#EjqcLW6tjtv?&9>k5iIYTRwZF?@-s8R8F;0 z&F@*yih57U^Z#mYY^bEYXRH>nl>F^`mS;_pOnxJ$rRgS%zc1G+6wA5J)3R^yT9?+N zU)#TDQ}msJBD-+ZcXv$QPZkcyW-l)USonSB2bTg0+~8F0t(O=JR20qkjq(dC83&bK z8<7>!5^P?E487K2YcY&DgkN}FOTU{iqRIIq4ro&#{^}$yv&tlFUyMu1Fk}ebO|_da zUYJ*!Qdo`8o}-BM|IQPExoOT)k`UmhIvvL#i(>~z;a{21h{`atkds+l9AV876NN{S zz4P}B2)LW8q)KxW;ck9^(cB$V$%i`k6dZ+UcK)x1yJ%=a zOu`{W`_j`PA(dFHo4~V9|4N*fOlI=KQM1dWgq2j2&l#u{-zUea#^M?=W9!p*k1)_? zfY5#d|Mb&IVkVn_>LMew4CvN^t5msIG}?t-I}GWc>>2KMzYVGNzU%!s&;^8bl(~^# z)!|`?d9TKyp^&g_y{mN}*V7cnTzHTCCT>wiWF4ap*Y?@mNI*cktDvWel11#F z24Vv{v{}WTM1_UMp+pon8Sd8qX@mZ!DZ1ksp`41+;K*o)6Yjz2$O+!w97R*GjsI$VPCE>8#Hb{|Ea19Jxr99!VA-il6@P*?AJgYJR}h zFg_;r;QzA&dx*(^0z8wrl}NBf8V(TvaV2)CW^*=MRCbr=sIBYDBfo6@CF9NT*wI(( z6WkOF_)Ppi@OCpWYce5D{K|*@cCotn>d%%YTFmUjY&$}~CXd;*seen9N^nt$DVkscW}n=q z@2G-+^3&}lw=lnN%l?CX=-DVBxv%~+F*s5jutroAwY z_Pczo%)5@uwe=r#BTFN}-21(hP4ybmD>XG~#qt?gfT-MoR_PbDQcIIYImCQZ`5q0e zdz6Uc%z#zjdsU5n(Jh#JcLw>`6_>+gVfLgb3cqq+2qiAgO2TIpI1VvdW9#|1O)yN< z&_be=4Xy+bU?|TxFYy8hn5j!%er|59RbD(7NVomK5kGa*ogXnHoAE=Aj?!wMbHC80 z5L@$#A|7C@k50co z{-oixKCCj#W4f?cuA@ zOpRE*h_gbw3VLIe@AV7aP5KdwI2Gj|fP&XyHUpZP*;dOE=2j=xdK#R#ncsKc$?sj^ ze7W>b@IlWjn|K zcd5UvX+~G6Hc(3*a*OCML;e zA4;=_t)Z8nG^Gjy!wpgG@EclOwe+%;dR~=dUyO9Uf)i>AQ?~34XnM1FKoQ+N)~)G+ ztXPvuT>`d?T$88?ujOn(_-4NQnLirLI&!hPCSBShM;-%B-(CGQ*3eT@5DL;VKK=Tx z$>(sbLWst*#ds1o@)G_c!BFs0hc9?c>X-WUrnTcwww9S z5(ChyCDq4PA8YA*#Qls!`ML8HdzW1li=?mXW*sRl1_BnY;5Ta34T$>|eEVYNTnOW}B!fc8eL)?QLigNvb7W!JDNifc@f%i%v&`?vn|m+a#s zFep3P9>?R4s}FO56~!QydYqXhF&EOdspPu$(=Ru#3+wk`uArv5zzHLt&QZblrt+Q} zN32*z(erEjpr^On>e3_ETkPExD(EY&awVhstwE&;c2rs0yBw{NQ2D>*WWb8{1W?Wg zg~5u+pjPuHAjRK6m*(s6r`KfHx!0-O!ea|7cP+$5Amq@d18v@hU!I?^d=#?27d)#J zehN8h`z+p{S*^!YBIh(+>#p@hr`xT^iX%{ncN1`4 z>Tk~@ySbjS`1(|VU{y@a|D1~r%WpjZ;>^XvsUsWH7}WZZ)gz8NO&X3N%6~Y>%mOZF zeV%lIy>ge625eQjZw?8N2!QH6;o0$HpUgTeB?Sw}TQ#~pH>?-2$M`;t&w)6yE2R}k z*mZipr3+-u$s<$N9{n(u_$+L!%#Q1u0U3H_)1AN8($=?We^hP88Bwk<_B_r6vAx|{ zUJW&Y=kLRwm=o^EmiK6o`hsvxpVh72e^b0@VEl3HE9z(?qp4mhCLk#GEbL&4-11~V z@?SGa)oj@wp?q{NJOZyYBPS+hp51hwTUx93E z0b9QNTU84MY~kVwk-4uen{2+HBu6@Xv;T9Z2H7YFrtr(Ya39wx;YY8X5j?y0`@`gM zw=nj@2v7pyev;zeGbnqOQTD@9kCIY=n^^mzd8nf3$EA-86ET~Rc>%S#myb0ye2K5l zPgQoO6Y6f*b+`33G_BaSp1Hj2On`h2D;Ei~PsRD_Ym8cU$un&ql;}4YjMv=x5n#dv zwaYlT7;#X;EPYUP`Pa2dWJ`EzrZc=!?Z8BvmkzK-mB~yBYNcD^DE72_-$E#;N>C<| zx?aE65ts8H9e>5*Mj#BVWzlLY#^-=-y1-yGx1);%C#LciPZqOot$JpkR2+UbYkt!)Cy;*j4`pT4n?d8U)?_a+@290murvV$p$!Qi1^znEB9SlHO4q^@3qoyOge;`l0s7>O`vRS;k( zB#PtF?3DfngZzFAT;3L{FGDHh%tXb?^gsTwNW#VCV!qaDa&l4-yyCu-u2H7re%QG4 zLPM~Tj*-#R&8_1*1g=(~e0_CAtyqGC_l=mrY82Y+Epm77^5kHN6o2(4(PkJb?^}vI zKYC0**xRcg*wlFWxc)V$1gp zQbKz&vGJr3`>9xB9Mm5b15m1E+9>Ysh}Q7%^=fex^=tPaU*+1`8f>~$L0*2(BY+a} z{qLx=V;Pf4(|hu#63|*U^6>D`%hCOGfbktM(9w6*ALG@lS9%_M^eqPvaFRSgzrq07 zWhg!=sr_tJSni3*=pYpy-Wm)R2E1JMX4V&NDAoj{?f@86Ih01_w;Xhu1yu4kz6LSYX_mdh%0?B^PeV$ zqkI5dUR>Zjf8Ki3c3YvDuEOy?2)hx{(x=*?oLr<2kFseD?jvt3% z%W(qHA*-R`9Xl)Qh8R6Py@(?65aH?#*1D50?o%9?0Dacux4^*OzCNK6+D|h7ME|-n z$n@ZHU?qw~B$+~`NF-*}K)&5d+iVxN_s#j&uP7w4k>uAKQQ}4$O+;W?p_dq`=17!4 zg??=jb@UFuC2F9i(e2s~72?~lfq6RcBqhoD6OY;=q#InXe?@A!n#OBBDtft?TNl@B z`9C71jbiVW2#%5?6R_PkqNV&dkLW-~Nc27cSM2KH_UJh}>PK?T>Vd69ZQDk#Yo5eu zjOVYOY{b$lR1Bf{yHpB+pRO7ruKKy1h967Fxzu6Z^_tkkLRQk7-G@cUwZEYnFaURL zTmeY;{XQja_G^+lU2YMiyfOn|TAA<;1{W`M-}7-1S8T(KTwKSsGkVPj zbqg=Jd3aPwE1Lrmb@&B$2?G#z!be%J&$&37AA-*SJ`m1f979~Pa zm>82*R}Dmp@npC}7)!Uek@dUuhREW6!DbgO;4vX;oO#6=-3N!m{ISf++4?3$q zyyy^#4Ck^!o#Ex>O^CzV{-QVtH0y88x3I9V)>dc+QWW~`&vIL*^y**yk`-1jc8cpY zSz-XEG8&-Y71NXH+VtdB7 zVc+Rpy%zf}jrMH>?!bZT2s=grM^PMg`^0q(*Qyl!m-h@2B86@ka&~Qg)s{MuAlY(l zV9;Dr&)*`mpni=?Nvpj8 zr<#CdR^5WI6Mx4L*eWA~H!PG%FwwC|{CZt3x)!9vh>Fgj3`Aw^)ME8#eu&Gf*%SHw z5-cKr`x(D8CW)8PP3&Bn3(*Me*@<&H>}#w_#=)nSb|pmn?JE=rIUy5WwW$#DA&;mQ zs%u`2<1WJ^cR7M;@}tg|COLSH=!h#*!+SvvvBfpwm)9!t~Mzh zjXod#((sFIg@RMR5!j>&nzy~rryBifO7);8bYh$RrVY7 zTg^ouaw+{oWL}6gsLnw*-AACt{vPe*kI*r~6`*7AQ8R}SNy#@!Oa%%Au{|{he7pD& zhxmbc8S<+lD=%^ zZaKX}+!4-XMNMoD7WfeDvvHeqo_5}?@uFD%f_NgkzAOh}-C7_2#f!n5wb+sVo z`1~^w)@7n)<<0g;YUPpX(Q@l?Pa?@(8mW&nFkM5S@;`i&lBslaqDkmFOd z2MS+J)4y7x$CMYX4$%Gd{Sblrs-#g>T{MKg&G!Cl%Wy|0zNf(l-v$RrGPP!+xlWtI zhN1(Ba5LAQw!JXXf+^sU+ofM-w({8a?xe3a=yL`NnvMcOOU{x1(~`uI3Zdp`-?P+} z3ZNN~0>^EF)`tnXe8H}rLOiU_Zbb~Fx75=GC+^vCp?pD3E`s?CwKmWWfoNfvLi{8G zHzO@K3*hedKWw!yOsf7pg21{nu*YNx4?x^;y42`-ZUFBNrn^1;T#`RScg3B#H{p15 z$zH;NW?;9aB5bJhM{~6+o1R}c=H#reb_NXUi`5#gbHv9Jg(9};7hvtTA;7imRhp$x z{MVrh1QY6m2(UBHl=@zCD-9Z@$Mn=F3&d5DvoSDOc~;)cWADq^DdL)y98!9tlu*vM zl=<{(EH{q=?_U{v64R*zY7g&-@B5!=E(O}pmq|k;9S|Xo5hyOVQYjpVa-x*AT7dvx z-6_PeNs2~Z5mrV}3gj5yMaTrvka?I#oWRSO@1J|))c7|CV4 z<3CDk+WXjzD`0!~QMlZ+{f5+-$csPU8+C#;>KN}|J*jNcb#JB(vC4j1e}+`qH2q@6 zp;=)#3IU-e@E@kS+)V&}uKvT+qJ0gK@PQ^JfE}^GA&VtSOC|j|x7ABng?W0b&s&Oy zIaGPR741;%k6SaO9ysBwzS({c0cHepQ7^N2sIOW?cc>{Y0Ddsezk{5H!RXO`?teoY z=jVSy$$DA_tA#3|FL$|w&EndX=`SCqK!`u}aqS73_n|AHBUGhWADbL7FdL!~J6#X- zLdF(6Ir9(W;Inf7#+d!A5+!BRslyWI~Xm`ZTZq*+qn{Y15Bs=}ZQdH!AM!F;OZx zd@>9xmX>&=0l3bOp=mLV9*C?umPB@@Q9!vzir6?lDJL<}r9l2#gpS)r_`}ECg^w!u zlX=O>B_R-9!ua&8#XqzIDsHaw2f|uU`#F@290V{DZ=?Wgz%6aIyzRzvBPbNR^UInx zI|0I8?AZbR2BQW6k9>j+pr-M^R^EJG%4SngU*3c?xL#Q?-%t7vV6C`8i*61jBg>GG zf&Y)Qw}7gu>%NBtK^l}+Bow7nKsp2jr1R3<4blyQpi)XmcYEpX4(aZ0xpX&t=L-0| z|L4u$HwHt;aL7G-?^ScnHP5~iI7*jiA5j$JJjJsRlYbvLZU~c2OasVN*7>@OuONHh0PV0<*L^^vN`4IL*N`#$kST9IzPp z7cqAW@~Kx@yp8s9uA!aVr{M}BNo*1j>$_={R#Nhw3|zudj!80b-lVG9=*cu@9&8Ra z9H)vOVPnJ-D5k#8jUdD=uVQZf*{SU%@@F!u+bjUiGYWl_)qj(11^!auQ;8?06 zdw-q!?V#xLJc_Q)X@NKj24Ks$>xfq|&))%Vz)O+_O#H>VIDu@(>~&W{+}_3nhy+^5 z;;sk0NLOJMAL(g?>{XuCI%DyE7tNme%xuA9dH|ek=jrLmnwa1FV3SkR0%s+i>5rYf zOJNB^Uo!Ro%0@=ix1V49>Gty{Ah3pOH{mQt3ls@*?Lz`Zf1$&nLuWUMKYFlmirur* z^z^}g|MT@TI;L2jY1?_>{a+%6gxNrGe}9)xjpp@7OEa*ao^LH2FRHl1zRS$U1uvdL z_RE&9tTu(YeAPecT+xndK1=`rvQ?tp|7cZ1U`?z&iXUsqrZuQ)G*mPnAcnEFGBin~ zcw2`RGNk}Z=s~{Cfn5RyirnY($*Gn-8a-gH!}(;vA?v*kW;31DaCq=KMgn|0wRZe9 z?m#qm%NP$>#wS#XJqxCO_K_Cv3j!H`;eSjQM*5MZ3rv9`IGO6HQ10o6Q;k!42wE zJE%}VtF)c&G)VS65JcTP&SXcQ@2V8&cSk}3Qp5-csjBJB0N5-UN$m#j3__?U^aM?8 zLkpD*ft*ySU1n-z!OhM!9FT^+FVDzeS&H_s&hoP~=8Fc+0YAM#PcP%izHYDn44 zN6T*t$(QV0qVAu!WX>D}xx5*#3LW<`^#7wU6cph;x@_YBIgB9NWxY3smVIC#$*3~$ z=B^5Vg^kO-M`jAlnpzBla!}7OUfu0iEe*;8-GvW+#M5dczVUB&BQt4FG7>x1dT4c1 zs@{~XNCIl?BynX<*PGv+&!^#GT~g({rYsM@8Y(v8Bh3)?FY$z`kD&oY{chr_zZlxf z0R@=*bqMsT6X5^X?;<}0gIU`C(+8&vs;DhLLz1K>!O4!H=2QHN#_7r3`~sxN`tbKo z-uC|9NkL`!3-fEE-^T=i10sUB!4Fa22z!*dsBkFfmXP~!^qL+NhDHLJ;dSHx^E}fx z$L*oyMTLcuaU3mApFe+o^fRxySi`UwDluRX=ZIv(HqZmWfa=`?54^Q^<{HYT-ggRMaQpaM z9B)nUD3@E!3lqB?MATg@$2rW%2vgG0ZH*ThYHKH*g$?8WF71F12M0=;K5Mm_NKg7u z;R9<6Kb{}8@r>$0R;LU5n+=6 zkAe%#Y1v$lryZuc$zcBRa|_y*eietOefS3ZTG2C?gh12;gYon5Fq#j*_|=H@7wJ-a zUkPN>Ssf0fiCF@i9;t8;qW#ebDmdm~`;*Kc+XE)rU}Wbo*U!>Q_3Xw;r2gp}G9e(Y zV`q0C+G#t`%-Cm5^?7_6hL3dz$TWkVSW5g;RTi-BaVH9GUW#z=dnsHt_lxqFm`R`q zcj@ImuD(2)^g}1aeA-oghno+_eih@ohzCikDpTQ8YT3a5LM}{7J$e|bq(03Dg-%u2 z+?=JaphqF90)1<<6i}VIPzQG8M-SJXuEd<2oYc4+FYIM!Wyx?X`VImD&+9#?B(CK7~nRcjFK_k_qG!qvJE0IHxB)>#1HD151@WIllE)8Ap8vg9~B#!wlG>2 z)pm@8(qtZ6;DPHd_B!R##btyn75{&%65ic?;WK&d#hzHh&)HJ{;oUi5GtjE_BthRF zeEmNkFf2c?ErPNSdkK7)J-}zxok74rD|gxW5rzLbZteeUGD80{bt+b9g7AvnolLnr zJB(q_hTTGKq2#KTsX!sj4sv<>X3tT*;{C@q{qx~nar`lBZ>pm8!!ypUa@~nyV@G+; zSZXRND?iHM0Rz7O)giZK4>ra+pp61J>Ty6IIqMN*80>LL9mc*oc0m*CTO>(KG?O#bx?-`)fkyNZF3VytHASwgX^}Cfs_`Q*3Gw4SA zl&0MQYB20~Yx7sR;!uR~FM(Fa@HncfzfSa?rin~1)#!g zlVQ!?s-Ko&p$I5*$^u}!Wa4*PqcogMp7_N(9Xc!($HAia^P!q_F!zyCo<>c)+mSN* zFz~+Y72uuF{LBOJ#v9`{Cp+_OIFBEn_6rj~3!pIUjbHBJ+WAQuOru^IR#)=wuQ>UA z%!z|ITG=yeEs3yfe?8S4CTE%%?I2;R9fE>KR}E0I`MKzstsE8oMoYFez^f-f0Fv_Z z5`PaRmr74f-H}sbZ(}hE8SVv&&~gXPmT{=(Ul|WN$>GZY4ti!yV(tX?uH?^1uutL+ z3tg|pXJ2(t=ZVL%$w&;neft&|6xI9U9#SfG>`}9^DSi5A z`&H}u>axI>*Kub~0SrPyUzyz_!}`rQTO}sRa?Ah5DNmt*W|3w4;HfdJEGrC|DGOM$ z%6>B=!Ts!XHNm`KPt@4f?avTp<=NnAFXZsd1t@gDV5+05Oa41<%s|0XZZSm@nKCy! zJ39|gEx_`}yf&BRAm!3+4FCvSYA&v)G3JepjU#!Q^lXtHop-Tglqru94)s|WDCe=| z*v-i;9PK$I;n}Xz4!LsY{BX2|inN1-0?3UY$D+&DW5Vxv`FJO^-@}wSi}VwZU{jTo z+n=)OosW*@u%q%o?}BpKZfCYRdjOre5|9dz*1*JUp<{DPrQKxQ2^h!z9#}BT|L_xq zn$2?&s-LP}iHj$d;DeCW>vbz%PF2_d_xUwfORYoHJt(KpS(fGuUy<}B;%ZcWCv=go zuBqA0k5JTf3!gu80Z8=`RZHXHWcBQ=wYASV^eU6a#f8!n|I?Fd3aiHw>2H((#&sNR z_{d{|z$`CZWDTNirqd9PLqOpFC0n^@WyWQD_=ilD(sWbPeSi>cGD;gsk7JF!p_};x z(wsAYM;Mz15LIoaGi&SvaH$rs(A*rWM4`nC5BJ0@lu5mFeyeJGCSUu0M{IQT7cdPS zU60=BB+y?%NJB(LL>QvNUJA`b-weg>qlH6~LZH0ToFkwlBg}KkSQPlbRlvb{8X; zi>C4+x@W_Cm14o9QI}wR`};!sm+Ip3wWjWFv^v$Zlf~fK_novG4r1fVt&ojZ2YY)9 zG7q)NvKEFm#)~Ql>!O+MH?YL^nr*ZH zdcY1gAV1izAK#!TO-ouTpG}|U@p*qwBs;a0hMAd#yJ6*@Pz?*bgtjEVTMSN(eaYT$ zKo5hZRk+oY9Ry*LU@IQmrtM93c>wohgXE*Etr+$kx5VF17W(@z$bE3BK#OI^YG@Zk zjhzn$j&)-GbSo@1^PZ*j-9Y&z;Vs1o^$1jCEdcheHuJ-rQvz}Eva@k%@D049De_Hl z;YSZ8tpBC97*mA-A{truAAUs(fif&vHTmA%z}m}K^icZU9s7v@otLQS{iFL9!?Cny zcq9J{+WGO5_t#o@b6{@KI$QMew(+m5iF))tE%{jD5$Ns+!H2Oz3S*Uo4Vh-P-AiskIj(g zc{?9%!yJ0?k5J$*p8-Bhn(Cgkq2IvRE`tQ02^ym^=Y4RBRyzJyGrGik6Oy-d;NTl% zyQ^O(Fe$OIv6Yp;tt<-*3*5AMVi9y%o!hIcewr)_lbkw#h@U@+3o50sf*<=*xkt}C z+;9(g0t}-vSh?oz4qFwT@JW_?l6(z(Y4+V8G0Xg5vp3-en4-ST4L*Xi^DPG?a-1CI z!9?6!KufZ_*v87tyd$e#>v{_86sWYS=RjLnWY|03-|nl&cJ zMItJ>4gXMZt|9VY_I`l&g#G;s`mT;}>TN&_adF|QBpJ^Y6%x`YrM>+0eH3sF%4)AB zfRkM&Ueput{|iUvlLpG=!)8fK#+wYq=Yn%@G06}))$rA$hBh*qiO-)shq<}Am0|cc zlz4;v{hKC}lb_R+>I(R`7e;B@g**rSUpYWCxt*r7NqO6fL zTwR{e+E1E$BVe?O*3M~N(cTUCy_BXIo9LH+^B$gJ&_Wow(gfhgp3fg)Hx=#$_ytjY zjc*r(Bi{eIc3}t)N?x1yFjCvNe>H5Y59UrvV8@;r@SqKuv8z;Vq-yoZ7a+4?kSJs02CE*#N0#B+(HXaw%rJH4;~-(!Per;HzuEV6#j8-E;< zDXNEEBAr2y4_x`2yBH<C4DQ9<`V;oF|EFtX`3Fv;hskM z4gBpQx52@X_g{XT+^j8p;kR0N#<>-5h(K&G`BJ9{^=BsAOfM%%=?tzX;UD3zd79^X zdJ{B#gbqJ)omdhlcaSc0*4KX-e;1{l4V&n~E~%Wx?fef*JTV*?+eC)Qk(GB@vzTlJxM$iq0| zEFufbN`yka&}sv&7cVDVI!5<>x!HO89q}zF#`@NXU&dH;b`dHVOAR(rtT3f(wM>`?fpG>HU6bn+Z9M&ZaIP;%Q{XmR8xwYYEvnt!3d zCoTSvtu6Oix8ujC50s*#qmhx3Pk{Hl0HF!H9V9GYE9es9*oCsO+7qXHb>cKQ3V@J; zHlilWcpdUCAPa_uggDB6hjYBciOmo*rNp}1(q{l2fRF~ENof~a_z#PH7s)1SN;0e#)}iL7Im?DuCeujcO6`hoX&nBEH3)MTC3j3w4Nn8 z67;0nlxqrTjFhDCZLt*3_v5HAwRrRKEjycdBcwhq=@D8*6h6UBi%{ZrANQAiI_<;# zY{mj(-JRtkL{J} z*)wBbd2%vxXAh(W15{2(77e3@T@dhwJLNnYF8u5+ron01Jd*8hV4jM2WjRS@^_{8S;n#m!;S+`e&sxxipv`Y2`gj;((&Fh|KdnFEB-xdBtbU5uK@!nc|1#0n(pv@k@;^bi6vi8~3x9@d304e9T zi@|gFs9}Vb_Vvj?G}`qYK$pF@$40+_d`c%1gur!A(la<@csy&P4}L%c@AUfsE{MMV z`L$&R!s|8`Aqu6-6}kgl!ws+TZC@O>xGh}DXSJ}s+%~TRuDoqkSdGM(0X@dmh&O9! z`)?x_bA?NoA(@0oA>hoR^&8wrLT`rb<@0#}84sFnx`6xSEhGsiVKJDOjzw{?au%}s6IIc~traw9SBqLViZUWHEtZmhqF z$S=@ZnD*;C#h>a-0xFw+C`NfpvKI?LQJ@ZRkn~{I*YXx$Su+ppOf_Z=&WGD*(6X|@ zJ?OE%YD=4Rd+s>XU%B6%9@>SUzMFrnKVX4-2qVdd-2)ki(X>Qolh@A99VHH;sxBzOn?H_4oswWeLXZr*u$ivVC&pPb zPM9v@RZv;oE7-Vtd}5;oc?Amekbl)qk8%tq&vi$xeMckGlemFLPSnMZsCYh2Nw2X^ck+FYZ!8VDVB)TT7A<8sT&~g`5mgHcD%IuvGOA*%)8zo6#qY3X`klP?))N0R&l9S&hL0Mz5sIz|jBZMnBC{vEA$IWX zyGS^+{*wc?dA%Z%qD5!zesgfxUHqUni__TDo&0;-)9x_oii@;tentGEX?_Rx|P-eAg!J)WFMVj^3& zFRILO@b$!!#`IU7Zl-$@^c34F{|0C)KWMmX4({NpR(4ODHZt31*pquLnjH+RKOw=n#JP69N0n%7=1x!&t zC`Gyn*>t6OrTN1?jq=4?#jhkHRn1FiLo0f3vgv*Wl$n4O&%b`eX2|=8Myt4I6_{s? zz91h97*0!Uk&ub(0nA(G_-(QZ<)F?8Ls7h8^=(?ks#t;L9 zSf2#4u&|tv*dP3ofjc|ira$oM>gsyTWKdu3w7;@BS=O{4@3QsC^;ZrW&RnRjvGE!L zv8&ajdD-Q~ey@NZ`deH8HLUli_<=O)PFm>ulz@Be{eb?+0}us^qI`S@vnu0xY>(Z( zSMbyI)G68)J_@fRq)4sHo<%w)6dsrvx{8lL><(|$$&s)O`vd;iMsj~NWG^#~HFr1WHhf2)W3xWqGp=oE=n{g;# zv4;;^RRg~3cSMRty`rQBiD#w3|MY#O!l;0Wq!S{G_a%@V^;NY?S6%DiX3Zygcw?r>OoJuI}e?X#0BS-FgEidk6 zQe>yiX}?ilJ+<5!0q#zsV!U7j)V)UdKVz&HTgPEOn%beZ2=EGorVxsZeEEXx*av09 zb}8>sAvz=ZDwCw;BS#-ao922|`~7TFVqUtm8&yZ(O{Ho48o}_kp*bQvJW3-6ASD5_ zKV>n&mOld=HfR^p%X8k9O|_G^qqx&T?~9BmS%=>;U8s*z8&Hqxaj=yu^ke5j0H1kNxhVI7 z=W^O{G0-aBy7h5+4oQ@_hU5H41BZ-wXUIZ}|89d75Sa}5I~&CZf($&cusJ<%f37;r zx;gX^?Gc7yiLJ-x@VtR((K#2ciV7N9<10u9Vc;gK#YA|@Iw#*V7ihuGe633O;4+{A z;_Lgs7=|>k{AAYs+r46$&JUA@>MnLoLPP>S~8L z4ZN^00XH{@aBu-|wOyUC*T^35nio2mo}LH(7Fyf*MX#b>IHIFk9L8}uz2X_wYA~~Z zD0k{dullAwHZI1Z5-DNDigbT1BO!?CL$56W&099;#WkDB-we{Mcxy{mZNMfR3W5p9 zSL+dG;jFJ`}&+C80s$5Q(=C$w@Z!qS8gn1b=gZgDq zt7G8l$;Bf{Xt8w=|Ln|Vw*_y}{X4WQ=!IzI)OKqo;&*?D!l%04(Wgd?Ebf4r>Hcg2s;mzWYOpyy!yn5UR(%s06Nc{fedT#Iz11KEuB*0B!6RL8jL``?^6o|H z0bF}-IH=6O#TPB1PzjMjH&ICrjDRAO+bzaN$t~kqnxupLE!sRlx!CBD?7`M_l?3P4 zg+9nDmnrk=w; zX@JHAj)(N8m~O1oN>tx!tB_Qp9peBUWBzv4Hjk4rD(VjmVjeYi)dSfR>XQXL0eF)8 zF)z$8KgPMs946k|EomG#Oh8Ne#G1if@K7<1+vlS~Ax=CHb8C z1~!eazIH;w1GyInRQ6Tyr1>7bJfAm3eN5Ew`r-__P=FgKESj`Ug_Xj`SYyl9vd@UTb2GXrY!pMZRk8E9BR zOOB|YR-yCgTq^eFfQ?F=o5ac-FVpor)L&Y)`)WJcH?-<;#EG`DD)yeA58<3MeP*1l z?x!wVnAf_Dj$)b}*Y};gKe^DMgC#90g`H@g8Ofh&K*5Nw=x4+z@rGF^PItG4wjA^r{sN;jx%f%4KE&M^WT&I+T2v{$TrdDkp1Zm16QQt zRGJtbobCap$9aUb?0HDS^J~Ph(7x@dElcyWuH#wEF$L z!lGC*v6P`}e1rpyMELkKey!49a8Wu9>Wmg`gJ9cNOr5$)M7Hu4d=h1%ZKpeLtl`wKaW++4a>LkRO5Lx;Y~B?;Ow(eFm} zz4L7e^V3hC?fO)&t2-I5=tRD==Q;GO`ik9t!afFtpiL|?d?KbfoOb< z*2oOUFt7BTVs2FBN%!hztkW+1+D-aq+$-eTlNMSdwag=dsz5V0!N`l^q4BI*7IxF=3jTPxXT{}> zVL6;|VFOKX_4x&n8>JaPib%8;fAa+3#eO_t%CHOZ&Pm=7q6j*DNl*dri-#OuI%=CO zMob6yE$PuP4VVp)V`aMU7dz`5hJK0yUCOw*na%v%(pW`uVT!_$id%Kkbk=7&ddV-Okm<8I9hIK!^}y05X2gia~od9T(+2nNiQeX|L7t6Dx>5p@O%_ zrJDDh(1Jze4ooxOaC48wDzbPm`;;U}c^Uo6B}>Ki$^FBc8S`jkUHI`uh=dCFWIGS> zS*UilNOb=rY1uvzK^tzkpDn-6MrDqNp1PiR_oBFe*GFjyG*O_H2=!a_P5 z=6#E)Ij5^cm%Lv~fhv^<0?T;|JbgqsqBLc1!Nl1y$h6wb*Yh0I5uoF?Va@5Y<@s-} zID}rYD(XJTjPl~oni>O)NnzOGZ#+#zVy{2u!R=!Ng*@SZz75nNOdMv)8g}D!B0o$} z!<$VI-OA2solYCq*G;<)!?pa0>(O%>f9#jEe4e2=A4R)6mJaD2pA?B1hD=w>`Sy&* zSh$xu+hYXwdOcR#-B$0TZg<=)G#2pdsb?ZsW@q@kVO7bSF}=OCs~Ds~Fo_pDoc&`a z&fHVX2k;^+cq0O;^gybx7(9Ny+pNr>P?;4%gh>K}N#ccwn18S0t4y|cF~`<}X)cua zHP&nWY#A@HH2W6u^MZLtTSOXvbRa~3nCq1k?(I>u{E`*^>hQcVBq6} zwRS>!?lV(ktky$P+zh7AyAr)-2PMvnu}6aDFCUzChd6wY=;Nu#Rk-o$=tq=@0P=j! z@_0}Pwo$X8*Tp`PYO_lq2I?ImB(Gp;_~=aJ_qB4iA`Wd|1!At?FO6`=T^yUVi(#|QT!A+_l!hZDU^hW3SD8k%v+;V|k_p9Qfc?Ezik*LZIi*RO z!QA5g?++6U%vkj&)9mN$XU(co&x{?qO2vMJLe40c-Frht%Ljk?=*F+0=&a$-PK{5ScDD$s83U~<~OcS zYECL_R#(hB&>r6AZ}D)8A2g4G2O#A$bX6OLmLBJm=4%=*S#v)U4C9?va1_<7XPi!I zf-zM#B#CUg77pHSXpnMWkYPp5k6o>uzP`R~L@ub7Wz{L`z(kh=K!ZRR{y7Jboz#X(aPkfBnX zT9p7!qAUAyhltBDACSbeJ(Mq2qOo7kDO<5!P&1n<--W)D{P+Q}>(ybNN5!~ryfh+y zMNqo?an9+!2=dl&gcN#s_T*)jvq4g`fQr+ei>MBG-yV6Ks}R2`!61Y8`n0$1WWk?0uliLX z&(m*&;|M(t(nz)5RtnPKDoZqz!_0$?{%Yd1ra(}erkdr6=~WiKs=xcmydS=754EX& zD7VXzRwi=ElZAYs9Xog^WM{{MPV8sE84hS;EPn0aX*f2V1Xf=IXPDIZC282ZHz>6O z&}8SSmZ8g51MlhqBX}mH7a99_btmvX+>&j*?ngzvyw?}mMLq9}(72NxGN@d}%wCZ3 zU|s>UNTC?u?g92al%Hj}ZmKnWszHyL9)y;Qs(}|Jw9#=BqMQk!pW)x=3z`UOycGCg5f^o%}GAs&>!!M6gG+^Y%K7lxeaZ&kProPsHjWGEj&=#BR4r@ln%A<>$1Y=8Oh+z{XM_89_)u$f_v|6nnTWuMGY>Z`LsyCK!YB$1hwlCSb zZ@bJkAtVFZkxy8hk@n?q0if$n&8rWLR>c9m6^`Bkgq*lGv??{Es-;Qaj*^Gz%jaNS z+3nh2Miigb`xhkDZw#cN@FXo3@ou3B^Ha3eP7I_UVC~yj(LO`4rvTjKAzl1{E5bN@ zCavO0e=#i;OUYS3O$sUd>$C$kO2lB`9I)x1=|7W8Qqc$G9N--dZ`en{uaHL}4H7J@ znuN=T1hXd(glGyhH^6*3K?V9o?hdaxpES%>xOw&|;v4&218zkAV4hK&!}-8yiZKHn zYnttY%H`R5oXzGTR;aPOwFnr>?DL zc8YIHqi`oag4(#K12Sjd`=37A1Q9!*5FmF!Gb*5jr~+64K)Alz9iwQnjWQ@TH4&VI zxkT*wOIjsvJ2Au!K?Yo<{8@z?lhGw?TX4-vO@77Gygyeb>}iXb`1@A0c;F(4Pz6A{ z|8$Ai*Q6ySps~c+N)ASaP+-;||oTrr_pa#EC;8&kZL9Qj^iy%RffNfuE{sGWgCV;}=>$>C5)EJXr zNdBJv5Gk%*xK^{>XIp^QlE3q01SweF&!5r`;;c}0s zW#$?#n*YlpzbIzDk16|9Mcp8{Dh4}u*gFQf4?>~0=DSZcBGkm{tm35C#ut2vyR@Qu9e)c3K4m z1&U=d!ev`nM4lcs=e0D)JuV`BZyr2O2fMMOK+yJR-YlSx*`0(lD8?m6ObAzLYZk#% z)&8CiDm(w&OLihSRk=tD0ojvp61rXNwgD7(#3p-T>A^lgRW^w87HRR!XkMRR*9X_j45wI@T^gxQqRrsY1rz?%(@|4%T zdV;|=$HIq0QrgC_Emd>_Pxs0(`|&I6*g;G-~Zqm@d+$e zT-aoR$K|@_B3yWQIAKFjmbw_PxrcD%eNt$tG6qW38(Hw=wy16jK$Q`90~Xco%o=`+ z@I(NxCKdf|q=k{<#Yco99g;^f+YCjpx~0;kz(j`m8-7L0htrwJ*SZ^euP6hxMp!La zn^H1bu==odtXA=6&^y1=dIv_OMJial_SrD|25K|UkNoPH!O{VnL+w`2gkepJ;okU; ziy_fxH;mvD-B^lHU?UMD{3yC7+UldIydXo7C$Gp9X_O1~dScnxMP9U{Si9&q%mw1A#Vq3J{$`28wx zmq>NeD(HNspV~F(AqJ}WNdql7GB0SBwq=U}<)?_w3b490Q_?k-58*=ssDLLJehTn(-mne#jEEt zMoDIb>~;_DU-8(rT#4(5vsxZ>z`d5rZm~2uRuRaF$Iypc4@Yl%`!Q~Tz9;dg9nKDOu?jzV>s3rJ-zA%3olT!X{~2z3@`Hbr{U(FKJo}%GO_7FYK8d`i?bvaTghu zXS=$pQw`=VO2o8maGExZ~$)_=7=^K^JQ(rj$*OSnO)Xt#fv#^FxDsT{FS zk=!VO!LYlpxe1wi1X|;O9iL~HMP}!fN!O)~{p+ojJ`WY}`62|(GN3wL^)yV~uhHnO zC?7O8T@Jbqnb?Vkx80Z0YskAQk^H_oWddmX1_~K>D1OF%Yv@_wp=cm>wP(xLKG~uF z-D&eR!zp>H%{di2n{0N+Rf`FC`M3P=JwB+lU%e1FxFn3z({gRw$#Yax%$^L53tHf= z(pw)<2u&PIIBKf_lU;SpPJgWsTbUZ{J~z1@O`OM?#6|N_=W%Z@EO7};?|n(-P`hu% zq`RU5_K5Vox_)WTY^rLH$r(Y)Pm%$`OEN;mu@O8Q@3*JQ;A_CE!>78J6>@#UbpU^g zdfoeCS8t<*2~O}qjsKT?4C5y^hX26FB>(1PzM@^#B(UUPnlnZDuDUo!NMxdcB&g%h zKCd3Ov+U#+J11nx6$Sgc*ssOUJ*X(nyzBkR9Qh(m1)h;y;J5-`e+m0F`T}F(LICy! zAN1!NrWVY5>l7sfE9RYt22g8-QBTB38AVMX^J)gx+!>!&8qHU>=Z{-AJuJ`nn zSPF_pD_{q8(aW$9w>JHqJS4VwulU^Z9AXS6l-`trJkpJWvAQ&}8KS>oN{eFPg^$;W zyuqg;!=~*J`hWxsQFynm)tk|ee@96@3WL>1fxT76T4Z-nRl1uqb{k8NAP&9%(Ic3& z13?&otU!9}U-(T6O6x!)!82<>BK+WnbQ9zQ*szZQI_jRFV39p**3B?rd{Lg+<@E{M zCrRhSTe4B#-wf67d>ccx_UvXgp1^8Q9uLQ=)WlIO4Xl-hd??TCW4&lO9Env!y?NMg zYA2FvTK*lzO+J8w=7XP^D?^YpQs+ryDK#ii$u0Y@eqka9E|dGH#xdP(W;C$*n(7Q9r-;+!G`|-9!tJK&ET5@iFzMTu-y2pQ9)Xh7vdzdGuGbU9bxWzr9!VUJZ@pm$To78YS&jlQxRbk*J9X^DC0rEyoP-dw zj9f)-72q2)B_@uwF88$SxQcN{Y=|#dL*E7P^bpiCf6nwRS-im=nDGBD1orYT8u4zT zT;>rFMt|rOn3oKTW$=z;a9^Lr<)!5-U#MsA zRdStNmDa4;QfbuLt;Gz^j{D9ZG)G#@{0c|%d77=sWV6Cq^`vcbf8z^yQu1z0{8u@GWr`Fq^NBAK&cgXd6v?g%(3ifAoMRm=#i$W3x@Y&Pzx-^AGi1h;+2taa{qU zH+bN0i{nx|C+uN>NAT`HY4H?N;CyXs6Pd*yew(JPnQTh^DCG*ax! zRcgBssl-W7hb|{5i~f>oL<<>BuZ~wQcOt)pV+DNNSnk$%{m`r55vLD7^&BG2x!|$wr@>XCE*C7b<<6m?-lIC;`}V@z`erI}KmNfZe-HccUZarT zQyD>Fpg`yYkk6#}nI3+WN02xDZ;`_d9+B%dW{6y02Fo5}g^^ z`?{j%Se$uWgr|(Q9<}JQfPXl!7V%b23jQBrxR?WbXGQtzdZ7Q*&|^){)#8KQ)k^$t ziVCNEat|*`tPEDctSyQXkom(%6SCYPdGsUFOBdc4xld=O5Y`LbcHGY`DaKpuW+M`L z%2!MTZLHiyjPp`%jJ;9shCl`hyT9m9S7(0m7!~{6Ne%vp**wAw13c=5*`9JT2SQHrIk zwH#dE^PWFTytV8NivLdoRWVuccBJd}$AQTV#j8<~o*c2Ofkk}lre9@bQSY+d8vzXu z`J)hgw^&wJQ9s^O$6V~ygD9PNR?>zFgdM3^;8v${( zXEVEekmV=Zr(;Z2>dL1lmGbG@Hp?wDp3A#J6=il?Zu*xQ+nstNHS9n9c^A0Lb<(1W zWdBl!6qsk^vUdHrM4cQGugopLP)9g{aFm%{=*`C=y68_g2!IC(wtg)UYVu6SL3E4{ zo5ijj_KWRaAzrJ^?msy`YD5U^5kMP24!+Ane+Q^$;!iJvZ;-hP6q#FMuLA>q6&D-w z?SV)8It4%Gxoh&K*?B{iF}kOi8ESP;6sy71BT?Erf58N5tgl`QSRTvU7C)z6+H9?@ zxRqR+_U(K&_kYkxM_i{jK2c*rR7p#?xP7!4HtlTHGU*b?d&*-_$5mRsCh!5r%=8ed z7`mE~h^U-pciJrNrpBv2s^xuUX)eel4twW_{}qgL@PWxeyq_h~6+GlMiDOs`t45t* z!}h;qFsN|bE0Wpd{{phA8 zE#G*ZCwuX#c4fDf@dT!Gz3yi!NT6ml)<0ehoKd8{Cv-u+ZGr#r!M}6De@5EqfO;cq z&JQY1)2i%j*p!=#CgjZ5Swd=y=$%R!=blM;L2Atk+^h?mZ=z$EX9K^0@rN>q=Pi!{ zbU5j4L#e#E?xUs&1uK1s#QsHG$$JCTm)ciap-b&NIeq(>U7jQG8Z zVstt2@qXvhoWaJiyeY5eI`jW%kp6p*;0a=7l9Gh*R?yY*hEFN023Cm`b+(FT+RzA; zp4jvpSM#FMZzX7ii)SnrNDRjmm3?~+9dB_bkHWBP!?7o89rW0cfqb9kECXb9_2SYy7*T==X zT~yEsT_`B#wj?B5LMTZjzh~a)eXI9-_3N+S^}DWj{&}9~ zp8MSAIp^HxKA-z@o$EY(?1hXi9t-a>&ZV2}>(&oarI?m;8+X#|U+3PB#$Q5Ap0A7UnW`#|sV8C^G4Tivu}*sj0K+AUQ&f=WfpbFKeNs#}mc|6p(L-12cTRZGZ9& zL^+Ueuvcf`hA{@;aAoctco02pzVhU`aC`qN=(nXk24az<6B3+4yYW}!S}H53+`;Ds zegooyn>YjxDujB$zfH$qt_$FjTbtmq7`EP$U&sEuu6n_u?Kic4V|AOcezfm%{W>=J zF$?+`s&~E_itOR;&iait+6zwF{$=QQ7SP#7CpIU;-#{AslW%jcy8R9eSbTNo?49fX z#Yg_B+1vF^!u-qr*ReF!RO$5G^IFrRzk&L=b8ptGn6D4sF9|JhuS~V~wDsQgp8aL; z0MQS4%F&Qm;coy-9;-^vVuAIZ{V|97CqCz_%;YT3iQgcZ!eEyBjU(54_W$R!SmohQ zpp8IDuD0$pDv992xT6pqp^5+;U|dmHBwArzh=8w24;%ns`XpC-ngf79fU+Y1?5K|$ z34j^niH;;28UQo$AkzMn=(-T>!9PxrZ9!!$76ZU^NMw5l8i2%L0hk8GnL;&kBiN9j zFinyt*@lFp5_|xdt}Bg1b)z^FXe59}^#Bd1lWFb-B&r6*#f{=ha-{)^08E?g461=w zhMp$LhGI(sl$D`tE%9caeu7|TVq&Vh@+HrnOYEE~;Xwd1D|i??-1^^}e>>q{PxyBh z{GZMOWmeW%TM2j4$qDkJ(L5Lo25;EVi+;EVbid=CRC0H($WhOUf=xfV)~;M9K| zBhxN=9X09|2%}diR6W@u4oJ?6_;LVG_v`RO48wH;3|K;gr93q^X!C8BIc|IO0W&U4 z+(wI!^K1~YhvOZuK~t@vrq*bGloQ8Hf&BY{)RktF!QSzEJ-zlbem&((2A_ijNR=GQj)G*GCriGx&pypYsyeEh$~5|MS4YR^BwUx6ySXQsJo@^f-O^l%(I+Be zPeT2np>y8)^!ZY*^Kij{BFaTAW=Rv56o=U90@3MdlkPDGkW(GpamHvx>7noPu{o(J zdb(Ovy2+sP)J<5G0Mmkm>80%@)rrTLN?kUpjtvxcM{!p zvf>d4%hbzM8nv z*aBCKEmbm0Rycbw*twQv%LO*t6(~AT4$dNLy-73x<;FSyFa-zb@UmWHmD6D%t3qz8 zDL-R^sv({+d!BW4W9kg_eF8ZggmK$w4mt5)lN%>j08SMeTB`?V9tb3}2hH;GXQ|z| zAdth8qTbEB&6M3oL(M>ukF`-F`~q*B>Zd1C*M)YUy^*P5pfvvnO{ARN;_T8DwkH63 z;|jB1@aANe4#K8qOm_o%i}#DN6Sti*KtGal0 z)rah??b^od+vYUYFBnTOZ{Fz?E1tuWr6I0fXDJ7|@o$)REY;jZ}6IDxmp+p8?CCL+~Vvw*)iVuHKR7<`0 zF!tbmRUcI!jjKmCU3cv?zL8v>W{R)U^gHMW!^NYL-X{&W6vXGpIwejfosz^S^dxyD zS;=KcTkZ5e_$Bvq8H-`9YOPUVcJc8{?V-{-r4U`M)T~6}Ibtd?oOt$?e50XcWn5s~ zy)F1W)rsP#l2><%sCQiTd0JL_sC3_R(sTHBoI=iWNBl(Nyx8lic@B~!$!v7jsOYH3 zXvw1^8|&cKi>M>QSEJ&iDxzZEqsQ*khv|KoBC_RbrA*?d-LAV&CyFQ9B{C<*+|WNp z>Ei23yWw&J-wAh=awItRIxcs~YCb;I+{9;ZZ35&<-7wi9W@=lV+l`8dHeXNon%QQHnX5``r6)h z<(&R}r2?DlCC2vIhfCVFTExkjDX85uzh~s7j@N@3!>o!7XEK!yGYT?tYH&4X{*N9! z0iIh&s$HtRo*9u@Lr5oN583>2BR0Q%ceZKv{w776yC);&l!wivio?@%<8-524jDb` z95`xSPA{c%IgL3;q4VV{nzM>un3&wu?!JPpKk)E$w$G(cdpMOMjU&?p`UR|Hr)7=y zPRfdz$e3&}b}4;Ryj1_ZA=Syk#;-ZlaoDD$Ew_K{PC?$@LC>0Lzx}Be#r*;mhb!m{ z+zaB%Qp*T7r7-WXD(;WZXr8+&g8jNSPre>1YnzK2W|KZ8eXB$F+F+VVn@roLwrox= z!CAr1y+YLXlS5^q)L1!NxhN}dx6ICCeTl=SlS_{e^+b<*Hn=qOKU3;mDO=vdqsJ4A zi)>D~7C$aR=d?VRRCFTtMA5ytkHi_rnQO}Xl*5&ymA6)VR_FV{76~gXE1paJ?|Wv) zmwJ}*5JkvMj@Qr}h&JRnn=&VoW6K5)NPR7HZAFk6?5UN6d8Yu2`ezN#kOLg@To(LG z?m}|1=$legK4r(e&v<)5_7b%;H5w{(Vjezyh>MIC&=c^|ZoxHbb>R+aozhCu(n~Uy zH7OaN)k!XkIJ5@PbvX$;sV2 zwux;Y#yXFPh&Vv+PY7LpWvJGfmlslg)LMz>Ix zUw4=VuXg99$8D>3fg^bd7ZS2%Pr0}Ih!RX_6S?}&uoS3RUPB1%Z%|ni{ zjVVQ5zg=~($Pw3d?M=>`K#`c#v8p$x?oFpXZ|>`<8FcaQV2);OWK-V3CtB(M@S}lK zftpJr;lkHU3@1Wa9YT+^-Llg*Ts zmmf4vZOxxBKxN-wgedOB&b?}06q`xsI?(GA;df&~dL?7w?i14p)6DJ{-Qjn0FyvGE zrv@hiI?}ecZQrYMY4!Ac)Iv&X$s>C`dTbm2J2Ng-6K*9d z7l#YZS8wneU$R(+4J?%VjhwQ7JKaSs^+Jz^jOnN&e_L=mTACN6F(K<>o?Hz=zFwFwcp?haP+88 zQT@KR<{M{Qqmnv?LuzEc-2Ir?o}Y2XYq`pv*wQfT)IOP_a&X{!HFl|c!DZa`^+<;o zc_#N-#6W(v%0l2u=CaLvbL_+vei5IT5v}5Nn&b03Zz&hMvB8hQ@0b4puQFgL1Fs@6 zh;MimyCyROvv~~-b%Hy|7C=D3X9n-FtWAF)I2?PU>EpP{5he)<$f;z<;Fk?^- z4B7ys3oICXfd`oSBLJ8l+14E}1J>*@vi>#V0)bwu_b;0o1RBAaVh_N+8ehZA$4OLo zGQ|~uA>`11FE77Ve%B#_4S+WSi~$5(4l5@Q7G+)3#Q(J=q(i7e^nQwJs*2`$_ zL&6b?a1;WA0KeM@N1MXo;J5sw|I+;1%NbB9wjMShe}Q0B2~sE;AOS-IUrCdJ;Smg* zpzsjI_V3SsHPo9*vV+0_gaQ=)?FV4wd?!Pr z;c&3qzLS9uNU(Q*kRjy3@%TZ8RQOpBg#l@y@AObuML5``?__8c_NR9N^^gib>LHMf zl<51i2qfyqdO>^WpUR@)ia*N`@;})_BjKQDtk*%K63EUZDwN?xMr2=bJQM)f5efx# zK8AyV1EcF|M*%(Y>%AuEiwESfwkQQ#3<*oHC1Eib8+m!6jRF>7hd`l-3N|Q=GW6Ff afW=n^3v{(V2N;b;A>mL-NiDoK^nU;uoeD+( literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/ctlsouris-delim.pdf b/docs/user_manual/figs/ctlsouris-delim.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bd97cc0727c09f8c302e93bd28264fcf12c0fd11 GIT binary patch literal 12868 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 WQRwOMeNdu@9eO^ovE5OXCHx=sS|@)1 literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/ctlsouris-model.pdf b/docs/user_manual/figs/ctlsouris-model.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5d06ac1ba7b77ea3bca70f09a918b83692b873d0 GIT binary patch literal 16009 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 literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/ctlsouris-top.pdf b/docs/user_manual/figs/ctlsouris-top.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c627a8cd1b182489280a6834c446c43b5a610e85 GIT binary patch literal 15727 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 S1_rUSv2i0%Qi>}|ApAcDQ}WON literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/gensig-chrono.pdf b/docs/user_manual/figs/gensig-chrono.pdf new file mode 100644 index 0000000000000000000000000000000000000000..61c9d5bea83d7d64ce1db4420cef69b26997bec1 GIT binary patch literal 76207 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 literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/gui/make-dot.pdf b/docs/user_manual/figs/gui/make-dot.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bacbbfb1af59c1debad6cd8b4ab295ad63092698 GIT binary patch literal 82817 zcmb5UcRbtO8#i8R)!t%MV$UL|E%sKkR;iJgrS`1Us7;7btJJ2bt@fTlqo`IXwMSc< z(%4UW-}iSs-{<$w@1K0~`iyhVwcgkJy3XM;P*uMN77`=o8r(SA*nV?dFgZ9(EDjO@ zc|e~K%gKR+bsgNDe4Rn}vA2vs!s;$=z7F2ltDBv#gQ^3}!`=Y|fe`!ndOO%XB@V<9 zcu4e+_u(Xk<~?n_d%S!P(1yHYc*I$ZOniV_g>h|Bd3;&vxo->hvt7%VQz<@C5#6ej zCATJaaJT*ylc=KQdtjc;H~~VyEm82(lEx-jD!`g2W}Igzi5k#!B(eOn<)o zm-GhS9x!7EUyvnsI#qR$u+~%Tq{{zXRsOkZfgXc|&Gn&A9ALhnKRVNT3I<93H6H}> zM?L=x{O8uc2L4B_Qh&WA{I@{=8ba9E59<4uh<{B75;k+O$C^M2ECCYMbZ~KU_613Z zNnxkKistR<@y8UzzTSRVWvF<#d3YOp+QA$^(tnR^{J_q~6$JhxELM7D7hfL(2X7UR zr=A|}f7FH@<^RK^f0XfWlkRjmCEp#&*q8NMQ}1lGS-d)OAMEnk0({8L9@$bEF z0w(q8>FI6W8$F_C*RBqxetmHX_}6QGWbt9_1w_2K|6GP%gt6JGW<33{Rq!>QP9Q|u zcDd|n@a|hCGdx-xHAO0ezb~5iaL;0hd-Cs-{KUth;cj+&kF)yuZD?!Av5-yt`$_Sd z|BQ$oI2nR>x(SR5lYZ&;K77NHTycU$w0R?p^?#<0zV(uniGVR8{p9;0K9&4`&u4%a z&ls+iR;D~mw8QxR+cN`-|EvYOq;RPE@~^hH{ixV=ciEDd{}w1-5zJwGTu(Po{-f~! zT9g5rXcq3aaXRqq-@^a39$GP637}=uTI~NW4-qzwGTpjM7IaDPM8u~`L-%iefI6tm zTOEI!*-UJI4K;c~Vb5++@IHzEMMwBiy{)de+P}1BfJd!ZFfo~(V7fb-7b@38D4HU8 zZm&VtH~SUtHvZv7vWDjG*$0x5owP==-2DGCNxY&zN0_DCb~j8%Vo!fJT$hu?cg|4F zQ?l-C_Uq#)He_VAN}UZauz(t$?{0mq6D1{>$RnCrl7BS z;$7rl4?eS*ATxF`WV<$cW$_>BMCov11n)| z^lSx=45+jSwcF)0bMB2AJRG68$1iaOjS`q!v6b)ff5KL;o#0aVR^XA<@qY}d_(QSa zB8)GHP_JgzU+OPK{{nf_iImE&+%_BFqqiD5x<`10VvAdM_hKgkzl#Z^$i(@|cWqSG zDhxHF()DwLG<)sGCC5~#vGXi=ejsC5SpIu%0g2s4WzL+|xX7CNa=h{4|M*nttv}Ms zHF?jkd}5WQ$Ww0cyuAVwXt{eQNOc3orjyb-T?#LYe;uQ@;Vzrok=|pue(k>T`+)fO z_rneICuc)IIjWg;nBPyYG*WujgB&CE8ca zBxf088R(8+@8ieMtGu};zMIrsx8h%D9ah_#GI#q;Uspf>d7)?d0hE&yI^6oioz;k* z)Pwu|Yxm7bCi-f_|JKzV(5Sq%p~iMKxJtLeYN`C*I)kEoB_o7$dS2?s9@KjxhBje2$NEun zZtZ@U$-=wtvn|5;Yr}~-EM~RVO~Q>Dp`G}z1hVQLYmCU#DY|iuEFCd8{Yjm)aXK^gL9G&k1+a z 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/gui/make-sim.pdf b/docs/user_manual/figs/gui/make-sim.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d5d47af2c852e3f17cba491e8560269b8b2a4e95 GIT binary patch literal 46808 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%0Dxm@h4y*5hgEh0J9BK7{o{RjamJ!5;*BU@M7+h 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 I*GLccKVm@_6aWAK literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/gui/open-file.pdf b/docs/user_manual/figs/gui/open-file.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4bffeac21c1ee1c8ba07b0e09f0f45e8cd568c15 GIT binary patch literal 60763 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

27t< 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 F{T~4+#S#Dj literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/shvar-chrono.pdf b/docs/user_manual/figs/shvar-chrono.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b2dc321eaa959db4f4f9a0f4696d8a2dd1c47c32 GIT binary patch literal 60541 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 e{ z75l*1X*d+skmFPij_*q>It|K5ec);smGdy&ovKq)xZH5AmNJj%gCnyQlt5uqu^Lf! zZD-gIEzptCK};;teiW2*G`Y_g49Rcd?AoyRsT$5%osC{UPls%Zb{~zl(~lXyHEUsf zAP#aGvN`7JT<~V^~a!y6&_X!DznGOZ8#@ zSwhCX-TUANNFYt^KSS!5zCG>PyVv6n%#uC{8B!eA=v{~N&K9)taq!UxRC6jC=+U*= zpto+f-i+9z?BW)95l>Ear#Wdk3IA;W*zPklV>^ukp2|bUfX>NiV!ZBY-Sy_;`aFYB&Rc?0ApGfy#KFjS3 zm75{4txpW%uh@SGh5|cN$gSqFM{K0BmNKq0Z)BuvJCyAEU4_{F?R#!QG8Nkc$80we zaF+Ssftz_WH8UHTNc?3m>{|OsAaG#)xfOE>kPgd&*DjHHk40zJ4uIKM15}Lxe+SXN z7YGXCfn?H->elFyb6XO@AU`Cg5TSQy+*mr|&Ztiu9_-F+C^Wa^kpI9F13rDMY_oyt zcb`vF_f7-uASbr+`rX<3OI~xtYYv>505c%AQhbnWNLayfD3v36OUasKOb zYCF1Wrp}-p>&(@+g8Ik5lvmA#FBDvTN@uJ?^ehDzv_@Ed!c7{ftY0UB!=A0?43u%% z5vqOQ&Jh_GBFM;`C~TV=tDb>EZaLz2Er=OeWn{ZIjP>6iI|9W}oJzx==j(Z)QAbc+ z5-6XxBf?Ni?1C&4q@>j<(1LHDr4HbNG2&ZANO8tP^Qk2Pa>K<3t|fna;-Km$*x7(5 zL<|)c`Kw~R=k(Eb8mN+eQJGcTv?=-xd|i#Nbc8_t-pbg<&KYqcG$3{-*r7D`uXlfi zGvjIOgRkBDA^C?AX~9QP2pph9qi2^McENV=Jl+}@r;=SuG`Do@lam?wV(%qow2M=- zXdZh;pSU|t2Y+~4-0Ci2lBEIon@60H#83`QGr(@-=Uwib)%-cip&+Gy2q=pGVUYX} z=j{V^;d1W1`DZB=+Wp?=Oy`XD5_Wl(hl$VI1r|%})5y>%;X1M>ypOdyTswJ}I%7{e z5^jRo7)zXxqb!5^j(;~eTh-2DhV#fMM6fP4dOm8@>%r|!hcm>g#4YGxTZ`iL$=MfarV()vl-8aY*s39gpwEV7nTN2Bvy zhKS6f$}BuBC?oP+2V(^0QV9j3CQ(rUXwSiGwsXRsbB(6VCyD>qvRT;}knHtiqSNpi z>9m;skR-?ElU=){w8wZvjj$x~;L!f_1RT4D#XkSFtkPyw z-n*_T<*nkQK7qrNMmkl*|4W^6hds1D67WK~~7;)i#j8 zXG6xj-)E7hxfDR;!TC-+=6(9Ao3bw|6Sqw8=GSfUZ+~y}9m2&*Nct6G{;)h1Jusu4FV>Whi%Wh)mhs2kJoI5p00W`g}r?694M0Ca;5#R>!a$LoiY(!&?!eo>8FrRhotHe?nRlV;NSfO7rML-67s zuPUx%JMfUF9b85LdpHNzp^zmp_qyAw1*BewS*pB9 z@bzQ#1kaZa`n06VDjwU77T4`jCh8)q+y{nZ-I-NNO@ zw{n*zU_LpU4aR%KvhDu{ww%(s$w+WQ+Sye#?~Hdi({dmWUk@m&sJu?W(*Nz6KW~c7C73 zucTd7==uHR{C_w-g`a61+X#3L00&Qj`H;BX62bUH)+8uZp8hsr1+2A!`f}9mv^zsG zkp}}rP9yLkh64h`m&WB(kX`Kl1}Phn<~EAaINZ|d&$J*t&!SM>&Hw#fmAae+S>F-n zy_UZFYu^m$OU&LK2JX;3LE@I$7zY^#d_CaOR8myDygC02$e`sFwP$|rabOJQP|CIw zywBQ3og`d4xo`VeF|ql;L)dt&j8?8W#`C|iwff?=$F22y40t-7jg=ifdoA-aH3VKoy{i>GG_nR;!dL$IfrI{C?En;<(pLjA>Q{ zMQBOvDZOpBtwsSi^eHfQ^3PnXZleSpqW4Y)uaZ)6p@_ZELT~LftSIZ56g?-;**XC< zGh4ds56R`42*$%3>VZ#9UXMZ+{m~)#ONMF1X==@Wrb9CD)(6*+&wPJ zFa;h)hhpL~1XZG=jZ2ZAQGxMBg$BPCu*y6Us~?C@6Vfe+m1NIv6Jv9Dd1Ll6u!*aG zdRPp^yBcEa8iO_f$C7>lOv|Iuv>P#auVxE5L(NM*{{GDi(X{?Ax4VgPwCL%BKH%US zR$0d9p9)v?m#vTyL9%5^G;MpHMKc>)aEm255%vTH6#hLO>& znS@K05k(v-0SjOUlZKZ{kDUXDg=F#F@d^5r3ORvT_j79hikLfV&#|e^7aXVN0TfW! zc<5C70`3ZUsC2HX5Rr-)WLV?nzGMh)e+#fiuY0|33o5zyYu(FHD4RvnM*YWHF>qMf zN%?_cCt&GvYhoLuMwHWe_$g5K?= z`$u<>f9GEK;u!i_NAe#pWW<(0nB3+m@XEv*(Oc%Yo|dEERJHs9F#lZ8S?ttJgHPFp z;fw}T)i!&h*sn7rn6t6lMt*j9r#(MVbW7|?4!Bm!wtru%q~Jm63(8#|)y&aT_FmlA zBA&x2^+II6N`VLMEdV|Ydr|+;dcMwkv=!eG&+z4S)xFz-lX}lT89D`cgaqfz7G|8& zFG&aRq|j-Rv-WtQjuXjtPd_oma5fyfj-(y1n9Bb4d&ET#aK1f^SAZ1J{_lHNcBE{OG*q(;3E+pQCa&+<#lg6ow(@e5lFX7 z-E+O4P;qU&SN5sFxEARb>(P(*L0#W2`N?bNaQ-BLmTF^~&usdmFB@R_aIYg^P%Uho z2kT};fe*> zfjH&X4O4GjV7_#?zYSPy!gJ(&0DOtA`!QK{<5siCIF-2lQkkFzV@_?TxBD%4Vi`9( z>0K3j*_%k!4{)-{*eII6N>n!d6u=+>m@f`n3CYyEz!4txjXUtLQ?5_%e4BgrNtxU7 z$mb~gRlcZ7R~Sp9C}GxsEaAko5*P5};{#B*HXede2nR)6qsq(shFPS+9Qj#fcUdd^ z#h9)Z{xI$VzjeHW$qefP8M2?d6BEZFJ20WS>5&3x4qI;KAu%;!3CpbGQ2^ zmrp_6ytJlG@1gE!)1`IfwbIIQwVowpV7Q{SX}Z<*uoz|EBjV#006GB5QA%$^#!c*v zW3&^}*1&{SYTlPG`4dinSvj+yV6xqx{4v=AJ+c|*LmIDUztEkj{REhZE*AeN?i}$z zfaxOSe$nn-dXN#hB-haL&OgU~O^xlvS+Caffj{Vrcb7lLo`QG|=QjZ`@jikfJ$*3GZoiAwAO_(A19b;St|~yyHer?KoMGe<_=V!t5gi6SoNMTC_k01I zYrZv4Qx{=XvOheOXXjCHrvQQ(#(PJ_Rf8jV*FHs0L5np(k6M=>9>o?!LxO-iD)L8|o zy?bW)Od#kWAekfC6&4D*tD#0psJ`=t-wgT!2BdEz`{?JcS+TNx6S)267l;K( zA7C2k-CDudarzmuIVtM@u1z6xk~KtNF*mFD33}khdXr_jg zPiag#*%rF8H{sPZH(A(dGzS!tE;isFGPQi6zSVEnH8NQX{Rn0o6~@0`rv9bK-O%*K zS?soHF-SdhWyL?8SvuZ|vmS+lCAZ|>W$3z=YoOp*Ei0{7hioaJdvn}0ac+V#?vd(v zWDI0VL%z?0yq#6A7qUje;myT}w$@S@Y%;=nayc??SGEIfXrsWGrD*90cJ4 zCu?KUk0cI=b@#@2E~CZfpPS*|CT*GLE~oPW7A84p(w<47gL$58JaPhN6jVtTyB4nUhAohO6*GRU?IOf}Qg8t2LCJ0c zCgj;z{IWPhl4rp7PkQO358pT`Vm~o?Wm>O&hPL!&4^Oz1$fF7m&nkV5&=EDkmg$@p zZoS1MaPfgOlb-D38?SF;Z(cf^LF`RK2>Of!bG{D1NTN#KH68~Kn&+(1ge!IPaWm4N zRnlpRuov|X6gAE5x8&nj1@o&D;)KseaB2&qBYD4)c1t9)$sB3kxyu8*Ro?vCqELzrH=RlsO4)KLbM;r zE9W^oEA)mN0?E41H^f(s^78sjZVgue0~kb(V9%p*OK*Txclu#L)5OnpF%$yy?d+jX zA^L#d?@>IHKnuCOxu-%oKrV8(cgEIQpfo=4x9|m6P~wBrZ$;&C-?r%EORiT^WW=fU z($7*g6z8}rlE_i5;#4vR>q>GyrU9$Kqo zixH>W;|!C-G_l<9#6RFR#z#w~*NqfIe)5(GZED@pe$#%JuED|-s)_xB%dG!o$5oS+ zXi!c~&DIuUpcCh6c<^e9Uf~I7%cEpU>}4v^8NN16yaj;KKz$luwWES112enI(#?ky6+kOQxFdRlAe)s(4}^ko0VgUL$aSY)PN;K_safa zyu7ORCt%$pqsvot(cJ&BT9$iJlpEZDM$`Z91^~O>pXhnP+6qm$CQsV(<5M|^n#0jE z?dOrJNBXtYr3bxmDMeQu-qjX@K=n21c+^AXRZ1!2={axEv!>UYD1p-du9=~EL+gH< zoI7akF=T#v#OQ8qOHxmIIr^$<8NC3^qY(_s+iGj~<6dlUG^Q~!662A&gmF&WX81wI z+hTkbFg5vA8nF-LKbbcTo2KeR1Qhe(-&GnZG{C@t{n|Kd4=*hmlkI)8t6SZ;Kzga_ zB}_mRfxFwAwjZj_X_HbW;FLlQH*oK$a0YEG->Bp6X%UG(UBwE(OTM5}WfpQ2h*cup3b z=X2fS(|=z*{sG{9gtfpBzGy1I*etqE{#`U|kB_^!e4)i-DEFjPC8mV!&>ga(9i_cP zN*}T18{HafLZ9qE{UDL-Bjv6Tt6hyFx0671HhmHs6wO2S5|tpsv3IBJI_gL_Mm9g) z0=-{HEZFdKBCR6fc42mu9R#w%SZ*tCiB$z~CLTM>DCyZ~wxp$1>8rcu@zy z09vEPamP4-n@PdOHr z@%lDO96s%3+&&`%0+mQmtabO{kOu2rXgc7Jg=V4}t3`^gr`3VGJ;pqN45INA33nC* zN6}TuH=_=qKX=dsj2S4$RbOiRA?!}(X6b2^y1k5@()vowdAitKjAdE~5HzLEkM&2L z5HTst){AIFN4K$|WMh4scHD=hkA6+Py1LIX1NooeqPl>TM^R*0d3I$KxiR-taR6#}`QT%EZ% znts8Tw~_a-Te%s_p&zos=Gb=J6OaT7ygphugKmeRiw$q$_!(n6+o{f9)tmX+%Z zRH9ibg_#E>8CZz(zwenG1jQfBn!)lIE~)qIQ&q-sW?`hGGnl|^sK?wwT^~*t$GuWt zbbbdoH%^pe=x85SDCZ@5vmS4DFO`b8I!;nz7g}HYr?i`kx1FS9Z*o8VRw^a^Nl)s< zPqoLBn6I~9F|($4-;s+aLSbaH+`5{{?o$k3iU@5J<-`g2xooerfUIx~*ZV`59NqMw zOb`U)UBCVW6e!m*>y2LeId}2o4EIJ4c)3+o={9W~aBjZz3Qo)CyuulLIT*N!K!bwu zhZ=aar^q!0F-NmNJ1=$b|>(>BrBfjmFeXM=E&-( zJ}OGi2p`vQ4;b2xHAZTo|3}wtzFyinhHh(c8(2GShVZp^8J$=+hnWs1z=fAyIiqe+wi-jZ+K2J@=l*B zd-|ITI@o$MJm3~yhcHWpKMjIReMU)h?47WlbVa3&)YX|9E2^idONt%Kbf57f&ii7C zT`IRxQquCF_S5G4`h~58`ooI3B_%_0_Njk)j*COz4z=$5tsd|QzCPXaaSC3L0 zuCnJV_kp^pPml%oHnv}(UPrKe9r+&@f52IhohWOVfwcHOy0$&a9kiNPEMb)0Cuo-W zWA0TyLSKgcXa!P4x=Qs7iUYDkYr{^ko=k{hH^MO5>UBBNPF<4rf1gA`tf_A%WAY&Q{cOmY3M}0DpVh;t@saG{-%2c)^dFF>iASVbYwYb8=Wykbm`ii>5 zT#mIR>%X<7HLhTy!w>Y)0y(ZY8#Lz0zQm|&HVlaJ@6nY+Vr+GrrSIT|jZ|K6%DE@} zNPTW-%l(M967O$nrKV8ZpMbb|?%$t&NpmOa!v_=>RzTm%Z;nRaDs4GS5??ZBFZSH( z^!Pp*H>TB9E+0U{gIUDM_C*?=vx7UrfZpwb zJpnDpPTx=PP!t*xQVmJhAmgv4UZG}2anM`za$JtKv*3=iqZUWta3oC7?*Z_X=)8g& zQq? zr)OB$Qty`NE{f`ssc%#hXgQJjIZQb&uYTq3;1f^?DX49_xEWUbBS2ORXKQc`0C)GR z>S3%0Q*QWBad7kY!(XeNG!Br#mgRZgrg*bER-5c6Hy**QHfMtd0#8go=Uc--Vn}*h zk>wI2ZXKnZ{*Bn49vI~X0bT7*O=FK%R&a&>SeCe~8fqk0MYBH{<@XL0E=M-U{2s6 z019pjHJg;0s|ABT1vN*4#D3iS4#prTt6;?m?dH~#eV|m6JdX75UW%@tJoMV-c*154 zd08a|rvLt|Nx>L`v^o&N+ER#H-{**}X0&8M6`lm&DFcTZYn>oX6RD8ZN~SKMgd{K_ zZn*{!Cu~XGbv=cMV; zg=+9CTZr=4s5UJ72^Uh-Q{9#CA0GXZN&J++z;*u-H;27PPr-jkxuuh}e;S(DE3uNL zkPe`yshtfYd?+ffejp$0tS_=gvhI(+N=dI8P#Jw49NQ=GpiB=-I}6~K!X#KqJ~y}j{$b)52RBp|FII|g|=u4 zHm4A{zKUJl!i%`Mbd%|q$Uxk@IK$96yRqodwuFJyqk|AxE&tq<+ABX%FxHB-FZS`j+=7p5C3y znG*J7grv?}wm-Y{hu}LE7QrKw0N||&sP^FBT?yHkW$7?fGSh8hxXj)r?)(M+TUCSS zV0YpuTNkKnsbj?YM6H{7y`Y+3=6xxB5N_yI{L>8;&;|4be4TMzVK0D$^!XNp+2u7^ zWM^TXYlESIJ_AeMx$$UhYbPrv#={_ivX@WATB}IwlGazvbLb^}Bj)g0O}4TC498xi z%dk3XH(;)=OXgsN?tTSD7#r9nr*P9!N^}c!HTOJZ?bTi9jiKcb5`-BJKIaVK>`!Fl zh;yj;=6RE+_MX<(;sBc~T+$}sWb~TWVxl(G(0FCwJP*vY7r;3yy&B|~3N^|4V!cRJ zGgY3M8;-acv5DWUwcydD^yS*Ct%!qE>-MVC3NR@Pnp8{Uo9?3ko3keHAyTBxCXG)Z zPDiF{f1!!t2)NX?J3?>ac?ag%#ZZ6sKgetAKlb(Uk^LDcZ|&(NHsyt3rsoK753N`@ zZF;SZIjfBOrBbir>|(p;1AV(+7IXp710y^F65eIpr3ZLx&yaa;-CxwU-VHsswlN;R zYyDXT2}8AGI@?F?r&IZj7@sqU;FC7lC^!V`M7PM-0CcOF+Tf3KiN9_Ht&&}rEt+sk zo)@qdXanBLVcN;L2n%r({LzSNhPKb*1JTH$0F;ToohE0SHd#Z%v>$pEO9#8+8W7D- z*AF|ZH~4Du$n7L9g^HCHxL7YMxTgf47q}^9>U3M$i6iKC^1n!$>!C<1_J5Hyd&RVS z;n)Q<#4aE0jd@wRP?wEQNLJStcqr`m$Zb7R%0-EfazcjZOR0py~j00{**J58$F2P>QUejt=w5??1euldx z*SQ3>f34EUo1B_{7){U&4LjFm!NWnTFK0+TT@<5BnMqqJn8kRP9l8f{9Jhe>9cGxG zU9#@de!H-ER=T-kaQ|gXeW5lND3sv`CDomsb;l2IyuZ%&(&=z9!I6KcnhP}X+R;3$ zD(cpJEsPoKnoLgAMoB%3O8MNRR4=??nPQ@PNp2*}5<2A%R>Jp{c~1U_?l~qQ8DbYN zzaJ3fb)9BF7$ihgt(;z!zUjiH9Fegy!K=q7z8{SgCy+>n2V$@mb|XA@|BbZ?>v$^N zba&zkLNDzTAR^w4IH#7>)e^c{#$CVN_uE$X=IPZ@E|YRa%xJ=G@!*_>{5OS+LN^)eBPOC!LFTRgF0qG)vlYERSj;nL4ct3si5)FBGm@t7%7tT`rqlWZ_112kQ?GzEK_l4$3Fz zt-kQeyZ>}k_RBxp;Lr2&7)z0>iN!>xIYv=Om9}a94cxSZQmhPM{~>OAE_Ek*Y}PF2 z1k^W*{PJy?YW6?FayoYZ%G8kZP}R@efG>m0oAv*1x9R_pVKMK-u?=SD= zg#*zO>`%YfZsghq2qT$Ehkq6m%q&Xh0ASBA2>|v8duv1)gxfx1Dt%NJ+?s4Y0)SrLMQ^%Y=kvyRnUPh&@gf|a2PCeSVA_EBj z-4*Y@{Gk~>fj&Z#t2gxd;bh`KR1!jj>-{^k^S^yNxO}h-Ytej=%k?*J$*5k{9b2aw zyqf<&I?cJUf(?4G&GKUtm0_18{@ar4+hu>`ZAm$|Sr6NtJwtX_dB>s)loHJOo_WOTab||7ZlA?&m#|Cy?-@UdfYySN)+{5@ zzD@h%vK<21U}C>SbbyLd4SnXey*_kLQ3K6x*B4hD6B7RLA zm9KykzCdA8TWsGM;AH3_;L3K z=d;8;h->9GWZ6vccC8Tja8^Z&Iw7)4WVEF)BH^w}}?=bv> zJOx+VW6Y>F93XfTnV&v(89dHe()|8UNUC0qlz^oA_f1>^_U6Wm2>^EPei4l|d=6l^ z#|4}vfm3n*R*ZuGT)c8bXRM@<(|tjGNB)lz+_FnV3H^^9xHSV}b-WpY+-e{50@9u4 zv6)4OPjSXB0z4~)z(vlu1%&{Y0y%a%Mw@#M3@ArrOIZX$eYW{cc27r@-yKyJv=6XH=$}Yvc@}Jntp9plF z`EH0cdKYohsL=gl0kd(Ei7v2Zx8%KOtRCG0Bl059ZPGYo&8V1?l=MG9=s$k)&`lzu zc`>I4lw|UJElRUM++}J9#lOKTgb?qqPA~>416=bKMAtl#tonaf$p2j-|96G_Pglr( z2N41$O^Lb4@|C^TzWb_Ug* zC7u*cQ`O`p$RJ1yI%B5gB_;1N1TuB9n(M=4G52mA;_@bVQQ3FZeKQA4xVvgO5Y-5x%QzEbscBB z*a;I31g&hA!R4zbo2zeYlDVpByp|z%bxI)9y_1=EAhN%Lz>rY6dL-<|KFdWW)bly> z_im^0+@2BdOXb*$ohmVmnCUn?S4m#P?_zeJy@uRuIx<^i0XElzpdE8v;x{8Bk?&*f zHi@%?yUyj}y#;uXWJ-_tUS%(M$T9gK;4L&O#pFerya^a-JLe>!sNTGEnf`vP;cd02 z@+Q6fAsFszw`V@GT8te(&?f4YQa1>+Qxc3d@fV`s(*%_=)@WUQ5+}2@8;@K~y-cfH zquU&lXSU?X+s-!8<+Efw^EOJ|U#J%*6egI!9lTQ%e|fvn(FoSop|Xt#^e4B_L5e!3 z57DJYA-i!^6osv9`=lc2?YCjITB?jszfSG7R~2TEv{EpoL&;k`3GAZ@*(nJNY8;5D zmMH4}75t}zUVREahMjl%GyG1R=>nXuGJV{mvPX1SsY&l_IY4VjKHuwgMN9Z8ovBHj~CM;G=q9Kf^qtoU{E@ipfPiA-GE+zD*Z$t_dN5J9-YNGPNneN z*cYiQvLa^JjC=)8iM|oOoX#_dkj^-?E=G-z%5#(zl1zP%KfmBPQp&uE3)lQSB3Ft1 zOu{)2|AAR{9;st?zaB3yR3;}UczRVKhZK1?1#_~Do8`W*Wz!?p(-$Ppi>s!rNS1#~ zyTz5Hc=gF!LHOZ=-!*Xlg$@-ReJ?i^h#y5L*NbSU)=G?5_4(FLj%w8kcD1t$nBSze zGbY^MScQ{C$%c{xtUZO^Ww47*8KgSha!PyinqTr+^r2&8KK9bnuvA?_&g}vBj!1IS zOu?m@RIk~&88s5k!xlz4l9y>&zb^4{ymFf#J593XjpX7|Kh;g4OcF3b;s4vpEti6p zgykwpW&Vw8onp}wDbBf2B3`L4-6kjQ?v2AF&6#qiD zuE^32GS;=(5oB0Xg(wCkKTOx-_N3bs)EtzXVPB#_%Qabrf`0wBJ%!C>Vmo$}RmYfZcxqMS2z0aMl z_T&u3W*2#o>Q(8hELS-XPzUPIQVyf%%?iz*h)*FH&Zxwm?Yob#d}>K=$syJtmX~D~ zv=c-bv=>Aglo%xNOgKn5h-zi1@6FB6H#rL=tV|yHPXtKZQ;mNf_dNc*S(DL53H^w* z_o@QJdDw}(r-Y}mHYP80!;QmbWMnQ0eUac5m&tMwYSBANI6QaYwR4Zfnxz5}!BQ%2 z$YLY8ZlzMSrMY-2&s4cMe4P2?v#*n1&-~E)Vf8~)FRtjZfI&u8qj`;SjsEuSB~Ib8 zn~#_reBvyzmWgA5_wSx*>bLfg_i*v3+=0B8dvDdh(f>;Vb}Lb0QNmuL+?xKOqt!>7 z`ww#-{V3l#m;Gqdrs?62Xsj%ry&1;iCho?t%v5ZZQsG(IZE@CC(nhUhs%Yv#W!dIK zo(K6=&ZReOnsms)TAkJBJvab@+k zBMJv-7LwesY0D}*A_xLO6G=iSNhE{-2?1*nL{K{@C<4Z=5^o-^~F`{6zR`#jHmpZ{~e{LVd>maD`KR9=sK_`p`|7+uJ^!5Vut zC80?sd!F>Di#JWsx@&&zDJZ@sFXR`A_P@mc)sO8UJIFw5+ZUg z@sg{PzfbmQ!Y7+2uX7r8Dsgg4*VMB`3UtcS52S;-pzdP!_Df0GZ5Fpsabd0)QnnzQ zj;$jub+t*&1|q5s6&?~+Wm!I~yQHIs}hKvkQ}HzfNlR1@?iP+;{Et3;>57 zCCS;I>})nyX6WIYx7{YP<+r6&xvWqYw?JBm(I3}bqp5E2N`JsA&>E&Mv>u2d;!awc z$Aq(%MrD7PMHaEAB9W0UOp_QY>4yEWQ+bU|2ihMTNh zvpD54dj4MF#J(uF=qv!JE+ySjQ^?B3TA7=a&=M->7qVAE+KkIsL>D)HH83#_sZ!|I98HV?^ zc0SiM?8{s_fj=>}9z1EB{S=G(^Cb?qR=6D7adoGw3=`2hRCq}d~_AYHj#zD=~J z{^+A5lev89zD}2oyTnF5+QZt5yB53@{Az0W7&@PN^2wA3$iK38`Pqg%ootKtcHhe_ zd2u$W7dG=*z)MpwH>hFKYjo$u-HS8vaXE3tZw6FnRE9sM9I3l%+WZd^&o$<@^Q&a> z6?E~vjCitqZq#@ZV5oR=P^Pp9*Ae#)N7PAPj)no;VR>g%X;T@bM>Q^~L;<(1x2 zWGhV~IK<1?*fOBMlfv=D7wOvk4!W7&6z$`W#EoW-@GcvG%Gi3>dSg-C+3wuTsA||+ zSVB%($H-$^E(OP!sin;I&c&F2w{<5xEI6$8SZ`yyEG5RfbNW zE~Dy5X<2ozjixW&wrjR?At;%PBi09>nIq zqE9{5uKtBy&>|@h5@iW82h8V8tb>b!>PuC_*p-T)zB-}5yt8kA?QpB-P`k2bZA`cC zCBF-@UGnz6Wu}+(im9k1p+H(tCXAH}dDnRc${P!yAN0}4u+#Rg09KfBP@$j8zN`3o z@LF|v&MSNhMswSaHO@DkLkv8uIP!qsOCAj08SdWg?sb75nrn9Z`|wfme7B&REjALD z=fU=L2gpMbXYWnE<}$=+YYbo2|8nuXdAm6V#M33^)fEz< zN4RxN>xATFUxE-mI3%r#jG67P;Fc^-3B7)hS9XX7mw~y4zLYqv^@ipgcTVuU!yA{D z1O5415(8EuE1Rl@WfmgJM^pV#=w%LnDkhco;KE2mcSca-kg5O210 zbD8>Qz2fVfxCbeeO0Z+Z0zn8U z1Vn=X(gK4A;P#AYItxGoa5rjb6c7aM-ql-Wo%i&F`>dorfklX5P(IXNeWuSx36>uv zcrzKH(MKVWGNuuZdK~}`l9*9c1|2}6zQqE;#)POS5{(!E9T7kwosmdPunDj~n!sdn z0B;8;dj_3Fie;I=;Pw#Cv7kJMRc14GutFhF76=>)hrl60v_&8Su^YNfpe`Aq|2qWs zpT1(5Br*&EAQ3RcUkiZ#wza?jWZ;8_gp7K37ofk_FqSwR<`WHyKtV37uD{|S2?Lq= ziDrR@?Efzfs)zYZ!(u?l_D|w0v7c&K1OoZd`B+Q>HG;%^$GHcn91_$U0QX@qSitHG zeW167PG$hB<5}H1K-0DXi6jujVL~w|OA8Q0qluPaDB1ET0&59ki9{S?5A6Sk0Qf)2 V7#iCOOM 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 literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/sync-ev1-chrono.pdf b/docs/user_manual/figs/sync-ev1-chrono.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c76d2bbf45d460070f0c415260c25d0bf4a88465 GIT binary patch literal 8918 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 literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/sync-ev1-model.pdf b/docs/user_manual/figs/sync-ev1-model.pdf new file mode 100644 index 0000000000000000000000000000000000000000..26a4ae1986913a2f58ccfd016d070d4f8ab46ac1 GIT binary patch literal 11409 zcmb_?bzD?k*ES_xDk+E~sq_rY0MZQt(#X)mFmw(`hqNF_r-XEuAdRGiAR#T?og&hF zgLmK0^S2tY&x-_Z$)fZ5=?qK9ks zhTfMYoEd*^E>J0_B+ohuPol-Ji%$+!Rq)A)u5`Xi} zKJqTrda$R@%vT~l()#<#xy!Ezu>?p$vY4rX?;W-SyO8nSnxx&~T(JbSzA-RwelyFM%U zoO{l*G0(^RY)L8k5tu@D&|fb4i@)>(Ew*Xg7mrg3a9k@5*xYebXFN9dmBW3}ojg7l zVkL8PXdllgsrCgW8KD<)#Iuu|m{c&wQ^e!(n?lhzt=2MhtmrT`v(Wp)93l$F371)o zOZ@1pZas4>*^?qv)Q(g#EqG6SAunv>0z{>bQC6{GDxrM*T@QzOfN+pNxeh zRSN26<~PX87MbxgJ)2Iip-ZlBFe20aZ&6=KvOc{W3E2r4Z=312s*&}dq88ZcfV?KC zB!Xo?rg8F$*=z;1;#;q4mLXx*+nwgp<5bnAZMy3_9rpm#7pwNg*&qC|L5@?2`9Xb{)YJQ9kKzei9oYLu^CW;~ugEdCh4>;^X|xBr?&WmTuPX}m`;C(W$`YYf)QTep zyz}xgoCLk8vL;4+jTN=y)AmNLa^)#H3{EnZ_>_h~3?e=Jl=-HDg_+GJ_TYVkAzJ3) zIgb|esq!?Z&U_Ctm8x_f1Br6?&m~J?FXwGuF^KsS0J7Wgx{lulR6$l$Z0_%ARDOAr zO3D@u6%?%faPawP7fZMnGr~W-EqOjT9dbq|fse2?`8@=n&Taw+@NWS`!_6KQF;rk? zzrK+OTPFYrbz2Rotfepm8l(tkur6{HI6WIEoo~dZMhm)ZFg;wFjKJT|cpUGLRHd_3RZ4ng zCd>+NuLS&kHu>M3aVmGTO?|N5jJ>DT-*^WJ!j7Ys?weAs}fo>fMk-3^d%>4uM7_ z@#|9o^E5QqT(jj+tPpwQ+}q=c7Ax!Bre_D0>Zis)w%B&1g;%bM14mVaZ@4L6mf6Ki zqccHmlFXxaN@#a>pku4%r_Gadbl&Qh!rkuYng`6=18L%6Y0x?A?P9Jb3bbQJowxTZ zKgMaIRoP&Rtt=EP?*Y&bZ=qGqrhKOhvNnkBSR`a2c)h)C?TDUk#mTnLcb@KN_qjPp z;Ac|r?zxs=E~Th1gFHD8LV6`PFIPdTuaA&8VZh|_C+YQ4i-5(Ko_6+>^cKp4z;#X4 z^;o=s5c7sWAz$rCP80k9pV0*$DhLY>wRfr&nfVJtG_ODbm0Ee6ZaZN#Nd`?+)#p+*}A*mvK#Nc$V9#`N0>>bV^fEW7`-7DaBBE~R`XacSJNc?u3?%hbZtS_%>3nl{P>nte3(K*P2eT(NFk%pn6M0lc>BIPQ?l$6K!)Gx<) zv?5oVrC8J%4|4l$I7f$;QG}6hc|rx|1Z-Q7mbj~hdXd)NyOv51WD73Esv#K07h#@4bpqKYq*yI zx7&DCee;!_=z~bzI`oVmSG<`JZ;IN3PF*nbiHNtLNF+Bdr9j&gz6M)_B!oQL-$hI8D$)>bK1J^6k~xGkA2VV0AY=cAlO;RAUC zE@=a)hP>Cy7r~q5^&#%HXO=(OH-$H2?j_&*c#ry?=Dh^oPB3+{ZE{cYO7a?SSCzRA z!3Qjz6`i#Y2HbH;yL}p_OqH(%GD=E!@;HV>vS*5fOW^sH+GbhLD*Ny1M|0}(iPz}W zsJlogD{yIZ8J4N;Wr(Pzm!xMm%Qox!d~O*8d^372{0}9Z^24hgLJvfibeYRTQstxN!+Vs}Cq`y9jOquf1_-TI&6#Vbd`)Av}3md(K9pKoTYUx+^v>X6@bpfx)YUvgc9H%W9&38t+-|<%v8I z2@wewx%<)iW04ov3G5Q%()n!W`}qFa+4#9K7C%-o-a39ZmJF5_jtBt=@6N3kSnaLo ztqpz;xV{=P>WxrfNL)xd2MXbV3H8a(9H}_jd5f91-D)*my5=^;Ju0gt?IE2Yt&pJ24y|043DXG!cC1z^Wgp*>2=86wt^MK(j&tn1GKG)G;y`_W^qf_f3_Ii)x4W2HWa1!$PsGVkoe|G@rPU(<69*_ndo!O~EcN%sx6_1zog)cddv^0>?`Ars|%#=(pA{ z{P?&PVFR#{o80e}=?zEF%-M#{j;Ov-p(S-*LcBQ_gYDxy!sWuFLeyM*Vl~Bx9(-J5tW9TEbBX})lZ)CRv_KQ z`%t1Y@Zfa_W$=^dP9pVH%U@GV%S&f_eG|$I4(gBvQ%&a=nh8Z_r2_hbUa4M9J3*J> zV{{E^@rK*p78@V-Y??OgD=*`hO5S|D<+XOEf6g^~T<^8=<~o%I^ELL_F6T#&YlCUw z4X@eDA)Epd1JOQr{!8;q`1VpJ3%)XITA^sk<><+{X+hJ`_PcSTfy!5A5ka+*T-R}@ zWyv^2_$I^uBRBr50C4Q$uJPWrC?#=h)SbxDhO16f6IpX|D#Jum=ny}&g{41!twX2;;;1iCZqo6 z9DXI-Tz;}9|(jGf!r*?A0L$D&+|WI|F>UW-kXZ%W==O}e>eS& z#{X%_zfAI*iJrl1P=(2VHJ~-j3{}+KlqaZ?N8(q}#R1~x0dVkw_yIsZl!`zQ-;Eo{ zqgK=cE^cdPeN$_3i95n?>P0><>ilN7n+pz<-B6Vj%w7&*VP@`xQXJK*fjV z-=u(FQYDz{FKeTQ0HG{@GdK#)LV!@f6{@Y;-<<20;13mlL$`ncKHi&(>UXRQ3*x$>mCIJE`bb9c;d+e| z9Y5PwcYz6eSqvoOUG6iFrS`hVAG56RC^Piwi_{`Vr7oWZ#3Yohr$@5rqZLv{H4+>9VjCLKwv)wgo;fr4R$0(SZ0rRZm&qe5x(! zgl-cdC(k7Sk_`&5%zT?7r)3=W9!tpKNcFNL;B%X z1%-ws#)>Q+mx#0o;I| z=7o_xr%gNLW;#=iIL-Sq^{4drz8#g-Y|u;{y|6iB`*x%p^LSno!l2`MX6AX8sC-?n z+}xjMxHC+7R{jIG3UCg~xhPn-9`c#ZyjFUB)lYGmOL0lWaTdto{`|GKc&-Sa`d;@) zS9ef*=Tvw@*gNr~LC(vahDhftBYBnlh^S^!DDw$soJ5#4%?>W0_C?haFheAKn(&mp zmD(o2llP_An7FpDm3#%pc%*UQb^DN!2t-#v$Ail+W9S=?`5PvcY;MYk_*C)D<)JsH z5=}v|N=Hz9n89wPeU&rcdjc6uE`lGX(Kyl_{>yrg)F*5osk`?iy(}Ce<_dKTwtp9L zLG>_8!qX}&y1ng_QG5eRD|xfDPrQ1sRsflsl`?Kf}|E~k{+ zX#@r=LgXsr41X|Xe=BuP>80cgxmSsC9&v$K91PA)Px$_W5^G=1zdZU(Cc)hxQ zPN@oIQIloF6W!FD>ivSo5Wf8<2EE@KL(Sa6bZ74Kd9s&Jdz>XEN$zeZN+Mj#a5GzK`rs328(7)!tL+*R-)o{jXV2)dCHfJJ2Dm z0^{oMo23lP42LjA&w!LTak4GWL)C2kjE1(M{1VONu`zN6Gltj3-P$7zA)xQO-8y)xI`*6&Vka3DJP3PC+j_ktl$& z_r(i^ni9Hlc^XRoR0h5|4xW@dOFIUGf`Ilk?+sfQAMN_d`_6CrG{1ShZc;WKco8gX zWSE_0Ws*MefG(A-KfHD*1BY*qD%4YQyt=nO$k{Wv^ghx|@_p%-rww)+q21eG-j}{A zW~1Nw#%`?n6NT#F@JvW~tbIxaU2D2a6!1Y?6f1Axej>KxJb!6PS2u|f zm8lq*oe3PN;EfYU>g%xpwXUGRR;|YK#^AL6p|R+et=R@A^(Sy8HWMduf^khPly*4O zJ`f4|9+J)?;tQGxxKqY78w{8=uU^vWM1=cW~|uFdK+R*c*wR*BGZ^ z7a0**2iowbPc3i@k(6bXiTFEYGBX>00@BjkMTx4vGfj?Yx{Rkb2};6bFF&8CsnxMn zxX3t3>i7_n&h(7=%C|Dlb#DLNS`oLh%>5VK1g4T?XMxa54!Ez~N}5`On2-yqXl;u1S7GyIxp?dZn{fz<}x*)8jLqAf3uX@tIeE97Oe zjK%mbqgRdimy?Xk3e0|*>*yxSz^bJ9&SBn;(Fa&{6Rz8(O;GRd|LkNkVKa8b+ncRX z*<(JqrB-#%pkz@SyG-8qRYSqlW48vTv8}WxA5=;kJR%3bgC%N~rPPM`5R7@#r8v;J zNHSIALJi}m>}*$PbYjXwTypG`+coO$0^81=-6>H0S9`b(S>^>9 zW*rbx=cn0I)KSS=B!sf{?Sbe>DXA?B0!%7e^Kh~{INm*vu_Xtz@b^+upY4MgqG!VS z52=*1^OP;$j*{aE>Xn+q#OTADc5mIOrD4qS$*h|uuCY<}pxopnWN(Yn_nUI^+Wk0X zOwYa^Uy)YSz?jRzI%EqCp5%hgzu0|3EA~tl zJ#tvmX6co_Hlf;04O?v|W8&|Xj?S&{m~gsvCb=lYT;q5m^5 z2dV{ZQBE><>IJ|#*~PrMCkbZ7`HU%t7GQM)llry^PS&myK=!f_6JeS8DJ%y+QcS26 zaU9j;M3BwxT7BZAdFMKP{$g_~O>(%a*M`BxovU#Q&L$ySYiLjwhbFt;m5<3n=pKCG z^B!WMu$SR7D3E0-vB-qr`SmsQB(w~gD2UD(>T$OOo1)oFq{Wcv>-##kR*vt9_Xk5o zAB1+7;Ud2-V0O|4JZqd|e2jl8h+hZCHpIWuTr96Ci#}sJ@-Xf(qdX0ieioN_KJWHb z2J^_vRAB1U6=nh1fZhCViy(`?ncLFCr^y23-tM7EEroBX2a(o1?Sq8jPiGWc`mL_E zEiG$KFM0X{b0dOH6FCEN-*!r>P~Ia+>W8VS>6tnwecxYO)av5&ZvEhWU=nsZ%tW%; z#?{s_#oJBvu2g3Tn~;YmPECUP!su2|ZX_Y`Hv3Pq$7qypCd+gh@N|bxr?H@!@jyAt z7eC@Rq_2MDQYwVXQ#-`OcpW?@sPpC0V)OEO>E&8`8cFP*>Gc6o8R*UtM^Q*)*wXyA z{ld}rOuuGD-}9|DRPEW-A%lIz@Tu4;rNU&o7xiar2UV9qx;FvPv$>jMqr)ZQ7-ct8Y`6p^Q9U zS;`x$p75lubnJQe<~1_;^>8j_dD3LzXMw(^PdU(B#YQ30Ml%e@=q*f~jt+}74bMiX z426>M**e|Qt)*K8z0{iVyjfjsXKn;%uP3&@kws@BsJe};ohxVJGnrC8XX+Twe`O~z zc{Pt*Pb^u@I?g-zE=15&OxN?7FzpGv-rkmQ6J+^p5;XYy1>7_RADE|=r`4Od!8EL3 z*&pkBY@^3!`kr| zIywDCOo$v;vy2W+9Vh~!2R5Nroe`}q;aUHgaD|w<+N1i-_n3d>ub#MV^&r@fZ31A#S4&pXBoLhhK3L4e*C!2f2(}zYO9M<; zp9N>!>&8p#EsuzpTJFY&B?g0*Z-MDRY@Fh2+Cze)x`fi+#0(EIl*BLA!AY$P}8l%L#_+grckrPwCQXA-p=XgHB zaxk03)6fGKxx-bI^yKO^1*u@UcG6`dA>OGGElX78c`K?q{F2LBdJVog`YkWJtV;yG+QiF?&mcK#OFDg@%H zQ6v6|5gn}19Hzi|(TM;2@mteYrpRz?&7x_}e2EGnH(5EJ=R+q&*ZdS!W&!bUM4LO@?rc4v*~=OTw43DdXimJ8=p|AX`smwX5jd|pUSi@*JX+NF^J_+}Rt#B6m$6uzTe)lxlE?3$c8O`4bC4^0QsvxTmnR%!0K$wm6! zEkxc8oGS%RH5#RGc5 z<_<0*jY?v~7! z&7>c`y2@XzNseia`DAA~%kG`Eto}v2;(%2|Ma}3789PQSb$G{wo{k1o{|>jMIAVbV zLH9z{27zy=8>3cMTGr2#gSAD_5&hw`)erMl6+lLO1oG{Wb|D2D!oGNSP7aQ#W4%4i zZ`=M|!VGxaDQV`X@|=&^%q@e#;)Q*h&2}tp0@9u}N+74Ye`gpPlI(tD5XU#FKv+yU z^1&LCy`oe3aOO#m)n{fm5g8lf%@b?xHR$^lFP+I8yxoyQ(~|5E(#}h<9IYOL z=HjaN^fiTFV+b{qf*SaO?B3L5Hoh+=YZmq-A#(%MF z3F?Wi%r4HC+mi2PW%piOSYx0wNVofP%r6{MhC9wZ%(_->Sm#@ucWX9teNfNGRN+T- z+Te#&0*qo@C+-v z8?o2`Wu~+7AzR~Eq};+*FH>kxZHjLeubK5!-*oRit5OIeknv(^j@*MhFjLO{_&IH~ z(QetwHGIqx&Z|>61Y#9Bq-wi(sfsW?HdRuaD?JMgE!_O^7+TG5(+z6MWco&xgL7+D zxwa_s_Cwv{2T!;@oJ~_bv9&fpsz-T2u5x-wlMU1^w2bW05>|Wmb=1hY1X|*iwjup3 zt`BEYLik(#z=e%3ZPogRvm>Hu2xnRKCS4;J@hkzmv^uJ3Izgt-8yaiVHHL1Ly|Mc$ z;?bL_58l1_>Fsv3a_zl)5IHPH_tYV_nB9cVYhk{tjB{&z=IBX}(BYjPo82<&J+=+Y zPIV3W5bwkj5^iX-p5<*gfSmm#G~u;i&4amvTvk0ljZ7ofj&}ynh_2p9E1W;4s3zgu zfgX#hWua~UCn^v8JLv|+M=^N;NAdO^*}&k+>HsYS($T`s76r3%LI8S?V2+Lm8)FnI zivWOtvOpkM?=e921q|ur4nWaYe$jATogUv1Z4fXg)N@idoRddVPe9xt9&UaRKadB7 z-g4`3bF-lS9-|O&JCpyt35wYA$EyKXB*GMhF#|#P+)=8TpG=sczwpK-mCAg0i!70^9)oYAE#E*3=I0 zYaMScq)_h&gg_uv7a$0~DcF=742PQ_KtNMI6F3mU0|FYGg1JTT|L;wH!}1-SQ0x24 z_&{zRFc_bSNm^OvA55*kh*GHO{K>bvp)vjS3g<6=)W6&OLDoXO7W&uIDzN{Z_4Nmv z3-E6`7yf_Hxo#%&Clw3DuKFim>~}^N%5MLh!C%hz|9z9N1H|p^QG_tm4nVCZClIx1 z{)f!~=J{*C{J-t1|J*eH%bo#p^MO&cxj+0Ar6};X%>?8Y5cr#8{@n?0TUb#!$` z^)I+GY;up;7?~9NRTz6wFiEvROr!|edDN+L15dsj_w%Sb_MkE2q9BB!Vs~M}?aglP z2fkgKy|(rH%60v}>u;QYb4cC85f0{1Hn#Zv+X-&(0_OU|IaRo`!!svSxHFjd4}rLY zy$kSvXYlog0PhvyW>&^x4(?!G2q55uae`q`eN4dr8#C9p-R@i2$-z_&?gG{YY)MFg zIb`hsi()rd@tdnGSRc%xrDS3aH+2DDM@!ZY3g-K5Oj!6jFgJ>?MYoD?0?Pk;6~`aD zxmCfT_RPfP_x^sH19NCvnE}DS_LM^gZe?NV0(cBq0k-Aj=y06_Oc$qTKp?~&Y#p4` z9F0xkVAvmu)fA1LZNSj$jRHFtvvP4(hC7Kn*f~1bUx$qUf1AteSp1pGEq$M`C!-{# z@A1SjsWa#zg02d)VhM?}!_xxggINK$#D z+=KLL=;9N|!oW8<`R7Nc*v(7#7rwS*wO*NAD>mCg7KZHY4{b^t$0lvAe7$z+chbvC zFWxToUd^tQd;9zx)r^XYvKV;X!zshiL=QVT-wE-%{5fvefQ8wcbv1Vu%IQl?ixRIM z84^?#nA(Fz5o1k}8s4QME=#L~dt&y2(Mm24V(PVX*+cOx#c)*KQKMw5;#(Q?Tre`L zD2bApedh6(o|znC3&j(wK;ov8D?uk#DvBU8@+C?tc$q1U156xGLbe^Isy{wbE)X6*fZp6*|_r9oI|9n&g4Q=^bsbSdf&WK(BT zqZ9KjT33%avtiha?H4O`AR8**llkCgLu6E}-OOTiFf?GBQDh)X+;)6HOyc2T0GGjeZF@27h~^5K{4(+ z6C-jnA3?h3=%b)jH=A-SyF1xGLiDzh&l>T`d2?39_Xs;>3ly(o7_^e+MQZFjQXwgH z2R^q_sT?ts1qy3<70&i|m&pYSNFy@o2DJG?8AtJQcJ<`>wT`_W)E##H@~t zFXq5G0oAq&2ow0PWYgWs|}HP*7tnt?B~WjRbWF+Rx#=2`e+e^ zoY!_Df|#YFsj@Q3?bq7d%*W{uE2U%Z(@IC%T3hD`=d@fDSiJy_o0dfoj>r4b((cWe zu5S-%LNcg7@l+h{FZDt7Cf~`Rzt@T_ftq$r^b@R4;++)!)Pt#t7BFs3H+UQXN`GA( z3@QqJ+3zBE@CRpMm_zZ*&JNe|MO{janNfbV7M3>uIvXie)5?5=tV!i}@$`6m8tQ8@ zgd}QU=)HF*!ggq7FcX(+ZhlCbiuhdgIckr-&*@UibltOdWsKy;)8$uum3#`JR|S&ht6u^ycA=O=ErK*@dGaY;%b=E+`nHb|1B%%{ zR(RYFBQnPgytXRG4gK^5O%D;MM9x-exs(g~Zysqpk-ij;ZVL)-*Y0RaY;5dXFGxQ& zUH$U%jt2?4J4#>jZ_=X(H_rm)pubb5pxO~a1lEie#A6m6nWsfXtpMtz9KD@WIAxC$ zV|)%}0b*}^ak7_6uPBvUKr=oy^jxo9FiaNvuD*ize%sPmv98CJ3d+sX;(r43y{NIJ zP|Oe{bLKnQUX8{fhN6temRk&VQJi%UD!F`$Y1a}nTEO=bm`HckVqh{62g*$PK6+9_ zi-7AU>6m`C!)&su?V7{4itywYBy15vrQw8vGnl&w7gCX=0YdDaC7*ymfXB=9f>xds zX&CGGj@LS`kkUuA+ynvLx2$tyX6Dyyvmv;1;)5yWG=8JZMW3M)wi>ROu^rWPO#4@? z09ogrczT?L3CT#+RJ}={d?x%uW4;$@mL`Aoy*vvrq*>rnPhr=GjHeRk`WbN9=-0Vm zm@a>-v?=V!Rcn1}5HS}WEzpW7@uc-lmHqU?yv;B4H-|0)`n-_COv7@%Im6ZJQ116C zy9GEw0A4WRyv}%uzGjJ@$JMV(gGNvKz5Y6L^g{uLC1IblEFxM`chT}7q+B8f&8i?g zW?qy)bghIr4y@(=m&lk#?Pjx0J`;W|`wl0&^Q!m@_YG2imTeM|A+!4Yc*W6T;0ltg zb=xuM=h51o+wY1Zp957%TgGg`r^>wfqPmIu%of9{i;A(N^_kif+>SOUv&g(n7@M4yls?5@QQXHug;sfc03quENd6F|R~;=ob@K?@#;UE&P@Dl=ch%1Xlp$Ymo8>>`nUdThsn81rC}jY{|gtasy1d2e)U@ri#X(2yENG)@ImbPq4f~ z%vN=JJefB5SBs~}c%@JJP+c6rW8@QZCAYo&BXF|N?zDZOt`AX{EkRF;ckUhYzQuZK zB|VIGzdqv>RBli9$A3y6r2zt36~A%gz;lIK2Fo?QMHdp2h0fv-J$z>RmBixH+t#+C zBdBVo-sk)|WOse&`ya?O(lS0mcd&AbpZFX@3)P#f8dUDI3uyb6x1QcFrb794k)(`kEfaRYR3)KSzV@BUjIS_!p8{J$4^ z*Ca3gdm&W`wcO^v7f#iLJlgxW>HS5W2CW;XY17{P7;|R3|LfpA{Mx_$6&+^q;bW&h zglyHl9^OCk@LYBGFa0X48Y}sNMVR)8GV5(@LuXIxy~a{BbWzchKy7{*)x9^laxZy8 zJ|b}Gi=HHis3-p6FL?F1+qH5UP%nNmc%X4x1CH1+u7lfaQz)vg)R+sfP(5gnUxuHp z=QkkU!4Z0<_ujCiQd;+}Nil`+af#%=Hrcp_Ok#M<5(~GGX%%T8taVddNwjt&eZkpnI>$JSq@z+SXsn<7yS5sB4Jj6%U%8syyl(GxG(@t zaYoCxXD0waIlMlip2&N)(kA7*RMPfjx%7aP`dQGQkY`2bCxlxD<@Ipr@R_Qh3_B^! zg!exX6lYDy>~XJX4nOx6&|SONMz@)_zecRU>x)nZ`&_?Ev%+s2q&tn@t*d+Jtyb$e z-)8j7)TV!+vo?pn&?qNeLWQ3K8Z^uJoWYKN2At2bsf8q zG8mn@!sh&iXul!=n8@^#7hH0`qp{uXs>CMeor|0n55<}Eqz;+c)XPv5aog65d2v1tWUsh-#&fUpo_Mvi(U)9l zTu02e8yOFuVGh@+w+8$K`hR!X^V<7?4P~=|j8&@#D}$kAU&Dr9clv(G5_Qs)%~+?s ze_NjB_h~Vraiw0A=-2bwedE@Z?)bumQWMht!=gVmU?J&&Vj5BVlldZzi2kI#m&EV=3J>v!ZSLzeygE@_xIIo<=B#jl=V<-hs z&!(DublK03w(6~h8FbinD#8wQOigLW96l?4W{skmJLhjf-X({cpj3ru<gr zRR$^jjC*B#`$!y2m{>bFbmJ5^Jc{^W+WqY;N8EFd!>@-YasoZ5(kE1pcxIxX*!+rK zKKadz8CTF}Shm<}7DTFQ%~Aul-hV=#If8<&xAAu0s|xGzIe?r5Wt(q(tE}keL!aa4 zkSvo-QJuojuz4pJ|Mo15<>p{R=;`*FY49NROTEaIj-ionP@qXoXVKgER=Lre#IiHn zJPQ;#UB(N|@qS{2$k98(YgsQz7onv2Ukw0fsIzmFd*$&EZ3r%c%?Dn?vJiL`j<&vs zUZSyHh2T=*2qnwz`YnFKx2@R=re{pIovOhvOG%ef*`BVy_Z|Ev=1I<~=q_QU=ye;u z$F9fkwoL(m`MhNBAx8l5bac+-ZdTBFyo;&1Jx3PnH-Yz`XN`? zs0HDql@(R+IVGuBcDIsZ;J{u2TV0#mAq1~CjKG%ip$p?t%Lh&gd@Km;>;1O6XB&{s z!_7%TUN8f9)vD^*n)E(oHVVD} z;d)_of(8morYS3HtS@DJV)#jGJ#f)sN!@D^)p8GVZE~b8ZgwLPD94YMJMX zT^Dsq921eyYmviM^0r1G&K5H%$!x&D;R6$4{WD;X@d|#d!C6>>mei$ zgopQbF!_5v_^-(%6#D-#n*3`JiOC@WceOHwOFJ2R{9|MZ{$phMe>sx;$9Q?`O8^4! zX$SkQQ!WN88@Ko)0@Eo{h|&MAFHLBur(@Q?=eqx#S^o~&bs(W!{C@`b?_=wmu`l#y zR{a` zfi!Z_DD?7WflOEV(KfrkS^am`W@QHFu`9ng8a{D4R0K@PQC>k`hI>m$iE8DYWSmzh zy@yFmoFPz7l5C8e_cRL~rM5?Jms#q2Qd1Zfvq9PeWDVRIk@dO>tutb#4Li#!-+5-BLvM2k?D%Eh_PK^Y z{ymWZT3KQ)xa3m)+kAP6{(dZ+ltHu0W4x<{7MRuNo_5yPnJxGBf>)oYtR`XvgmAWn-+XD{N3a0SLz(Y>G^BrjOwmlg#EmND2>|k5mt^ju7mC&E~?B=gxo0}9*YRr z?zMcMm#ZNW#;I<*H&4Ecz#44WmVo}~6FTyclomSqo`hJe79Ao!wM`t&8>B+Xv{;-s z$QDAiBj-&tjK@smAfu_KsTvCRmU+$bxB^ZC^GrrR9i~lN$twX~o#z?m;M5_JB zK&gZ-6KqJ28!w`q$jCsXBu61BHu)GPSNq80k%xGmDt3YWh}OH*x^x|-MhPD|9}ejR zu9Sn6g`VPsqBxtRjTA3>rNr?Rw-iJ6%m;?lesaI^FKUofS|7El1>}}#WJ}Fgv|H0F#Lf;S{5MNE8RQPDE>??g9HArkY&*N)Ng<{3SZ}4vrN@>0~ z=feqWorhGbjfWU;dbsWq;}XRZXsNtc6}1gwbi$=dmKT{2Ssxj5z`a~MxG?ygx75nu zs(~r#l-ZuyJBcRAJP9!==AFV5hf$)@^mlgeltv)d4A#chlh)^>>_t(7ZwK8n2Gb3> zuNE&t*URd{J!{Uaf3~j+ttWueKusVr&=XJ!cNY&?ntfVN+EUsIcXx%Q&fQ8Boh6-> zN&`sJ%k6%3bNccZuc_L|@`+aKRjav)Damta zaTu1W>|_h8WEN+>X_ju*_3Lf<0{&+7LiAN@L3TuTvvG!T?z}1OySSnu=3Jdzfi8a2 zs;3cq!V9_#W#Q?v@v>1pifR)hGwMclgB62VHp`X_+(kU~-8p4b+S>1>#OXQ=TJ1EQ1{SAoZ|@>SH}7vpHcjc)%lu%y~qW$ z2VM_849mWqP1hb^8o(aNy^D2k_udE_sngKY`5FqRICeAkNJDqW?2#wmlNNL~&iWO{ zqgGry>^i0=geEU*&RKBfapR<4bSJ(|SOE>*H3&;7)r`|Dt&Tr7*|FYvEBsJ6TsTUY zu*tQl$cN*^_!8;T^=$fJe0Sw+{9FlzALTv9D&`v$DHIJf;k%p|1b3dHw6`L*)(28? zd^M!g8zDgwyAXE`7R2De(kDK1CS_;ke$TM!QS-#z*WC?;%|uc{yrW(w=F`_t(l4S& z!lA;?RzVdf6~kim z#t~&K`dmT}8adjzb0Ok&y;h^!PY81!4aF%iI%}KPr$+x$_$d=f_lo|x_T6&pk24n1 z@XTJ7e*ERb#k58HKFXeho^xLwa~`*67EP|dLM~c)wry~VgU3qrzSll>({HVt|Jk$= zV+XdAncVG@>WhMt&)P@KjHqO(lrXD6HWL&5k-UFr(vhc*eujP$TQYlbgVMp$dEIR>&qf7C z#`y~P5_#LA;=4X9JneS4ock&6MOd_^%#~Yvg2GP?+xyXdLba2DB{=C3;qz|o!DZ%A z)fb%zo$RrxvGA%lyjETcUbAcd!|9X*lx!leuDlN;k6xyg_gcsg#tjg^eg(^P^W7Kg z3f_AWelPT)ri*Z0#p2iWlCqMSzJQccgS}d(!tage7f(`(EJ|Sd0zTn>7R4V9M$ya5HP%Xs|rYA||9poZ~9#v{b46 z&S2pni&TZwx^%JhVB~4!wC9Jz&fUJql;MToW~N_N$4Ns)nZ9o4jTR<79lJI|8!tuV zW(t~MXJbcpD`u;U!){hP`EMg;ikd`@0xq-9O%J={);5(+l#()|MBKbFF819S?97*E zkAn`*|NAcR8-`xPRZd-A zhV%b{TX9WHcm}Wy0M3HEm6~0{P$rbErBv z0M&Ox|B d{GXQq6rkU%8KBgDCm06dg<;auODaiW{x5c$?HK?7 literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/sync-ev2-model.pdf b/docs/user_manual/figs/sync-ev2-model.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c3875d3023fcaa436cf79662ecd293c1c1daf578 GIT binary patch literal 11952 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 literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/sync-sv1-chrono.pdf b/docs/user_manual/figs/sync-sv1-chrono.pdf new file mode 100644 index 0000000000000000000000000000000000000000..15295600546c6057df2b4c7d20f40c1f70030260 GIT binary patch literal 9579 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 AJOBUy literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/sync-sv1-model.pdf b/docs/user_manual/figs/sync-sv1-model.pdf new file mode 100644 index 0000000000000000000000000000000000000000..489bf0b89dd0d358c01220eb02a2d36a9e18cba1 GIT binary patch literal 12054 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 R7<2tkg9LK10e?5h{{aAt7)$^F literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/sync-sv2-chrono.pdf b/docs/user_manual/figs/sync-sv2-chrono.pdf new file mode 100644 index 0000000000000000000000000000000000000000..34db7f2f9a14de96334d8ca8cdd6ad2772bc7d09 GIT binary patch literal 9476 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 literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/sync-sv2-model.pdf b/docs/user_manual/figs/sync-sv2-model.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b90fcf18e9a4c2c68a85bed02b7452f4683f93b1 GIT binary patch literal 11909 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 literal 0 HcmV?d00001 diff --git a/docs/user_manual/introduction.tex b/docs/user_manual/introduction.tex new file mode 100644 index 00000000..86a3d572 --- /dev/null +++ b/docs/user_manual/introduction.tex @@ -0,0 +1,50 @@ +\chapter{Introduction} +\label{chap:intro} + +This document is a brief user manual for the RFSM language and compiler. + +\medskip +RFSM is a domain specific language aimed at describing, drawing and simulating \emph{reactive finite state + machines}. Reactive FSMs are a FSMs for which transitions can only take place at the occurence of +events. + +\medskip +RFSM has been developed mainly for pedagogical purposes, in order to initiate students to +model-based design. It is currently used in courses dedicated to embedded system design both on +software and hardware platforms (microcontrolers and FPGA resp.). But RFSM can also be used to +generate code (C, SystemC or VHDL) from high-level models to be integrated to existing applications. + +More precisely, RFSM can be used to +\begin{itemize} +\item describe FSM-based models and testbenches, +\item generate graphical representations of these models (\verb|.dot| format) for visualisation, +\item simulate these models, producing \verb|.vcd| files to be displayed with waveform viewers such + as \texttt{gtkwave}, +\item generate C, SystemC and VHDL implementations (including testbenches for simulation) +\end{itemize} + +\medskip +The RFSM compiler is also used internally by the \textsc{RfsmLight} +application\footnote{\url{https://github.com/jserot/rfsm-light}} which provides a GUI-based interface to a +subset of the language\footnote{Single FSM models only.} and compiler back-ends. The +\textsc{RfsmLight} application is described in a separate document. + +\medskip +This document is organized as follows. +Chapter~\ref{cha:overview} is short presentation of the language and its possibilities using simple +examples. Chapter~\ref{cha:language} is a more throrough presentation describing its syntax in a more +systematic way and discussing the main issues related to its semantics. +Chapter~\ref{cha:rfsmc} describes how to use the command-line compiler. Appendices +A1, A2 and A3 give some examples of code generated by the C, SystemC and VHDL backends. + +\medskip +\textbf{Note}. The language described in this document is the so-called \emph{standard} RFSM language. The +distribution\footnote{\url{https://github.com/jserot/rfsm}} actually contains several variants, all +sharing a common \emph{host} language but differing, essentially, in the so-called \emph{guest} language used to describe +the conditions and actions attached to transitions. The framework available in the distribution +can be used to build one's own variant language. This process is described in the reference manual. + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "rfsm_um" +%%% End: diff --git a/docs/user_manual/language.tex b/docs/user_manual/language.tex new file mode 100644 index 00000000..9aab001f --- /dev/null +++ b/docs/user_manual/language.tex @@ -0,0 +1,1077 @@ +\chapter{The RFSM language} +\label{cha:language} + +This section describes the syntax and semantics of the \emph{standard} RFSM language in a more +systematic, but informal, way. The corresponding formalized descriptions are given in the reference +manual. + +\section{Programs} +\label{sec:programs} + +A RSFM program contains declarations of six kinds~: +\begin{itemize} +\item \textbf{types} +\item \textbf{constants} +\item \textbf{functions} +\item \textbf{FSM models} +\item \textbf{global objects} +\item \textbf{FSM instanciations} +\end{itemize} + +These declarations may appear in any order in a given program but an object used in a given section must +have been declared before. + +\section{FSM models} +\label{sec:fsm-models} + +% The general form of an FSM model is given in listing.~\ref{lst:fsm-model-gen}. +% \begin{lstlisting}[language=Rfsm,frame=single,caption=Overall syntax for FSM models,label=lst:fsm-model-gen] +% fsm model <@\emph{parameter declarations}@> @\emph{name}@ ( +% @\emph{io declaration}@ +% { +% states: @\emph{state declaration}@; +% vars: @\emph{variable declaration}@; +% trans: @\emph{transition descriptions}@; +% itrans: @\emph{initial transition description}@; +% } +% \end{lstlisting} +% where +% \begin{itemize} +% \item \emph{name} is the name of the defined model, +% \item \emph{parameter declarations} is an optional list of generic parameters, +% \item \emph{io declarations} list the inputs and outputs of the FSM, +% \item \emph{state declarations} list the states of the FSM, +% \item \emph{variable declarations} is an optional list of internal variables, +% \item \emph{transition descriptions} describe all the transitions of the FSM, +% \item \emph{initial transition description} describes the initial transition of the FSM. +% \end{itemize} + +An FSM model, introduced by the \verb|fsm model| keywords, describes the interface and behavior of a +\emph{reactive finite state machine}. A reactive finite state machine is a finite state machine +whose transitions can only be caused by the occurrence of \emph{events}. + +\begin{center} +\framebox{\lstinline[language=Rfsm]|fsm model { }|} +\end{center} + +\medskip The \textbf{interface} of the model gives its name, a list of parameters (which can be +empty) and a list of inputs and outputs. All parameters and IOs are typed (see +Sec.~\ref{sec:types}). Inputs and outputs are explicitely tagged. An IO tagged \verb|inout| acts +both as input and output (it can be read and written by the model). Inputs and outputs are listed +between \verb|(...)|. Parameters, if present are given between \verb|<...>| and allow the +definition of \emph{generic} models. Examples : + +\begin{center} +\example{\lstinline[language=Rfsm]|fsm model cntmod8 (in h: event, out s: int<0..7>) \{ ... \}|} +\end{center} + +\begin{center} +\example{\lstinline[language=Rfsm]|fsm model gensig (in h: event, in e: bit, out s: bit) \{ ... \}|} +\end{center} + +\begin{center} +\example{\lstinline[language=Rfsm]|fsm model update (in top: event, inout lock: bool) \{ ... \}|} +\end{center} + +\medskip +The model \textbf{body}, written between \verb|{...}|, generally comprises four sections : +\begin{itemize} +\item a section giving the list of \emph{states}, +\item a section introducing local (internal) \emph{variables}, +\item a section giving the list of \emph{transition}, +\item a section specifying the \emph{initial transition}. +\end{itemize} + +Each section starts with the corresponding keyword (\verb|states:|, \verb|vars:|, \verb|trans:| and +\verb|itrans:| resp.) and ends with a semi-colon. + +\begin{center} +\framebox{\lstinline[language=Rfsm]| fsm model ... ( ... ) \{ states: ...; vars: ...; trans: ...; itrans: ...; \}|} +\end{center} + +\subsection{States} +\label{sec:states} + +The \verb|states:| section gives the set of internal states, as a comma-separated list of +identifiers (each starting with a uppercase letter). Example : + +\begin{center} +\example{\lstinline[language=Rfsm]|states: Idle, Wait1, Wait2, Done;|} +\end{center} + +Values for outputs can be attached to states using the \verb|where| keyword. When several +assignements are attached to the same state, they are separated using the \verb|and| keyword. + +\begin{center} +\example{\lstinline[language=Rfsm]|states: Idle, Wait1 where s1=0, Wait2 where s1=1 and s2=0, Done;|} +\end{center} + +\subsection{Variables} +\label{sec:variables} + +The \verb|vars:| section gives the set of internal variables, each with its type. Example : + +\begin{center} +\example{\lstinline[language=Rfsm]|vars: cnt: int, stop: bool;|} +\end{center} + +The type of a variable may depend on parameters listed in the model interface. Example + +\begin{center} +\example{\lstinline[language=Rfsm]|fsm gensig (...) \{ ... vars: k: int<0:n>; ... \}|} +\end{center} + +The \verb|vars:| section may be omitted. + +\subsection{Transitions} +\label{sec:transitions} + +The \verb|trans:| section gives the set of transitions between states. Each transition is denoted + +\begin{center} +\framebox{\lstinline[language=Rfsm]{| src_state -> dst_state on ev when guards with actions}} +\end{center} + +where +\begin{itemize} +\item \emph{src\_state} and \emph{dst\_state} respectively designates the source state and destination state, +\item \emph{ev} is the event trigerring the transition, +\item \emph{guards} is a set a enabling conditions, +\item \emph{actions} is a set of actions performed when then transition is enabled. +\end{itemize} + +\medskip The semantics is that the transition is enabled whenever the FSM is in the source state, +the triggering event occurs and all conditions evaluate to true. The associated actions are then +performed and the FSM moves to the destination state. + +\medskip +The triggering event must be listed in the inputs. + +\medskip +Each condition listed in \emph{guards} must evaluate to a boolean value. The guard is true if +\emph{all} conditions evaluate to true (conjonctive semantics). +The guards may involve inputs and/or internal variables. + +\medskip +The guard can be empty. In this case, the transition is denoted +\begin{center} +\framebox{\lstinline[language=Rfsm]{| src_state -> dst_state on ev with actions}} +\end{center} + +\medskip The \textbf{actions} associated to a transition consists in modifications of the outputs +and/or internal variables or emissions of events. Modifications of outputs and internal variables +are denoted + +\begin{center} +\framebox{\lstinline[language=Rfsm]{id := expr}} +\end{center} + +where \emph{id} is the name of the output (resp. variable) and \emph{expr} an expression involving +inputs, outputs and variables and operations allowed on the corresponding types. + +\medskip +The action of emitting of an event is simply denoted by the name of this event. + +\medskip +Examples : + +\begin{center} +\example{\lstinline[language=Rfsm]'S0 -> S1 on top '} +\end{center} + +In the above example, the enclosing FSM switches from state \verb|S0| to state \verb|S1| when the +event \verb|top| occurs. + +\begin{center} +\example{\lstinline[language=Rfsm]'Idle -> Wait on Clic with ctr:=0, received'} +\end{center} + +In the above example, the enclosing FSM switches from state \verb|Idle| to state \verb|Wait|, resetting the internal variable + \verb|ctr| to 0 and emitting the event \verb|received| whenever an event occurs on its \verb|Clic| input. + +\begin{center} +\example{\lstinline[language=Rfsm]'Wait -> Wait on Top when ctr<8 with ctr:=ctr+1'} +\end{center} + +In the above example, the enclosing FSM stays in state \verb|Wait| but increments the internal +variable \verb|ctr| whenever an event \verb|Top| occurs and that, \emph{at this instant}, the +value of variable \verb|ctr| is smaller than 8. + +\medskip +Expressions may also involve the C-like ternary conditional operator \verb|?:|. +For example, in the example below, the enclosing FSM stays in state \verb|S0| but updates the variable \verb|k| +at each occurrence of event \verb|H| so that is incremented if its current value is less than 8 or +reset to 0 otherwise. + +\begin{center} +\example{\lstinline[language=Rfsm]'S0 -> S0 on H with k:=k<8?k+1:0'} +\end{center} + +\medskip +The set of actions may be empty. In this case, the transition is denoted : + +\begin{center} +\framebox{\lstinline[language=Rfsm]{src_state -> dst_state on ev when guard}} +\end{center} + +\subsubsection*{Semantic issues} +\label{sec:semantic-issues} + +\textbf{Sequential vs. synchronous actions}. +By default, actions are performed \emph{sequentially}, i.e. one after the other. +For example, if \verb|x| and \verb|y| are internal variables of the enclosing FSM and respectively +have values 1 and 0, then taking this transition + +\begin{center} +\example{\lstinline[language=Rfsm]'S0 -> S1 on H with x:=x+1, y:=x*2'} +\end{center} + +will assign them values 2 and 4 respectively, because the action \verb|x:=x+1| is performed before +the action \verb|y:=x*2|. + +This interpretation is the most intuitive one and naturally fits with software-based +implementations. There's actually another interpretation in which actions are not performed sequentially but +\emph{synchronously}. In this case, all the expressions appearing on the right-hand-side of +assignations are fisrt evaluated \emph{in parallel} and then, and only then, all the assignations +are performed. Because the values of the variables occuring in the RHS expressions are those +\emph{before} the transition, the order in which the actions are performed does not matter in this +case. In the example above, the values assigned to \texttt{x} and \texttt{y} will be 2 and 2 + respectively. This interpretation more naturally fits to \emph{hardware-based} implementations, +in which variables are implemented as \emph{signals} all updated synchronously at each clock cycle. +Switching to a synchronous interpretation is possible by invoking the \texttt{rfsmc} compiler with the +\texttt{-synchronous_actions} option. \textbf{Caveat}. This option is +available when using the simulator and the VHDL backend but is +currently not supported when using the C and SystemC backends. + +\medskip +\textbf{Non-determinism and priorities}. +The FSM models involved in programs should normally be \emph{deterministic}. In other words, a +situation where several transitions are enabled at the same instant should normally never arise. But +this condition may actually be difficult to enforce, especially for models reacting to several input +events. Consider for example, the model described in Listing~\ref{lst:rfsm-prio-pb}. This model +describes a (simplified) stopwatch. It starts counting seconds (materialized by event \verb|sec|) +as soon as event \verb|startstop| occurs and stops as soon as it occurs again. + +\begin{lstlisting}[language=Rfsm,frame=single,numbers=left,caption=A program showing a potentially non-deterministic + model,label={lst:rfsm-prio-pb},float] +fsm model chrono ( + in sec: event, + in startstop: event, + out aff: int) + { + states: Stopped, Running; + vars: ctr: int; + trans: + | Stopped -> Running on startstop with ctr:=0; aff:=0 + | Running -> Running on sec with ctr:=ctr+1; aff:=ctr + | Running -> Stopped on startstop; + itrans: + |-> Stopped; + } + +input StartStop: event = sporadic(25,70) +input H:event = periodic(10,10,110) +output Aff: int + +fsm c = chrono(H,StartStop,Aff) +\end{lstlisting} + +The problem is that if both events occur simultaneously then +both the transitions at line 10 and 11 are enabled. In fact, here's the error message produced by +the compiler when trying to simulate the above program : + +\small +\begin{verbatim} +Error when simulating FSM c: non deterministic transitions found at t=70: + - Running -- H / ctr:=ctr+1; aff:=ctr -> Running + - Running -- StartStop -> Stopped +\end{verbatim} +\normalsize + +Of course, this could be avoided by modifying the stimuli attached to input \verb|StartStop| so that +the \texttt{StartStop} and \texttt{H} events are never emitted at the same time. But this is, in a +sense, cheating, since the \texttt{StartStop} event is supposed to modelize user interaction which +occur, by essence, at impredictible dates. + +The above problem can be solved by assigning a \emph{priority} to transitions. In the current +implementation, this is achieved by tagging some transitions as ``high priority'' +transitions\footnote{Future versions may evolve towards a more sophisticated mechanism allowing + numeric priorities.}. When several transitions are enabled, if one is tagged as ``high priority'' +than it is automatically selected\footnote{If none (resp. several) is (resp. are) tagged, the + conflict remains, of course.}. + +Syntaxically, tagging a transition is simply achieved by replacing the leading ``\verb+|+'' by a +``\verb|!|''. In the +case of the example above, the modified program is given in +Listing~\ref{lst:rfsm-prio-solved}. Tagging the last transition is here equivalent to give to the +\verb|startstop| precedence against the \verb|h| event when the model is in state +\verb|Running|. + +\begin{lstlisting}[language=Rfsm,frame=single,numbers=left,caption=A rewriting of the model defined + in Listing~\ref{lst:rfsm-prio-pb}, label={lst:rfsm-prio-solved},float] +fsm model chrono (...) + { + ... + trans: + ... + | Running -> Running on sec with ctr:=ctr+1; aff:=ctr + ! Running -> Stopped on startstop -- This transition takes priority on the others + itrans: -> Stopped; + } +... +\end{lstlisting} + +\subsection{Initial transition} +\label{sec:initial-transition} + +The \verb|itrans:| section specifies the initial transition of the FSM. This transition is denoted~: + +\begin{center} +\framebox{\lstinline[language=Rfsm]{| -> init_state with actions}} +\end{center} + +where \emph{init\_state} is the initial state and \emph{actions} a list of actions to be performed +when initializing the FSM. The latter can be empty. in this case the initial transition is simply +denoted~: + +\begin{center} +\framebox{\lstinline[language=Rfsm]{| -> init_state}} +\end{center} + +\medskip +\textbf{Note}. Output values can be set by either attaching them to states or by updating them on +transitions. For a given output \texttt{o}, attaching a value \texttt{v} to a state \texttt{S}, by writing + +\begin{center} +\framebox{\lstinline[language=Rfsm]{states: S where o=v, ...}} +\end{center} + +is equivalent to adding the action + +\begin{center} +\framebox{\lstinline[language=Rfsm]{o:=v}} +\end{center} + +to each transition ending at state \texttt{S}. + +The compiler rejects models for which the value of an output is specified both with the former and +latter formulation. Stricly speaking, models for which the values specified by each formulation are +equivalent could be accepted, but this condition is statically undecidable in general (because +values assigned to outputs in transitions may depend of inputs). + + +\section{Inputs and outputs} +\label{sec:inputs-outputs} + +Interface to the external world are represented by \verb|input| and \verb|output| objects. + +\step For outputs the declaration simply gives a name and a type~: + +\begin{center} +\framebox{\lstinline[language=Rfsm]'output name : typ'} +\end{center} + +\step For inputs, the declaration also specifies the \textbf{stimuli} which are attached to the +corresponding input for simulating the system. +\begin{center} +\framebox{\lstinline[language=Rfsm]'input name : typ = stimuli'} +\end{center} + +There are three types of stimuli~: +periodic and +sporadic stimuli for inputs of type \verb|event| and value changes for scalar inputs. + +\medskip +Periodic stimuli are specified with a period, a starting time and an ending time. + +\begin{center} +\framebox{\lstinline[language=Rfsm]'periodic(period,t0,t1)'} +\end{center} + +Sporadic stimuli +are simply a list of dates at which the corresponding input event occurs. + +\begin{center} +\framebox{\lstinline[language=Rfsm]'sporadic(t1,...,tn)'} +\end{center} + +Value changes are given as +list of pairs \verb|t:v|, where \verb|t| is a date and \verb|v| the value assigned to the +corresponding input at this date. + +\begin{center} +\framebox{\lstinline[language=Rfsm]'value_changes(t1:v1,...,tn:vn)'} +\end{center} + +\medskip +Examples: + +\begin{center} +\example{\lstinline[language=Rfsm]'input Clk: event = periodic(10,10,120)'} +\end{center} + +The previous declaration declares \verb|Clk| as a global input producing periodic events with period 10, starting + at t=10 and ending at t=100\footnote{Note that, at this level, there's no need for an absolute + unit for time.}. + +\begin{center} +\example{\lstinline[language=Rfsm]'input Clic: event = sporadic(25,75,95)'} +\end{center} + +The previous declaration declares \verb|Clic| as a global input producing events at t=25, t=75 and + t=95. + +\begin{center} +\example{\lstinline[language=Rfsm]'input E : bool = value_changes (0:false, 25:true, 35:false)'} +\end{center} + +The previous declaration declares \verb|E| as a global boolean input taking value \texttt{false} at +t=0, \texttt{true} at t=25 and \texttt{false} again at t=35. + +\section{Shared objects} +\label{sec:shared} + +Shared objects are used to represent interconnexions between FSM instances. This situation only +occurs when the system model involves several FSM instances and when the input of a given instance +is provided by the output of another one. + +\step For shared objects the declaration simply gives a name and a type~: + +\begin{center} +\framebox{\lstinline[language=Rfsm]'shared name : typ'} +\end{center} + +\medskip +Examples: + +\begin{center} +\example{\lstinline[language=Rfsm]'shared done: event'} + +\example{\lstinline[language=Rfsm]'shared ctr: int'} +\end{center} + +The previous declarations declare \verb|done| as a shared event and \texttt{ctr} as a shared +variable of type \texttt{int}. + +\subsection*{Semantic issues} + +\medskip +Shared objects are typically used to perform some kind synchronisation between FSMs. The precise semantics +of this synchronisation depends on the shared object. It is described formally in Appendix D. + +\subsubsection*{Synchronisation using a shared event} +\label{sec:synchr-using-shar} + +Synchronisation using a shared event is both instantaneous and ephemeral. + +\textbf{Instantaneous} means that an event emitted by a FSM when taking a +transition can trigger a reaction of another FSM at the same logical instant, the two reactions -- that of +emitting FSM and that of the ``receiving'' FSM -- being simultaneous. +This is illustrated in Fig.~\ref{fig:sync-ev1}. Here, each occurence of event \texttt{H} when +\texttt{a1} is in state \texttt{A} triggers the simultaneous transition of \texttt{a2} from state +\texttt{A} to state \texttt{B}. + +\begin{figure}[h] + \centering +\begin{tabular}[c]{cc} + \begin{minipage}[b]{0.3\linewidth} + \begin{lstlisting}[language=Rfsm] +fsm model A1( + in h: event, + out e: event) +{ + states: A, B; + trans: + | A -> B on h with e + | B -> A on h; + itrans: + | -> A ; +} + +fsm model A2( + in h: event, + in e: event) +{ + states: A, B; + trans: + | A -> B on e + | B -> A on h; + itrans: + | -> A ; +} +\end{lstlisting} + \end{minipage} & + \begin{minipage}[b]{0.7\linewidth} +\begin{lstlisting}[language=Rfsm] +input H : event = sporadic(10,20,30,40) +shared e : event + +fsm a1 = A1(H,e) +fsm a2 = A2(H,e) +\end{lstlisting} +\includegraphics[width=0.5\textwidth]{figs/sync-ev1-model}\\ +\includegraphics[width=0.7\textwidth]{figs/sync-ev1-chrono} + \end{minipage} +\end{tabular} + \caption{Illustration of instantaneous synchronisation} + \label{fig:sync-ev1} +\end{figure} + +\medskip +\textbf{Ephemeral synchronisation} means that if an event emitted by a FSM when taking a +transition is not awaited by another FSM it is simply ``lost''. In other words, events are never +memorised. This is illustrated in Fig.~\ref{fig:sync-ev2}. In this example, the first occurence of +event \texttt{e} is lost because FSM \texttt{a2} is not waiting for it when it is emitted by FSM +\texttt{a1} at the first occurrence of event \texttt{H}. As a result, the transition of \texttt{a2} +from state \texttt{B} to state \texttt{C} only occurs at second occurrence of \emph{e}, when +\texttt{a2} is in state \texttt{B}. + +\begin{figure}[h] + \centering +\begin{tabular}[c]{cc} + \begin{minipage}[b]{0.3\linewidth} + \begin{lstlisting}[language=Rfsm] +fsm model A1( + in h: event, + out e: event) +{ + states: A, B, C; + trans: + | A -> B on h with e + | B -> C on h + | C -> A on h; + itrans: + | -> A ; +} + +fsm model A2( + in h: event, + in e: event) +{ + states: A, B, C; + trans: + | A -> B on h + | B -> C on e + | C -> A on h; + itrans: + | -> A ; +} + \end{lstlisting} + \end{minipage} & + \begin{minipage}[b]{0.7\linewidth} +\begin{lstlisting}[language=Rfsm] +input H : event = sporadic(10, 20, 30, 40, 50) +shared e : event + +fsm a1 = A1(H,e) +fsm a2 = A2(H,e) +\end{lstlisting} +\includegraphics[width=0.5\textwidth]{figs/sync-ev2-model}\\ +\includegraphics[width=0.7\textwidth]{figs/sync-ev2-chrono} + \end{minipage} +\end{tabular} + \caption{Illustration of ephemeral synchronisation} + \label{fig:sync-ev2} +\end{figure} + +\medskip \textbf{Note}. The semantics of event synchronisation described here is somehow related +to that of \emph{rendez-vous} supported by certain programming languages. But it is definitely not +equivalent. The latter enforces that \emph{both} transitions, the emitting and the +receiving one, are taken together. This means in particular that if there's no transition waiting +for the emitted event, the emitting transition will \emph{not} be taken (in other words, the source +FSM will block). This is not the case here. In this situation, and as explained above, the emitted +event will be simply ignored (``lost''). Emitting an event can never prevent a transition to be +taken in our semantics. + +\medskip \textbf{Implementation issues}. The semantics of events presented here is that implemented +by the \texttt{rfsmc} simulator. For various reasons, it may not fully supported all compiler +backends. The support of shared events in the SystemC backend, for example, is fragile and has not +yet fully tested\footnote{It relies on the insertion of zero-time \texttt{wait} instructions.}. It +is completely lacking in the VHDL backend (VHDL implementation of FSMs can only be triggered by a +single, ``external'' \texttt{clock} signal). Finally, the \emph{event} mechanism provided by most +of real-time operating systems (as abstracted by \verb|notify_ev()| and \verb|wait_ev()| +pseudo-primitives used in the code generated by the C backend) may not obey the semantics provided +here (most of OS-supported events are \emph{memorized} when they are not awaited for when emitted in +particular). The concept of event provided by the RSFM language must therefore be viewed as a basic +and abstract \emph{modeling} tool, to be refined afterwards at the implementation level. + +\subsubsection*{Synchronisation using shared variables} + +The semantics associated to shared variables is that +of \emph{instantaneous broadcast}. This means that any modification of the value of a shared variable by a +FSM is immediately viewed by the other FSMs. More precisely, if a reaction of a FSM modifies the +value of a shared value, the new value can enable, \emph{in the same global reaction}, the +transition of another FSM. This is illustrated in Fig.~\ref{fig:sync-sv1}. Here, both \texttt{a1} +and \texttt{a2} react to event \texttt{H}. When \texttt{a1} and \texttt{a2} are in state \texttt{S1} this is possible +only because the modification of the shared variable \texttt{v} made by \texttt{a1} is immediately +visible and hence can enable the transition of \texttt{a2}. + +\begin{figure}[h] + \centering +\begin{tabular}[c]{cc} + \begin{minipage}[b]{0.3\linewidth} + \begin{lstlisting}[language=Rfsm] +fsm model A1( + in h: event, + out v: bool) +{ + states: S1, S2; + trans: + | S1 -> S2 on h with v:=1 + | S2 -> S1 on h with v:=0; + itrans: + | -> S1 with v:=0; +} +fsm model A2( + in h: event, + in v: bool) +{ + states: S1, S2; + trans: + | S1 -> S2 on h when v=1 + | S2 -> S1 on h; + itrans: + | -> S1 ; +} + \end{lstlisting} + \end{minipage} & + \begin{minipage}[b]{0.7\linewidth} +\begin{lstlisting}[language=Rfsm] +input H : event = sporadic(10, 20, 30, 40) +shared V : bool + +fsm a1 = A1(H,V) +fsm a2 = A2(H,V) +\end{lstlisting} +\includegraphics[width=0.7\textwidth]{figs/sync-sv1-model} +\includegraphics[width=0.7\textwidth]{figs/sync-sv1-chrono} + \end{minipage} +\end{tabular} + \caption{Illustration of instantaneous broadcast of shared variables} + \label{fig:sync-sv1} +\end{figure} + +\bigskip Because shared variables are, by definition, memorized, they can used to implement +\emph{defered synchronisation}, \emph{i.e.} the situation where a FSM emits an event which be used +\emph{later} by another FSM (shared events cannot be used in this case since, as described above, +non-awaited events are not memorized and hence lost). This is illustrated in +Fig.~\ref{fig:sync-sv2}. Here, \texttt{a1} set variable \texttt{v} to 1 when going from state +\texttt{S1} to \texttt{S2} but \texttt{a2} only detect this when going from state \texttt{S2} to +\texttt{S3}, reseting the variable to 0 \emph{en passant}. In effect, \texttt{a1} has emitted a +event which has been memorized and caught latter by \texttt{a2}. + +\begin{figure}[h] + \centering +\begin{tabular}[c]{cc} + \begin{minipage}[b]{0.3\linewidth} + \begin{lstlisting}[language=Rfsm] +fsm model A1( + in h: event, + out v: bool) +{ + states: S1, S2, S3; + trans: + | S1 -> S2 on h with v:=1 + | S2 -> S3 on h + | S3 -> S1 on h; + itrans: + | -> S1 with v:=0; +} + +fsm model A2( + in h: event, + inout v: bool) +{ + states: S1, S2, S3; + trans: + | S1 -> S2 on h + | S2 -> S3 on h when v=1 with v:=0 + | S3 -> S1 on h; + itrans: + | -> S1 ; +} + \end{lstlisting} + \end{minipage} & + \begin{minipage}[b]{0.7\linewidth} +\begin{lstlisting}[language=Rfsm] +input H : event = sporadic(10, 20, 30) +shared v : bool + +fsm a1 = A1(H,v) +fsm a2 = A2(H,v) +\end{lstlisting} +\includegraphics[width=0.7\textwidth]{figs/sync-sv2-model} +\includegraphics[width=0.7\textwidth]{figs/sync-sv2-chrono} + \end{minipage} +\end{tabular} + \caption{Using a shared variable to implement memorized events} + \label{fig:sync-sv2} +\end{figure} + +\medskip \textbf{Implementation issues}. +The semantics of instantaneous broadcast for variables is the most intuitive one at the modelisation +level is the default one for simulation. However, and as for events, this semantics is not supported +by all compiler backends. + +For the SystemC backend, support of instantaneous broadcast is supported by means of +automatic insertion of zero-time delta-cycles and is therefore fragile. + +It is \emph{not} supported by the VHDL backend because shared variables are (currently) +implemented as \emph{shared signals}, for which any modification at a given cycle is only visible +at the next clock cycle. + +Shared variables are implemented as global variables by the C backend. When the +corresponding code is used to define concurrent tasks for a real-time operating system, the +instantaneous broadcast hypothesis cannot in general be assumed (because the delay separating writes +and reads of such a variable depends of the scheduler and cannot be predicted). + +% \medskip The \emph{instantaneous broadcast} interpretation can be replaced by a \emph{defered +% broadcast} one by calling the compiler with the \verb|-no_inst_bcast| option. Any modification to +% a shared variable made by a FSM during a reaction will then not be visible by other FSMs at the same +% reaction but at the next one. This is illustrated for example in Fig.~\ref{fig:sync-vp1b} which +% shows the simulation results of the program listed in Fig.~\ref{fig:sync-vp1} when passing this +% option to the compiler. Here, the modification of the shared variable \texttt{v} operated by the +% transition from \texttt{s1} to \texttt{s2} of \texttt{a1} is \emph{not} viewed by \texttt{a2} at the +% same occurrence of the \texttt{H} event, but only at the next one. + +% \begin{figure}[htbp] +% \centering +% \includegraphics[width=0.6\textwidth]{figs/sync-vp1b} +% \caption{Simulation results for the program of Fig.~\ref{fig:sync-vp1} when disabling the +% instantaneous broadcast interpretation} +% \label{fig:sync-vp1b} +% \end{figure} + +% The \verb|-no_inst_bcast| option is supported both by the SystemC and VHDL backend. When using the +% latter, it makes the simulation result obtained by the VHDL simulator identical to those obtained by +% the simulator. + +\section{FSM instances} +\label{sec:fsm-instances} + +The description of the system is carried out by instanciating +%-- and, possibly, inter-connecting -- +previously defined FSM models. + +\medskip +Instanciating a model creates a copy of the corresponding FSM for which +\begin{itemize} +\item the parameters of the model are bound to their actual value, +\item the declared inputs and outputs are connected to global inputs, outputs or shared + objects. +\end{itemize} + +\medskip +The syntax for declaring a model instance is as follows~: + +\begin{center} +\framebox{\lstinline[language=Rfsm]'fsm inst_name = model_name(actual_ios)'} +\end{center} + +where +\begin{itemize} +\item \emph{inst\_name} is the name of the created instance, +\item \emph{model\_name} is the name of the instanciated model, +\item \emph{param\_values} is a comma-separated list of values to be assigned to the formal + (generic) parameters, +\item \emph{actual\_ios} is a comma-separated list of global inputs, outputs or shared objects to be + connected to the instanciated model. +\end{itemize} + +Binding of parameter values and IOs is done by position. Of course the number and respective types +of the formal and actual parameters (resp. IOs) must match. + +\medskip +For example, the last line of the program given in Listing~\ref{lst:rfsm-gensig} + +\begin{center} +\example{\lstinline[language=Rfsm]'fsm g = gensig<4>(H,E,S)'} +\end{center} + +creates an instance of model \verb|gensig| for which \verb|n=4| and whose inputs (resp. output) are +connected to the global inputs (resp. output) \texttt{H} and \texttt{E} (resp. \texttt{S}). + +\medskip +In the current version, paramater values are limited to scalar values (\texttt{int}s, +\texttt{bool}s, \texttt{char}s and \texttt{float}s). + +% For example, provided that globals \verb|Top|, \verb|Clic|, \verb|SimpleClic| and \verb|DoubleClic| +% have been previously declared with the correct type, writing + +% \begin{lstlisting}[language=Rfsm,frame=single,basicstyle=\small] +% fsm c1 = ctlr<5>(Top,Clic,SimpleClic,DoubleClic) +% \end{lstlisting} + +% will create an instance of the FSM model described in +% Fig.~\pageref{fig:fsm-model-ex} named \verb|c1| and for which \verb|D=5|. + +\section{Constants} +\label{sec:constants} + +Global constants can be defined using the following syntax~: + +\begin{center} +\framebox{\lstinline[language=Rfsm]|constant name : = |} +\end{center} + +\noindent +where +\begin{itemize} +\item \lstinline[language=Rfsm]|| is the type of the defined constant (currently limited to + \verb|int|, \verb|bool|, \verb|char|, \verb|float| and arrays of such types, +\item \lstinline[language=Rfsm]|| is the value of the constant. +\end{itemize} + +Global constants have a global scope and hence can be used in any FSM model or instance. + +\section{Functions} +\label{sec:functions} + +Conditions and actions associated to FSM transitions can use globally defined functions. An example +is given in listing~\ref{lst:rfsm-heron}\footnote{This example can be found in directory + \texttt{examples/std/single/heron} in the distribution.}. The FSM described here computes an approximation +of the square root of its input \verb|u| using Heron's classical algorithm. Successive approximations are computed in +state \verb|Iter| and the end of computation is detected when the square of the current +approximation \verb|x| differs from the argument (\verb|a|) from less than a given threshold +\verb|eps|. For this, the model uses the global function \verb|f_abs| defined at the beginning of +the program. This function computes the absolute value of its argument and is used twice in the +definition of the FSM model \verb|heron|, for defining the condition associated to the two +transitions going out of state \verb|Iter|. + +\begin{lstlisting}[language=Rfsm,frame=single,numbers=left,caption=An RFSM program using a global + function definition,label={lst:rfsm-heron},float] +function f_abs(x: float) : float { return x < 0.0 ? -.x : x } + +fsm model heron( + in h: event, + in start: bool, + in u: float, + out rdy: bool, + out niter: int, + out r: float) +{ + states: Idle where rdy=1, Iter where rdy=0; + vars: a: float, x: float, n: int; + trans: + | Idle -> Iter on h when start=1 with a:=u, x:=u, n:=0 + | Iter -> Iter on h when f_abs((x*.x)-.a)>=eps with x:=(x+.a/.x)/.2., n:=n+1 + | Iter -> Idle on h when f_abs((x*.x)-.a) Idle; +} + +input H : event = periodic (10,10,200) +input U : float = value_changes (5:2.0) +input Start : bool = value_changes (0:0, 25:1, 35:0) +output Rdy1, Rdy2 : bool +output R1, R2 : float +output Niter : int + +fsm h = heron<0.00000001> (H,Start,U,Rdy2,Niter,R2) +\end{lstlisting} + +\medskip +\step The general form for a function definition is + +\begin{center} +\framebox{\lstinline[language=Rfsm]| function name (:, ..., :)\ :\ \{ return \}|} +\end{center} + +\noindent +where +\begin{itemize} +\item \lstinline[language=Rfsm]|| (resp. \lstinline[language=Rfsm]||) is the name + (resp. type) of the i$^{th}$ argument, +\item \lstinline[language=Rfsm]|| is the type of value returned by the function, +\item \lstinline[language=Rfsm]|| is the expression defining the function value. +\end{itemize} + +\medskip +\step Functions can only return one result and cannot use local variables. There are therefore more +like \emph{macros} in the C language and are typically used to improve readability of the programs. + +\section{Types and type declarations} +\label{sec:types} + +Types present in RFSM programs belong to two categories~: builtin types and user defined types. + +\medskip +\textbf{Builtin types} are : \texttt{bool}, \texttt{int}, \texttt{float}, \texttt{char}, \texttt{event} and +\texttt{array}s. + +\medskip +\step Objects of type \texttt{bool} can have only two values : \texttt{0} (false) and \texttt{1} (true). + +\step Values of type \texttt{char} are +denoted using single quotes. For example, for a variable \verb|c| having type \verb|char| : +\begin{center} + \example{\lstinline[language=Rfsm]|c := 'A'|} +\end{center} +They can be converted from/to they internal representation as integers using the "\verb|::|" \emph{cast} +operator. For example, if \verb|c| has type \verb|char| and \verb|n| type \verb|int|, then +\begin{center} + \example{\lstinline[language=Rfsm]|n := 'A'::int; c:=(n+1)::char|} +\end{center} +assigns value 65 to \verb|n| (ASCII code) and, then, value \verb|'B'| to \verb|c|. + +% \begin{table}[h] +% %\begin{minipage}[c]{1.0\linewidth} +% \small +% \begin{center} +% \begin{tabular}{|l|l|} \hline +% {\tt int} & {\tt + - * / mod = != > < >= <=} \\ \hline +% {\tt bool} & {\tt = !=} \\ \hline +% {\tt enumeration} & {\tt = !=} \\ \hline +% \end{tabular} +% \caption{Operations on types} +% \label{tab:type-ops} +% \end{center} +% %\end{minipage} +% \end{table} + +\medskip +\step The type \texttt{int} can be refined using a \emph{size} or a \emph{range annotation}. The +type \verb|int|, where \verb|sz| is an integer, is the type of integers which can be encoded using +\verb|n| bits. The type \verb|int|, where both \verb|min| and \verb|max| are integers, is +the type of integers whose value ranges from \verb|min| to \verb|max|. The size and range limits, +can be given as litteral constants (ex: \verb|8|) or as parameter values\footnote{Provided, of + course, that the corresponding parameter as type \texttt{int}.}, as for the type of the +variable \texttt{k} in Listing~\ref{lst:rfsm-gensig}. + +\medskip +\step Supported operations on values of type \texttt{int} are described in Table~\ref{tab:int-ops}. +If \verb|n| is an integer and \verb|hi| (resp. \verb|lo|) an integer expression then \verb|n[hi:lo]| +designates the value represented by the bits \verb|hi|...\verb|lo| in the binary representation of +\verb|n|. Bit ranges can be both read (ex: \verb|x=y[6:2]|) or written (ex: \verb|x[8:4]:=0|). The +syntax \verb|n[i]|, where \verb|n| is an integer is equivalent to \verb|n[i:i]|. The \emph{cast} +operator (\verb|::|) can be used to combine integers with different sizes (for example, if \verb|n| +has type \verb|int<16>| and \verb|m| has type \verb|int<8>|, writing \verb|n:=n+m| is not allowed +and mus be written, instead, \verb|n:=n+m::int<16>|. Note that the +logical ``or'' operator is denoted ``\verb+||+'' because the single ``\verb+|+'' is already used in +the syntax. + +\begin{table}[h] +\begin{center} +\begin{tabular}{|l|l|} \hline +\verb|+|, \verb|-|, \verb|*|, \verb|/|, \verb|%| (modulo) & arithmetic operations \\ \hline +\verb|>>|, \verb|<<| & (logical) shift right and left \\ \hline +\verb|&|, \verb+||+, \verb|^| & bitwise and, or and xor \\ \hline +\verb|[.:.]| & bit range extraction (ex: \verb|n:=m[5:3]|) \\ \hline +\verb|[.]| & single bit extraction (ex: \verb|b:=m[4]|) \\ \hline +\verb|::| & resize (ex: \verb|n::int<8>|) \\ \hline +\end{tabular} +\caption{\label{tab:int-ops}Builtin operations on integers} +\end{center} +\end{table} + +\medskip +\step The operations on values of type \texttt{float} are : "\verb|+.|", "\verb|-.|", "\verb|*.|" and +"\verb|/.|" (the dot suffix is required to distinguish them from the corresponding operations on +\texttt{int}s). + +\medskip +\step Arrays are 1D, fixed-size collections of \verb|int|s, \verb|bool|s, \verb|char|s or \verb|float|s. Indices +range from 0 to \verb|n-1| where \verb|n| is the size of the array. For example, + \verb|int array[4]| is the type describing arrays of four integers. If \verb|t| is an object + with an array type, its cell with index $i$ is denoted \verb|t[i]|. + +\bigskip +\textbf{User defined types} are either \emph{type abbreviations}, \emph{enumerations} or +\emph{records}. + +\step Type abbreviations are introduced with the following declaration +\begin{center} + \framebox{\lstinline[language=Rfsm]{type typename = type_expression}} +\end{center} +Each occurrence of the defined type in the program is actually substituted by the corresponding type +expression. +% Type expressions in type abbreviations are currently limited to builtin types. + +\medskip +\step Enumerated types are introduced with the following declaration +\begin{center} + \framebox{\lstinline[language=Rfsm]|type typename = enum \{ C1, ..., Cn \}|} +\end{center} +where \verb|C1|, \ldots, \verb|Cn| are the enumerated values, each being denoted by an identifier +starting with an uppercase letter. For example : +\begin{center} + \example{\lstinline[language=Rfsm]|type color = \{ Red, Green, Orange \}|} +\end{center} + +\medskip +\step Record types are introduced with the following declaration +\begin{center} + \framebox{\lstinline[language=Rfsm]|type typename = record \{ fid1: ty1, ..., fidn: tyn \}|} +\end{center} +where \verb|fid1|, \ldots, \verb|fidn| and \verb|ty1|, \ldots, \verb|tyn| are respectively the name +and type of each record field For example : +\begin{center} + \example{\lstinline[language=Rfsm]|type coord = record \{ x: int, y: int\}|} +\end{center} + +Individual fields of a value with a record type can be accessed using the classical ``dot'' +notation. For example, with a variable \verb|c| having type \verb|record| as defined above : +\begin{center} + \example{\lstinline[language=Rfsm]|c.x := c.x+1|} +\end{center} + +% \medskip The listing in Fig.~\ref{fig:fsm-model-ex} gives an example of a FSM model declaration. The +% declared model is that of a simplified mouse controler. It has two inputs, \verb|Top| and +% \verb|Clic|, and two outputs, \verb|SimpleClic| and \verb|DoubleClic|. All inputs an and outputs are +% of type \verb|event|. Input \verb|Top| is here supposed to be periodic and hence provide an time +% base. Whenever an event occurs on the input \verb|Clic|, an event is emitted either on +% \verb|DoubleClic| or \verb|SimpleClic| depending on whether the \verb|Clic| event is followed by +% another before \verb|D| events occur on the \verb|Top| input, where \verb|D| is a parameter of the +% model. The description of the behavior employs two states, named \verb|Idle| and \verb|Wait|, an +% internal variable, \verb|ctr|, and four transitions rules, listed in the \verb|trans:| section. The +% first rules says that a transition from state \verb|Idle| to state \verb|Wait| happens whenever and +% event occurs on input \verb|Clic| and that the internal variable \verb|ctr| is then reset to 0. The +% second rule says that a transition from state \verb|Wait| to state \verb|Idle| happens whenever and +% event occurs on input \verb|Clic| and that an event is then emitted on output \verb|DoubleClic|. The +% third rule says that a transition from state \verb|Wait| to itself happens whenever and event occurs +% on input \verb|Top| provided that, at this instant, the value of variable \verb|ctr| is less than +% \verb|D-1|. The variable \verb|ctr| is then incremented. The fourth and last rule says that a +% transition from state \verb|Wait| to state \verb|Idle| happens, emitting an event on output +% \verb|SimpleClic|, whenever and event occurs on input \verb|Top| and that, at this instant, the +% value of variable \verb|ctr| is equal to \verb|D-1|. Finally, the initial transition, given after +% the keyword \verb|itrans:| designates the state \verb|Idle| as the initial state (with no associated +% action here). + +% A graphical representation of this FSM is given on the right in Fig.~\ref{fig:fsm-model-ex} (this +% diagram has been automatically generated by the RFSM compiler, as explained in +% Chap.~\ref{chap:using}). + +% \begin{figure}[t] +% \begin{minipage}[b]{0.6\linewidth} +% \centering +% \begin{lstlisting}[language=Rfsm,frame=single,basicstyle=\small] +% fsm model ctlr ( +% in Top: event, +% in Clic: event, +% out SimpleClic: event, +% out DoubleClic: event) +% { +% states: Idle, Wait; +% vars: ctr: int<0..D>; +% trans: +% Idle -- Clic | ctr:=0 -> Wait, +% Wait -- Clic | DoubleClic -> Idle, +% Wait -- Top.ctr Wait, +% Wait -- Top.ctr=D-1 | SimpleClic -> Idle; +% itrans: -> Idle; +% } +% \end{lstlisting} +% \end{minipage} +% \begin{minipage}[b]{0.4\linewidth} +% \includegraphics[height=5cm]{figs/mousectlr-dot} +% \centering +% \end{minipage} +% \hfill +% \caption{Example of an FSM model description (with its graphical representation)} +% \label{fig:fsm-model-ex} +% \end{figure} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "rfsm_um" +%%% End: diff --git a/docs/user_manual/overview.tex b/docs/user_manual/overview.tex new file mode 100644 index 00000000..63315d02 --- /dev/null +++ b/docs/user_manual/overview.tex @@ -0,0 +1,356 @@ +\chapter{Overview} +\label{cha:overview} + +This chapter gives informal introduction to the RFSM language and of how to use it to describe +FSM-based systems. + +\medskip +Listing~\ref{lst:rfsm-gensig} is an example of a simple RFSM program\footnote{This program is + provided in the distribution, under directory \texttt{examples/std/single/gensig}.}. This program is +used to describe and simulate the model of a calibrated pulse generator. Given an input clock +\verb|H|, with period $T_H$, it generates a pulse of duration $n \times T_H$ whenever input +\texttt{E} is set when event $H$ occurs. + +\begin{lstlisting}[language=Rfsm,frame=single,numbers=left,caption=A simple RFSM + program,label={lst:rfsm-gensig}] +@\label{gensig-1a}@fsm model gensig ( + in h: event, + in e: bool, + out s: bool) +{ +@\label{gensig-1}@ states: E0, E1; +@\label{gensig-3}@ vars: k: int<1:n>; + trans: + | E0 -> E1 on h when e=1 with k:=1, s:=1 +@\label{gensig-4}@ | E1 -> E1 on h when k E0 on h when k=n with s:=0; + itrans: + | -> E0 with s:=0; +@\label{gensig-1b}@} + +@\label{gensig-2a}@input H : event = periodic (10,0,80) +input E : bool = value_changes (0:0, 25:1, 35:0) +@\label{gensig-2b}@output S : bool + +@\label{gensig-6}@fsm g = gensig<3>(H,E,S) +\end{lstlisting} + +\medskip +The program can be divided in four parts. + +\medskip The first part (lines \ref{gensig-1a}--\ref{gensig-1b}) gives a \textbf{generic model} of +the generator behavior. The model, named \verb|gensig|, has one parameter, \verb|n|, two inputs, +\verb|h| and \verb|e|, of type \verb|event| and \verb|bool| respectively, and one output \verb|s| of +type \verb|bool|. Its behavior is specified as a reactive FSM with two states, \verb|E0| and +\verb|E1|, and one internal variable \verb|k|. The transitions of this FSM are given after the +\verb|trans:| keyword in the form : +\begin{center} + \framebox{\lstinline[language=Rfsm]{| source_state -> destination_state on ev when guard with actions}} +\end{center} +where +\begin{itemize} +\item \emph{ev} is the event trigerring the transition, +\item \emph{guard} is a set of (boolean) conditions, +\item \emph{actions} is a set of actions performed when the transition is enabled. +\end{itemize} + +The semantics is that the transition is enabled +whenever the FSM is in the source state, the event \emph{ev} occurs and all the conditions in the +guard are true. The associated actions +are then performed and the FSM moves to the destination state. For example, the first transition is +enabled whenever an event occurs on input \verb|h| and, at this instant, the value of input \verb|e| +is 1. The FSM then goes from state \verb|E0| to state \verb|E1|, sets its internal variable +\verb|k| to 1 and its output \verb|s| to 1\footnote{Boolean values \texttt{true} and \texttt{false} can + be denoted 1 and 0 respectively in programs.}. + +\medskip +The \emph{initial transition} of the FSM is given +after the \verb|itrans:| keyword in the form : +\begin{center} + \framebox{\lstinline[language=Rfsm]{| -> initial_state with actions}} +\end{center} +Here the FSM is initially in state \verb|E0| and the output \verb|s| is set to 0. + +\medskip +\textbf{Note}. In the transitions, the \lstinline[language=Rfsm]{when guard} and +\lstinline[language=Rfsm]{with actions} are optional and may be omitted. + +\medskip +A graphical representation of the \verb|gensig| model is given in +Fig.~\ref{fig:rfsm-gensig-model} (this representation was automatically generated from the +program in Listing~\ref{lst:rfsm-gensig}, as explained in Chap.~\ref{cha:rfsmc}). + +\begin{figure}[!h] + \includegraphics[height=9cm]{figs/gensig-model} + \centering + \caption{A graphical representation of FSM model defined in Listing~\ref{lst:rfsm-gensig}} + \label{fig:rfsm-gensig-model} +\end{figure} + +Note that, at this level, the value of the parameter \verb|n|, used in the type of the internal +variable \verb|k| (line~\ref{gensig-3}) and in the transition conditions (lines \ref{gensig-4} and +\ref{gensig-5}) is left unspecified, making the \verb|gensig| model a \emph{generic} one. + +\medskip The second part of the program (lines \ref{gensig-2a}--\ref{gensig-2b}) lists \textbf{global inputs and + outputs}. +% \footnote{In case of multi-FSM programs, this part will also contains the declaration of +% \emph{shared} events and variables. See Sec.~\ref{sec:globals}.}. +For global outputs the +declaration simply gives a name and a type. For global inputs, the declaration also specifies the +\textbf{stimuli} which are attached to the corresponding input for simulating the system. The +program of Listing~\ref{lst:rfsm-gensig} uses two kinds of stimuli\footnote{See + Sec.~\ref{sec:inputs-outputs} for a complete description of stimuli.}. The stimuli attached to input +\verb|H| are declared as \emph{periodic}, with a period of 10 time units, a start time of 0 and a +end time of 80. This means than an event will be produced on this input at time 0, 10, 20, 30, 40, +50, 60, 70 and 80. The stimuli attached to input \verb|E| say that this input will respectively take +value 0, 1 and 0 at time 0, 25 and 35 (thus producing a ``pulse'' of duration 10 time units starting +at time 25). + +\medskip +The third and last part of the program (line~\ref{gensig-6}) consists in building the global model of the system by +\emph{instanciating} the FSM model(s). +Instanciating a model creates a ``copy'' of this model for which +\begin{itemize} +\item the generic parameters (\verb|n| here) are now bound to actual values (3 here), +\item the inputs and outputs are connected to the global inputs or outputs. +\end{itemize} + +\medskip +A graphical representation of the system described in Listing~\ref{lst:rfsm-gensig} is given in +Fig.~\ref{fig:rfsm-gensig-top}\footnote{Again, this representation was actually automatically generated from the +program in Listing~\ref{lst:rfsm-gensig}, as explained in Chap.~\ref{cha:rfsmc}.}. + +\begin{figure}[!h] + \includegraphics[height=7cm]{figs/gensig-top} + \centering + \caption{A graphical representation of system described in Listing~\ref{lst:rfsm-gensig}} + \label{fig:rfsm-gensig-top} +\end{figure} + +\section*{Simulating} +\label{sec:simulating-1} + +Simulating the program means computing the reaction of the system to the input stimuli. Simulation +can be performed by the RFSM command-line compiler as described in chapter~\ref{cha:rfsmc}. +It produces a set of +\emph{traces} in VCD (Value Change Dump) format which can visualized using \emph{waveform viewers} +such as \texttt{gtkwave}. Some simulation results for the program in Listing~\ref{lst:rfsm-gensig} +are showed in Fig.~\ref{fig:rfsm-gensig-chrono}. + +\begin{figure}[!h] + \includegraphics[width=\textwidth]{figs/gensig-chrono} + \centering + \caption{Simulation results for the program in Listing~\ref{lst:rfsm-gensig}, viewed using + \texttt{gtkwave}} + \label{fig:rfsm-gensig-chrono} +\end{figure} + +\section*{Code generation} +\label{sec:code-generation-1} + +RFSM can also generate code implementing the described systems simulation and/or +integration to existing applications. + +\medskip +Currently, three backends are provided : +\begin{itemize} +\item a backend generating a C-based implementation of each FSM instance, +\item a backend generating a \emph{testbench} implementation in SystemC (FSM instances + stimuli + generators), +\item a backend generating a \emph{testbench} implementation in VHDL (FSM instances + stimuli + generators). +\end{itemize} + +\medskip +The target language for the C backend is a C-like language augmented with +\begin{itemize} +\item a \verb|task| keyword for naming generated behaviors, +\item \verb|in|, \verb|out| and \verb|inout| keywords for identifying inputs and outputs, +\item a builtin \verb|event| type, +\item primitives for handling events : \verb|wait_ev()|, \verb|wait_evs()| and + \verb|notify_ev()|. +\end{itemize} +The idea is that the generated code can be turned into an application for a multi-tasking operating +system by providing actual implementations of the corresponding constructs and primitives. + +\medskip +For the SystemC and VHDL backends, the generated code can actually be compiled and executed for +simulation purpose and. The FSM implementations generated by the VHDL backend can also be +synthetized to be implemented on hardware using hardware-specific tools\footnote{We use the + \textsc{quartus} toolchain from Intel/Altera.}. + +\medskip +Appendices C1, C2 and C3 respectively give the C and SystemC code generated from the example in +Listing~\ref{lst:rfsm-gensig}. + +\section*{Variant formulation} +\label{sec:variant-formulation} + +In the automata described in Fig.~\ref{fig:rfsm-gensig-model} and Listing~\ref{lst:rfsm-gensig}, the +value of the \texttt{s} output is specified by indicating how it changes when transitions are taken +(including its initialisation). This is typical of a so-called \emph{Mealy}-style description. In +some cases, it is possible -- and maybe simpler -- to indicate which value this output takes for +each state. A equivalent description of that given +in Listing~\ref{lst:rfsm-gensig} is obtained, for example, by specifying that \texttt{s} is 0 +whenever the FSM is in state \texttt{E0} and 1 whenever it is in state \texttt{E1}. +This style of description, often called +\emph{Moore}-style, is illustrated in Fig.~\ref{fig:rfsm-gensig-moore}. The value of the \texttt{s} +output is here attached to states using the \texttt{where} clause in the declarations of states. + +\begin{figure}[htbp] + \centering + \begin{tabular}[c]{cc} +\includegraphics[width=0.4\textwidth]{figs/gensig-model-moore} & +\begin{minipage}[b]{0.6\textwidth} +\begin{lstlisting}[language=Rfsm] +fsm model gensig ( + in h: event, + in e: bool, + out s: bool) +{ + states: E0 where s=0, E1 where s=1; + vars: k: int<1:n>; + trans: + | E0 -> E1 on h when e=1 with k:=1 + | E1 -> E1 on h when k E0 on h when k=n + itrans: + | -> E0 with s:=0 +} +\end{lstlisting} +\end{minipage} + \end{tabular} + \caption{A reformulation of the model given in Listing~\ref{lst:rfsm-gensig} and + Fig.~\ref{fig:rfsm-gensig-model} using Moore-style} + \label{fig:rfsm-gensig-moore} +\end{figure} + +\medskip \textbf{Note}. The \texttt{rfsmc} compiler automatically transforms models using +Moore-style descriptions models using only Mealy-style ones. + +% This option is +% automatically inserted when simulating a system\footnote{\emph{I.e.} simulation is always performed +% on Mealy-style FSMs.}. + +\section*{Multi-FSM models} +\label{sec:multi-fsm-models} + +It is of course possible to describe systems composed of several FSM instances. + +\medskip +A first example is given in Listing~\ref{lst:rfsm-cntmod8} and Fig.~\ref{fig:rfsm-cntmod8}. The system is a simple modulo 8 counter, here +described as a combination of three event-synchronized modulo 2 counters\footnote{This program is + provided in the distribution, under directory \texttt{examples/std/multi/ctrmod8}.}. + +Here a single FSM model (\texttt{cntmod2}) is instanciated thrice, as \texttt{C0}, \texttt{C1} and +\texttt{C2}. These instances are synchronized using two \textbf{shared events}, \texttt{R0} and \texttt{R1}. +Shared events perform \emph{instantaneous synchronisation}. When a FSM \emph{emits} such an event, all transitions +triggered by this event are taken, simultaneously with the emitting transition. In the system +described in Fig.~\ref{fig:rfsm-cntmod8}, for example, the transition of \texttt{C0} +(resp. \texttt{C1}) from \texttt{E1} to \texttt{E0} occurs triggers the simultaneous transition of +\texttt{C1} (resp. \texttt{C2) }from \texttt{E0} to \texttt{E1} and, latter of \texttt{C1} +(resp. \texttt{C2}) from \texttt{E1} to \texttt{E0}. + +\begin{figure} + \centering +\includegraphics[width=\textwidth]{figs/ctrmod8-top} + \caption{Graphical representation of the program of Listing~\ref{lst:rfsm-cntmod8}} + \label{fig:rfsm-cntmod8} +\end{figure} + +\begin{minipage}[c]{0.95\textwidth} +\begin{lstlisting}[frame=single,language=Rfsm, + caption={A program involving three FSM instances synchronized by a shared event}, + label={lst:rfsm-cntmod8}] +fsm model cntmod2( + in h: event, + out s: bool, + out r: event) +{ + states: E0 where s=0, E1 where s=1; + trans: + | E0 -> E1 on h + | E1 -> E0 on h with r; + itrans: + | -> E0; +} + +input H: event = periodic(10,10,100) +output S0, S1, S2: bool +output R2: event +shared R0, R1: event + +fsm C0 = cntmod2(H,S0,R0) +fsm C1 = cntmod2(R0,S1,R1) +fsm C2 = cntmod2(R1,S2,R2) +\end{lstlisting} +\end{minipage} + +\pagebreak +Simulation results for this program are given in Fig.~\ref{fig:rfsm-cntmod8-vcd}. + +\begin{figure} + \includegraphics[width=0.9\textwidth]{figs/ctrmod8-chrono} + \centering + \caption{Simulation results for the program in Listing~\ref{fig:rfsm-cntmod8}} + \label{fig:rfsm-cntmod8-vcd} +\end{figure} + +\bigskip FSM instances can also interact by means of \textbf{shared variables}. This is illustrated +in Listing~\ref{lst:rfsm-shvar} and Fig.~\ref{fig:rfsm-shvar}\footnote{This program is provided in + the distribution, under directory \texttt{examples/multi/synv_vp/ex5}.}. FSM \texttt{a1} +repeatedly writes the shared variable \texttt{c} at each event \texttt{h} so that it takes values 1, +2, 3, 4, 1, 2, \emph{etc}. FSM \texttt{a2} observes this variable also at each event \texttt{h} and +simply goes from state \texttt{S1} to state \texttt{S2} (resp. \texttt{S2} to \texttt{S1}) when the +observed value is 4 (resp. 1). + +\begin{lstlisting}[frame=single,language=Rfsm,caption={A program involving two FSM instances and a + shared variable},label={lst:rfsm-shvar}] +fsm model A1( in h: event, inout v: int) +{ + states: S1, S2; + trans: + | S1 -> S2 on h with v:=1 + | S2 -> S2 on h when v<4 with v:=v+1 + | S2 -> S1 on h when v=4; + itrans: + | -> S1 with v:=0; +} + +fsm model A2( in h: event, in v: int) +{ + states: S1, S2; + trans: + | S1 -> S2 on h when v=4 + | S2 -> S1 on h when v=1; + itrans: + | -> S1 ; +} + +input h : event = periodic(10,10,100) +shared c : int +fsm a1 = A1(h,c) +fsm a2 = A2(h,c) +\end{lstlisting} + +\begin{figure} + \centering +\includegraphics[width=0.8\textwidth]{figs/shvar-top} + \caption{Graphical representation of the program of Listing~\ref{lst:rfsm-shvar}} + \label{fig:rfsm-shvar} +\end{figure} + +Simulation results for this program are given in Fig.~\ref{fig:rfsm-shvar-vcd}. + +\begin{figure} + \includegraphics[width=0.95\textwidth]{figs/shvar-chrono} + \centering + \caption{Simulation results for the program in Listing~\ref{fig:rfsm-shvar}} + \label{fig:rfsm-shvar-vcd} +\end{figure} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "rfsm_um" +%%% End: diff --git a/doc/user_manual/rfsm_um.pdf b/docs/user_manual/rfsm_um.pdf similarity index 100% rename from doc/user_manual/rfsm_um.pdf rename to docs/user_manual/rfsm_um.pdf diff --git a/docs/user_manual/rfsm_um.tex b/docs/user_manual/rfsm_um.tex new file mode 100755 index 00000000..3568c08a --- /dev/null +++ b/docs/user_manual/rfsm_um.tex @@ -0,0 +1,112 @@ +\documentclass[a4paper]{report} + +\usepackage{amsmath,amssymb,stmaryrd,latexsym} +\usepackage{titlepic} +\usepackage{syntax} +\usepackage{multicol} +\usepackage{alltt} +\usepackage{graphicx} % Including Graphics +%\usepackage{verbatim} +\usepackage{spverbatim} +\usepackage{alltt} +\usepackage{xspace} +\usepackage{listings} +\usepackage{ifthen} +\usepackage{adjustbox} +\usepackage{xhfill}% http://ctan.org/pkg/xhfill +\usepackage{color} +\usepackage{fancybox} +\usepackage{fancyvrb} +\usepackage{fixltx2e} +\usepackage[multiple]{footmisc} +\usepackage{url} + +\newsavebox{\FVerbBox} +\newenvironment{FVerbatim} + {\VerbatimEnvironment + \begin{center} + \begin{lrbox}{\FVerbBox} + \begin{BVerbatim}} + {\end{BVerbatim} + \end{lrbox} + \fbox{\usebox{\FVerbBox}} + \end{center}} + +\newboolean{devel} +\setboolean{devel}{true} + +\lstloadlanguages{C++,VHDL} +\lstset{frameround=tttt} +\lstset{captionpos=t} +\lstset{breaklines=true} +\lstset{escapechar=@} +%\lstset{aboveskip=2\medskipamount} +%\lstset{belowskip=1.5\medskipamount} +%\lstset{abovecaptionskip=\medskipamount} +\lstdefinelanguage{Rfsm}{keywords={type,enum,record,function,return,fsm,model,in,out,inout,vars,states,trans,itrans,on,when,with,periodic,sporadic,value_changes,event,bool,input,output,shared,where,and},morecomment=[l]{--}} +\lstdefinelanguage{ctask}{language=C,morekeywords={task,wait_ev,wait_evs,notify_ev,in,out,inout}} +\lstdefinelanguage{systemc}{language=C++,morekeywords={SC_MODULE,SC_METHOD,SC_THREAD,sc_in,sc_out,sc_inout}} + +%%% Better hyphenation: +%\sloppy +\setlength{\topmargin}{0pt} +\setlength{\oddsidemargin}{0pt} +\setlength{\textheight}{600pt} +\setlength{\textwidth}{448pt} + +%\Newcommand{\docdate}{\today} %%%!!!! +\newcommand{\step}{\noindent\medskip$\blacktriangleright$\xspace} + +\newcommand{\version}{2.0} + +\newcommand{\ie}{\emph{i.e.}\xspace} +\newcommand{\txt}[1]{\hbox{#1}} +\newcommand{\emtxt}[1]{\hbox{\em{#1}}} +\newcommand{\bftxt}[1]{\hbox{\bf{#1}}} +\ifthenelse{\boolean{devel}}{\newcommand{\note}[1]{\marginpar{\tiny #1}}}{\newcommand{\note}[1]{}} +\newcommand{\todo}[1]{\note{TODO: #1}} +\newcommand{\tofix}[1]{\note{TOFIX: #1}} +\ifthenelse{\boolean{devel}}{\newcommand{\tbw}[1]{$\spadesuit$ {\bf To be written\ldots}\xspace}}{\newcommand{\tbw}[1]{}} +\ifthenelse{\boolean{devel}}{\newcommand{\tbc}[1]{$\spadesuit$ {\bf To be continued\ldots}\xspace}}{\newcommand{\tbc}[1]{}} + +\newcommand{\rfsm}{RFSM\xspace} +\newcommand{\ocaml}{{\sc Objective Caml}\xspace} + +\newcommand{\example}[1]{\fcolorbox{white}{lightgray}{#1}} +\newcommand{\ifname}[3]{$\mathtt{#1}_{\mathtt{#2}}\mathtt{#3}$} + +%\newenvironment{example}{\medskip\noindent{\it Example :}\begin{alltt}}{\end{alltt}} + +\title{RFSM User Manual - \version} + +\author{J. S\'erot} + +\titlepic{\includegraphics[width=0.5\textwidth]{../figs/rfsm-logo}} +\date{} + +\begin{document} + +\maketitle + +%\tableofcontents + +\input{introduction} +\input{overview} +\input{language} +\input{rfsmc} +\input{ex1-c} +\input{ex1-systemc} +\input{ex1-vhdl} + +% \input{source} +% \input{biblio} + +\bibliographystyle{plain} +\bibliography{rfsm} + +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/docs/user_manual/rfsmc.tex b/docs/user_manual/rfsmc.tex new file mode 100644 index 00000000..d5bf0782 --- /dev/null +++ b/docs/user_manual/rfsmc.tex @@ -0,0 +1,253 @@ +\chapter{Using the RFSM compiler} +\label{cha:rfsmc} + +The RFSM compiler can be used to +\begin{itemize} +\item produce graphical representations of FSM models and programs (using the \verb|.dot| format), +\item simulate programs, generating execution traces (\verb|.vcd| format), +\item generate C, SystemC or VHDL code from FSM models and programs. +\end{itemize} + +This chapter describes how to invoke compiler on the command-line. On Unix systems, this is +done from a terminal running a shell interpreter. On Windows, from an MSYS or Cygwin +terminal. + +\medskip +The compiler is invoked with a command like : + +%rfsmc [options] file\textsubscript{1} ... file\textsubscript{n} +\begin{FVerbatim}[commandchars=\\\{\}] +rfsmc [options] \emph{source_files} +\end{FVerbatim} + +\medskip +There must be at least one source file. If several are given, all happens as if a single one, +obtained by concatening all of them, in the given order, was used. + +\medskip +The complete set of options is described in Appendix B. + +\medskip +The set of generated files depends on the selected target. The output file \texttt{rfsm.output} +contains the list of the generated file. + +\section{Generating graphical representations} +\label{sec:gener-graph-repr} + +%rfsmc -dot f\textsubscript{1}.fsm ... f\textsubscript{n}.fsm +\begin{FVerbatim}[commandchars=\\\{\}] +rfsmc [-options] -dot \emph{source_files} +\end{FVerbatim} + +The previous command generates a graphical representation of each FSM model +contained in the given source file(s). If the source file(s) contain(s) FSM instances, involving global IOs +and shared objects, it also generates a graphical representation of the the corresponding system. + +The graphical representations use the \verb|.dot| format and can be viewed +with the \texttt{Graphviz} suite of tools\footnote{Available freely from + \texttt{http://www.graphviz.org}.}. + +The representation for the FSM model \verb|m| is generated in file \verb|m.dot|. When generated, the representation +for the system is written in file \verb|main.dot| by default. The name of this file can be changed +with the \verb|-main| option. + +By default, the generated \verb|.dot| files are written in the current directory. This can be changed with the +\verb|-target_dir| option. + +\section{Running the simulator} +\label{sec:running-simulator} + +\begin{FVerbatim}[commandchars=\\\{\}] +rfsmc [-options] -sim \emph{source_files} +\end{FVerbatim} + +The previous command runs simulator on the program described in the given source files, writing +an execution trace in VCD (Value Change Dump) format. + +The generated \verb|.vcd| file can be viewed using a VCD visualizing application such as +\verb|gtkwave|\footnote{gtkwave.sourceforge.net}. + +By default, the VCD file is named \verb|main.vcd|. This name can be changed using the \verb|-main| option. + +By default, the VCD file is written in the current directory. This can be changed with the +\verb|-target_dir| option. + +\section{Generating C code} +\label{sec:gener-c-code} + +\begin{FVerbatim}[commandchars=\\\{\}] +rfsmc [-options] -ctask \emph{source_files} +\end{FVerbatim} + +For each FSM model \verb|m| contained in the listed source file(s), the previous command generates a file +\verb|m.c| containing a C-based implementation of the corresponding behavior. + +By default, the generated code is written in the current directory. This can be changed with the +\verb|-target_dir| option. + +\section{Generating SystemC code} +\label{sec:gener-syst-code} + +\begin{FVerbatim}[commandchars=\\\{\}] +rfsmc [-options] -systemc \emph{source_files} +\end{FVerbatim} + +If the source file(s) only contain(s) FSM \emph{models}, then, for each listed FSM model \texttt{m}, +the previous command generates a pair of files \verb|m.h| and \verb|m.cpp| containing the + interface and implementation of the SystemC module implementing this model. + +\medskip +If the source file(s) contain(s) FSM \emph{instances}, involving global IOs +and shared objects, it generates +\begin{itemize} +\item for each FSM instance \verb|m|, a pair of files \verb|m.h| and \verb|m.cpp| containing the + interface and implementation of the SystemC module implementing this instance, +\item for each global input \verb|i|, a pair of files \verb|inp_i.h| + and \verb|inp_i.cpp| containing the interface and implementation of the SystemC module describing + this input (generating the associated stimuli, in particular), +\item a file \verb|main.cpp| containing the description of the \emph{testbench} for simulating the + program. +\end{itemize} + +The name of the file containing the \emph{testbench} can be changed with the \verb|main| option. + +\medskip +By default, the generated code is written in the current directory. This can be changed with the +\verb|-target_dir| option. + +\medskip Simulation itself is performed by compiling the generated code and running the executable, +using the standard SystemC toolchain. In order to simplify this, the RFSM compiler also generates a +customized \emph{Makefile} so that compiling and running the code generated by the SystemC backend +can be performed by simply invoking \verb|make|. For this, the compiler simply needs to know where +to find the predefined template from which this \emph{Makefile} is built. This is achieved by using +the \verb|-lib| option when invoking the compiler. For example, provided that RFSM has been +installed in directory \verb|/usr/local/rfsm|, the following command + +\begin{FVerbatim}[commandchars=\\\{\}] +rsfmc -systemc -lib /usr/local/rfsm/lib -target_dir ./systemc \emph{source_file(s)} +\end{FVerbatim} + +will write in directory \verb|./systemc| the generated source files and the corresponding +\verb|Makefile|. Compiling these files and running the resulting application is then simply achieved +by typing + +\begin{verbatim} +cd ./systemc +make +\end{verbatim} + +\medskip +\textbf{Note}. The generated \emph{Makefile} uses platform-specific definitions which have been +written in a file named \verb|platform| located in RSFM library directory +(\verb|/usr/local/rfsm/lib/etc/plaform| in the example above). This file is generated by +the installation process from the values given to the \verb|configure| script. Depending on your +local SystemC installation, some definitions given in the \verb|platform| file may have to be +adusted. + +\section{Generating VHDL code} +\label{sec:generating-vhdl-code} + +\begin{FVerbatim}[commandchars=\\\{\}] +rfsmc [-options] -vhdl \emph{source_files} +\end{FVerbatim} + +If the source file(s) only contain(s) FSM \emph{models}, then, for each listed FSM model \texttt{m}, +the previous command generates file \verb|m.vhd| containing the entity and architecture describing +this model. + +\medskip +If the source file(s) contain(s) FSM \emph{instances}, involving global IOs +and shared objects, it generates +\begin{itemize} +\item for each FSM instance \verb|m|, a file \verb|m.vhd| containing an entity and architecture + description for this instance, +\item a file \verb|main_top.vhd| containing the description of the \emph{top level} model of the + system, +\item a file \verb|main_tb.vhd|containing the description of the \emph{testbench} for + simulating the system. +\end{itemize} + +\medskip The name of the files containing the \emph{top level} description \emph{testbench} can be +changed with the \verb|main| option. + +\medskip +By default, the generated code is written in the current directory. This can be changed with the +\verb|-target_dir| option. + +\medskip +The produced files can then compiled, simulated and synthetized using a standard VHDL +toolchain\footnote{We use GHDL for simulation and Altera/Quartus for synthesis.}. + +\medskip +As for the SystemC backend, the RFSM compiler simplifies the compilation and simulation of the +generated code by also generating a dedicated \emph{Makefile}. For example, +and, again, provided that RFSM has been installed in directory \verb|/usr/local/rfsm|, the following +command + +\begin{FVerbatim}[commandchars=\\\{\}] +rsfmc -vhdl -lib /usr/local/rfsm/lib -target_dir ./vhdl \emph{source_file(s)} +\end{FVerbatim} + +will write in directory \verb|./vhdl| the generated source files and the corresponding +\verb|Makefile|. Compiling these files and running the resulting application is then simply achieved +by typing + +\begin{verbatim} +cd ./vhdl +make +\end{verbatim} + +\section{Using \texttt{rfsmmake}} +\label{sec:rfsmmake} + +The current distribution provides a script named \verb|rfsmmake| aiming at easing the use of the +RSFM compiler in a command line environment. With this tool, the only thing required is to write a +small \emph{project description} (\verb|.pro| file). +%\footnote{The \texttt{.pro} file is also used by the GUI described in chapter~\ref{cha:gui}.}). +Invoking \verb|rfsmmake| will then +automatically build a top-level \emph{Makefile} which can be used to invoke the compiler, generate +code and exploit the generated products. + +Suppose, for instance, that the application is made of two source files, \verb|foo.fsm|, containing the FSM model(s), and +\verb|main.fsm|, containing the global declarations and FSM instanciations (the so-called +\emph{testbench}). Writing the following lines in file \verb|main.pro| + +\begin{lstlisting}[language=make,frame=single] +SRCS=foo.fsm main.fsm +GEN_OPTS= ... +DOT_OPTS= ... +SIM_OPTS= ... +SYSTEMC_OPTS= ... +VHDL_OPTS= ... +\end{lstlisting} + +\noindent +and invoking + +\begin{verbatim} +rfsmmake main.pro +\end{verbatim} + +\noindent +will generate a file \verb|Makefile| in the current directory. +Then, simply typing\footnote{Please refer to the generated \emph{Makefile} for + a complete list of targets.} + \begin{itemize} + \item \verb|make dot| will generate the \verb|.dot| and lauch the corresponding viewer, + \item \verb|make sim.run| to run the simulation using the interpreter (\verb|make sim.show| to display results), + \item \verb|make ctask.code| will invoke the C backend C and generate the corresponding code, + \item \verb|make systemc.code| will invoke the SystemC backend and generate the corresponding code, + \item \verb|make systemc.run| will invoke the SystemC backend, generate the corresponding + code, compile it and run the corresponding simulation, + \item \verb|make vhdl.code| will invoke the VHDL backend and generate the corresponding code, + \item \verb|make vhdl.run| will invoke the VHDL backend, generate the corresponding + code, compile it and run the corresponding simulation, + \item \verb|make sim.show| (resp \verb|make systemc.show| and \verb|make vhdl.show|) will display + the simulation traces generated by the interpreter (resp. SystemC and VHDL simulation). + \end{itemize} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "rfsm_um" +%%% End:

;ng6w6< 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 OY#az=WI{5+2>%PhBAGS- literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/gui/options.pdf b/docs/user_manual/figs/gui/options.pdf new file mode 100644 index 0000000000000000000000000000000000000000..232ba788c45a436b95ba54dd02882db52fbe9fbc GIT binary patch literal 16916 zcmeIabyQr<5-*BO2yTJkFt`NQKyVw}LvSBl5*Q#jBuF55f(LgG9y|nh_u%fq9qtUt z_nq&YbKkpft#{Y`=RMY5%yjSWs_v@V^{ejPHMA;{(kvXTT&T2dYe#E4xyNZkZ5^oG zKz5*mi8ZRAAdpP~Y;OUv1oA+u)PQW#R<;nZBlOeO7y_0An>v_*fx^P5P7p`1u^sAL z_-7i(8VnjkSTZbfN-PYFihZgKJpj~rLPADDxb*adfRtLs_=GQoX$J{5d5h6lW4Oq0 zjk%cNs9<}uKQy4R|1l^Hx7T1Gn~Jf;!+%GxJp{=0dw^%H#;YggZDWrACEpNbRK_L!Mgr6 ze-%duQ*|%|s0-yMDGg+kwS#gM|MMyF=TjD_4`kC)Hn9eqLVz%-$=Y!M`5qVw3&RBT zhcK+_FT#HW`~0C5+wU3uMS@M;*#z=1#|L&mwpUhWFePyD0@-B1Ru+~JASWjelnr!l zj;|eH%0PuUIzy!);b80FsQ%j66b$75O<7&h*vSUS0h=v!`r=j)Cl#=xgoE8{2YZ;@ zp8rpk3KPcPO5IDo{zTRuvvEMd!Ljt=RGEb1EpKd?7LQCB$4+NSziFuJl(8K(xlR6| zuf<+6Tm_P8Bz!50rL7r_AaZ0RIxm)dWteej*_b$j-}lXNHTgMrNa3kvmCkK+-T2%x ztxF~Sv4(j{f$q!m`R%%M&6p;lty%2^dgYYkZr#hhx>w%@Q(f28@UY?FVb=%RUt7vP zSL&%(WAyh|!No;X+*=L);rv1XXA0h5T^3YhaYu06aVc@M53LE9kbU7`mxip-@m59Z z-Avetj5rqc$(xA~5tsCL5BGdU6#)js3F!xNGN8>DQ8A@^Vt>(0L~eNQ7~AARPjCO zZoa75(maw)$*evgK-_nu>B*tPpbt!;P+;yz@#-f*uBm(P z;h*6#%Kf`@QTDW{tNhjnS>ZQVr-7}Kux2i@sQ9(>7at)s&m5=&BRLN(bW^2%I-D?X6 zSt&9KJW{@G1Zk$^DJHK8*=M|QT%PQOjxk)o*~f8etIJ_t5KjjzJ(e=Gmd5%MlMs-6 zb5f_44{kZ$^;~)9V_3JD%8O+8bEL3&HMDglI0elErnD|rzofgt)?4~q-UG7me8|A) zeN2haUVeWZhk6&i+xq(`rR(5xUaULE=|$_85lKjf(YhXb>eq+$`-95&!DV}b) zDp%|MLE!I|MQbYx)ge$B&~({Id)qqdurEZUPNA10JeKjw-ZKyFv`t}4gkLe`axr`K zZY(woQCZm2HlReAl>@`M_GX~IYy6&zb|_~UUg)FYX&dcNy42NapXwJ!t`v>}3N5`X2P8)gllWT^~QAlHF{MwlsEB2`tYO%2aHkK?bL|C8vmjEy=prg)q}wqKREx5t-p7{E*}tsAgeDFSi43Tte|-$B$-%yCX1 zO<^_7fhq1W+fG;1njMJTCUY`#Y$%2VL}BBx8~&nusq;=;XzXBGWZm4&iNeN|>@az6 zS>xVd;Uv3m=yIWHO~x{Y^Udn7C80V}!70#bE0#!xT&)~Q>L;FaeaNBL{qFIN`A&Ow zZ`_cMvY`^aa746rezr4)tD{79Om>Q6)|`bllm2a`jy+0#_v!iT_a2_lqMtoHxt5%M zKHpY04o=a9FMGm6VlZ9qDuaj@uA6%w41HZa9J0FD1Df#KT8_V3X}(6SUGsS+RXUcF zLg+zE1%3FofsIv@P%B&DC)UZ94h;(@A6eThGu61ha?ei@O{FOTEQjY*``^N0!!bs9VVKG`fMe5vhgfM`d| zlC*Y736tLU2Dj$XsJI0ZxnZ8zLn@++NW&3SUJA=4gULa{Ol16 zdms7P4`&WOCq#pR0&JH-3yw6^#muEz1uvdyxibpBxu!M8FQq4ZDOt{r2y>nSIN#Q; zBOv6&UfwHyAu&o9t#vAy8E-byIga``My(d^cR%Sq)jK_VSE@2s{)@?aR&M?*Nqn!G zqy+24woKhJBk>wPMP9hu2`@H4NC{*xEkLM)$k{S8+~|rmet4*^frvz@6dU#V?OG4m zCB~wZS>JJuXM5T&WUu+2*vqTGqSW>!65qYj?EOB-r?_6e8WcWLt-INAO+A8wf)xw( zvOpCdgoUfSkrL`$gP$XYWh004g=joX#Gjy#3q48l8E7_j`YQQSx7jHzER2@diV^X5yyR2XM^m5*tA9+_#g&=>nZatBnRnahXB^j^ z!h(6P&ZDY1^|J+=TjNd@ON=hb_Fffw}{GN^_{NXf1AM>g-DgvtlxWjiw8tJPPjb3-xq0Y zI?6wET~K&HHfLtT#?GxSiWkZmzma?__ zDd*%K)LdBi^L*E5h9?vihJnzF2j`n(jR(1QjRyc9CO_z9P4#-3HJ5s)URo74bC}no zLogf@5Wfc_dA%|aj=ERJY4{U9z&&Aj6~YElI`o-;OxBVF_}!ceep5zDlKoHQLI3I}$efsER>B?7>)C~ZG22@(7dp5dq#f}-%wlBaJZpuA2QPMB<6cN zJQmlh@f1(N4+}L534sH!T|lkw#sInIGkA{hObtCuQfi}C$d9DfzRm{Bgoa7CF5QZa zj290F0SH9zAI`Ho3`HTN%FD1A0=9FhHwKbldh$45>$e@bbee#2wAA6Rp9f9%bWAv~tC4ntBB@%$|pvALDKv z(0S8d)ih`?@bR%yZOT*+@JNnoA)JmzMTp#8Xh=>Ue*Zc0^Rdg@%opTZma{ldqMb)M z?PFvJWFh|K>_u9Zio^8SXdmmV%hmgjWz0OSjrPPlZT5Zy*qDYr!y1`Tnb0sjlkt$P zw0E9DR4u5H?55RJjDBfBiLjirsbc)uRSgUDMs15hrWRwBSjZZN^j z(68T6Y->AfQs?G8oC)D~JzRcdF!_#WMtDRztX}M_ROoZ*6Rqdz;a`0AbZK!h-Cv4m zY3UWZqYM*EZ~!un3~@QId?yF<^CusnaaTREY1qAW@#b5XOZlF|c49GImsqC#V;1CK zJi}1s@aB~@yPy#d_E9V{Mh`?YIlv&cu~d7po#E9=J0hjOOJa7fk2t8@F@rMP92=^~ z(16(D?Y=2u(h<;8*K+vA*v*qM{j0Vafu}aqWaY*e;v-5`7TMHi`I4x?yJMWHhXE$Y zfosh<{u+m`L&NwbiL;4$!?3Hp4NXmt0GQ#IrSEq}7%HkTsuW$~Ag#tVIWY)Nm2P%A z^{srWuZ=Y-mZSz2;$+5UkH7qB!6T+?fg@-IGZ>enzurh&mEW%jEmq&5tXPwVO=YJO&KWxDn|7jFLOFd~@< z+e6{)N_s1=bv-4ms9jW70v;}qVi6D}puFBNvX$XT9zGNWp}MeBB_|?l3`GfLl4VR3 zP&eXao2sIbk&p?>5fn69d*^fe#KbS2?xYages0__bjJ=y>?ek_-I?p-F8DCqE-v4} z$En3da~A*^@Fajt3$(N*!>`qjVifFhs+W=|8Y1amzg95#RP((~Q115Rdnd_MnPpSW zCv!WVp3#i+v8kD^D*1ZCMiM<;X`0z_^A;x!=5-A7S2bHIoJ~qkYD?8w$!#S-)&ed@ zdh7^tAb&NL*>k~ViUL{CK#GtDu&$`t0+XWYL|`N3w1<62DsJAFeAy+m-w*NGxN3UO zm&@aEy)8=B5XsgRCPRGyhI8dFA)yj1d+AbUG7fxiY zGBxYc&2W+0{orgwa@Q_*{A#8>gZQOI3nqioiUxB*$3?V(T^=vKVQvEXQ|!m;Ut8g~ zd_`kmzK@HGYtD^*T0TImsjy3_NzOuhbVfIHMn^~W z|7NkY5!JA(%J4-2+|n`z*=ZpJpi1~=i7`E@T04jJ=+-F=-|dm;{t(WM8zcC)2j7%2 z4ws~f_Vpdc$t9>5!?}~Gv`30q~vUZ|lpF=yHI{5t26BunE8z6e~gCTPowcE5!+rz^56bPfRP5udgkot6r^8x^i zBo%OE(x}xK^H@?ryv`B5sASz^2GoSG;paW}lN4Bff|gJ1a1yFMXT}7{BG*MqePGLo zfCBN4c}M%+px3z#Qw+peHHnM_L*;ETU_!W7Hu7dylF&-IIB2^J{0jv^6+o_CSD8r6 zLv{;{4E<}!f=BC3Z=gf&=6zHl3M7KZ#kuOGTU&#!fo?W4BQ_&0N3f@9oWiw%*iyjY z@QZe;H0q@Duvt{H;2-4k3)8#~2D%m(TH}rR&-2}@JP8fh6|_JGSFP^aHTzSIS9}ih zr$*Q5)bCHuJ=3W#-;S;`^#BA+!0$-ZKnN0Hqc|QaQyt8%Emvh>+5*g}_Cj%dJz<&d zJsUGAd5ns?HD%M%rtg;4h#M?T)s9O|oXxIF$V*bp58YT6AnEb=ks6N(lE z-SoYVLGXh(uNL3tn%R8`*TS_*#<#jG^K0kc)v3lYCFL>On34VresZ0JuUj!;_k7zo ze0O)o6=Jk`zT=|r-O6TPyL0)8KIpJkv-N!Soff-axJ-6hwI?|WdUiJTe6A3L__NOJ zc(qDll|BWgU2!(9v-{(K^2H2ciX+4BJqR`JwU}D{QPxM7jjD~gH$hr+p-#xhGbh^x zqk-U@;E3FYDahCWJF|JC=J#9z7bd0W{*l<@RN*MpD0+o(I=UG1MoporkGJ+dKsLpm zk|z{YxS~su($?_fd=DtY)On#nfnJbp8;Zmep{X_2M1l9|Cw?Kd(Bta}^e>zIuPv?J z&0F@G>yCVc&#q>#uQ18pg|FHxJK?;p6F54%Q!mfSrY^oxNJC7E3Bip%)2y2t*Ipuf zy8ZKOZmKJ8B}F>$Nkd4#(zRTBFy_3<;pMBx-_Q)!7(R*^I?wEM zkAw=C-H*(^O+Pf@LpnUB+qxR?sPTi^Q?4|#& z#O*Ey5p3kTy~?no0%${2T`eZvJf9?mKAPfwFn&Td(29A(o+~fHyi?#Z)%cKJl(tq?mMX^ zBqWBSzU-O}{7`uCl6#X;qX(oA9v-qXiY#n>j}iYb;;2mmdKV-*oGOa?yF_{CL3Wm+ zUe2~6j)w{Xm{DT8=ezShJCxy7U&qacmJU5QW~(d%`;(6=XP{-fTX3NE^lV2K{81O^hGVwT87N+e9=mKbTq1A zk=g#sS(lwwNEX7<;3tfaKp(WS@JKC{^!wFFa*53yXY1Ek&C!Z?xDsvCbdjPUXh5dB z-IeO048w-A^+{a)Oh}vXili5lw)_ym7Zxi?p3`?L@BDWZfDc}a7m_ug3pjs(2`hxH z?Jf_mC*{j-G@~97i?CH35Ce)Ge;%!gCKRaux3b0YgzbHc=Ah6F;pF3u#R`<~4fz)h zMJXHzy?fa2;70!YPNR>w=B5m>E`Z_>i{I341vqOP7hZ14DRFF zs#ripA~RXW1rgzfISqOKOC%|#FcRE8?{VN^0~$;CgO>T!9*=XNcgCQKB!{t0 zRQ`LY`+kg2G4?MQNj|LXo&T_%&86vpS3r&SlP>vr7J<{InN7yd)NzG|JT&-7b^?sPj(i$fA?giK^VVz<5FH583~+} z#)e8LMeC~>0OF4)sj(?TU5#zy>q{w0%%Pqy3PNYOQ3w;oCBu;uE1*mTVSb5^#TSU4 z5vF}T_8ZFI1xqD~1Ld+OTnu&ginG<=x4uGm_JU6RuC8CbFwk#))0)#y!#RYr@B*H| z3dRc-wK%UX4snko=0G6^f*v3J$zvg9sXFRy1+K@31VXOQ&j+TJLnC^^XQZ8=a1!}B-Z7%x{;4lk)eUp%2O7lF{bd3#e;ew0dE_{=*cY=Y>6tXJ%umBJPZ?#y|)zSsu4sdlzj&Q<59`_*RHMDj>_Qu@mPuGBj_o^c7LECs!IOxlLAisoOJT zX?1IK9xRhB^jQ}=VwY=MEncg#F8ahdW3uO`!`e8r*!v=f!i`~1?l462DxbP?yf}auD<-%dFGUZBas(g{eP6)BEWlzGk zeCX$Or^=Zq5t_l;$MX94=}`AkwWj|RM=scZ#Y-J(!D-Y|Q|r5Hf84cj1R!u^5=U6; z!b}wu$_OFtTIos=tX?7tSrFdKZ%@MgMdvDqzGXo;7MV&lK$|_ z;Eal3OU(XhY5Ocq2B++2y{9gfNLj1Nf@Q8dBlVc->g9v3#$?mgULaRjWy6K^%+7F( zWI=ubUS3{drF#-0qJZ#KkM|YCUaSzB!e00)=J-=PBC3OYai=3)H)JLs3Ns?8^^0e1!}3yYSEe6ZfJSAuxQ* z^>~r&0Z~PvU<7Cr-|nh!%(c69Iv07#aYCBV%mir9y!%NiB(?mNq(MY78qd z0H6iRY8=@ICZo`;;lx04wD+(;f)ZLlEen%DcmPUiIDrxF6D>km0aXmTpZvj25*G%> zL)_4<=A87-9}mck3@wP;Qb#|)eGZOqI5&pSQzRJni(~tS%{54Cy=8Z|%6dxUg<^?Ab8A?OT8WKU|rYReQ#6pMXetWt4>CJJi ze9Jk~c%=PIVE>QF$o)Pz#e@ysNfr|__e>@i{FLffsa(^i?W8=x7$=3MV9n#(%93xB zuCnuF=nEeP+i9R%{>wff?oB2F0dWvuK??FXKlW-Vnds_n{QcSf5%G2hYZ7>0T3B4r z71i0}*(~wyM3Sy3+fK3l4WX0p#w}|fVJiGC`!8!MjgNW$dVTx8oc4MVsI!1Yy2N(< zRd@46HJ0>2tJcA9leeBYUrcTQ@xAPls|C94YOx;&=b7b2+`v2q&^-%?p_f`WNX~M^HlAaG`(jD%Rx+v?I&LW?h^2sK? zp+BAa^iDZ?=#`Bv2pn;$j8X4zH>Fe?tD|8?6BffKHyt7FtTuf66J2Szu}P`_2H&-) zeyU6J(Td@_jVr;g3Gg&dHRjbVswi;oC|s{r<+(OPz9bM)icCukVU)kDslNBGtf%Q0 zly^!wR2h5bv8d`L=n-V}o$}f&&QYeWs--KC+eK+rZbk=cBhG6(MdF}URKZv7Y1Klc zh?x_8yb9Q zU$b|;z_}_CcP8H}!d^34WQc;&sF(MKzL~Q^vc_)$_vX~jo>D8Fv45>e;w!L!*)%I| zUKVz3KAyDltv*~!qzPr&-gUI<0xUsmg@bFi74zZQ+)^cbC$cA|g8Z(YA0B zyRKv~S)!Djv8NqE?l5)||FU0MXm$22FiT>8_uLEhbY&q+!u}l<3A}8H^PCc!ui$$6p#RTE#vK=i7Z8R3=j9bVBM# zkory;<+tX*D<38!yc^Vib0&a&WU2RUjqtNhpY9ZIOjub>@CAt&-<^~lQVY=T%Yeaj zL3mSCcX|lg`DEn?C#=7;K zbK?yiXClV&iKA+#RnAv#ZwF-aN?viOg2H^{M?z{Z^q$F>^IGT(y{azhXRA2zaPJ83 zok^IaC&;GJHXZ$T9%({cOa&Fqv?^3Wde8Q&yV{Or^n3{s{m|mzQb6UIG|<|0VgK;9 z?=9HK+;Om1fFqw>jaWq{tx*}7Q4td8;h@frdrc9Q%nH>7T5$?RIKS|*6|a}W^pGqn zDnegT11Nq$p~S6J9F+Ku?BhF8A>_#L#RDy{nA|VdqUDA8ixi<0ENQW{V1T)~@N;2K zzr;rfl>~~O^xSW)1S7Z!pT|DH^*bnv;n_+=VLkvC^mSxb%lEQ}g)Uwwv|vOM0(k(g z7ASCGAce0z6pWySN3$wfh%orYpo3yD`)lUMu)-rKyf97$QjtAiF*_7~-}{;JKVUH- zw9vwfxAlOfS#OS2G56kct7#3Hj%RGj`FR=m?i;Whw9v051P+(U3iXkQNfW<~o z_(ekObbP>Kc7*9+oRB{+rhyTF&B35sNVnr1wF&;qawVTmCN!TP=o~O+aL6>!AP(17N7 z*CW{AMAQEFzP^@`UQAG&n`GU)*u5>q%T#0itST4+?v0&up44ApkxSQO$h`Qx#{g-| z5QT0_0Pzu;J-rS#?k|gbYm#dn?`usodIC5z8Zs^_g-(VtBZLJ61#e_kQP;$YR1H)a zd%ZV5Wcl$T`+na=@jQ(>jdKt=PQHs6_>#aRovp_}-SZ4}AlY@EUqImMu#-X=KU;qL_r!1NghVs=)8CIx4DaAk`Ua3?su%Ykn zC!(O|P*!r)N@mI9bveQNh%Y|hlVSBGUw`K{u-p?T*89r4CN<8qlFPJ>?8V{5^kz89 zBY{OPX)4SigRY`=^5yI!u>W9Hxo0LNFE#@^{76)xwep`z4pm^+R<6RP150nXU0O+Yo0 z1=H{eYWM0?e6^0kOn&b>9^2BkvD0t-_Hqd;i{c!ULs6j%mdIEDR0ZFG+4~viGZi17 zMCZ{)7M64SlS@4>{jICE?L@k%aeqIF@X%!o+U3AuVKTEMHzCtHgp+0IXlhP=3}kyGbxNCDPR1zq9dB~Jz(1v9a!>pZoKH2)bZ#H~M5=$44C z$b7Enj0K_TbtQUGuMrvl)NGP9?YL!auEfQz7I#qPdqWS87n?tmo0-P(+jSZn$2Vmh zqBD+k#+Fj^qdAhtCaelxRWlu=d+&d?@9|i*#JAg&DLYU%dyJq>Cn|6hFgJRQMJiKM z(rlq*H6XMjRP(HqCBN`?Y{$8zSvMlLKJQeTs9hxDi;%~eXhy~nQ@^3rddU|NpKRHX ztA-+}h;22-LL9!m?>(0zXoF*Bp(}|#YSK{u+{;G{9Wufb6@hY_I*Wy-u^k&4{2WiO zfV1ZPeSW8X?|xmI_DNa2eS^5Gy46U|f;{T$=%;c&vR*Rj*T4H&1WXtM4^&O6z1x8# z?o2h?eYCQU{-%Lfq&<=c^_@+!QN+k*U*M8!QV+h&%+Bd&$q}{hboKQqxR#-U{WqYB zwt*@-M9$Ya%VsczYTO!Prd);!$;xwOI70B-g+3^kKL@z#>+3=^7&9+6qPDiSN=)#3 zkO!%!o9D18k@2G8Zj-|Y8-*NO2Zjgq>qAr-33?dr4kFOe(T9AHnhF^L9MeO8or6%_ zf~Xj=yM*Dd>izC7hxtV6!K)Q7=+V?_LRF+We6SAFgUEFr&L;zJF%3h-YgM2wfaiek z<~GWjp#}Ov4|@Jb*>1|IKic_3Oof99>U!Fry#3Ykc&o`PVQ3dqiQUZoh-)|7{4PO-c-ItvNic!-; zt$Ghrg)gKY6aDM>H2`q2V6*hsK`PuQ7xzDg_K5yF&j5D(9(E!h>Ls7E|8-3N;jsLF zoYUvv_@;skfX8Nza8KQ{yxC}|L}nRzhzzQ4ROH3!NL7VyUVvg zWBVX#{M{EG5ec1;-RS@S^8a-qeD^TgnAbD=Z_9r$Xqb`naP$9d`2S3@`IDf+@h7uJ z37TTVCI(CYv4^Ic0RNb=8VH&T^S{apN{)5aP@jGpG}y@3ID|_Dq&*>aM*)t!kiiG2 z2Fv=YAO!l;xkx^e#=~LMG}HJF4+^3(mBK@N|ITC*_a$?40O&#z zVeF<+C?O$FrlaC)pVil_ewMjeh0bZ>-Y1HRPl5&s4pnNLSJ0b|U=883dPO@C=RKh3 zB!-bQkc0DSI!Znv-Hm^idblh_JZwh5nJO^xHB4^B(jR8n3r&sc1WUY zOGU~DK)9nvaFz34j>!XU4WiqY(dp4X?(W(;!Kd1=KHKEGPJQRl(;Ucup3u90t@$E{ zK*Wz)7M}|&wU(2cBQM$4hmILHXm)#!eZTUZ->Sd6mHA8RcY?!!&6ld1pHcjSE$agW z{j?%k%~1V)#+Q5udFdY$c_-W8SvniSc?IyRe3O0LJ-80ez$Q&fudW;SaUKZg?<<3i7>md%gJ2~JC>Il+f%+GxYp!AOSHIg3S)pv~7 zXz0EmQPjW|d3N}DKP%*Szp(K$#0nyxW??0WPhgYiAiGJ3sXWI+Y?la*#Eurd9HPr3 zWO`qaE}e{4b9Q zzRxbneS0d5S@VNniR2d?bAaKGPspNO$cV$zTF4}alH!qCH1If-Hc?br2>DWpk(gN| zwP7+*Z&neJg3^uS37>WltpsU@E}3W=PngKDkH?$FYbp?|^O|FG`CY!tHW@F=(V{OB zaY5n5NeW|W(=>`O()}7&hB#%s`+^j+^E=Tp>1*$AgnFFzJSBh{tjW-N-jQZ}Lbkou4>L{M}z(?_D{0Bqi2QN{vkY-u#GiIF#uZ~bw8aI5;| zDMP3NvEADAOc=|;r^Fg$N$He6;mHQl5U9~GCRF-q$XZkB(+SZvQhw?dFatRfYKs~u zm(ZjF4Qa8WMN~dB(BUb|kxGeAEAh+Kin@uqNo1>GnJx$ddYdQfj)7? z9mlP77k?^@vWeM=^PpA!JQ?R2XULjLZ%FAQcb9YX4MDXNJ8>0Q9YjBnGMYq0=&}LH-i;rfzjeM(AtQ435&#;q$__D4? zKW(+2P;54ypnz$?x@!z;q-(@$6+LQ5KiG{fxYUTULqCPqhejN8uh$N)49@bFS{d9o zFveUm*)w^@P{o+Xz{f-sD7(ZHbWIsdHsrov zy$Ra>S{Lm8?aKPJbz5lr6LBJO6EP9-OX4{04j!UJ`^4_VwZskX&Pq!iv?_qkn$AX* z0eeisexHUpZN*3a^x~4eT$W+sthqv=V$-||EsIR0ih(Ek(X6_BVl{d->aOC-@@!gc zhNY?p>B6e1#i?1%pk`g4p6^4z8KaM4NiBKlA?eM=DaM&grql&dg~LplI+-szo|{&` z2{{yA(WUzuoGcqH8`iC;J~cM4VN^F*If!nvZb`>o$Wz~$@%5*+c9HZ%8h@)`muIG1 z(&aNWp^sW0lb_B#HDumnR%h8^rqE{8exzkrx&8I3b*3%RM&Hz{Gthd)v|=DwRys~Kyk;oH~gV=rf8R&;i*`V=R_ zHeA~5+UBN&rfe{Eb%UMmBh1By^KQL_Nj0L{n3Xq+gxkDLLmE$}V%?M;tt)`VL`qVktzIUgYorVGG3=@Q zQ&;J3P`lJPNKwi|Do#p1PK#N)VpTd+Clr_?^pt`G--E`*G5>sIPCjU5cNukMpOs55 zwqke2v1%>9cd#VVutoa~6FCV5*#h=`@RJ|;YYHVNhPAG1fXPqwLD$h69nUtx4)rg< zH&K8%|8oCf$+$NCU{l!=S$x?Q1ZATJ>Eau;~h!n1FKSsXA?qBmQs}Y@kkqdy3SQ>ipA{Ojejl`wGQrNY}Ykg_!#;~?#UcR4T1td*_}TkoX1~`P4eaO zedhfU7Tr;{@}|?_cJWlg<4NI`3RhiX)|KW1y1;s%My5O{1h*!ZD{cY-5^^i`8 zPWr^piQwuiUMmj;kA*GY(PXj#G8U1fd(V^5vxLNo9t-)wr~&*hN&Km<-bdmc0f!%h z34#P(L4@lnS4WadzLw1Q`o)zR9M(GK&o*A)yo@WfDB;(C;g#&wxEFXEHbGvW5^K2Y zZM9W(VAr_yy5cr=r8vClk=MqR{x#eDS)JEf_lOb^@CLIbboY8c_eQHh=YlrDgvsZ`|qs zCKDW%MePhtjphKd$y=E@K~ul~ko-p`H^)D7KF6ONehFxNmv;F zKogc0?_l=N^1o8n-#UWLQQ3hUe5mYy{{eYSbAvl2q39bzU3qgasCs=^s9-IV70t9#Wx0>v| z&)NH&Z`}LFedGOg85!wbv*(&Mt*U-iHD}SONz1ZwvT>u*eO^0S+b%lJ8UNgi$^+s6 zxmq}&3JZhSm8@NCJ?ucdK#>NBUDn>o!`dDAbTap_mbSKZwXz0@ilRREaJM#hM)iSZ z)%Bc4E`7p1R+W=B276MF4E5i9V$!l8cCa%*Qu2>asXso!AY%}_o~ng|wWS9LI$dCAPSDc_YNDdhnfaq(Xwjby z|1qQd54G5T59iM&*fl*ZJRS!4Kn}#NYi|XeeW0uC^49jYb{^0!17v`Kxx2YSR{_<- z-4mD!DOV>~cTG2QOKXt8@0K-{&7V7hIH5xY#x7~^@m$T?UCPzj&D8}uY5f0nHKCL7 z*J|zt+!&g^V3^grj%${c}~eFXD@nr7z(=_z*a$pt`f2m+R-(sXo6Og2CBf zgEK3BnJsoSrO92J4rfRlmLb;l7aexc!BJ2?gK9-c0Y`7|9<1%*@5W)N$7zsTZ)T8! z3J(0AxDjAMdj$hf77703BBNo({P!Yer1;lacnE(lEDMiwguwl+#hV|ySiIn%x_|W! z2SJ1OwI&60K(N$mG6*I<&WG8Qcf05N{-ty9oH+V0j8rnHm$L+KPF0wANmV-h*QG~S z4%3${l8DF{e-Bbz0D0$TqUx84h=h z^DVCX?YI6*-|l;t0xV$I{0~RY9T0ONzh_-A9EMK~Y01?0aHPA3A|kS1!wYESqP3C(vZy z1m4+&tW;hH!ug?^GGW3Nsqwi<0R27tsj(ww(J_ft^+V6k{ywo~FZu-O^87mPn`af6 zA$*|rzF+bBbI%K@@}zU}2}X^8oso0V8QMpqrM@>kkg1XTqs;ru72A%>gDO}5pQ-m3 zb?JVzr`G}d3?ahjBfC$R>%L0gjl{dOAMI0ID(|vPIE}R!R2pk=$pn&0xBtrQ=y&a) z8yZb%d(UO3gb?uwMC~>^HMT5zG_cnc$IJhTaLxna=PQ;X3?ppZ#P@3oQNYIDipP@n z@m)ejCf&d~(t}{<9-4G6q6o^AHth@DMA9?5>5Qx#$13j>+?^+l-A{k+xGVAx^f{ec zHNCehN|+)veS7`$8~vHu%iB*X^We7DdpEBB=S?mhzUwZLKbWdMudkL)N6Xk-?12SV!x^qM*p__-lsmF-;rp<;3*^7_^(*C%pP`gxpPdiVZ#YO1^d#GR_3yU!n46Yw^}5!+W3@jUImM#T(vJa# zS=)2}qh{M!kaSgOjI@r3Hbn+Cdatl+V{fqWRC>tDp@eUE#%n+~vqG#!!{I@s`QkJ? z`u)nXbbRS^EjJH%LW`Fatq=rvUljZD%XMDi@RrcNF!SL>{XW0ScgnXK{ zNq%eJC#(_(UC>%+$Cc#|9joJa!dxypxBJn!aY*_bTW2Mtm@wh!dE*1lGrk5Iv&&bo zxZU?!jYv!=?zMdcCG z;jh14`*9s@$1hjk?lCBRY}#)F+cfBl%p*p&i`r-$Bgk(ND@~(oD59KaQoLNM5FtX4 z2-g@)tN-yhFTJGE+&NIdvr_W0HVH0N^*u(8F=z06F`^NMEw?y}qDW^G&wVSedEK+( z7{PKYC%+Zj6K`UAgIx8ax`^3ZRV*q^?nZvV`~G0UEcG+H*7GMVvY^gCni+g!PBfo{^N~wsLem!$$xaUtpe3|ZF*}8d1n6QUYoiglD=U0oM z-@ISw=yGuwJP3E~*nS$5#S6Rd+r?5~li;VYe%BR0vLb3&G4RtOZ^0?iH#MQ7kyhHX z^0fi)ZX{Gg;=rm6_*1@9IK9s(%8AF?d8IZf&Wr@SuZaLTJx5*?m}$K9(Z;qjOKdUkdEobdi= zJ(_Ur<>h)E@U^EW`eo3~J)6_d=K02iNxQi+^_B7t{4lt~ z#r^n@fZD#fMKPid+arI6t-km>r?H=r84{(r-;P%?zIxx)V`5J0!9_E`Nt=OiU_!`5 z4~w2Ii_M?R`QEQc(qU(i(9lyWo+sg5V`iW9We~o#xi_x}a#Bs@XlbN0Q9L_60Qb8y z?E#8mgpDQpx6&G>)DN(HCNNfWzKDNdHUdgfyTfbwkooRK4JKv^K#LZj#etL7e82fV zesq}fvi<>*fKu?TJ9!ne7vO`*viHPl`COA7ujA)RXv_ym`G-PHj69;I8vJc9V*uqd zBTliea@*$b~hx;DUQO>nEgy#Nt(dn36)G#2!ZO0 zLI7^``~lHQBR;+J7JavLYUtz@B?4%@M+uKL3KC3>zzKN#(SKn<3W@KFDPyN9|9UY( zJRSt1^_K>IiWQ*c#7*Oa?{!qpSfq7vgCVxY|aS@=U#qM|Mf6zgJqb;F_c_#Q2t}l*#tgYGq z*QTv6AmheS5Zqq=U>gdMJBy?Om#VT^VX;_VeqI>Rv}JRL{!R@1&PsmWyxAto%gZY$ zc!ec{{#l~FkXXn8ApfKl9-oYMI^8fy9U$a}%tKdl7#X>_xj8*O%^pn@5n>lH-=iZ7 z*`mG(c#}cfqoRNy7%Q#``MBHob!KK}G+XT67YF_sHU?+QT)Di4F+#_fMpA*`Vh&L@ z&=#ZcYBxbCagMv52V^h;?FvKd{JHwW3#mWXaoXBm&)Tr@hb9A}M8Se)F@ zHt=}%;A<*owP$^e%5M2=6jnzgM&o&(Y@;DdjxU#i2TIUe+UcJnMnkc* z+Gr`FUq;Xsy}7Eoxt&>+HcFUi*IM%QeHwW!b&~DMdnILODvx79>M(;u=_w}5#VZVD zrELVtUDe}7;PVVyL7Tw_3G+^7^5@%+3TO^mb+P-w8b#5hv?YyKUamqRsyy5y=uHC} zUJcqH#;+GNE5mWp^UGW9*;{YErs$NS9rUE1`}sMqtQt6SVqa)GehBkd)~-n7#lThA zPf=TF2({4A6s{nF^OZ-<_Ttz6Ce9lcgXd{)RBiWH79b{Y$*RxRr>*_Ed?KC67;NC`~#sr|DM zTJ8L-vuFpySfm%f4zrz#(e1@iznR;xM2dg%ABV?y7A$+xi^_zO-#;W*8Jmr%_chPB zf`)N2=S%F!w@lgnjP$qZxKG+fM>3nfyOQL5=5nBsi9J@HE2Dssnrq4VY0E9K&wW*@ zlzmQf+N_#4SB?Bg&J;<@Jp2i_A8X-oLXR?o7ftcPXC@X(FE>Pl;=OyH9jP# zX3ONNWOl&dw$0GhM`LntR{s!&&*+I~e+^0qFW`InG@jrocC1i|SEgmv)$B!R2zD%< zlU}#WI~Lygilk*~8Lr2gLxy8dAYAQ!#r%s>G?3)|`q(`Md;3E2D=L%R=}rNXAv<=#4zmVY@^&eoWc)=w(`-oq~owJ0)1;i<6FcabI#G z*=eCuzr4mBHEou!4h)=cH-E9Xs>W-SLHdO{)3ck7K zlM(muyMUF!gR6=-hMjgk5UyA*;pi^sO^Rq@=RDusn%Er;Wxc)c(xg0Xstaw0e2;lV zBlH~n=}7&F5S4X`6Guxwf0^%t`%LCY`i$}&7S4#0AL{};QQ?dAn}rk!pNsTZ6y}gu zL`Z~l_5y~HeEo*66d&n6&68vw9$T3HDpF{ak-^uQCTWPgN>x&4JH}?y_q@rJ&tq3A zuZqF8jerm*HvSrQFQpA{ltYTBOIO``4E{qws2$=<>yi=4)svM@1MIX{bcuK_l9SV2 z5j-oGGA^1tb=$HYhJ0IAL)t;KQM+AKwS`oqlP7XQ!*Y*LoRCQoN~k+bx0+z+_}!%-2LgcI-#}R zCV;-Mg-?R#ERfa=Ra?UjCrFsKp{AxLfxIq16?4}|{N!}Ce6|ZNFR{R(VJc|$5mzbZ zV{?X->oY0M zUc7lZDvNfOj}g2r&TMbas$6ErYU6049Gxq{4rPX!*;%aL%;4T4R_BQtRIy*+_oL7j zLpnzRD!yM>ULGBB-I*@ILv;pEAevuM2K~yLXh4lAjKnqQ;06`a@^W%=3J83ttqmqu zyME9FL%Vd5PB#Q62xP+c@URJZ_gt>LLX>5dh;Rb;T>Eo#L}#Ktva@&MWYUiL%y{1w zAWSgQVb#b^PH%;t9q~XtDuBmfuU2CFDQ$^F%TFVAs4~rw1QackM~xm6^vP@-P?i`A z`0IWT>JeY^6|Ht|bdScvQ%D#L*kQbqe^wEySc|a%&53Hv@IG*87Jg!c=#Yeu-oYEmfxj_ zmNw>6jm9m+Wg#^u0zp}WpQpF@O98{i1#(42 zw-2p|Xe2wT^Qq{moZu^RZx23yE#q%mdWb?N7x8A;rBD0U3-&98$L8>uB+QiGbT+q} zNQ<#G-aJl{$2b&jn>s=~}*NkQAy2)7ps(2zgGYB70{hn2*~sm>-Qn!MPz= zu8O5m!P2NZWqf`yuYk*+`U7p{ARzy3!%jtEN_&cw)}+@g;J+a)l$G_PYs^7vq<+>Gf3SG2#nCRvp*wsVD2AO%{+>u*EhdhjpK$e{U0_k1dI@ zNN}?v`qc?nb=+a;MdSQP$vYMuo!wSVE`#g`4ZrNGS=Y&eJnvzU1FHp_U4mwYivP; zI7>qtB(}|^&YTIE_ltfC5r3WDt29gJyGiUwaU0gNP8}l)>bR(#9%)~-!9fo#Iw`VF z_NvtoB9nOUM|I5OT6t=od_RAZ$CkWtcE81ab;vdF^C*_ym(B>gDE3Vy=CO@KjlU{m zYhf%`Q5rm;O+C+c=6iO0_RfaFDg)#n)ag%ZDA&(^ELA4UE`2=`J)QYxKm2|gl6`RU zn0a6^ew^BaWdZrKcI{4Stl&XxxFdIgTqw$W(~U-1ISl zq!Sk$n{td|u^{Vy?1=`&IkB;^uXobO+dS<0;D5s$0&Kwc(ZJfZ%V4oyRYj6K`kb;{ zg2c)TUTfJNZ?)JSTF)zAIMxY5#W5_Et&^qFP6M%Of63D|m*G}Z`3pH9WjZs{IcF7g znGA?oIMF$)UOHtJj1!-#9)EDrtTz)|05uzxG}=sc8E9OWSFDw}E-KK4eQkWfx|RAV zU4`mzh~nK=JxifAf&r*RWpN-z5#b6C01K~OSxik#dhdt)b0UKHBYIsWTt6^>sVM@~ z@TtA&YONpge?=56a}F1*8xO{1NWnp>l>bJc4Wo2U2X_Bus&8L!Z}oX6_s27&pCAKo zs0wYlIM+OjjeX9b^6r-epyk)GKN-)cD$|S^$ZPnjW9c0zF)lh~xv_gBsQN0E#dU$^!p3&OulJ#1MWm z5%$|d@DXa}Ggosn{-(1k@rpJDiEaUS4OO=9beTeG~zQTmAn61a0B))_i8zK~- zd?oSz)5gE5q;Z!J2^Xh;e02NKW!r-xO#{|0(H%p_n&%XL{%iQRC9hrDUf1x8q2zrD zb7h*r)`x3T!sM3E-@*j_0zSmLP4Ft5;$EgNG&VFWh3_v)ff&H}K4rj=5b8{dox7NW zj9SU%>4)_iCs3azSy8DaKmF{FMmrrGUDbHLj7!Ta^thUwBwcxVG7X9Qfzx-tV##pethoESsLGrWj(M%mmiWNp}28{IqDhV>i&S~jS}9Kd=G~LknV9@FGq+x`&F=WGsYafWOW@8WXC&$gVzGRz0>twl>DU5m zkZ~k}21(YTXKoHLPKrD>13NWG5L#6YPeH<|(vX(XwCV=IvUIL%4n^l)#W35C#l&2P zkTZubwXf63iEF5KC>gcqktu-Ds*|!ZE^Xl=XZI{e280vlLdkTCe%p#@WHnpa94c;zc0=?m>h*9TVqVGb&*{q5i~z>hWLM#6uEVm!oR|J6oXTn4%zb*cMqT|02~@soKyCS^ zHTUVpEr*;IdcAk10A(l1mo-!HZIW4>oTzf%Ku6NV`0ebb zN5U;)UxT-ZV@7L$(=XkeCoo=bD6N_N(j#(_4fC@yHH)JnwHb&sd0dRotk^bR8!aH# z7AP=EHN?HIjCaopc>HBFWhs60DR21^~tF-?h141}1t57?&at5X`PWUPk{9pWep!FLj?8y;zD>>V|7 zt!I&u{7kikxN8!O%#-RV=+6*3S|L~#J|atXp=M0##e$^I4&w?DSmgpEiFYJ_9vPE8 zL)Xur2~9?$ta|n~_E~vWYnsCDsFtw9!jtDw1VO?=|D)4Fa8dlWh~yyOm6n>8H((K~ z&KV^i7Dpb26WK;kjXEUO&L-eOmhC&ue)(tVlr$_H$p-2)mL(Bh?HPLz<2R*3vDY~E z^n4u8yK`BMpF-}$3cr_BSb!oe+9a*?=y#Qi>bhT0NQ@!Yf#wWFr^{kh(1VE)vPSWC z!`LQ^orCO;vHJ?qMr(vAM`~&sRR=Oil=iUEsf79a;ds?B%-<`Zq@WfPf=;g!DupGw zUq>;1R%mV5si{-+Y+phv!KEV>drJ7ZJ~qDF`!%2<7Ut&k`s3y&6vMrQL05k6Gmhr4 z6Y?6?yz0L;S>Q4Xri`b>rTveT%Y(GrO3qrhWt_E_HFz_44V2#=I+j2_)uy`{s)6e0 z+gW|S@UTODQ)<9|o}Odb6}51CmPwBg6r%auK-70_b5zs6E|Y^TOAc z_?~?~h#K)Hh@|6DTS!1suA(%c$+sAU>EK?|0P2$-_+wzu)zPVjcX;_=z(>Z?W<@Or zzmpAJub_s3beUqZ-c(wN19~4J=#Fp`a!P)3BHtd9X*E=QB%w$kYHQvJhhreUyRl3eghmwwWwZe>(|@0v5lX z0fdN2W1)J<7me*y^0eR`Z4bc%;eSUoo*!3wMdFK4S`BU7({01TZEup*-xu}_KEe04 z_b0R&U;fLF;(6ue!W_8w_&Mp%S(GeeFLcWHzlc^FMjU5_X;>E|pwMP6MqcAlus*xi zYErs+1EE5O98H;O);smS!?WTVsa{_Z5bt9#>Q)8ZT5`981GC>TLF2`nx~)Tb@gkNj}QG zu%3&^g*fGv(@$Zy2Fs##aw7Y^ao>bmq?0`u5G~@^DGh|jAG{|olawi*2QeB+EHO+G zqD#9K4YCmVr1CRp7!%q?T$-aF7pTwiAiAw}Qje(erB5(0ewkJKAxWSRODEnZPCgQVtb4>n-*1>@x%r8u!Bo|o!NBIAc<*l4|h z3WlyCaus~Q9Up%!xGWD3zSspf<_jUBG&~8$Hs-*lYVD1MDWE;SB#Oi!BjaX!m$c)8 z#%V@V#i$4-aoFMPOw!8oLTuRjUdc`GR59vMI4nA>k$DLDk`GL|N6AaAM=TGIDQZDoGg9vE(e4wU#wPWK-e8J*Me<&7xv1JL&N%&si9ngxHnhX42A>7e2DX<4QW+6~DMGSOx2MD&^G_(phcwn(7 z*uO+_dX_I`hQdT_+V)U9DnP(hd9#oDDzEtGql*5nk{x>2;=;3|fY89eF)5AA%uKo8 zLX)_SAd{qFOrlQL)(qzqjYc!JhL0y#4up*J&7M_p?Gdx^r{@JzzZLN{HnlYR_2!w9 z8=(XpHqO9mc@QMzVjZecjGZPO6LR0cVJwL>Wx&_25txp`8_#W7a4YE6)Jet&3 z1)Hn6sX`rQJ5PFB-s`MReOZkybAwO`DS@%xfGIx}KtS!xLL`%jA1OA>*{jS2V4ISc zw71iXe>tg1jzyFgjs3=lyd zrXA%rB*()?mP803`Dt~lq?g^4h&FgUs-UFx`VyP!5oF-!qNXO@J0Rw^QIvbjYe(LA zJ2DU^ldj+3fA);?FpD5${SxG{pG;ek|LsNb!ly1GsmkD?Bpa`za>Ayy-ojIuKme+ZHma%9qNdVk z82NB;u;P#HcG+S%VGBhQyQbh7qw32%(SEw`VNN0W8MgGNYpsEgW;E*1iAo}ZMjXYL zI6~JqE9}qw>=7R@iLxFz8_ieV!P3%_O2|fzoqXZ&)yDRKe%0$ofC-y2EuCIehinHK zoMjw;_QG^Cj zBxYvjIoJj@q~1(c?USM z@n2#vw*QL3q)wNm*}CD_U9oPg;NnhBPL`FGnG!%}8M`hzD~fhn=HQxz7wq6>$e?RN z@ZV!F_#4yQ-A4?H;kKi1(swN-+YJzazvZ4#-^TwH+mj1 zF{go;nj6R{!|0_O*NE$^&fa`y{2WQk+gy>v%#QYFfQG3+gb&Liv-M5}LKkG^KQ`A~ zEx{fv)UZQC(D`W=XI;8<`zJc5Sd2M^#3*`Zo&`)(M~F;Dwi8#rYGv1~+MUo}v-9to zf6%Tdj$VuDK)kfg*7>vWh7595?ZmUH0gN~X;#@Lip22};AC=k`)+g9TCMj9wMQR}i z5>=73C7sS$M!xz`ETak)j1WQRj{}ATozY9L3!Gor104%IrBC-J3UVTolYxBMERS!% zEzq`OVI<&UJTs`fI;wYx{Z}@ewCFH#JV)S?*rkhDa|45%*x10qe>Qp z*YSC^E?*KfbaQdQcb@1KL3B2`oBo|mlAibkC2xc%xflpax@@lw4oL!Vj};&4SmIS* zTs=h`7s1kYr z;KAB0DIA*IqW+YnH7i7fw&4%m4fA!jgmo()zOs{kJfoVJO{z1Aj*jT<3z&8uDmS75 z80#8y;E@;k{~S>E$j>)2hPp5J%~*2wp&`BpDYkWHrSlHT;OFEJv>idfQRNU2aBKDq zexf-^;Z*RQ4j#a!e{|!&8c2B}>DCW^+<@>^xRy9z|7WD7rM-P?q_5wJS$qq4d&AO7 zGTVkHB`yd~xDLryjX;byYvYy6JuI(~PniEBHoWa(NCWmHybl~~|A%pORbs!YkM{qg zv(}6L!M4H<5(b3RQI0ezREz;)4Hb}pm7hinpwbbRIsploA&O+XNn2#4Ka8Le8GhET_`_6Lpfx+e&|e}#W{QiB@IWb|}JA`smMPIGeF-J!8=?*Tox zOyuv;S+jqfv+6)Ef5hx?Aomie<$Onz>%R~6QD-@JDhx`%jBQlE-XaWk-~JR;UFipd z`5m$?ArY_!NM-FkNX>UX9Pz$(sGs(hw>qyEFdr3Njww+V{h@u{H$v0Vz=V_3SX*Uc zRiuD0Riqh3{x+`0tPQ>vA3_|j)eI$op5wRLv3y`f2rW?YHrt{6%D39rSaVAcucaaw zaJAl@Mt0|m^f+5|vDvbz#mex5p}soWcz-Uyk)|Hbj5b!g*Bd8P%8!SPriYqOW#_jI{IL4# zS22ou6)TY*ou&X*u=WSV-r%p&;(}*IkFcu0=X58mTEsb^>{v`I0ivRH{*?1fmv zZj$7l8p^gfIC?Tf%*T;tKlbmQQpXL*i$-M0%AfZIx_22Ly4MB-07|_pA2Bl`!FueB zjEv;>#HF?eT&^t#GU6OFm{ML{sm9zL4TXPsj?zu7QcYc6M)9hGo%qxeAA_mBOxR(# zm7K@s1EXq9T@X6`av<1*RN94a+UK7uD&J?q~hU}n9gGFqszue<8dtGz&`TX zA9Mnl9M1Oz&-z>f26$(zqj|TF;1wrrs2wqc>)Q_N`s>4?lljlyZq9|HQM9xpQus+c z3g{f4K|Auh;8+T8Z&Xw!WZ~PJb7m2!W5aVHSRu?bD%983!A-VVz~Vf%Wo>+Q!uvnVhTRaRIQSvb4c~v|q};HggTvP zcCD*?_le_e-cZCb+F(Yv20hPN+#$OXC-O>>ZGHK1UGghnDG?IV^NO&=`%Fwt#pX=m znH^e_Nb2d%r^EyZCNTld^%~E2#mD)i8_dqmzH*N!GR_VUW!0BxS2?U7qVBo$pDP2i z!fT#e8;=7>vOh%GuRJltnP7Z#?K2G!JX?g$;cD1WHK z8)glY`i%&CR0kSq(yqkY29C|XLPiGx#9>=EjJO_v6BEGerS9+b7@$vP0C)mpe3w~= zJVchXfzXk53UiO(!xMZ2aIOW0T`*M%Dt(Hf(x=pjaRv;1A`%Ds3hy)V!Ri5GX+!yb zO`%2w`t%8g8aUVTDSDLd;gD)6G(5$m8|C?M$^{V{7BU56;=z^HCq7FiEZuz)j+_Z4B5;=^fHt^YSeoMQr8@0R=yv;j0p;DCEp zrq)QIUm#pK&{=>I``;3^59ksEw?+dKMh#BE65@UsQiM1K!YU2!j}Y80{TII_HxRNz zLpCBKA*sE$Z_Im`KY&gSA@;>Ri+^Y6e_lF-UdMyp(BtIc;Nki6+TO$ExqsZ-V!*(_bmiQYxMCsUJV7Vo zF#Gfh79R2ce)+$X@PDuqn&9E<&2P&8lWQKB0m>kJ90Gqa&A;E){o}GL=O0&eRe-y? z>=MvB#4fXf7)O--3f|+TjN3l_ z<@xod*?HUjfZ2~QYB#|MT^@R{uXu9x@bI2BMhFT zFmi=)auMXB}>=vXS4>HX+UgQ-nF0KtBIOXF!YI*>QRfo9)QPyz%rpJJ@xwBTV2teQ57mN2ric zEC`5ta9hi)6&4jLN)HdCW2TN--JWCLuY3})9~tOod7J%-@bLA9w)#dgN@%1V-~$WN zOJK7?4ShNN<0TOv0}^pymLr~>rzuRpYXP-pFjBv(2#gdBJgtkEA6&q;AvPy!e|xK4 zMPk+ScrL%Y^(#s=qbQdjN)ptXzs}I(t=#GIScvnNL!CO|9w#7q5dv2nn$m|>8; z;&y{y0>Om7lE;RB1J5Q8XD^OWD63pj@XoR5q3BwHy z{gs?JYFMWt2kcUiJ#z2?Hh!K&X#zn3R=VU2HmL!!uatxuKOTIKRAd4+MEr7`zLDbP2_~egXAN!amZB;(m03*@fJ296ekUC(i~$Brt#H$wGbJyT-VTdX&?NzNQ9rh z{!nNp5XEfjBK$#m0K@Xyv?~c&ydN2ULRJr%^iWzdL5~&|hsrULx&W?3CL;l}fb>JG zeB!fJc*O8r^E4uYUgDK-{g@vXI_5JL3LMjEmT5XlgunP~u(^XSgWp?B*A(h8l#6+x z@Zn^}vVPVvi#Ic@POX8TGv5&+!|eM+{FBTru$jn+%Z0ZRp$Tg?rsdUkH^vY8L!VZr zCA|G$tj^~L7B8sUQD2h1q*#up?CoGkKrujY4922*1EO`J)xsu0UPrzS#p&Wv4=Psm zpbo?K{cL2xSQ9rV(F!J`S4qMHhtU#h&@!gi2Wf#FsEz4G=-a501_Z6-+==wXO;jss zvq7eGSP(I_lJhD83LnIM#eJpTYhV<+OzD-TeatdYZIcdA2w;~>;!ZtI zT^XoIDob=s*-rJRQ%#;t^-eWq%Vsd8dZ}<%c+(80-YMRx8I)hGlPmk9zDwjaSSBMc z#UjEY!y?imBI$bLy2-5UewM2Zg`U~BADiX=b_r716>y_&T7pxaJ$mO0ETu&x# z_MA{|w4I<>(^(s?Jy|1LBU!5()IjXwFuUN^AbuZ{6w?wDf6Vji!`RB$SH3EHllxZ2 zluITTrWYyHDK;svDeq6Km*DtC)mCqxSt%S0+Hi|h1k^Hu6bag8BthEFA$jG8pPB~=yK_1I0T z)c12m)w3(I3p(UF3||g@8V41FVxF#+4wB# zP;|wRzB)1s3<1XuC~MA5Eoqs39IGEgcl>2X&r`g#22A5@Z~SN;J&ajFV(@3E znFJRtXX%eJj$(}FqoETX5KgfYxlcU%(M;x^$Y#YBW9s9UJEi?KWyN6oYFK$TcHQf< z^XJ7mk@?%^Yi2A(tVFr!zT~2$b&@eOlZezR-9+80Cdj$PzQcZzsGw-1Xsjr1yH|Tz z0Q-gcE!?fw)#CB&!TQzgwJHKXLOIF?Y5{^Qf)0`>8W+mrN1h1Xov@uP!IbP@Olgg# z2;d}dq`Y1Wqwt~|<6k`|Vq@Vcr{D2y*7gbX@kU^^kdc=9+#(;}|D|6pI+j3@z*}}e zu198CPFcoZCRIi;RgXo#ZdEqMAO=(@LO@B1?@#OHUUL3rQ89dF=O^mQ9vipOo4TC^ z_lC8Sp|Q#Y(@ypWM(&b{k`epR`iuHWNjmeWYGz|@ z5r#JQZk~J&sgHy9(|g*udEyg^N>85a+q9&`-6@^Q$Ixcdh3KQzIn*xM%2{U*st@D* zI$6zFbr~WbI3BnT-xfDN9_yuB=$p)sSAI9HSQ|ddJ8Ejt z-D%e`H+*J>Wgl-9U(Z!s+on+EAU9pKRj?IA5})y_ZOgxDH*2Bq>ukre^UF!tSoj_! zQ3^b=)|dU~YK|2W&OPSeew25QZRc%$?67@l`cisV{xES&?zPuuRbJ{gPE#UAZ(Alv-tS_`$v8YuojWc50bzrGT+eKvqE8ZrE+?3`NVkH>Nv* z_L~j+&TX4+b+>O;D&pE71*~5gU$ZZreGFKOyU!wpk4C)OV{7-nH~A*A8L)IafmDKJ zA~x*De`|MZxwDeTfU3&$u2ihzcKTx0rljp;Cui1dtS-VfKCD@a{XXTgO11mZSjiZ( zY`yH3T!q|N%w^1?U(HF+!B9-<zJK=11|TZ@6u2aXfl>0$~?#q9!D zGiT20RvW96-uC;2MNvyYeC#afHuu`{q%U!ENA*HAB|BEk`vuC)kq^DI&9CM2(Btd> z0#~6h6be_l_&B-##H-MBDbO+?(F<5gO49tfwH1gHieWWC#(&oN^F3&amwzRodHz48 zl!2yW@dR?LaDvzs?X8{zIb{B5@843waQ=Iio!@OrnR}Q!x!V5DZu9)lv^F}{?$7OA zT|n%dY&`$|{-0@bo+z7Jf>bp@dO)rhHUTzXkh-V2yN4eL$XfG|0LRCJ@y}s!{+ZzB ziL@XW2PZ!VHzyw_4-X$VmjMR{1Mu%(HUF3t=zxJtI98sPK-wS9Ke7Nx0oi^$fG$Zx zG5kZD(BwL&@TGIQhAtHd#0ZayGC&fm&7dH6W~*&Zi9 zFjxOsj|?_}-% zkgG}4-Vaz0AU%+Vt1Gbi{>XX+cCm235U|xA7MPQtmzxWfj!s5Z7WMxD9f4+| literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/rfsm-logo.pdf b/docs/user_manual/figs/rfsm-logo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..da1a8fedd5b4d37f677b4191971b4b816e1c36fc GIT binary patch literal 179592 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 z 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

T#m6jzz8?i!eg>yS;*9T!xs~9hO+fOV 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 literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/gensig-model-moore.pdf b/docs/user_manual/figs/gensig-model-moore.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b78c951d507342df793b21da7eeeac9e1148b08a GIT binary patch literal 11497 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 literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/gensig-trace.pdf b/docs/user_manual/figs/gensig-trace.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6f34757e461117a2526d990af76c081d29cf6f85 GIT binary patch literal 12828 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 JoVq;4{{Y_K3zz@^ literal 0 HcmV?d00001 diff --git a/docs/user_manual/figs/gui/make-dot-project.pdf b/docs/user_manual/figs/gui/make-dot-project.pdf new file mode 100644 index 0000000000000000000000000000000000000000..925084f531778b65f1b0f14c7c8b57ae5f238729 GIT binary patch literal 113028 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�A26iC5nQyVkDh&0bDQlNkcOC3E0> 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