summaryrefslogtreecommitdiffstats
path: root/presentation.org
diff options
context:
space:
mode:
Diffstat (limited to 'presentation.org')
-rw-r--r--presentation.org2373
1 files changed, 2373 insertions, 0 deletions
diff --git a/presentation.org b/presentation.org
new file mode 100644
index 0000000..2f383c0
--- /dev/null
+++ b/presentation.org
@@ -0,0 +1,2373 @@
+#+title: Formal Verification of High-Level Synthesis
+#+author: \underline{Yann Herklotz}, John Wickerson
+#+options: H:2 toc:nil
+#+columns: %45ITEM %10BEAMER_ENV(Env) %10BEAMER_ACT(Act) %4BEAMER_COL(Col)
+#+setupfile: setup.org
+
+** Script for start :noexport:
+
+Hi, I'm Yann and I will be presenting our work on formal verification of high-level synthesis.
+
+Hardware accelerators are becoming increasingly more popular in many industries, because using a CPU
+for those tasks is often unnecessary. For example, a datacenter might have a CPU organising
+accesses to various SSDs or harddrives. However, this does not benefit from the flexibility of the
+CPU, and would therefore result in increased latency for requests, as well as increased power
+consumption. Instead, one would ideally like to have a application-specific integrated circuit that
+only does one task, thereby using up less power and probably being more performant at that task.
+However, until recently, designing a special chip for each application is expensive. This is where
+FPGAs come in, whose main benefit is that their circuit can be reprogrammed at any time.
+
+** The Need to Design Hardware Accelerators
+
+Application-specific hardware accelerators are increasingly being needed in industries.
+
+*** Column 1
+:PROPERTIES:
+:BEAMER_ENV: column
+:BEAMER_COL: 0.5
+:END:
+
+#+attr_beamer: :overlay <+->
+- Using a *CPU* everywhere not always the best choice.
+- *Application-specific integrated circuits (ASIC)* are the ideal choice, but very expensive to
+ create.
+- *Field-programmable gate arrays (FPGA)* act as *reprogrammable hardware*, therefore can be made
+ application-specific.
+
+*** Column 2
+:PROPERTIES:
+:BEAMER_ENV: column
+:BEAMER_COL: 0.5
+:END:
+
+**** Minipage
+:PROPERTIES:
+:BEAMER_ENV: minipage
+:BEAMER_OPT: 5cm
+:END:
+
+#+beamer: \vspace{2em}
+
+***** Only 1
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: 1
+:END:
+
+#+begin_export latex
+\includegraphics[width=6cm]{assets/database-cpu.pdf}
+#+end_export
+
+***** Only 2
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: 2
+:END:
+
+#+begin_export latex
+\includegraphics[width=6cm]{assets/database-asic.pdf}
+#+end_export
+
+***** Only 3
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: 3-
+:END:
+
+#+begin_export latex
+\includegraphics[width=6cm]{assets/database-fpga.pdf}
+#+end_export
+
+** Where does the flexibility of FPGAs come from?
+
+#+attr_beamer: :overlay <+->
+- FPGA's are programmable circuits with two main components.
+- *Look up tables (LUTs)* provide flexible logic gates. They are connected by *configurable switches*.
+- *RAMs* provide accessible storage.
+
+*** Minipage
+:PROPERTIES:
+:BEAMER_ENV: minipage
+:BEAMER_OPT: 5cm
+:END:
+
+#+beamer: \centering
+#+beamer: \vspace{0.2em}
+
+**** Only 1
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: <1>
+:END:
+
+#+begin_export latex
+\includegraphics[width=8cm]{assets/fpga.pdf}
+#+end_export
+
+**** Only 2
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: <2>
+:END:
+
+#+begin_export latex
+\includegraphics[width=8cm]{assets/fpga-expl.pdf}
+#+end_export
+
+**** Only 3
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: <3>
+:END:
+
+#+begin_export latex
+\centering
+\includegraphics[width=8cm]{assets/fpga-expl2.pdf}
+#+end_export
+
+** So How do we Program an FPGA?
+
+*** Code example :B_column:
+:PROPERTIES:
+:BEAMER_ENV: column
+:BEAMER_COL: 0.5
+:END:
+
+**** Top
+:PROPERTIES:
+:BEAMER_ENV: minipage
+:BEAMER_OPT: 4.5cm
+:END:
+
+#+attr_beamer: :overlay <+->
+- FPGAs contain *LUTs* and programmable interconnects.
+- Programmed using *hardware description languages*.
+- Simulation quite slow.
+- High-Level Synthesis is an alternative.
+- Faster testing through execution.
+
+**** Bottom
+:PROPERTIES:
+:BEAMER_ENV: minipage
+:BEAMER_OPT: 2.5cm
+:END:
+
+#+beamer: \vspace{1em}
+
+***** Only 2
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: <2>
+:END:
+
+#+begin_export latex
+\includegraphics[width=0.5cm]{assets/up-arrow.pdf} Fine control \hspace{1em}
+\includegraphics[width=0.5cm]{assets/down-arrow.pdf} Long to design
+#+end_export
+
+***** Only 3
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: <4>
+:END:
+
+#+begin_export latex
+\includegraphics[width=0.5cm]{assets/up-arrow.pdf} Quick to design \hspace{1em}
+\includegraphics[width=0.5cm]{assets/down-arrow.pdf} Less control
+#+end_export
+
+*** Code example :B_column:
+:PROPERTIES:
+:BEAMER_ENV: column
+:BEAMER_COL: 0.5
+:END:
+
+**** Minipage
+:PROPERTIES:
+:BEAMER_ENV: minipage
+:BEAMER_OPT: 5cm
+:END:
+***** FPGA
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: <1>
+:END:
+
+#+begin_export latex
+\includegraphics[width=6.8cm]{assets/fpga-flow.pdf}
+#+end_export
+
+***** Verilog
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: <2>
+:END:
+
+#+begin_export latex
+\includegraphics[width=6.8cm]{assets/verilog-flow.pdf}
+#+end_export
+
+***** Verilog Simulation
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: <3>
+:END:
+
+#+begin_export latex
+\includegraphics[width=6.8cm]{assets/verilog-flow-testing.pdf}
+#+end_export
+
+***** HLS
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: <4>
+:END:
+
+#+begin_export latex
+\includegraphics[width=6.8cm]{assets/hls-flow.pdf}
+#+end_export
+
+***** HLS Testing
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: <5>
+:END:
+
+#+begin_export latex
+\includegraphics[width=6.8cm]{assets/hls-flow-testing.pdf}
+#+end_export
+
+** What is High-Level Synthesis :noexport:
+
+*** High-Level Synthesis (HLS)
+:PROPERTIES:
+:BEAMER_ENV: definition
+:END:
+
+Translation of a high-level programming language such as C/C++ into a hardware description language (HDL) such as Verilog.
+
+*** Benefits of HLS :B_blockNH:
+:PROPERTIES:
+:BEAMER_env: block
+:BEAMER_ACT: <2->
+:END:
+
+- *Usability*: Use software ecosystem.
+- *Speed*: Quickly design hardware.
+
+*** Trade-offs of HLS
+:PROPERTIES:
+:BEAMER_ENV: block
+:BEAMER_ACT: <3->
+:END:
+
+- *Performance*: Requires automatic parallelisation.
+- *Correctness*: Hard to verify generated HDL.
+
+** Motivation for Formal Verification
+
+*** HLS Unreliable :B_blockNH:
+:PROPERTIES:
+:BEAMER_env: blockNH
+:END:
+
+High-level synthesis is often quite unreliable:
+
+- We fuzzed HLS tools (Herklotz et al. [2021]) and found they failed on simple random test cases.
+
+#+beamer: \vspace{2em}
+
+#+attr_latex: :booktabs t
+|-----------------+-----------------|
+| Tool | Run-time errors |
+|-----------------+-----------------|
+| Vivado HLS | 1.23% |
+| Intel i++ | 0.4% |
+| Bambu 0.9.7-dev | 0.3% |
+| LegUp 4.0 | 0.1% |
+|-----------------+-----------------|
+
+** Solution :B_frame:
+:PROPERTIES:
+:BEAMER_env: frame
+:BEAMER_OPT: t
+:END:
+
+#+begin_export latex
+\definecolor{compcert}{HTML}{bebada}
+\definecolor{formalhls}{HTML}{8dd3c7}
+\begin{center}
+ \begin{tikzpicture}
+ [language/.style={fill=white,rounded corners=3pt,minimum height=7mm},
+ continuation/.style={},
+ linecount/.style={rounded corners=3pt,dashed},scale=0.8]
+ \fill[compcert,rounded corners=3pt] (-1.2,-0.5) rectangle (14,2);
+ \fill[formalhls,rounded corners=3pt] (-1.2,-1) rectangle (14,-2.4);
+ %\draw[linecount] (-0.95,-0.45) rectangle (3.6,1);
+ %\draw[linecount] (4,-0.45) rectangle (7.5,1);
+ \node[language] at (-0.3,0) (clight) {Clight};
+ \node[continuation] at (1.5,0) (conta) {$\cdots$};
+ \node[language] at (3.5,0) (cminor) {CminorSel};
+ \node[language] at (6,0) (rtl) {3AC};
+ \node[language] at (8,0) (ltl) {LTL};
+ \node[language,anchor=west] at (11.5,0) (aarch) {aarch64};
+ \node[language,anchor=west] at (11.5,0.8) (x86) {x86};
+ \node[continuation,anchor=west] at (11.5,1.4) (backs) {$\cdots$};
+ \node[continuation] at (10,0) (contb) {$\cdots$};
+ \node[language] at (6,-1.5) (htl) {HTL};
+ \node[language] at (9,-1.5) (verilog) {Verilog};
+ \node[anchor=west] at (-0.9,1.6) {\bf CompCert};
+ \node[anchor=west] at (-0.9,-1.4) {\bf Vericert};
+ %%\node[anchor=west] at (-0.9,0.7) {\small $\sim$ 27 kloc};
+ %%\node[anchor=west] at (4.1,0.7) {\small $\sim$ 46 kloc};
+ %%\node[anchor=west] at (2,-1.5) {\small $\sim$ 17 kloc};
+ \node[align=center] at (4,-2) {\footnotesize RAM\\[-0.5em]\footnotesize insertion};
+ \draw[->,thick] (clight) -- (conta);
+ \draw[->,thick] (conta) -- (cminor);
+ \draw[->,thick] (cminor) -- (rtl);
+ \draw[->,thick] (rtl) -- (ltl);
+ \draw[->,thick] (ltl) -- (contb);
+ \draw[->,thick] (contb) -- (aarch);
+ \draw[->,thick] (contb) to [out=0,in=200] (x86.west);
+ \draw[->,thick] (contb) to [out=0,in=190] (backs.west);
+ \draw[->,thick] (rtl) -- (htl);
+ \draw[->,thick] (htl) -- (verilog);
+ \draw[->,thick] (htl.west) to [out=180,in=150] (5,-2.2) to [out=330,in=270] (htl.south);
+ \end{tikzpicture}%}
+\end{center}
+#+end_export
+
+#+beamer: \vspace{1em}
+
+*** Minipage
+:PROPERTIES:
+:BEAMER_ENV: minipage
+:BEAMER_OPT: 5cm
+:END:
+
+**** Block 1 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <1>
+:END:
+
+Use CompCert, a fully verified C compiler, and add an HLS backend.
+
+**** Block 2 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <2>
+:END:
+
+Support for: all *control flow*, *fixedpoint*, *non-recursive functions* and *local arrays/structs/unions*.
+
+* Example
+** Example: 3AC :B_frame:
+
+*** Code example :B_column:
+:PROPERTIES:
+:BEAMER_ENV: column
+:BEAMER_COL: 0.45
+:END:
+
+**** Code 1 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_ACT: <1>
+:BEAMER_env: onlyenvNH
+:END:
+
+#+begin_src C
+int main() {
+ int x[2] = {3, 6};
+ int i = 1;
+ return x[i];
+}
+#+end_src
+
+**** Explanation 5 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <2>
+:END:
+
+- *Three address code (3AC)* instructions are represented as a control-flow graph (CFG).
+- Each instruction links to the next one.
+
+*** Text :B_column:
+:PROPERTIES:
+:BEAMER_ENV: column
+:BEAMER_COL: 0.45
+:END:
+
+**** Text 1 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_ACT: <1>
+:BEAMER_ENV: onlyenvNH
+:END:
+
+- Example of a very simple program performing loads and stores.
+
+**** 3AC Code 5 :B_onlyenv:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <2>
+:END:
+
+#+attr_latex: :options fontsize=\small
+#+begin_src C
+main() {
+ x5 = 3
+ int32[stack(0)] = x5
+ x4 = 6
+ int32[stack(4)] = x4
+ x1 = 1
+ x3 = stack(0) (int)
+ x2 = int32[x3 + x1 * 4 + 0]
+ return x2
+}
+#+end_src
+
+** HTL Overview
+
+The representation of the *finite state-machine with datapath* is abstract and called **HTL**.
+
+*** Datapath and control logic :B_blockNH:
+:PROPERTIES:
+:BEAMER_env: blockNH
+:END:
+
+src_coq[:exports code]{Definition datapath := } $\mathbb{Z}^+ \mapsto \texttt{\small Verilog.stmnt}$
+
+src_coq[:exports code]{Definition controllogic := } $\mathbb{Z}^+ \mapsto \texttt{\small
+Verilog.stmnt}$
+
+*** Minipage
+:PROPERTIES:
+:BEAMER_ENV: minipage
+:BEAMER_OPT: 5cm
+:END:
+
+**** Module definition :B_blockNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 2
+:END:
+
+#+beamer: \vspace{0.25em}
+
+#+attr_latex: :options fontsize=\footnotesize
+#+begin_src coq
+Record module: Type := mkmodule {
+ mod_datapath: datapath;
+ mod_controllogic: controllogic;
+ mod_reset: reg;
+ mod_ram: ram_spec;
+ ...
+ }.
+#+end_src
+
+**** Module definition :B_blockNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 3
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={2-3}
+#+begin_src coq
+Record module: Type := mkmodule {
+ mod_datapath: datapath;
+ mod_controllogic: controllogic;
+ mod_reset: reg;
+ mod_ram: ram_spec;
+ ...
+ }.
+#+end_src
+
+**** Module definition :B_blockNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 4
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={4}
+#+begin_src coq
+Record module: Type := mkmodule {
+ mod_datapath: datapath;
+ mod_controllogic: controllogic;
+ mod_reset: reg;
+ mod_ram: ram_spec;
+ ...
+ }.
+#+end_src
+
+**** Module definition :B_blockNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 5
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={5}
+#+begin_src coq
+Record module: Type := mkmodule {
+ mod_datapath: datapath;
+ mod_controllogic: controllogic;
+ mod_reset: reg;
+ mod_ram: ram_spec;
+ ...
+ }.
+#+end_src
+
+** Translation (3AC $\rightarrow$ HTL)
+
+Translation from *control-flow graph* into a *finite state-machine with datapath*.
+
+#+beamer: \pause
+#+beamer: \vspace{1em}
+
+#+attr_beamer: :overlay <+->
+- *Control-flow* is translated into a *finite state-machine*.
+- Each *3AC instructions* translated into equivalent *Verilog statements*.
+- Call *stack* implemented as *Verilog array*.
+- Pointers for loads and stores translated to array addresses.
+ - *Byte* addressed to *word* addressed.
+
+#+beamer: \vspace{1em}
+
+*** Minipage :B_minipage:noexport:
+:PROPERTIES:
+:BEAMER_env: minipage
+:BEAMER_OPT: 5cm
+:END:
+
+**** Only 1 :B_onlyenvNH:noexport:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 3
+:END:
+
+~x3 = x3 + x5 + 0~ $\quad\longrightarrow\quad$ src_verilog[:exports code]{reg_3 <= {reg_3 + {reg_5 + 0}}}
+
+**** Only 2 :B_onlyenvNH:noexport:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 5-6
+:END:
+
+~x5 + x1 * 4 + 0~ $\quad\longrightarrow\quad$ src_verilog[:exports code]{{{{reg_5 + 0} + {reg_1 * 4}} / 4}}
+
+** Memory Inference Pass
+
+- An HTL $\rightarrow$ HTL translation removes loads and stores.
+- Replaced by accesses to a proper *RAM*.
+
+*** Minipage
+:PROPERTIES:
+:BEAMER_COL: 0.5
+:END:
+
+
+#+beamer: \vspace{1em}
+
+src_verilog[:exports code]{stack[reg_5 / 4]}
+
+#+beamer: \vspace{1em}
+
+becomes
+
+#+beamer: \vspace{1em}
+
+**** Minipage
+:PROPERTIES:
+:BEAMER_ENV: minipage
+:BEAMER_OPT: 5cm
+:END:
+
+***** Only 1
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: 1
+:END:
+
+#+beamer: \vspace{0.25em}
+
+#+attr_latex: :options fontsize=\footnotesize
+#+begin_src verilog
+u_en <= ( ~ u_en);
+wr_en <= 0;
+addr <= reg_5 / 4;
+#+end_src
+
+***** Only 2
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: 2
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={1}
+#+begin_src verilog
+u_en <= ( ~ u_en);
+wr_en <= 0;
+addr <= reg_5 / 4;
+#+end_src
+
+***** Only 3
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: 3
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={2}
+#+begin_src verilog
+u_en <= ( ~ u_en);
+wr_en <= 0;
+addr <= reg_5 / 4;
+#+end_src
+
+***** Only 4
+:PROPERTIES:
+:BEAMER_ENV: onlyenvNH
+:BEAMER_ACT: 4
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={3}
+#+begin_src verilog
+u_en <= ( ~ u_en);
+wr_en <= 0;
+addr <= reg_5 / 4;
+#+end_src
+
+
+** Verilog Syntax :noexport:
+
+*** Column 1 :B_column:
+:PROPERTIES:
+:BEAMER_COL: 0.45
+:END:
+
+**** No highlight :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <1>
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize
+#+begin_src verilog
+module top(input clk, input [31:0] in1,
+ output reg [31:0] out1);
+ reg [31:0] reg_1, tmp;
+
+ always @(posedge clk) begin
+ reg1 <= in1;
+ end
+
+ always @(posedge clk) begin
+ tmp = reg1;
+ out1 <= tmp;
+ end
+endmodule
+#+end_src
+
+**** Highlight :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <2>
+:END:
+
+#+attr_latex: :options highlightlines={5-7,9-12},fontsize=\footnotesize
+#+begin_src verilog
+module top(input clk, input [31:0] in1,
+ output reg [31:0] out1);
+ reg [31:0] reg_1, tmp;
+
+ always @(posedge clk) begin
+ reg1 <= in1;
+ end
+
+ always @(posedge clk) begin
+ tmp = reg1;
+ out1 <= tmp;
+ end
+endmodule
+#+end_src
+
+*** Column 2
+:PROPERTIES:
+:BEAMER_COL: 0.55
+:END:
+
+#+attr_beamer: :overlay <+->
+- Verilog example for a simple shift register.
+- Always block run in parallel
+
+
+** Translation (HTL $\rightarrow$ Verilog) :B_frame:
+
+*** Column
+:PROPERTIES:
+:BEAMER_COL: 0.45
+:END:
+
+**** Code 1 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <1>
+:END:
+
+#+attr_latex: :options fontsize=\tiny
+#+begin_src verilog
+module main(reset, clk, finish, return_val);
+ input [0:0] reset, clk;
+ output reg [0:0] finish = 0;
+ output reg [31:0] return_val = 0;
+ reg [31:0] reg_3 = 0, addr = 0, d_in = 0,
+ reg_5 = 0, wr_en = 0,
+ state = 0, reg_2 = 0,
+ reg_4 = 0, d_out = 0, reg_1 = 0;
+ reg [0:0] en = 0, u_en = 0;
+ reg [31:0] stack [1:0];
+ // RAM interface
+ always @(negedge clk)
+ if ({u_en != en}) begin
+ if (wr_en) stack[addr] <= d_in;
+ else d_out <= stack[addr];
+ en <= u_en;
+ end
+#+end_src
+
+**** Code 2 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <2>
+:END:
+
+#+attr_latex: :options fontsize=\tiny,highlightlines={11-17}
+#+begin_src verilog
+module main(reset, clk, finish, return_val);
+ input [0:0] reset, clk;
+ output reg [0:0] finish = 0;
+ output reg [31:0] return_val = 0;
+ reg [31:0] reg_3 = 0, addr = 0, d_in = 0,
+ reg_5 = 0, wr_en = 0,
+ state = 0, reg_2 = 0,
+ reg_4 = 0, d_out = 0, reg_1 = 0;
+ reg [0:0] en = 0, u_en = 0;
+ reg [31:0] stack [1:0];
+ // RAM interface
+ always @(negedge clk)
+ if ({u_en != en}) begin
+ if (wr_en) stack[addr] <= d_in;
+ else d_out <= stack[addr];
+ en <= u_en;
+ end
+#+end_src
+
+**** Code 3 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <3>
+:END:
+
+#+attr_latex: :options fontsize=\tiny
+#+begin_src verilog
+ // Data-path
+ always @(posedge clk)
+ case (state)
+ 32'd11: reg_2 <= d_out;
+ 32'd8: reg_5 <= 32'd3;
+ 32'd7: begin
+ u_en <= ( ~ u_en); wr_en <= 32'd1;
+ d_in <= reg_5; addr <= 32'd0;
+ end
+ 32'd6: reg_4 <= 32'd6;
+ 32'd5: begin
+ u_en <= ( ~ u_en); wr_en <= 32'd1;
+ d_in <= reg_4; addr <= 32'd1;
+ end
+ 32'd4: reg_1 <= 32'd1;
+ 32'd3: reg_3 <= 32'd0;
+ 32'd2: begin
+ u_en <= ( ~ u_en); wr_en <= 32'd0;
+ addr <= {{{reg_3 + 32'd0} + {reg_1 * 32'd4}} / 32'd4};
+ end
+ 32'd1: begin finish = 32'd1; return_val = reg_2; end
+ default: ;
+ endcase
+#+end_src
+
+**** Code 4 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <4>
+:END:
+
+#+attr_latex: :options fontsize=\tiny,highlightlines={7,8,12,13,18,19}
+#+begin_src verilog
+ // Data-path
+ always @(posedge clk)
+ case (state)
+ 32'd11: reg_2 <= d_out;
+ 32'd8: reg_5 <= 32'd3;
+ 32'd7: begin
+ u_en <= ( ~ u_en); wr_en <= 32'd1;
+ d_in <= reg_5; addr <= 32'd0;
+ end
+ 32'd6: reg_4 <= 32'd6;
+ 32'd5: begin
+ u_en <= ( ~ u_en); wr_en <= 32'd1;
+ d_in <= reg_4; addr <= 32'd1;
+ end
+ 32'd4: reg_1 <= 32'd1;
+ 32'd3: reg_3 <= 32'd0;
+ 32'd2: begin
+ u_en <= ( ~ u_en); wr_en <= 32'd0;
+ addr <= {{{reg_3 + 32'd0} + {reg_1 * 32'd4}} / 32'd4};
+ end
+ 32'd1: begin finish = 32'd1; return_val = reg_2; end
+ default: ;
+ endcase
+#+end_src
+
+**** Code 5 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <5>
+:END:
+
+#+attr_latex: :options fontsize=\tiny
+#+begin_src verilog
+ // Control logic
+ always @(posedge clk)
+ if ({reset == 32'd1}) state <= 32'd8;
+ else case (state)
+ 32'd11: state <= 32'd1; 32'd4: state <= 32'd3;
+ 32'd8: state <= 32'd7; 32'd3: state <= 32'd2;
+ 32'd7: state <= 32'd6; 32'd2: state <= 32'd11;
+ 32'd6: state <= 32'd5; 32'd1: ;
+ 32'd5: state <= 32'd4; default: ;
+ endcase
+endmodule
+#+end_src
+
+*** Text
+:PROPERTIES:
+:BEAMER_COL: 0.45
+:END:
+
+**** Text 1 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_ACT: <1-5>
+:BEAMER_env: onlyenvNH
+:END:
+
+#+attr_beamer: :overlay <+->
+- Finally, translate the FSMD into Verilog.
+- This includes a RAM interface.
+- Data path is translated into a case statement.
+- RAM loads and stores automatically turn off RAM.
+- Control logic is translated into another case statement with a reset.
+
+* Verification
+** Verilog Semantics (Adapted from Lööw et al. (2019))
+
+- Top-level semantics are *small-step operational semantics*.
+
+*** Only 1
+:PROPERTIES:
+:BEAMER_ENV: blockNH
+:BEAMER_ACT: <1->
+:END:
+
+#+begin_export latex
+{\centering\includegraphics[width=8cm]{assets/clk.pdf}\par}
+#+end_export
+
+*** Only 2
+:PROPERTIES:
+:BEAMER_ENV: blockNH
+:BEAMER_ACT: <2>
+:END:
+
+- At each clock tick, the *whole module* is executed using *big-step semantics*.
+
+#+begin_export latex
+{\centering\includegraphics[width=6cm]{assets/big-step.pdf}\par}
+#+end_export
+
+** How the Verilog semantics changed :noexport:
+
+Changed the semantics in *5* minor ways to make it a better HLS target.
+
+#+attr_beamer: :overlay <+->
+- Verilog *2D array support*,
+- add *negative edge* support,
+- add support for *declarations*,
+- *removed* support for *external IO*, and
+- *simplifying* support for *bitvectors*.
+
+#+beamer: \vspace{1em}
+
+*** Minipage :B_minipage:
+:PROPERTIES:
+:BEAMER_env: minipage
+:BEAMER_OPT: 5cm
+:END:
+
+**** Only 1 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 1
+:END:
+
+#+attr_latex: :options fontsize=\small
+#+begin_src verilog
+reg [31:0] x[1:0];
+always @(posedge clk) begin x[0] = 1; x[1] <= 1; end
+#+end_src
+
+**** Only 2 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 2
+:END:
+
+#+begin_export latex
+\begin{equation*}
+\inferrule[Module]{(\Gamma, \epsilon, \vec{m})\ \downarrow_{\text{module}^{+}} (\Gamma', \Delta') \\ (\Gamma'\ //\ \Delta', \epsilon, \vec{m}) \downarrow_{\text{module}^{-}} (\Gamma'', \Delta'')}{(\Gamma, \yhkeyword{module}\ \yhconstant{main} \yhkeyword{(...);}\ \vec{m}\ \yhkeyword{endmodule}) \downarrow_{\text{program}} (\Gamma''\ //\ \Delta'')}
+\end{equation*}
+#+end_export
+
+**** Only 3 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 3
+:END:
+
+Have an association map for each register to declaration.
+
+- Information about input or output.
+- Information about size.
+
+**** Only 4 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 4
+:END:
+
+Constant inputs and outputs modelling the HLS interface.
+
+**** Only 5 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 5
+:END:
+
+Use integers modulo $2^n$.
+
+Those are the only types needed for HLS.
+
+** How do we prove the HLS tool correct? :noexport:
+
+*** Notes
+:PROPERTIES:
+:BEAMER_ENV: note
+:END:
+
+This describes the main proof that is needed to show that the HLS tool is correct. I should probably be spending most of my time on this section, as that is what George will be most unfamiliar with.
+
+*** Text 1 :B_blockNH:
+:PROPERTIES:
+:BEAMER_env: blockNH
+:END:
+
+#+beamer: \vspace{-1.5em}
+
+- We have an *algorithm* describing the *translation*.
+- Have to *prove* that it does not change *behaviour* with respect to our language semantics.
+
+*** Minipage :B_minipage:
+:PROPERTIES:
+:BEAMER_env: minipage
+:BEAMER_OPT: 5cm
+:END:
+
+**** Table :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <2>
+:END:
+
+#+attr_latex: :booktabs t :align cp{10cm}
+|------------+------------------------------------------------------------------|
+| Behaviour | Guarantee |
+|------------+------------------------------------------------------------------|
+| Converging | Means a result is obtained, Verilog and C results must be equal. |
+| Diverging | C is in an infinite loop, Verilog must execute indefinitely. |
+| Wrong | Such as undefined behaviour, no guarantees need to be shown. |
+|------------+------------------------------------------------------------------|
+
+**** Theorem :B_onlyenvNH:noexport:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <3>
+:END:
+
+***** Main Backward Simulation :B_theorem:
+:PROPERTIES:
+:BEAMER_env: theorem
+:END:
+
+#+begin_export latex
+\begin{equation*}
+ \forall C, V, B,\quad \yhfunction{HLS} (C) = \yhconstant{OK} (V) \land \mathit{Safe}(C) \implies (V \Downarrow B \implies C \Downarrow B).
+\end{equation*}
+#+end_export
+
+where
+
+#+begin_export latex
+\begin{equation*}
+ \mathit{Safe}(C):\ \forall B,\ C \Downarrow B \implies B \in \texttt{Safe}
+\end{equation*}
+#+end_export
+
+**** Theorem :B_onlyenvNH:noexport:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <4->
+:END:
+
+***** Forward Simulation :B_theorem:
+:PROPERTIES:
+:BEAMER_env: theorem
+:END:
+
+#+begin_export latex
+\begin{align*}
+ &(\forall C, V, B \in \texttt{Safe},\quad \yhfunction{HLS} (C) = \yhconstant{OK} (V) \land C \Downarrow B \implies V \Downarrow B)\\
+&\land (\forall V, B_1, B_2,\quad V \Downarrow B_1 \land V \Downarrow B_2 \implies B_1 = B_2).
+\end{align*}
+#+end_export
+
+** 3AC $\to$ HTL: Build a Specification :noexport:
+
+Assuming $\yhfunction{HLS} (C) = \yhconstant{OK} (V)$ requires reasoning about implementation details.
+
+#+beamer: \pause
+#+beamer: \vspace{1em}
+
+Instead we build a model of the translation which we can use.
+
+#+begin_export latex
+\begin{equation*}
+ \forall C, V,\quad \yhfunction{HLS} (C) = \yhconstant{OK} (V) \rightarrow \yhfunction{tr\_hls}\ \ C\ \ V.
+\end{equation*}
+#+end_export
+
+#+beamer: \pause
+
+*** 3AC to HTL operator conversion :B_example:
+:PROPERTIES:
+:BEAMER_env: example
+:BEAMER_ACT: <2->
+:END:
+
+#+begin_export latex
+\begin{equation*}
+ \inferrule[Iop]{\yhfunction{tr\_op } \mathit{op}\ \vec{a} = \yhconstant{OK } e}{\yhfunction{tr\_instr}\ \mathit{fin}\ \mathit{rtrn}\ \sigma\ \mathit{stk}\ (\yhconstant{Iop}\ \mathit{op}\ \vec{a}\ d\ n)\ (d \Leftarrow e)\ (\sigma \Leftarrow n)}
+\end{equation*}
+#+end_export
+
+** 3AC $\to$ HTL: Prove Forward Simulation :noexport:
+
+*** Column 1
+:PROPERTIES:
+:BEAMER_COL: 0.35
+:END:
+
+#+begin_export latex
+\definecolor{highlightcol}{HTML}{db6060}
+\begin{center}
+ \begin{tikzpicture}
+ \begin{scope}
+ \node[circle,minimum size=2] (s1) at (0,3) {$S_{1}$};%
+ \only<2>{\node[circle,minimum size=2] (s1) at (0,3) {\textcolor{highlightcol}{$S_{1}$}};}
+ \node[circle,minimum size=2] (r1) at (4,3) {$R_{1}$};%
+ \only<2-3>{\node[circle,minimum size=2] (r1) at (4,3) {\textcolor{highlightcol}{$R_{1}$}};}
+ \node[circle,minimum size=2] (s2) at (0,0) {$S_{2}$};%
+ \only<4>{\node[circle,minimum size=2] (s2) at (0,0) {\textcolor{highlightcol}{$S_{2}$}};}
+ \node[circle,minimum size=2] (r2) at (4,0) {$R_{2}$};%
+ \only<3-4>{\node[circle,minimum size=2] (r2) at (4,0) {\textcolor{highlightcol}{$R_{2}$}};}
+ \draw (s1) -- node[above] {\textasciitilde{}} node[below] {\small\texttt{match\_states}} ++ (r1);
+ \only<2>{\draw[highlightcol] (s1) -- node[above] {\textasciitilde{}} node[below] {\small\texttt{match\_states}} ++ (r1);}
+ \draw[-{Latex[length=3mm]}] (s1) -- (s2);
+ \draw[dashed] (s2) -- node[above] {\textasciitilde{}} node[below] {\small\texttt{match\_states}} ++ (r2);%
+ \only<4>{\draw[highlightcol,dashed] (s2) -- node[above] {\textasciitilde{}} node[below] {\small\textcolor{highlightcol}{\texttt{match\_states}}} ++ (r2);}
+ \draw[-{Latex[length=3mm]},dashed] (r1) -- node[left] {+} ++ (r2);%
+ \only<3>{\draw[highlightcol,-{Latex[length=3mm]},dashed] (r1) -- node[left] {+} ++ (r2);}
+ \end{scope}
+ \end{tikzpicture}
+\end{center}
+#+end_export
+
+*** Column 2
+:PROPERTIES:
+:BEAMER_COL: 0.6
+:END:
+
+\texttt{match\_states} defined as:
+
+#+begin_export latex
+\begin{equation*}
+ \mathcal{I} \land R \le \Gamma \land M \le \Gamma ! \mathit{stk} \land \mathit{pc} = \Gamma ! \sigma
+\end{equation*}
+#+end_export
+
+Prove the simulation diagram correct:
+
+#+beamer: \pause
+
+#+attr_beamer: :overlay <+->
+- Assuming an initial match between the 3AC state $S_1$ and Verilog state $R_1$,
+- there exists 1 or more steps in Verilog,
+- such that after 1 step in 3AC, the resulting states match.
+
+** Main Challenges in Proof
+
+*** Translation of memory model
+:PROPERTIES:
+:BEAMER_ENV: block
+:BEAMER_ACT: <1->
+:END:
+
+*Abstract/infinite memory model* translated into *concrete/finite RAM*.
+
+*** Integration of Verilog Semantics
+:PROPERTIES:
+:BEAMER_ENV: block
+:BEAMER_ACT: <2->
+:END:
+
+- *Verilog semantics* differs from CompCert's main assumptions of intermediate language semantics.
+- Abstract values like the *program counter* now correspond to *values in registers*.
+
+* Extensions
+** Current work
+
+Many optimisations missing:
+
+- *scheduling*
+- *if-conversion*
+- memory partitioning
+- *loop pipelining*
+- polyhedral analysis
+- operation chaining
+- register allocation
+
+** New languages for scheduling
+
+Currently implemented two new languages for it:
+
+- ~3ACBlock~ :: 3AC with basic blocks.
+- ~3ACPar~ :: 3AC with basic blocks made up of parallel constructs.
+
+#+beamer: \vspace{1.5em}
+
+*** Minipage :B_minipage:
+:PROPERTIES:
+:BEAMER_env: minipage
+:BEAMER_OPT: 10cm
+:END:
+
+**** 3ACBlock Basic Block
+:PROPERTIES:
+:BEAMER_ACT: 2
+:BEAMER_env: onlyenv
+:END:
+
+#+begin_src coq
+Record bblock: Type := mk_bblock {
+ bb_body: list instr;
+ bb_exit: cf_instr
+}.
+#+end_src
+
+**** Instructions :B_onlyenv:
+:PROPERTIES:
+:BEAMER_ACT: 3
+:BEAMER_env: onlyenv
+:END:
+
+#+begin_src coq
+Inductive instr: Type :=
+| RBnop: instr
+| RBop: option pred_op -> operation -> list reg -> reg -> instr
+| RBload: option pred_op -> memory_chunk -> addressing
+ -> list reg -> reg -> instr
+| RBstore: option pred_op -> memory_chunk -> addressing
+ -> list reg -> reg -> instr
+| RBsetpred: condition -> list reg -> predicate -> instr.
+#+end_src
+
+** More details of transformations
+
+#+begin_export latex
+\scalebox{0.8}{\begin{tikzpicture}
+ \begin{scope}
+ \node[draw,minimum width=3cm,minimum height=1cm,align=center] (imstranslation) at (1.5,2) {\small\texttt{\textcolor{functioncolour}{Iterative Modulo}}\\\small\texttt{\textcolor{functioncolour}{Scheduling}}};
+ \node[draw,ellipse] (input) at (-1.5,2) {\small\texttt{3ACBlock}};
+ \node[draw,ellipse] (output) at (5,2) {\small\texttt{3ACBlock}};
+ \draw[->] (input) -- (imstranslation);
+ \draw[->] (imstranslation) -- (output);
+ \visible<2->{\node[draw,minimum width=3cm,minimum height=1cm,align=center] (verification) at (1.5,0.5) {\small Equivalence\\\small Check};%
+ \draw[->] (input) |- (verification);%
+ \draw[->] (output) |- (verification);%
+ \node[draw,ellipse] (error) at ($(verification.south) - (0.5,1.5)$) {\small\texttt{\textcolor{constantcolour}{Error}}};%
+ \draw[->] ($(verification.south) - (0.5,0)$) -- (error);%
+ \node at (0.3,-0.5) {\footnotesize\texttt{\textcolor{keywordcolour}{false}}};%
+ \node at (2,-0.3) {\footnotesize\texttt{\textcolor{keywordcolour}{true}}};%
+ \node[draw,ellipse] (ok) at (5,-0.5) {\small\texttt{\textcolor{constantcolour}{OK}(3ACBlock)}};%
+ \draw[->] (verification) |- (ok);}
+
+ \visible<3->{\node[draw,minimum width=3cm,minimum height=1cm,align=center] (schedtranslation) at (9.5,-0.5) {\small\texttt{\textcolor{functioncolour}{Resource Constrained}}\\\small\texttt{\textcolor{functioncolour}{Scheduling}}};%
+ \node[draw,ellipse] (schedoutput) at (13,-0.5) {\small\texttt{3ACPar}};%
+ \draw[->] (ok) -- (schedtranslation);%
+ \draw[->] (schedtranslation) -- (schedoutput);%
+ \node[draw,minimum width=3cm,minimum height=1cm,align=center] (schedverification) at (9.5,-2) {\small Equivalence\\\small Check};%
+ \draw[->] (ok) |- (schedverification);%
+ \draw[->] (schedoutput) |- (schedverification);%
+ \node[draw,ellipse] (schederror) at ($(schedverification.south) - (0.5,1.5)$) {\small\texttt{\textcolor{constantcolour}{Error}}};%
+ \draw[->] ($(schedverification.south) - (0.5,0)$) -- (schederror);%
+ \node at (8.3,-3) {\footnotesize\texttt{\textcolor{keywordcolour}{false}}};%
+ \node at (10,-2.8) {\footnotesize\texttt{\textcolor{keywordcolour}{true}}};%
+ \node[draw,ellipse] (ok) at (13,-3) {\small\texttt{\textcolor{constantcolour}{OK}(3ACPar)}};%
+ \draw[->] (schedverification) |- (ok);}
+ \end{scope}
+\end{tikzpicture}}
+#+end_export
+
+** Scheduling example
+
+#+beamer: \vspace{0.5em}
+
+*** Column 1
+:PROPERTIES:
+:BEAMER_COL: 0.40
+:END:
+
+**** Minipage :B_minipage:
+:PROPERTIES:
+:BEAMER_env: minipage
+:BEAMER_OPT: 10cm
+:END:
+
+***** Code 1 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 1
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize
+#+begin_src C
+p1 = r3 == 0
+r1 = r3 + r4
+(p1) r2 = r3 + r1
+(~ p1) r2 = r4 + r1
+stk[r5] = r2
+r6 = stk[r5+1]
+#+end_src
+
+***** Code 2 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 2
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize
+#+begin_src C
+p1 = r3 == 0
+r1 = r3 + r4
+(p1) r2 = r3 + r1
+(~ p1) r2 = r4 + r1
+stk[r5] = r2
+r6 = stk[r5+1]
+#+end_src
+
+***** Code 3 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 3
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={5,6}
+#+begin_src C
+p1 = r3 == 0
+r1 = r3 + r4
+(p1) r2 = r3 + r1
+(~ p1) r2 = r4 + r1
+stk[r5] = r2
+r6 = stk[r5+1]
+#+end_src
+
+***** Code 4 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 4
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={1}
+#+begin_src C
+p1 = r3 == 0
+r1 = r3 + r4
+(p1) r2 = r3 + r1
+(~ p1) r2 = r4 + r1
+stk[r5] = r2
+r6 = stk[r5+1]
+#+end_src
+
+#+beamer: \vspace{-2em}
+
+#+begin_export latex
+\begin{align*}
+ &p_{1} \mapsto r_{3}^{0} = 0
+\end{align*}
+#+end_export
+
+***** Code 5 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 5
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={2}
+#+begin_src C
+p1 = r3 == 0
+r1 = r3 + r4
+(p1) r2 = r3 + r1
+(~ p1) r2 = r4 + r1
+stk[r5] = r2
+r6 = stk[r5+1]
+#+end_src
+
+#+beamer: \vspace{-2em}
+
+#+begin_export latex
+\begin{align*}
+ &p_{1} \mapsto r_{3}^{0} = 0\\
+ &r_{1} \mapsto r_{3}^{0} + r_{4}^{0}
+\end{align*}
+#+end_export
+
+***** Code 6 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 6
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={3}
+#+begin_src C
+p1 = r3 == 0
+r1 = r3 + r4
+(p1) r2 = r3 + r1
+(~ p1) r2 = r4 + r1
+stk[r5] = r2
+r6 = stk[r5+1]
+#+end_src
+
+#+beamer: \vspace{-2em}
+
+#+begin_export latex
+\begin{align*}
+ &p_{1} \mapsto r_{3}^{0} = 0\\
+ &r_{1} \mapsto r_{3}^{0} + r_{4}^{0}\\
+ &r_{2} \mapsto \begin{cases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1}
+ \end{cases}
+\end{align*}
+#+end_export
+
+***** Code 7 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 7
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={4}
+#+begin_src C
+p1 = r3 == 0
+r1 = r3 + r4
+(p1) r2 = r3 + r1
+(~ p1) r2 = r4 + r1
+stk[r5] = r2
+r6 = stk[r5+1]
+#+end_src
+
+#+beamer: \vspace{-2em}
+
+#+begin_export latex
+\begin{align*}
+ &p_{1} \mapsto r_{3}^{0} = 0\\
+ &r_{1} \mapsto r_{3}^{0} + r_{4}^{0}\\
+ &r_{2} \mapsto \begin{cases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1}\\
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ \end{cases}
+\end{align*}
+#+end_export
+
+***** Code 8 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 8
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={5}
+#+begin_src C
+p1 = r3 == 0
+r1 = r3 + r4
+(p1) r2 = r3 + r1
+(~ p1) r2 = r4 + r1
+stk[r5] = r2
+r6 = stk[r5+1]
+#+end_src
+
+#+beamer: \vspace{-2em}
+
+#+begin_export latex
+\begin{align*}
+ &p_{1} \mapsto r_{3}^{0} = 0\\
+ &r_{1} \mapsto r_{3}^{0} + r_{4}^{0}\\
+ &r_{2} \mapsto \begin{cases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1}\\
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ \end{cases}\\
+ &\mathit{Mem} \mapsto \mathit{Mem}^0 \cup \{r_{5}^{0} \mapsto r_{1}^{0} + r_{2}^{0}\}
+\end{align*}
+#+end_export
+
+***** Code 9 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 9
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={6}
+#+begin_src C
+p1 = r3 == 0
+r1 = r3 + r4
+(p1) r2 = r3 + r1
+(~ p1) r2 = r4 + r1
+stk[r5] = r2
+r6 = stk[r5+1]
+#+end_src
+
+#+beamer: \vspace{-2em}
+
+#+begin_export latex
+\begin{align*}
+ &p_{1} \mapsto r_{3}^{0} = 0\\
+ &r_{1} \mapsto r_{3}^{0} + r_{4}^{0}\\
+ &r_{2} \mapsto \begin{cases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1}\\
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ \end{cases}\\
+ &\mathit{Mem} \mapsto \mathit{Mem}^0 \cup \{r_{5}^{0} \mapsto r_{1}^{0} + r_{2}^{0}\}\\
+ &r_{6} \mapsto (\mathit{Mem}^0 \cup \{r_{5}^{0} \mapsto r_{1}^{0} + r_{2}^{0}\})[r_{5}^0 + 1]
+\end{align*}
+#+end_export
+***** Code 10 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 10
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={6}
+#+begin_src C
+p1 = r3 == 0
+r1 = r3 + r4
+(p1) r2 = r3 + r1
+(~ p1) r2 = r4 + r1
+stk[r5] = r2
+r6 = stk[r5+1]
+#+end_src
+
+#+beamer: \vspace{-2em}
+
+#+begin_export latex
+\begin{align*}
+ &p_{1} \mapsto r_{3}^{0} = 0\\
+ &r_{1} \mapsto r_{3}^{0} + r_{4}^{0}\\
+ &r_{2} \mapsto \begin{cases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1}\\
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ \end{cases}\\
+ &\mathit{Mem} \mapsto \mathit{Mem}^0 \cup \{r_{5}^{0} \mapsto r_{1}^{0} + r_{2}^{0}\}\\
+ &r_{6} \mapsto \mathit{Mem}^0[r_{5}^0 + 1]
+\end{align*}
+#+end_export
+
+*** Column 2
+:PROPERTIES:
+:BEAMER_COL: 0.55
+:END:
+
+**** Minipage :B_minipage:
+:PROPERTIES:
+:BEAMER_env: minipage
+:BEAMER_OPT: 10cm
+:END:
+
+***** Code 2 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 2
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize
+#+begin_src C
+p1 = r3 == 0 || r1 = r3 + r4
+ || r6 = stk[r5+1]
+(p1) r2 = r3 + r1
+ || (~ p1) r2 = r4 + r1
+stk[r5] = r1 + r2
+#+end_src
+
+***** Code 3 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 3
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={2,5}
+#+begin_src C
+p1 = r3 == 0 || r1 = r3 + r4
+ || r6 = stk[r5+1]
+(p1) r2 = r3 + r1
+ || (~ p1) r2 = r4 + r1
+stk[r5] = r1 + r2
+#+end_src
+
+***** Code 4 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 4
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={1,2}
+#+begin_src C
+p1 = r3 == 0 || r1 = r3 + r4
+ || r6 = stk[r5+1]
+(p1) r2 = r3 + r1
+ || (~ p1) r2 = r4 + r1
+stk[r5] = r1 + r2
+#+end_src
+
+#+beamer: \vspace{-2em}
+
+#+begin_export latex
+\begin{align*}
+ &p_{1} \mapsto r_{3}^{0} = 0\\
+ &r_{1} \mapsto r_{3}^{0} + r_{4}^{0}\\
+ &r_{6} \mapsto \mathit{Mem}^0[r_{5}^{0} + 1]
+\end{align*}
+#+end_export
+
+***** Code 5 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 5
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={3,4}
+#+begin_src C
+p1 = r3 == 0 || r1 = r3 + r4
+ || r6 = stk[r5+1]
+(p1) r2 = r3 + r1
+ || (~ p1) r2 = r4 + r1
+stk[r5] = r1 + r2
+#+end_src
+
+#+beamer: \vspace{-2em}
+
+#+begin_export latex
+\begin{align*}
+ &p_{1} \mapsto r_{3}^{0} = 0\\
+ &r_{1} \mapsto r_{3}^{0} + r_{4}^{0}\\
+ &r_{2} \mapsto \begin{cases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1}\\
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ \end{cases}\\
+ &r_{6} \mapsto \mathit{Mem}^0[r_{5}^{0} + 1]
+\end{align*}
+#+end_export
+
+***** Code 6 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 6-
+:END:
+
+#+attr_latex: :options fontsize=\footnotesize,highlightlines={5}
+#+begin_src C
+p1 = r3 == 0 || r1 = r3 + r4
+ || r6 = stk[r5+1]
+(p1) r2 = r3 + r1
+ || (~ p1) r2 = r4 + r1
+stk[r5] = r1 + r2
+#+end_src
+
+#+beamer: \vspace{-2em}
+
+#+begin_export latex
+\begin{align*}
+ &p_{1} \mapsto r_{3}^{0} = 0\\
+ &r_{1} \mapsto r_{3}^{0} + r_{4}^{0}\\
+ &r_{2} \mapsto \begin{cases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1}\\
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ \end{cases}\\
+ &\mathit{Mem} \mapsto \mathit{Mem}^0 \cup \{r_{5}^{0} \mapsto r_{1}^{0} + r_{2}^{0}\} \\
+ &r_{6} \mapsto \mathit{Mem}^0[r_{5}^{0} + 1]
+\end{align*}
+#+end_export
+
+** One more complication
+
+How to prove equality of *conditional expressions*?
+
+#+begin_export latex
+\begin{equation*}
+ \begin{drcases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1} \lor (p_{2} \land \neg p_{2}) \\
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ r_{4}^{0}, &p_{3} \land \neg p_{3}\\
+ \end{drcases} = \begin{cases}
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1}\\
+ \end{cases}
+\end{equation*}
+#+end_export
+
+#+attr_beamer: :overlay <+->
+- They can be *reordered* in any way.
+- Some expressions *not present anymore* (when predicate is provably false).
+- Predicates *simplified* by scheduling.
+
+** Solution to proving conditional functions
+
+#+attr_beamer: :overlay <+->
+1. Use a *formally verified SAT solver*.
+2. Show that predicates are *independent*.
+3. Reorder the list of predicates in a more useful order.
+4. Use SAT solver to go through list and find equivalent pairings.
+5. Show that attached expressions are equal.
+
+*** Minipage :B_minipage:
+:PROPERTIES:
+:BEAMER_env: minipage
+:BEAMER_OPT: 5cm
+:END:
+
+**** Only 1 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 2
+:END:
+
+#+begin_export latex
+\begin{equation*}
+ \text{unsat}\quad (p_1 \land \neg p_1) \lor (p_1 \land (p_{3} \land \neg p_{3})) \lor (\neg p_1 \land (p_{3} \land \neg p_{3}))
+\end{equation*}
+#+end_export
+
+**** Only 2 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 3
+:END:
+
+#+begin_export latex
+\begin{equation*}
+ \begin{drcases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1} \lor (p_{2} \land \neg p_{2}) \\
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ r_{4}^{0}, &p_{3} \land \neg p_{3}\\
+ \end{drcases} = \begin{cases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1}\\
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ \end{cases}
+\end{equation*}
+#+end_export
+
+**** Only 3 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 4
+:END:
+
+#+begin_export latex
+\begin{equation*}
+ \begin{drcases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1} \lor (p_{2} \land \neg p_{2}) \\
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ r_{4}^{0}, &p_{3} \land \neg p_{3}\\
+ \end{drcases} = \begin{cases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1}\\
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ \end{cases}
+\end{equation*}
+#+end_export
+
+#+begin_export latex
+\begin{equation*}
+\text{unsat}\quad \neg (p_{1} \lor (p_{2} \land \neg p_{2}) \Longleftrightarrow p_1)
+\end{equation*}
+#+end_export
+
+**** Only 4 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: 5
+:END:
+
+#+begin_export latex
+\begin{equation*}
+ \begin{drcases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1} \lor (p_{2} \land \neg p_{2}) \\
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ r_{4}^{0}, &p_{3} \land \neg p_{3}\\
+ \end{drcases} = \begin{cases}
+ r_{3}^{0} + r_{3}^{0} + r_{4}^{0}, &p_{1}\\
+ r_{4}^{0} + r_{3}^{0} + r_{4}^{0}, &\neg p_{1}\\
+ \end{cases}
+\end{equation*}
+#+end_export
+
+#+begin_export latex
+\begin{equation*}
+\text{unsat}\quad \neg (p_{1} \lor (p_{2} \land \neg p_{2}) \Longleftrightarrow p_1)
+\end{equation*}
+#+end_export
+
+#+begin_export latex
+\begin{equation*}
+r_{3}^{0} + r_{3}^{0} + r_{4}^{0} \stackrel{?}{=} r_{3}^{0} + r_{3}^{0} + r_{4}^{0}
+\end{equation*}
+#+end_export
+
+** New passes
+
+#+begin_export latex
+\definecolor{compcert}{HTML}{66c2a5}
+\definecolor{formalhls}{HTML}{fc8d62}
+\begin{center}\scalebox{0.8}{\begin{tikzpicture}[language/.style={fill=white,rounded corners=2pt}]
+ \fill[compcert,rounded corners=3pt] (-1,-1) rectangle (9,1.5);
+ \fill[formalhls,rounded corners=3pt] (-1,-1.5) rectangle (9,-2.5);
+ \node[language] at (0,0) (clight) {Clight};
+ \node[language] at (2,0) (cminor) {C\#minor};
+ \node[language] at (4,0) (rtl) {3AC};
+ \node[language] at (6,0) (ltl) {LTL};
+ \node[language] at (8,0) (ppc) {PPC};
+ \node[language] at (2,-2) (acblock) {\small 3ACBlock};
+ \node[language] at (4,-2) (acpar) {\small 3ACPar};
+ \node[language] at (6,-2) (dfgstmd) {HTL};
+ \node[language] at (8,-2) (verilog) {Verilog};
+ \node at (0,1) {CompCert};
+ \node at (0,-2) {Vericert};
+ \draw[->] (clight) -- (cminor);
+ \draw[->,dashed] (cminor) -- (rtl);
+ \draw[->] (rtl) -- (ltl);
+ \draw[->,dashed] (ltl) -- (ppc);
+ \draw[->] (rtl) |- (2,-1.3) -- (acblock);
+ \draw[->] (acblock) -- (acpar);
+ \draw[->] (acpar) -- (dfgstmd);
+ \draw[->] (dfgstmd) -- (verilog);
+ \draw[->] ($(acblock.south) - (0.1,0)$) to [out=270,in=180] (2,-3) to [out=0,in=270] ($(acblock.south) + (0.1,0)$);
+\end{tikzpicture}}\end{center}
+#+end_export
+
+#+beamer: \vspace{1em}
+
+Add two more passes, from *3ACBlock* $\rightarrow$ *3ACBlock* and from *3ACBlock* to *3ACPar*.
+
+** About Iterative Modulo Scheduling
+
+#+attr_beamer: :overlay <+->
+- Algorithm used to approximate an optimal schedule for a loop.
+- Performs code transformations from one loop iteration into other loop iterations.
+- Allows for more parallelism between instructions.
+
+** Example of proof by translation validation
+
+*** Diagram
+:PROPERTIES:
+:BEAMER_COL: 0.45
+:END:
+
+#+begin_export latex
+\scalebox{0.8}{
+ \begin{tikzpicture}
+ \begin{scope}
+ \node[draw,minimum width=3cm,minimum height=1cm] (translation) at (1.5,2) {\texttt{\textcolor{functioncolour}{HLS}}};
+ \node[draw,ellipse] (input) at (-1.5,2) {\texttt{C}};
+ \node[draw,ellipse] (output) at (5,2) {\texttt{Verilog}};
+ \draw[->] (input) -- (translation);
+ \draw[->] (translation) -- (output);
+ \visible<2->{%
+ \node[draw,minimum width=3cm,minimum height=1cm,align=center] (verification) at (1.5,0.5) {Equivalence\\Check};
+ \draw[->] (input) |- (verification);
+ \draw[->] (output) |- (verification);}
+ \visible<3->{%
+ \node[draw,ellipse] (error) at ($(verification.south) - (0.5,1.5)$) {\texttt{\textcolor{constantcolour}{Error}}};
+ \draw[->] ($(verification.south) - (0.5,0)$) -- (error);
+ \node at (0.3,-0.5) {\footnotesize\texttt{\textcolor{keywordcolour}{false}}};}
+ \visible<4->{%
+ \node at (2,-0.3) {\footnotesize\texttt{\textcolor{keywordcolour}{true}}};
+ \node[draw,ellipse] (ok) at (5,-0.5) {\texttt{\textcolor{constantcolour}{OK}(Verilog)}};
+ \draw[->] (verification) |- (ok);}
+ \end{scope}
+ \end{tikzpicture}}
+#+end_export
+
+*** Text
+:PROPERTIES:
+:BEAMER_COL: 0.45
+:END:
+
+#+attr_beamer: :overlay <+->
+- Prove correctness of an existing translation from ~C~ to ~Verilog~.
+- Add equivalence check.
+- Error out if it fails.
+- Succeed if the equivalence check passes.
+
+** How is the Equivalence Check Performed? :B_frame:
+
+*** Code example :B_column:
+:PROPERTIES:
+:BEAMER_ENV: column
+:BEAMER_COL: 0.45
+:END:
+
+**** Code 1 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_ACT: <1>
+:BEAMER_env: onlyenvNH
+:END:
+
+#+begin_src C
+int main() {
+ int x[3] = {1, 2, 3};
+ int sum = 0;
+ for (int i = 0; i < 3; i++)
+ sum += x[i];
+ return sum;
+}
+#+end_src
+
+**** Code 2 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <2>
+:END:
+
+#+attr_latex: :options highlightlines={2}
+#+begin_src C
+int main() {
+ int x[3] = {1, 2, 3};
+ int sum = 0;
+ for (int i = 0; i < 3; i++)
+ sum += x[i];
+ return sum;
+}
+#+end_src
+
+#+begin_export latex
+\begin{align*}
+\text{Mem} \{0 \rightarrow 1, 4 \rightarrow 2, 8 \rightarrow 3\} =\\ \text{Mem} \{0 \rightarrow 1\} \land\\
+ \texttt{x8} \rightarrow 1
+\end{align*}
+#+end_export
+
+**** Code 3 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <3>
+:END:
+
+#+attr_latex: :options highlightlines={2}
+#+begin_src C
+int main() {
+ int x[3] = {1, 2, 3};
+ int sum = 0;
+ for (int i = 0; i < 3; i++)
+ sum += x[i];
+ return sum;
+}
+#+end_src
+
+#+begin_export latex
+\begin{align*}
+ \text{Mem} \{0 \rightarrow 1, 4 \rightarrow 2, 8 \rightarrow 3\} =\\ \text{Mem} \{0 \rightarrow 1, 4 \rightarrow 2\} \land\\
+ \texttt{x8} \rightarrow 1 \cup \texttt{x7} \rightarrow 2
+\end{align*}
+#+end_export
+
+**** Code 4 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <4>
+:END:
+
+#+attr_latex: :options highlightlines={2}
+#+begin_src C
+int main() {
+ int x[3] = {1, 2, 3};
+ int sum = 0;
+ for (int i = 0; i < 3; i++)
+ sum += x[i];
+ return sum;
+}
+#+end_src
+
+#+begin_export latex
+\begin{align*}
+ \text{Mem} \{0 \rightarrow 1, 4 \rightarrow 2, 8 \rightarrow 3\} =\\ \text{Mem} \{0 \rightarrow 1, 4 \rightarrow 2, 8 \rightarrow 3\} \land\\
+ \texttt{x8} \rightarrow 1 \cup \texttt{x7} \rightarrow 2 \cup \texttt{x6} \rightarrow 3
+\end{align*}
+#+end_export
+
+**** Code 5 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <5>
+:END:
+
+#+attr_latex: :options highlightlines={3}
+#+begin_src C
+int main() {
+ int x[3] = {1, 2, 3};
+ int sum = 0;
+ for (int i = 0; i < 3; i++)
+ sum += x[i];
+ return sum;
+}
+#+end_src
+
+Here we also need a mapping for variable names: $\texttt{sum} \rightarrow \texttt{x2}$.
+
+#+begin_export latex
+\begin{align*}
+ \texttt{sum} \rightarrow 0 = \texttt{x2} \rightarrow 0
+\end{align*}
+#+end_export
+
+**** Code 6 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <6>
+:END:
+
+#+attr_latex: :options highlightlines={4}
+#+begin_src C
+int main() {
+ int x[3] = {1, 2, 3};
+ int sum = 0;
+ for (int i = 0; i < 3; i++)
+ sum += x[i];
+ return sum;
+}
+#+end_src
+
+#+beamer: \vspace{2em}
+
+For loops can just be identified using a template.
+
+**** Code 7 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <7>
+:END:
+
+#+attr_latex: :options highlightlines={5}
+#+begin_src C
+int main() {
+ int x[3] = {1, 2, 3};
+ int sum = 0;
+ for (int i = 0; i < 3; i++)
+ sum += x[i];
+ return sum;
+}
+#+end_src
+
+#+begin_export latex
+\begin{align*}
+ \texttt{sum} \rightarrow \texttt{sum}^{0} + \text{Mem}[i^{0} * 4] =\\ \texttt{x5} \rightarrow 0
+\end{align*}
+#+end_export
+
+**** Code 8 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <8>
+:END:
+
+#+attr_latex: :options highlightlines={5}
+#+begin_src C
+int main() {
+ int x[3] = {1, 2, 3};
+ int sum = 0;
+ for (int i = 0; i < 3; i++)
+ sum += x[i];
+ return sum;
+}
+#+end_src
+
+#+begin_export latex
+\begin{align*}
+ \texttt{sum} \rightarrow \texttt{sum}^{0} + \text{Mem}[i^{0} * 4] =\\ \texttt{x5} \rightarrow 0 \cup \texttt{x4} \rightarrow \text{Mem}[\texttt{x1} * 4]
+\end{align*}
+#+end_export
+
+**** Code 9 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <9>
+:END:
+
+#+attr_latex: :options highlightlines={5}
+#+begin_src C
+int main() {
+ int x[3] = {1, 2, 3};
+ int sum = 0;
+ for (int i = 0; i < 3; i++)
+ sum += x[i];
+ return sum;
+}
+#+end_src
+
+#+begin_export latex
+\begin{align*}
+ \texttt{sum} \rightarrow \texttt{sum}^{0} + \text{Mem}[i^{0} * 4] =\\ \texttt{x5} \rightarrow 0 \cup \texttt{x4} \rightarrow \text{Mem}[\texttt{x1}^{0} * 4]\\ \cup\ \texttt{x2} \rightarrow \texttt{x2}^{0} + \text{Mem}[\texttt{x1}^{0} * 4]
+\end{align*}
+#+end_export
+
+*** Text :B_column:
+:PROPERTIES:
+:BEAMER_ENV: column
+:BEAMER_COL: 0.45
+:END:
+
+**** Text 1 :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_ACT: <1>
+:BEAMER_env: onlyenvNH
+:END:
+
+Example of simple loop accumulating values in array.
+
+**** 3AC Code 2 :B_onlyenv:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <2>
+:END:
+
+#+attr_latex: :options fontsize=\scriptsize,highlightlines={2-3}
+#+begin_src C
+main() {
+ 15: x8 = 1
+ 14: int32[stack(0)] = x8
+ 13: x7 = 2
+ 12: int32[stack(4)] = x7
+ 11: x6 = 3
+ 10: int32[stack(8)] = x6
+ 9: x2 = 0
+ 8: x1 = 0
+ 7: x5 = stack(0) (int)
+ 6: x4 = int32[x5 + x1 * 4 + 0]
+ 5: x2 = x2 + x4 + 0 (int)
+ 4: x1 = x1 + 1 (int)
+ 3: if (x1 <s 3) goto 7 else goto 2
+ 2: x3 = x2
+ 1: return x3
+}
+#+end_src
+
+**** 3AC Code 3 :B_onlyenv:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <3>
+:END:
+
+#+attr_latex: :options fontsize=\scriptsize,highlightlines={2-5}
+#+begin_src C
+main() {
+ 15: x8 = 1
+ 14: int32[stack(0)] = x8
+ 13: x7 = 2
+ 12: int32[stack(4)] = x7
+ 11: x6 = 3
+ 10: int32[stack(8)] = x6
+ 9: x2 = 0
+ 8: x1 = 0
+ 7: x5 = stack(0) (int)
+ 6: x4 = int32[x5 + x1 * 4 + 0]
+ 5: x2 = x2 + x4 + 0 (int)
+ 4: x1 = x1 + 1 (int)
+ 3: if (x1 <s 3) goto 7 else goto 2
+ 2: x3 = x2
+ 1: return x3
+}
+#+end_src
+
+**** 3AC Code 4 :B_onlyenv:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <4>
+:END:
+
+#+attr_latex: :options fontsize=\scriptsize,highlightlines={2-7}
+#+begin_src C
+main() {
+ 15: x8 = 1
+ 14: int32[stack(0)] = x8
+ 13: x7 = 2
+ 12: int32[stack(4)] = x7
+ 11: x6 = 3
+ 10: int32[stack(8)] = x6
+ 9: x2 = 0
+ 8: x1 = 0
+ 7: x5 = stack(0) (int)
+ 6: x4 = int32[x5 + x1 * 4 + 0]
+ 5: x2 = x2 + x4 + 0 (int)
+ 4: x1 = x1 + 1 (int)
+ 3: if (x1 <s 3) goto 7 else goto 2
+ 2: x3 = x2
+ 1: return x3
+}
+#+end_src
+
+**** 3AC Code 5 :B_onlyenv:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <5>
+:END:
+
+#+attr_latex: :options fontsize=\scriptsize,highlightlines={8}
+#+begin_src C
+main() {
+ 15: x8 = 1
+ 14: int32[stack(0)] = x8
+ 13: x7 = 2
+ 12: int32[stack(4)] = x7
+ 11: x6 = 3
+ 10: int32[stack(8)] = x6
+ 9: x2 = 0
+ 8: x1 = 0
+ 7: x5 = stack(0) (int)
+ 6: x4 = int32[x5 + x1 * 4 + 0]
+ 5: x2 = x2 + x4 + 0 (int)
+ 4: x1 = x1 + 1 (int)
+ 3: if (x1 <s 3) goto 7 else goto 2
+ 2: x3 = x2
+ 1: return x3
+}
+#+end_src
+
+**** 3AC Code 6 :B_onlyenv:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <6>
+:END:
+
+#+attr_latex: :options fontsize=\scriptsize,highlightlines={9,13-14}
+#+begin_src C
+main() {
+ 15: x8 = 1
+ 14: int32[stack(0)] = x8
+ 13: x7 = 2
+ 12: int32[stack(4)] = x7
+ 11: x6 = 3
+ 10: int32[stack(8)] = x6
+ 9: x2 = 0
+ 8: x1 = 0
+ 7: x5 = stack(0) (int)
+ 6: x4 = int32[x5 + x1 * 4 + 0]
+ 5: x2 = x2 + x4 + 0 (int)
+ 4: x1 = x1 + 1 (int)
+ 3: if (x1 <s 3) goto 7 else goto 2
+ 2: x3 = x2
+ 1: return x3
+}
+#+end_src
+
+**** 3AC Code 7 :B_onlyenv:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <7>
+:END:
+
+#+attr_latex: :options fontsize=\scriptsize,highlightlines={10}
+#+begin_src C
+main() {
+ 15: x8 = 1
+ 14: int32[stack(0)] = x8
+ 13: x7 = 2
+ 12: int32[stack(4)] = x7
+ 11: x6 = 3
+ 10: int32[stack(8)] = x6
+ 9: x2 = 0
+ 8: x1 = 0
+ 7: x5 = stack(0) (int)
+ 6: x4 = int32[x5 + x1 * 4 + 0]
+ 5: x2 = x2 + x4 + 0 (int)
+ 4: x1 = x1 + 1 (int)
+ 3: if (x1 <s 3) goto 7 else goto 2
+ 2: x3 = x2
+ 1: return x3
+}
+#+end_src
+
+**** 3AC Code 8 :B_onlyenv:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <8>
+:END:
+
+#+attr_latex: :options fontsize=\scriptsize,highlightlines={11}
+#+begin_src C
+main() {
+ 15: x8 = 1
+ 14: int32[stack(0)] = x8
+ 13: x7 = 2
+ 12: int32[stack(4)] = x7
+ 11: x6 = 3
+ 10: int32[stack(8)] = x6
+ 9: x2 = 0
+ 8: x1 = 0
+ 7: x5 = stack(0) (int)
+ 6: x4 = int32[x5 + x1 * 4 + 0]
+ 5: x2 = x2 + x4 + 0 (int)
+ 4: x1 = x1 + 1 (int)
+ 3: if (x1 <s 3) goto 7 else goto 2
+ 2: x3 = x2
+ 1: return x3
+}
+#+end_src
+
+**** 3AC Code 9 :B_onlyenv:
+:PROPERTIES:
+:BEAMER_env: onlyenvNH
+:BEAMER_ACT: <9>
+:END:
+
+#+attr_latex: :options fontsize=\scriptsize,highlightlines={12}
+#+begin_src C
+main() {
+ 15: x8 = 1
+ 14: int32[stack(0)] = x8
+ 13: x7 = 2
+ 12: int32[stack(4)] = x7
+ 11: x6 = 3
+ 10: int32[stack(8)] = x6
+ 9: x2 = 0
+ 8: x1 = 0
+ 7: x5 = stack(0) (int)
+ 6: x4 = int32[x5 + x1 * 4 + 0]
+ 5: x2 = x2 + x4 + 0 (int)
+ 4: x1 = x1 + 1 (int)
+ 3: if (x1 <s 3) goto 7 else goto 2
+ 2: x3 = x2
+ 1: return x3
+}
+#+end_src
+
+** Example of Iterative Modulo Scheduling
+
+*** Initial loop :B_column:
+:PROPERTIES:
+:BEAMER_ENV: column
+:BEAMER_COL: 0.45
+:END:
+
+**** Code :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_ACT: <1>
+:BEAMER_env: onlyenvNH
+:END:
+
+#+begin_src C
+for (int i = 1; i < N; i++) {
+ x = A[i];
+ sum = sum + x;
+ A[i] = sum;
+}
+#+end_src
+
+*** Transformed loop :B_column:
+:PROPERTIES:
+:BEAMER_ENV: column
+:BEAMER_COL: 0.45
+:END:
+
+**** Code :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_ACT: <1>
+:BEAMER_env: onlyenvNH
+:END:
+
+#+begin_src C
+x = A[0];
+sum = sum + x;
+x = A[1];
+for (int i = 0; i < N - 2; i++) {
+ A[i] = sum;
+ sum = sum + x;
+ x = A[i + 2];
+}
+A[N-2] = sum;
+sum = sum + x;
+A[N-1] = sum;
+#+end_src
+** Example of Iterative Modulo Scheduling
+
+*** Initial loop :B_column:
+:PROPERTIES:
+:BEAMER_ENV: column
+:BEAMER_COL: 0.45
+:END:
+
+**** Code :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_ACT: <1>
+:BEAMER_env: onlyenvNH
+:END:
+
+#+begin_src C
+for (int i = 1; i < N; i++) {
+ c1 = acc[i-1] * c;
+ c2 = x[i] * y[i];
+ acc[i] = c1 + c2;
+}
+#+end_src
+
+*** Transformed loop :B_column:
+:PROPERTIES:
+:BEAMER_ENV: column
+:BEAMER_COL: 0.45
+:END:
+
+**** Code :B_onlyenvNH:
+:PROPERTIES:
+:BEAMER_ACT: <1>
+:BEAMER_env: onlyenvNH
+:END:
+
+#+begin_src C
+c1 = acc[0] * c;
+c2 = x[1] * y[1];
+for (int i = 1; i < N - 1; i++) {
+ acc[i] = c1 + c2;
+ c2 = x[i+1] * y[i+1];
+ c1 = acc[i+1] * c;
+}
+acc[i] = c1 + c2;
+#+end_src