diff --git a/.gitignore b/.gitignore
index a1f5c9859651ccd9a4cec05836fab958648ebe99..ff13a17a67da8c8c12fe3e225749e5cce6d35c9a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -53,4 +53,23 @@ a.out
 
 meta/circ/*.png
 meta/graphics/*.pdf
+
+meta/report/**/*.aux
+meta/report/**/*.lof
+meta/report/**/*.log
+meta/report/**/*.lot
+meta/report/**/*.out
+meta/report/**/*.pdf
+meta/report/**/*.ptc
+meta/report/**/*.synctex.gz
+meta/report/**/*.synctex(busy)
+meta/report/**/*.tex.swp
+meta/report/**/*.bbl
+meta/report/**/*.bcf
+meta/report/**/*.blg
+meta/report/**/*.run.xml
+meta/report/**/*.dvi
+
+meta/report/xout/
 meta/report/*.pdf
+!meta/report/template/images/statements/originalstatements.pdf
diff --git a/Makefile b/Makefile
index 642f208227499da11dd6488c194de50b10e394fc..645938c1ee889a0892e1bbbe2ef4afb102aa645b 100644
--- a/Makefile
+++ b/Makefile
@@ -1,12 +1,78 @@
 SRCD := hw/spinal/kyber
 
+REPORT := ISC_EMB_memoire_diplome_Stefanovic_Upegui_2024.pdf
+
+LATEX_MAIN_NAME := toplevel
+
+LATEX_MAIN_FILE := ${LATEX_MAIN_NAME}.tex
+LATEX_MAIN_OUTPUT := ${LATEX_MAIN_NAME}.pdf
+LATEX_TMP_DIR := /tmp/latex-$(shell date +%Y%m%d-%H%M%S-%N)
+#LATEX_CMD_PDF := pdflatex -interaction=nonstopmode -synctex=1 --output-directory=${LATEX_TMP_DIR} --aux-directory=${LATEX_TMP_DIR} ${LATEX_MAIN_FILE}
+LATEX_CMD_PDF := pdflatex -interaction=nonstopmode -synctex=1 --output-directory=${LATEX_TMP_DIR} ${LATEX_MAIN_FILE}
+LATEX_CMD_BIB := biber --input-directory ${LATEX_TMP_DIR} --output-directory ${LATEX_TMP_DIR} ${LATEX_MAIN_NAME}
+
+LATEX_SRC := $(shell find meta/report -type f -name '*.tex')
+
 
 ntt: clean $(wildcard ${SRCD}/ntt/*)
+	sbt "runMain kyber.ntt.NttGEN"
 	sbt "runMain kyber.ntt.NttSIM"
+
+
+ntt-gen: clean $(wildcard ${SRCD}/ntt/*)
 	sbt "runMain kyber.ntt.NttGEN"
 
+
+ntt-sim: clean $(wildcard ${SRCD}/ntt/*)
+	sbt "runMain kyber.ntt.NttSIM"
+
+
+pdf: ${LATEX_SRC}
+	mkdir -p ${LATEX_TMP_DIR}
+	cd meta/report && \
+		${LATEX_CMD_PDF} && \
+		${LATEX_CMD_PDF} && \
+		${LATEX_CMD_PDF} && \
+		${LATEX_CMD_BIB} && \
+		${LATEX_CMD_PDF} && \
+		${LATEX_CMD_PDF} && \
+		cp ${LATEX_TMP_DIR}/${LATEX_MAIN_OUTPUT} ${REPORT}
+	rm -rf ${LATEX_TMP_DIR}
+
+
+view: pdf
+	#firefox meta/report/${LATEX_MAIN_OUTPUT}
+	firefox meta/report/${REPORT}
+
+
+repdf: clean pdf
+
+
+review: clean view
+
+
 clean:
-	rm -rf gen simWorkspace target
+	rm -rf gen out simWorkspace target meta/report/xout meta/report/*.pdf
+	find meta/report -type f \
+		\(\
+			-name '*.aux' -o \
+			-name '*.lof' -o \
+			-name '*.log' -o \
+			-name '*.lot' -o \
+			-name '*.out' -o \
+			-name '*.ptc' -o \
+			-name '*.synctex.gz' -o \
+			-name '*.bbl' -o \
+			-name '*.bcf' -o \
+			-name '*.blg' -o \
+			-name '*.run.xml' -o \
+			-name '*.dvi' -o \
+			-name '*.pdf' \
+			-not -name 'originalstatements.pdf' \
+		\)\
+		-print -delete
+
 
+.PHONY: clean ntt pdf repdf review view
 
-.PHONY: clean ntt
+.NOTPARALLEL: repdf review
diff --git a/hw/spinal/kyber/TopLevel.scala b/hw/spinal/kyber/TopLevel.scala
deleted file mode 100644
index d4d86de4b9d5106fab1c13eb67b14f16c15d339d..0000000000000000000000000000000000000000
--- a/hw/spinal/kyber/TopLevel.scala
+++ /dev/null
@@ -1,31 +0,0 @@
-/*package kyber
-
-import kyber.ntt.NumberTheoreticTransformSequential
-import spinal.core._
-
-case class TopLevel() extends Component {
-	val io = new Bundle {
-		val ntt_addr = in UInt (8 bits)
-		val ntt_data_i = in SInt (16 bits)
-		val ntt_load = in Bool()
-		val ntt_start = in Bool()
-		val ntt_interrupt = in Bool()
-		val ntt_data_o = out SInt (16 bits)
-		val ntt_ready = out Bool()
-		val ntt_valid = out Bool()
-	}
-
-	val ntt = NumberTheoreticTransformSequential()
-	io.ntt_addr <> ntt.io.addr
-	io.ntt_data_i <> ntt.io.data_i
-	io.ntt_load <> ntt.io.load
-	io.ntt_start <> ntt.io.start
-	io.ntt_interrupt <> ntt.io.interrupt
-	io.ntt_data_o <> ntt.io.data_o
-	io.ntt_ready <> ntt.io.ready
-	io.ntt_valid <> ntt.io.valid
-}
-
-object TopLevelVhdl extends App {
-	Config.spinal.generateVhdl(TopLevel())
-}*/
diff --git a/hw/spinal/kyber/TopLevelFml.scala b/hw/spinal/kyber/TopLevelFml.scala
deleted file mode 100644
index b1606f5fe6d8442a2003530957cea6c3679d2fc0..0000000000000000000000000000000000000000
--- a/hw/spinal/kyber/TopLevelFml.scala
+++ /dev/null
@@ -1,23 +0,0 @@
-/*package kyber
-
-import spinal.core._
-import spinal.core.formal._
-
-// You need SymbiYosys to be installed.
-// See https://spinalhdl.github.io/SpinalDoc-RTD/master/SpinalHDL/Formal%20verification/index.html#installing-requirements
-object TopLevelFml extends App {
-	FormalConfig.withBMC(10).doVerify(new Component {
-		val dut = FormalDut(TopLevel())
-
-		// Ensure the formal test start with a reset
-		assumeInitial(clockDomain.isResetActive)
-
-		// Provide some stimulus
-		anyseq(dut.io.ntt_addr)
-		anyseq(dut.io.ntt_data_i)
-		anyseq(dut.io.ntt_load)
-
-		// Check the state initial value and increment
-		//assert(dut.io.state === past(dut.io.state + U(dut.io.cond0)).init(0))
-	})
-}*/
diff --git a/hw/spinal/kyber/TopLevelSim.scala b/hw/spinal/kyber/TopLevelSim.scala
deleted file mode 100644
index 51a99bb8cb297122e3b03b5fbdbfdb1512e8ca53..0000000000000000000000000000000000000000
--- a/hw/spinal/kyber/TopLevelSim.scala
+++ /dev/null
@@ -1,31 +0,0 @@
-/*package kyber
-
-import spinal.core._
-import spinal.core.sim._
-
-object TopLevelSim extends App {
-	Config.sim.compile(TopLevel()).doSim { dut =>
-		// Fork a process to generate the reset and the clock on the dut
-		dut.clockDomain.forkStimulus(period = 10)
-
-		var modelState = 0
-		for (idx <- 0 to 99) {
-			// Drive the dut inputs with random values
-			dut.io.ntt_addr.randomize()
-			dut.io.ntt_data_i.randomize()
-
-			// Wait a rising edge on the clock
-			dut.clockDomain.waitRisingEdge()
-
-			// Check that the dut values match with the reference model ones
-			//val modelFlag = modelState == 0 || dut.io.cond1.toBoolean
-			//assert(dut.io.state.toInt == modelState)
-			//assert(dut.io.flag.toBoolean == modelFlag)
-
-			// Update the reference model value
-			//if (dut.io.cond0.toBoolean) {
-			//	modelState = (modelState + 1) & 0xff
-			//}
-		}
-	}
-}*/
diff --git a/hw/spinal/kyber/ntt/Ntt.scala b/hw/spinal/kyber/ntt/Ntt.scala
index d1d390f2f237bbdba7dbd10cb68297b87f1ae685..85abb9a4dd0858bcec26c609042d8d05405708e9 100644
--- a/hw/spinal/kyber/ntt/Ntt.scala
+++ b/hw/spinal/kyber/ntt/Ntt.scala
@@ -7,6 +7,8 @@ import spinal.core._
 import spinal.core.sim._
 import spinal.lib.fsm._
 
+import java.io.File
+
 
 /**
  * Performs a <b>Number Theoretic Transform</b>,
@@ -120,8 +122,14 @@ case class Ntt(nports: Int = 1) extends Component {
 
 
 object NttGEN extends App {
-	val report = Config.spinal.generateVhdl(Ntt(nports = 128))
-	report.printPruned()
+	val dir = Config.spinal.targetDirectory
+	val plain = "Ntt.vhd"
+	for (i <- 0 to 7) {
+		val nports = 1 << i
+		val report = Config.spinal.generateVhdl(Ntt(nports = nports))
+		report.printPruned()
+		new File(dir + "/" + plain).renameTo(new File(dir + "/Ntt_%03d.vhd".format(nports)))
+	}
 }
 
 
diff --git a/hw/spinal/kyber/ntt/NttAXI.scala b/hw/spinal/kyber/ntt/NttAXI.scala
deleted file mode 100644
index 0abd0231b218a29a189748aac6628b903998f26b..0000000000000000000000000000000000000000
--- a/hw/spinal/kyber/ntt/NttAXI.scala
+++ /dev/null
@@ -1,45 +0,0 @@
-package kyber.ntt
-
-import kyber.Config
-import spinal.core._
-import spinal.core.sim._
-import spinal.lib._
-import spinal.lib.bus.amba4.axi._
-
-
-/**
- * Mapping of the functionality offered by the Ntt component to a register array.
- *
- * @param nports the number of "butterflies" or parallel multiplications
- */
-case class NttAxi(nports: Int = 1) extends Component {
-	SoftChecks.require_NPORTS(nports)
-
-	val io = new Bundle {
-		val axi = slave(Axi4(Axi4Config(
-			addressWidth = 32,
-			dataWidth = 32,
-			idWidth = 0,
-			useId = false,
-			useRegion = false,
-			useBurst = false,
-			useLock = false,
-			useCache = false,
-			useSize = false,
-			useQos = false,
-			useLen = false,
-			useLast = false,
-			useResp = false,
-			useProt = false,
-			useStrb = false,
-		)))
-	}
-}
-
-
-object NttAxiSIM extends App {
-	Config.sim.compile(NttAxi()).doSim { dut =>
-		//TODO
-		simSuccess()
-	}
-}
diff --git a/hw/spinal/kyber/ntt/NttMemoryMap.scala b/hw/spinal/kyber/ntt/NttMemoryMap.scala
new file mode 100644
index 0000000000000000000000000000000000000000..b81b4ef3b065c3a69f8ecb20b67a5f5e8eb404f3
--- /dev/null
+++ b/hw/spinal/kyber/ntt/NttMemoryMap.scala
@@ -0,0 +1,81 @@
+package kyber.ntt
+
+import kyber.Config
+import spinal.core._
+import spinal.core.sim._
+import spinal.lib._
+import spinal.lib.bus.amba4.axi._
+
+
+/**
+ * Mapping of the functionality offered by the Ntt component to a register array.
+ *
+ * @param nports the number of "butterflies" or parallel multiplications
+ */
+case class NttAxi(nports: Int = 1) extends Component {
+	SoftChecks.require_NPORTS(nports)
+
+	val io = new Bundle {
+		val axi = slave(Axi4(Axi4Config(
+			addressWidth = 32,
+			dataWidth = 32,
+			idWidth = 0,
+			useId = false,
+			useRegion = false,
+			useBurst = false,
+			useLock = false,
+			useCache = false,
+			useSize = false,
+			useQos = false,
+			useLen = false,
+			useLast = false,
+			useResp = false,
+			useProt = false,
+			useStrb = false,
+		)))
+	}
+
+	val ntt = Ntt(nports = nports)
+
+	// SPEC (AXI4) : on reset, drive VALID to '0'
+	val reg_rvalid = Reg(Bool()) init false
+	reg_rvalid := ntt.io.o_valid
+	val reg_bvalid = Reg(Bool()) init false
+	reg_bvalid := True
+
+	val sig_is_write = Bool() // TODO: define
+
+	// NTT INPUTS
+	ntt.io.i_data := io.axi.w.data(ntt.io.i_data.getBitsWidth - 1 downto 0)
+	ntt.io.i_addr := sig_is_write.mux(
+		io.axi.aw.addr.asBits.asUInt(ntt.io.i_addr.getBitsWidth - 1 downto 0),
+		io.axi.ar.addr.asBits.asUInt(ntt.io.i_addr.getBitsWidth - 1 downto 0),
+	)
+	ntt.io.i_load
+	ntt.io.i_go
+	ntt.io.i_stop
+
+	// CONSUMABLE
+	io.axi.ar.addr
+	io.axi.ar.valid
+	io.axi.r.ready
+	io.axi.aw.addr
+	io.axi.aw.valid
+	io.axi.w.data
+	io.axi.w.valid
+
+	// SETTABLE
+	io.axi.ar.ready := True
+	io.axi.r.data := ((ntt.io.o_data.getBitsWidth - 1 downto 0) -> ntt.io.o_data, default -> false)
+	io.axi.r.valid := ntt.io.o_valid
+	io.axi.aw.ready := True
+	io.axi.w.ready := ntt.io.o_ready
+}
+
+
+object NttAxiSIM extends App {
+	Config.sim.compile(NttAxi()).doSim { dut =>
+		//TODO
+		simSuccess()
+	}
+}
diff --git a/hw/spinal/kyber/poly/PolyBundle.scala b/hw/spinal/kyber/poly/PolyBundle.scala
deleted file mode 100644
index d57c29d9a0ffc57ab0fa85fb940bbc495ec75f7f..0000000000000000000000000000000000000000
--- a/hw/spinal/kyber/poly/PolyBundle.scala
+++ /dev/null
@@ -1,7 +0,0 @@
-package kyber.poly
-
-import spinal.core._
-
-case class PolyBundle() extends Bundle {
-	val coeffs = Vec.fill(256)(SInt(16 bits))
-}
diff --git a/hw/spinal/kyber/poly/PolyCompress.scala b/hw/spinal/kyber/poly/PolyCompress.scala
deleted file mode 100644
index 61597c259523f5a38f2b1e94c6ab886d6ada08ae..0000000000000000000000000000000000000000
--- a/hw/spinal/kyber/poly/PolyCompress.scala
+++ /dev/null
@@ -1,11 +0,0 @@
-package kyber.poly
-
-import spinal.core._
-
-case class PolyCompress(compressedBytesLen: Int) extends Component {
-	require(compressedBytesLen == 128 || compressedBytesLen == 160)
-
-	val io = new Bundle {
-		val poly = in(PolyBundle())
-	}
-}
diff --git a/hw/spinal/kyber/verify/Verify.scala b/hw/spinal/kyber/verify/Verify.scala
deleted file mode 100644
index 865a421341f2b352d69d387c5b03c4b446652f26..0000000000000000000000000000000000000000
--- a/hw/spinal/kyber/verify/Verify.scala
+++ /dev/null
@@ -1,7 +0,0 @@
-package kyber.verify
-
-import spinal.core._
-
-case class Verify()extends Component{
-	val io=new Bundle{}
-}
diff --git a/hw/vhdl/NumberTheoreticTransformSequential.vhd b/hw/vhdl/NumberTheoreticTransformSequential.vhd
deleted file mode 100644
index 77c33b31c906734135b87831dd79c20e34121a43..0000000000000000000000000000000000000000
--- a/hw/vhdl/NumberTheoreticTransformSequential.vhd
+++ /dev/null
@@ -1,35 +0,0 @@
-library ieee;
-use ieee.std_logic_1164.all;
-use ieee.numeric_std.all;
-
-
-entity ntt is
-	port (
-		i_addr: in std_logic_vector(7 downto 0);
-		i_data: in std_logic_vector(15 downto 0);
-		i_load: in std_logic;
-		i_start: in std_logic;
-		i_interrupt: in std_logic;
-		o_data: out std_logic_vector(15 downto 0);
-		o_ready: out std_logic;
-		o_valid: out std_logic;
-		reset: in std_logic;
-		clk: in std_logic
-	);
-end ntt;
-
-
-architecture arch of ntt is
-	type t_zetas is array(0 to 127) of signed(15 downto 0);
-	constant c_zetas: t_zetas := (
-		-1044, -758, -359, -1517, 1493, 1422, 287, 202, -171, 622, 1577, 182, 962, -1202, -1474, 1468,
-		573, -1325, 264, 383, -829, 1458, -1602, -130, -681, 1017, 732, 608, -1542, 411, -205, -1571,
-		1223, 652, -552, 1015, -1293, 1491, -282, -1544, 516, -8, -320, -666, -1618, -1162, 126, 1469,
-		-853, -90, -271, 830, 107, -1421, -247, -951, -398, 961, -1508, -725, 448, -1065, 677, -1275,
-		-1103, 430, 555, 843, -1251, 871, 1550, 105, 422, 587, 177, -235, -291, -460, 1574, 1653,
-		-246, 778, 1159, -147, -777, 1483, -602, 1119, -1590, 644, -872, 349, 418, 329, -156, -75,
-		817, 1097, 603, 610, 1322, -1285, -1465, 384, -1215, -136, 1218, -1335, -874, 220, -1187, -1659,
-		-1185, -1530, -1278, 794, -1510, -854, -870, 478, -108, -308, 996, 991, 958, -1460, 1522, 1628
-	);
-begin
-end arch;
diff --git a/meta/circ/Counter_7.circ b/meta/circ/Counter_7.circ
new file mode 100644
index 0000000000000000000000000000000000000000..435883850a8a97796cb0a96fbaa59258f7bcd218
--- /dev/null
+++ b/meta/circ/Counter_7.circ
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project source="3.8.0" version="1.0">
+  This file is intended to be loaded by Logisim-evolution v3.8.0(https://github.com/logisim-evolution/).
+
+  <lib desc="#Wiring" name="0">
+    <tool name="Pin">
+      <a name="appearance" val="classic"/>
+    </tool>
+  </lib>
+  <lib desc="#Gates" name="1"/>
+  <lib desc="#Plexers" name="2"/>
+  <lib desc="#Arithmetic" name="3"/>
+  <lib desc="#Memory" name="4"/>
+  <lib desc="#I/O" name="5"/>
+  <lib desc="#TTL" name="6"/>
+  <lib desc="#TCL" name="7"/>
+  <lib desc="#Base" name="8"/>
+  <lib desc="#BFH-Praktika" name="9"/>
+  <lib desc="#Input/Output-Extra" name="10"/>
+  <lib desc="#Soc" name="11"/>
+  <main name="main"/>
+  <options>
+    <a name="gateUndefined" val="ignore"/>
+    <a name="simlimit" val="1000"/>
+    <a name="simrand" val="0"/>
+  </options>
+  <mappings>
+    <tool lib="8" map="Button2" name="Poke Tool"/>
+    <tool lib="8" map="Button3" name="Menu Tool"/>
+    <tool lib="8" map="Ctrl Button1" name="Menu Tool"/>
+  </mappings>
+  <toolbar>
+    <tool lib="8" name="Poke Tool"/>
+    <tool lib="8" name="Edit Tool"/>
+    <tool lib="8" name="Wiring Tool"/>
+    <tool lib="8" name="Text Tool"/>
+    <sep/>
+    <tool lib="0" name="Pin"/>
+    <tool lib="0" name="Pin">
+      <a name="facing" val="west"/>
+      <a name="output" val="true"/>
+    </tool>
+    <sep/>
+    <tool lib="1" name="NOT Gate"/>
+    <tool lib="1" name="AND Gate"/>
+    <tool lib="1" name="OR Gate"/>
+    <tool lib="1" name="XOR Gate"/>
+    <tool lib="1" name="NAND Gate"/>
+    <tool lib="1" name="NOR Gate"/>
+    <sep/>
+    <tool lib="4" name="D Flip-Flop"/>
+    <tool lib="4" name="Register"/>
+  </toolbar>
+  <circuit name="main">
+    <a name="appearance" val="logisim_evolution"/>
+    <a name="circuit" val="main"/>
+    <a name="circuitnamedboxfixedsize" val="true"/>
+    <a name="simulationFrequency" val="1.0"/>
+    <comp lib="0" loc="(160,240)" name="Pin">
+      <a name="appearance" val="NewPins"/>
+      <a name="label" val="EN"/>
+    </comp>
+    <comp lib="0" loc="(160,280)" name="Pin">
+      <a name="appearance" val="NewPins"/>
+      <a name="label" val="ZERO"/>
+    </comp>
+    <comp lib="0" loc="(160,340)" name="Pin">
+      <a name="appearance" val="NewPins"/>
+      <a name="label" val="CLK"/>
+    </comp>
+    <comp lib="0" loc="(460,230)" name="Constant">
+      <a name="value" val="0x0"/>
+      <a name="width" val="3"/>
+    </comp>
+    <comp lib="0" loc="(540,240)" name="Constant"/>
+    <comp lib="0" loc="(550,120)" name="Constant">
+      <a name="width" val="3"/>
+    </comp>
+    <comp lib="0" loc="(570,280)" name="Constant">
+      <a name="value" val="0x0"/>
+    </comp>
+    <comp lib="0" loc="(660,400)" name="Constant">
+      <a name="value" val="0x6"/>
+      <a name="width" val="3"/>
+    </comp>
+    <comp lib="0" loc="(660,530)" name="Constant"/>
+    <comp lib="0" loc="(690,570)" name="Constant">
+      <a name="value" val="0x0"/>
+    </comp>
+    <comp lib="0" loc="(860,220)" name="Pin">
+      <a name="appearance" val="NewPins"/>
+      <a name="facing" val="west"/>
+      <a name="label" val="VALUE"/>
+      <a name="output" val="true"/>
+      <a name="width" val="3"/>
+    </comp>
+    <comp lib="0" loc="(860,390)" name="Pin">
+      <a name="appearance" val="NewPins"/>
+      <a name="facing" val="west"/>
+      <a name="label" val="FULL"/>
+      <a name="output" val="true"/>
+    </comp>
+    <comp lib="0" loc="(860,510)" name="Pin">
+      <a name="appearance" val="NewPins"/>
+      <a name="facing" val="west"/>
+      <a name="label" val="OVERFLOW"/>
+      <a name="output" val="true"/>
+    </comp>
+    <comp lib="1" loc="(580,510)" name="AND Gate">
+      <a name="inputs" val="3"/>
+      <a name="negate2" val="true"/>
+    </comp>
+    <comp lib="2" loc="(430,210)" name="Multiplexer">
+      <a name="width" val="3"/>
+    </comp>
+    <comp lib="2" loc="(500,220)" name="Multiplexer">
+      <a name="width" val="3"/>
+    </comp>
+    <comp lib="3" loc="(600,130)" name="Adder">
+      <a name="width" val="3"/>
+    </comp>
+    <comp lib="3" loc="(720,390)" name="Comparator">
+      <a name="mode" val="unsigned"/>
+      <a name="width" val="3"/>
+    </comp>
+    <comp lib="4" loc="(540,190)" name="Register">
+      <a name="appearance" val="logisim_evolution"/>
+      <a name="width" val="3"/>
+    </comp>
+    <comp lib="4" loc="(660,480)" name="Register">
+      <a name="appearance" val="logisim_evolution"/>
+      <a name="width" val="1"/>
+    </comp>
+    <comp lib="8" loc="(580,431)" name="Text">
+      <a name="font" val="Monospaced bold 16"/>
+      <a name="text" val="combinations = 7 = (6+1)"/>
+    </comp>
+    <wire from="(160,240)" to="(360,240)"/>
+    <wire from="(160,280)" to="(320,280)"/>
+    <wire from="(160,340)" to="(240,340)"/>
+    <wire from="(240,340)" to="(240,550)"/>
+    <wire from="(240,340)" to="(540,340)"/>
+    <wire from="(240,550)" to="(660,550)"/>
+    <wire from="(320,280)" to="(320,530)"/>
+    <wire from="(320,280)" to="(480,280)"/>
+    <wire from="(320,530)" to="(520,530)"/>
+    <wire from="(360,220)" to="(400,220)"/>
+    <wire from="(360,240)" to="(360,510)"/>
+    <wire from="(360,240)" to="(410,240)"/>
+    <wire from="(360,510)" to="(530,510)"/>
+    <wire from="(360,90)" to="(360,220)"/>
+    <wire from="(360,90)" to="(620,90)"/>
+    <wire from="(380,180)" to="(380,200)"/>
+    <wire from="(380,180)" to="(540,180)"/>
+    <wire from="(380,200)" to="(400,200)"/>
+    <wire from="(410,230)" to="(410,240)"/>
+    <wire from="(430,210)" to="(470,210)"/>
+    <wire from="(460,230)" to="(470,230)"/>
+    <wire from="(480,240)" to="(480,280)"/>
+    <wire from="(500,220)" to="(540,220)"/>
+    <wire from="(510,470)" to="(510,490)"/>
+    <wire from="(510,470)" to="(740,470)"/>
+    <wire from="(510,490)" to="(530,490)"/>
+    <wire from="(540,140)" to="(540,180)"/>
+    <wire from="(540,140)" to="(560,140)"/>
+    <wire from="(540,180)" to="(660,180)"/>
+    <wire from="(540,260)" to="(540,340)"/>
+    <wire from="(550,120)" to="(560,120)"/>
+    <wire from="(580,510)" to="(660,510)"/>
+    <wire from="(600,130)" to="(620,130)"/>
+    <wire from="(600,220)" to="(660,220)"/>
+    <wire from="(620,90)" to="(620,130)"/>
+    <wire from="(660,180)" to="(660,220)"/>
+    <wire from="(660,220)" to="(660,380)"/>
+    <wire from="(660,220)" to="(860,220)"/>
+    <wire from="(660,380)" to="(680,380)"/>
+    <wire from="(660,400)" to="(680,400)"/>
+    <wire from="(720,390)" to="(740,390)"/>
+    <wire from="(720,510)" to="(860,510)"/>
+    <wire from="(740,390)" to="(740,470)"/>
+    <wire from="(740,390)" to="(860,390)"/>
+  </circuit>
+</project>
diff --git a/meta/graphics/logical_blocks.xopp b/meta/graphics/logical_blocks.xopp
index a856d043ce4c634e01a82835d6b1d9e7dcfe26e5..c7894f23a70fb73282e6a5057de4f19832218e06 100644
Binary files a/meta/graphics/logical_blocks.xopp and b/meta/graphics/logical_blocks.xopp differ
diff --git a/meta/report/0_head.md b/meta/report/0_head.md
deleted file mode 100644
index 2afefccb4262da9fb0cfc28bdc698e06d6c43c19..0000000000000000000000000000000000000000
--- a/meta/report/0_head.md
+++ /dev/null
@@ -1,46 +0,0 @@
-title: Lattice Based Post-Quantum Cryptographic Components on FPGA - Towards an ASIC Implementation of the Kyber Key Encapsulation Algorithm
-author: Boris Stefanovic
-date: 2024-05-27
-
-
-
-$$\null\hfill Right justify$$
-
-# Acknowledgements
-
-As this is work dealing with key exchange algorithms, it seems fitting to begin by appreciating my time spent with all the people who foster trust in a time of contempt.
-
-I would like to express my gratitude to Marc for his time and help with making sense of obscure proof-of-concept VHDL code found on shady GitHub repositories. Fun as it was, remind me not to do that again for a full week. Thank you for helping me through this and other well-chosen tricky situations.
-
-Then, to Big Léo, for always helping me keep my head when the scent of cloves rises. Thank you for your trust and friendship.
-
-Last but not least, Alessia, for always doing your best to heal a world that still lacks the ability to do so on its own, steadily, one step at a time. Thank you for being such an inspiration!
-
-# Abstract
-
-
-
-# List of Acronyms
-
-- ASIC : Application Specific Integrated Circuit
-- CLB : Configurable Logic Block
-- FPGA : Field Programmable Gate Array
-- IP : Intellectual Property
-- LUT : LookUp Table
-- LWE : Learning With Errors
-- NIST : National Institute of Standards and Technology
-- PQC : Post-Quantum Cryptography
-- RTL : Register Transfer Level
-- SVP : Shortest Vector Problem
-- TCL : Tool Command Language
-- VHDL : V(ery High Speed Integrated Circuit) Hardware Description Language
-
-# List of Illustrations
-
-
-
-# List of URLs
-
-
-
-# List of Appendices
diff --git a/meta/report/1_introduction.mkd b/meta/report/1_introduction.mkd
deleted file mode 100644
index e965e7f5c8b6edeb24f4db2a8a539fc0af4fa406..0000000000000000000000000000000000000000
--- a/meta/report/1_introduction.mkd
+++ /dev/null
@@ -1,3 +0,0 @@
-# Introduction
-
-NIST
\ No newline at end of file
diff --git a/meta/report/2_math.mkd b/meta/report/2_math.mkd
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/meta/report/3_algorithm.mkd b/meta/report/3_algorithm.mkd
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/meta/report/4_fpga.mkd b/meta/report/4_fpga.mkd
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/meta/report/5_test.mkd b/meta/report/5_test.mkd
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/meta/report/6_conclusion.mkd b/meta/report/6_conclusion.mkd
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/meta/report/chapters/1_outils.tex b/meta/report/chapters/1_outils.tex
new file mode 100644
index 0000000000000000000000000000000000000000..bdc8ad724e8c4482871678ed702eaeb8d20cd149
--- /dev/null
+++ b/meta/report/chapters/1_outils.tex
@@ -0,0 +1,170 @@
+% !TeX spellcheck = fr_FR
+
+
+\chapter{Chapitre 1 : Outils utilisés}
+
+\inspired{
+	L'avantage des langages de haut-niveau, c'est qu'ils sont moins verbeux.\linebreak
+	Le désavantage des langages de haut-niveau, c'est qu'ils sont moins verbeux.\linebreak
+	\linebreak
+	- Marc Gay-Balmaz
+}
+
+
+\section{Field Programmable Gate Array}
+
+\tbfigure{0.6}{fpga}{FPGA Altera Stratix IV EP4SGX230 sur un PCB}{tiré de commons.wikimedia.org, ref. URL1.1}
+
+Les \gls{fpga} sont des circuits intégrés particuliers dont il est possible de reprogrammer la logique interne.
+Conceptuellement, cette reprogrammation de bas-niveau se fait au niveau de la porte logique et du registre.
+Pour vulgariser, une \gls{fpga} permettrait de \textit{créer} un processeur avec une architecture hautement optimisée pour la résolution d'un problème particulier, sans les délais et coûts d'usinage liés à la production d'un \gls{asic}.
+
+La logique interne d'une \gls{fpga} se présente sous forme de :
+
+\begin{itemize}
+	\item \gls{lut} : tables de vérité matérielles à plusieurs entrées
+	\item registres : mémoires d'état pour les systèmes séquentiels
+	\item \gls{clb} : blocs répétés regroupant des éléments de logique configurable et de mémoire
+	\item matrice d'interconnexion : permet le routage des signaux d'une partie de la logique à l'autre
+\end{itemize}
+
+L'image ci-dessous résume cette structure.
+
+\tbfigure{0.7}{fpgainternal}{Schéma de la structure interne d'une FPGA}{tiré de iq.opengenus.org, ref URL1.2}
+
+Lors de la reconfiguration de la \gls{fpga}, la logique se crée en écrivant des valeurs dans les tables de vérité (\gls{lut}) et la configuration des routes se fait à l'aide des \textit{switch blocks}.
+Dans chaque \gls{clb}, les multiplexeurs déterminent si la logique locale est combinatoire ou séquentielle.
+
+\subsection{Cas d'utilisation}
+
+De manière générale, on pense à utiliser une \gls{fpga} si la production d'un grand nombre d'\gls{asic} ne serait pas immédiatement avantageuse.
+En pratique, la cause en est souvent soit la grande spécificité de l'opération à exécuter, soit la possibilité de présence d'erreurs dans la logique du modèle, dans son état du moment.
+Les utilisations tombent donc très souvent dans une des trois catégories suivantes.
+
+\textbf{Opérations spécifiques}
+
+La reconfigurabilité des \gls{fpga} peut être mise à profit lorsque l'on veut lancer un grand nombre de calculs similaires en parallèle, quand investir dans l'achat ou le développement d'un \gls{asic} dédié n'est pas avantageux économiquement.
+Une fois la \gls{fpga} acquis, le développement d'un nouveau composant de ce type n'engendre aucun coût matériel: il suffit d'une description du matériel à implémenter en \gls{hdl}.
+
+\textbf{Prototypage}
+
+Un autre cas d'utilisation courant des \gls{fpga} est le prototypage.
+Ce type d'utilisation est celui qui est mis en avant dans ce papier.
+Développer du matériel et plus particulièrement produire un prototype physique est coûteux, particulièrement quand le prototype contient des erreurs logiques.
+Une \gls{fpga} permet d'éviter ces coûts en implémentant la logique sans investissement supplémentaire.
+C'est un formidable moyen de tester un modèle avant de commencer à planifier la production d'un \gls{asic} et ainsi en réduire les risques économiques.
+
+\textbf{Performance}
+
+Un cas un peu plus rare est celui du \textit{matériel sur demande}.
+On parle ici de machines qui se reconfigurent matériellement \textit{à chaud} pour résoudre efficacement les différentes parties d'un problème de façon optimisée.
+En d'autres termes, la reprogrammation de la \gls{fpga} ferait partie de l'algorithme.
+
+Finalement, il est beaucoup plus facile de mettre à jour ou d'adopter une nouvelle version d'une logique implémentée sur \gls{fpga} que de fabriquer un \gls{asic} puis de le connecter à la place des anciens composants.
+Selon la manière dont les \gls{fpga} ont été connectées au système, il peut même ne pas être nécessaire d'interagir physiquement avec ce dernier.
+
+Pour citer un exemple récent, le \gls{cern} a exploré l'implémentation de modèles de \textit{deep learning} sur des \gls{fpga}, afin de permettre le traitement des données de certaines expériences du \gls{lhc} en temps réel\footcite{govorkovaLHCPhysicsDataset2022}.
+Les modèles d'apprentissage automatique évoluent constamment et le remplacement manuel d'un tel nombre de circuits serait lourd.
+Celà en fait un cas particulièrement adapté à l'utilisation des \gls{fpga}.
+
+\subsection{Outils et méthode de programmation d'une FPGA}
+
+La grande majorité des \gls{fpga} se reconfigure ou reprogramme à l'aide d'un logiciel propriétaire fourni avec ces dernières.
+Pour les \gls{fpga} Xilinx, par exemple, ce logiciel est Vivado ou la suite Vitis.
+
+Pour programmer une \gls{fpga}, on part souvent d'une description du système logique à réaliser en \gls{hdl}.
+Cette description, précise au coup d'horloge près, sera ensuite traitée par le logiciel.
+Le nombre d'étapes entreprises par le logiciel peut varier selon les implémentations.
+Celà dit, par souci de simplification, on ne citera que les méta-étapes présentées par Vivado.
+
+\textbf{Synthèse}
+
+La première étape menant à la reprogrammation d'une \gls{fpga} est la synthèse.
+Cette étape consiste à exprimer la logique décrite au niveau \gls{rtl} et la réexprime en termes de composants présents dans la \gls{fpga}: \gls{lut}s, bascules bistables (ou flip-flops), \gls{ram}, etc.
+L'entièreté de la logique est prise en compte simultanément et on supprime la notion de hiérarchie entre les composants, résultant en une représentation \textit{aplanie}.
+À l'issue de ce processus, on obtient une forme du design qui permet un certain niveau de simulation.
+Cette étape ne dépend pas fortement de la \gls{fpga} utilisé.
+
+\textbf{Implémentation}
+
+Contrairement à la précédente, cette étape dépend fortement du matériel auquel la logique créée est destinée.
+Ici, on calcule le placement et le routage des composants sur la carte.
+Celà permet ensuite de générer un rapport détaillant les timings et les ressources utilisées\footnote{Il est possible de générer un tel rapport au niveau de la synthèse mais il est moins précis et sans garantie; le rapport post-placement-et-routage est plus concret et fiable.}.
+C'est là que l'on détermine la fréquence d'horloge maximale à laquelle la logique pourra fonctionner.
+
+\textbf{Génération de bitstream}
+
+Une fois que l'on sait comment placer et router toute la logique, il s'agit de créer un fichier selon un format spécifique interprétable par la carte.
+Ce fichier peut finalement être envoyé sur une entrée dédiée de la \gls{fpga}, ce qui va effectivement procéder à sa reconfiguration.
+
+
+\section{SpinalHDL}
+
+SpinalHDL (couramment appelé simplement \textit{Spinal}) est un langage de description de matériel - ou \gls{hdl} - de haut-niveau.
+Il évolue dans l'environnement du langage de programmation Scala.
+Cela implique qu'un et permet donc d'avoir accès à toutes les fonctionalités de ce dernier pendant le design et qu'il est possible de générer le matériel dynamiquement.
+Si il est bien utilisé, un code SpinalHDL est très expressif et plus descriptif qu'un code \gls{vhdl} équivalent, qui lui se base sur des évènements (\texttt{if rising\_edge(clk) then \dots}).
+
+\subsection{Génération dynamique de matériel}
+
+On peut dire que chaque ligne de code SpinalHDL écrite sera responsable de générer un code VHDL équivalent.
+Étant utilisé depuis l'environnement Scala, il est possible d'écrire l'algorithme selon lequel les composants seront placés au lieu de simplement placer les composants et les signaux.
+L'équivalent d'une instruction en langage \gls{vhdl} \texttt{generate} sera une simple boucle \texttt{for} en Scala/SpinalHDL mais les avantages ne s'arrêtent pas là.
+Lors de l'exécution du code Scala, les composants décrits se comportent eux aussi comme de simples objets scala sur lesquels il est possible d'itérer, qu'il est possible de stocker dans des collections en attendant de les interconnecter et ainsi de suite.
+Ces possibilités sont comparables à celles d'un \textit{préprocesseur pour la génération de matériel}, permettant et encourageant un code plus descriptif que son équivalent en \gls{vhdl}, plus évènementiel.
+
+\subsection{Équivalence claire au code VHDL}
+
+Si il facilite le processus de description du matériel, SpinalHDL de dispense pas d'une compréhension poussée des principes du matériel.
+En celà, il diffère des langages de type \gls{hls}.
+Un code \gls{hls} simplifie le développement de matériel au prix de l'abandon du contrôle précis, au coup d'horloge près, qu'offrent les langages de descriprion traditionnels, comme le \gls{vhdl}.
+A l'inverse, SpinalHDL permet, comme le \gls{vhdl}, une description du matériel précise au cycle d'horloge près et peut facilement être traduit en code \gls{vhdl} équivalent.
+
+\subsection{Disponibilité d'environnements de développement puissants}
+
+Finalement, il est plus aisé de trouver un bon \gls{ide} pour le langage Scala\footnote{comme l'excellent plugin Scala pour les éditeurs de JetBrains} que pour le \gls{vhdl}.
+Celà permet de passer moins de temps à chercher des erreurs de base, telles des erreurs de syntaxe et plus de temps à travailler sur la logique à proprement parler.
+
+\subsection{Design flow en SpinalHDL}
+
+Le design flow de SpinalHDL suit à peu près les étapes suivantes.
+Le matériel souhaité est décrit en Scala.
+Le code scala est compilé puis exécuté.
+L'exécution de ce code produit un fichier unique contenant le code \gls{vhdl} ou Verilog (au choix) décrivant tout le matériel de l'entité du plus haut niveau et ses dépendances.
+Ce code bas-niveau peut ensuite être utilisé pour faire des testbenches et simulations, comme dans un design flow en \gls{vhdl}.
+Finalement, le code bas-niveau est synthétisé.
+À partir de là, en suivant les étapes décrites dans la première section de ce chapitre, le designpeut être implémenté sur une \gls{fpga}.
+Ces étapes sont résumées sur l'image suivante.
+
+\tbfigure{0.5}{SpinalDesignFlow}{Design flow de SpinalHDL}{tiré de pic3.zhimg.com, ref. URL1.3}
+
+Pour faciliter ces tâches, SpinalHDL comporte une \gls{api} de test et de simulation.
+En d'autres termes, les tests et les simulations peuvent être automatisés et pris en charge par Spinal.
+La majeure partie du travail de design peut donc être faite sans quitter l'environnement Spinal.
+
+
+\section{Verilator}
+
+Verilator est un outil permettant la simulation d'un composant défini en Verilog - un autre \gls{hdl}.
+Un modèle en C/C++ correspondant au \gls{hdl} est d'abord compilé avant de lui soumettre différentes séquences sur ses entrées virtuelles et vérifier ses sorties.
+
+Le premier avantage de cette méthode est la possibilité de l'utiliser directement depuis le projet en SpinalHDL.
+Il s'agit, d'ailleurs, du système de simulation par défaut utilisé par SpinalHDL.
+Même si Verilator s'utilise pour des descriptions en Verilog, grâce à SpinalHDL, les utilisateurs habitués au \gls{vhdl} pourront y accéder par une interface SpinalHDL simple d'utilisation.
+Celà implique aussi qu'il est possible et parfois souhaitable d'avoir le code d'un composant et de sa simulation dans le même fichier.
+
+Le deuxième avantage réside dans le fait que contrairement aux outils de simulation présents dans Vivado, par exemple, Verilator peut utiliser tous les coeurs du \gls{cpu} de l'ordinateur.
+En termes de productivité, celà compense largement le temps de compilation et des redémarrages incessants des outils de simulation usuels (Vivado, ModelSim, \dots).
+
+Toutes les simulations de ce travail ont été réalisées à l'aide de Verilator, à travers l'\gls{api} de simulation de SpinalHDL.
+
+
+\section{Vivado}
+
+Vivado est un logiciel fourni par Xilinx pour permettre le design et l'implémentation de matériel pour leurs \gls{fpga}.
+Il comprend entre autres un éditeur, des outils de synthèse, de placement et de routage, ainsi que pour la simulation et les tests.
+Sachant que nous utilisons Spinal pour une grande partie de ces tâches, deux fonctionalités particulières de Vivado nous intéressent dans ce travail.
+La première est la génération d'une représentation graphique d'une description en \gls{hdl}.
+Cet outil s'est révélé fort utile lors de nos premières expériences avec Spinal, pour confirmer la bonne compréhension des outils qu'offre ce dernier.
+La deuxième est la génération des rapports détaillant les timings et les ressources utilisées, à la fin de la phase d'implémentation.
+Ces rapports nous ont servi à évaluer en partie la qualité de notre solution.
diff --git a/meta/report/chapters/2_operations.tex b/meta/report/chapters/2_operations.tex
new file mode 100644
index 0000000000000000000000000000000000000000..45d9565d843af698faac94078fa8c67310d77bde
--- /dev/null
+++ b/meta/report/chapters/2_operations.tex
@@ -0,0 +1,215 @@
+% !TeX spellcheck = fr_FR
+
+
+\chapter{Chapitre 2 : Théorie et description des opérations à réaliser}
+
+
+\section{Rappels de cryptographie}
+
+\subsection{Propriétés de la sécurité}
+
+Pour assurer la sécurité d'un système, on cherche à en assurer certaines propriétés :
+
+\begin{itemize}
+	\item Confidentialité
+	\item Integrité
+	\item Authenticité
+	\item Disponibilité
+	\item Non-répudiation
+\end{itemize}
+
+Selon le champ d'application de notre système, on peut les appliquer sur les données :
+
+\begin{itemize}
+	\item au repos (stockées)
+	\item en transit (dans un canal de communication)
+	\item en utilisation (par exemple, en mémoire vive)
+\end{itemize}
+
+Dans notre cas, on s'intéresse surtout à la sécurité des données en transit.
+On décrit ici comment trois propriétés choisies s'appliquent au chiffrement par clé publique donc aussi, par extension, à Kyber.
+
+\textbf{Confidentialité}
+
+Confidentialité signifie qu'il est impossible à un parti non-autorisé d'accéder aux données.
+Comme on traite de chiffrement, la confidentialité signifie qu'un message chiffré intercepté dans le canal de communication, par un parti autre que l'expéditeur et le destinataire, ne pourra pas être déchiffré et lu.
+
+\textbf{Integrité}
+
+Assurer l'integrité des données revient à prévenir leur modification par un parti non-autorisé.
+Dans le cas de communications chiffrées, celà revient à dire qu'une modification du message chiffré intercepté dans le canal puis retransmis au destinataire sera détectée et que le message sera invalidé.
+
+\textbf{Authenticité}
+
+Établir l'authenticité d'un message consiste à confirmer l'identité de son auteur ou de son expéditeur.
+Comme on est dans le cas de clés publiques - c'est-à-dire connues du monde ou au minimum interceptables en texte clair dans le canal de communication - on ne peut garantir que l'expéditeur soit une entité particulière.
+En revanche, il est possible de déterminer l'authenticité par les contenus des messages, d'après un protocole défini auparavant.
+
+\subsection{Principe du chiffrement par clé publique}
+
+Un mécanisme de chiffrement par clé publique repose sur l'existence de fonctions non-inversibles en l'absence d'une information supplémentaire que l'on appelle la \textit{clé}.
+Il faut aussi que le calcul de la préimage d'une valeur par cette fonction soit \textit{pratiquement impossible} par essai de toutes les valeurs possibles.
+Par \textit{pratiquement impossible}, on entend que compléter l'opération de cette manière demanderait en réalité un temps extrêmement long.
+
+
+\section{Rappel de quelques propriétés de la NTT}
+
+La \gls{ntt} est une transformation mathématique\footnote{En ce qui concerne la nomenclature utilisée dans ce document, on parle de transformation pour désigner l'opération et de transformée pour désigner soit le résultat de la transformation, soit l'expression de celle-ci.} qui s'applique aux polynômes.
+Les données que l'on a avant et après son application contiennent les mêmes informations mais présentées sous une forme différente, \textit{dans un autre domaine}.
+La transformation prend donc des données du \textit{domaine normal} et les présente dans le \textit{domaine de la \gls{ntt}}.
+La \gls{ntt} est une alternative de la transformation de Fourier qui au lieu de s'appliquer à l'ensemble des nombres complexes $\mathbb{C}$, s'applique aux anneaux modulaires $\mathbb{Z} / p \mathbb{Z}$.
+Concrètement, on l'obtient en remplaçant $e^{-2 \pi i k / N}$ dans la transformée de Fourier par une n-ième racine primitive de l'unité de l'anneau en question\footcite{weissteinNumberTheoreticTransform2024}.
+On parle donc ici de \textit{domaine de la \gls{ntt}} comme on parlerait de passage du domaine temporel au domaine fréquentiel dans le cas de la transformation de Fourier.
+
+On peut constater ces similarités et différences en observant les formules de ces deux transformées.
+Tout d'abord, pour référence, voici l'expression complète de la \textbf{transformée de Fourier}.
+Pour toute \textbf{fonction} $f$ périodique définie sur les nombres réels $\mathbb{R}$ et $T$, sa période\footnote{Il se peut que T soit $\infty$.}, sa transformée de Fourier se présente ainsi :
+
+%\begin{equation}
+%	\begin{aligned}
+%		f & \rightarrow \hat{f}\\
+%		[0, T] & \mapsto R
+%	\end{aligned}
+%\end{equation}
+
+\begin{equation}
+	\hat{F}(\omega) = \int_{-\infty}^{\infty}f(x) e^{-2\pi i \omega x} dx
+\end{equation}
+
+avec $\omega$, la fréquence.
+
+Pour comparaison, voici la formule de la \gls{ntt}.
+Pour tout \textbf{polynôme} de la forme :
+
+\begin{equation}
+	g = \sum_{i=0}^{255} c_i X^i
+\end{equation}
+
+Sa \gls{ntt} se présente comme suit :
+
+\begin{equation}
+	NTT(g) = \Hat{g} = \sum_{i=0}^{255} \Hat{g}_i X^i
+\end{equation}
+
+avec
+
+\begin{equation}
+	\Hat{g}_i = \sum_{j=0}^{255} \psi^j g_j \omega^{ij}
+\end{equation}
+
+$\omega$ est une n-ième racine primitive de l'unité et $\psi = \sqrt{\omega}$.
+
+
+\section{Format de données et opérations de Kyber}
+
+Kyber a été développé pour permettre l'encapsulation de clés; on parle aussi d'échange de clés symmétriques temporaires.
+Cette section décrit les cinq opérations que Kyber définit à cette fin\footnote{Cette section traite de Kyber et contient des informations qui lui sont spécifiques mais ces cinq opérations doivent être définies par toute méthode de chiffrement par clé publique.} ainsi que le format des données utilisées.
+Elle s'inspire beaucoup de certains passages du document \textit{CRYSTALS – Kyber: a CCA-secure module-lattice-based KEM}\footcite{bosCRYSTALSKyberCCAsecure2017}.
+
+\subsection{Format des données}
+
+Les données traitées par Kyber se présentent comme des vecteurs de valeurs.
+Mathématiquement, ces vecteurs s'interprètent comme des polynômes dans l'anneau modulaire $\mathbb{Z}_{256} [X] / (X^{256} + 1)$.
+En d'autres termes, un tel polynôme $g$ se présenterait ainsi :
+
+\begin{equation}
+	g = \sum_{i=0}^{255} c_i X^i
+\end{equation}
+
+où chaque coefficient $c_i \in {0 , \dots , 255}$ serait la i-ième valeur du vecteur.
+
+\subsection{Génération de la paire de clés : \texttt{KEYGEN}}
+
+La première opération est bien sûr la génération de la paire de clés, respectivement la clé publique $pk$ et la clé privée/secrète $sk$.
+Une bonne génération de clés nécessite une bonne source d'aléatoire, de façon à rendre impossible la tâche de diviner les contenus des clés.
+
+\subsection{Chiffrement à l'aide de la clé publique : \texttt{ENC}}
+
+L'opération de chiffrement consiste à créer un message chiffré $c$ à partir d'un texte clair $m$.
+Pour ce faire, on utilise la clé publique $pk$, de façon à ce qu'il ne soit possible de déchiffrer $c$ que si on est en possession de la clé privée $sk$.
+
+\subsection{Déchiffrement à l'aide de la clé privée : \texttt{DEC}}
+
+L'opération de déchiffrement prend un message chiffré $c$ et en restitue le texte clair $m$ correspondant.
+Cette opération doit être impossible sans la clé privée $sk$ de la même paire que celle à laquelle appartient la clé publique $pk$ qui a été utilisée pour chiffrer $m$.
+Ele est appliquée sur un espace fini (même si il peut être grand) dans lequel se trouvent nos messages $m$.
+En pratique, en informatique, on parle souvent de vecteurs d'octets d'une taille définie.
+
+\subsection{Création et encapsulation de la clé temporaire \texttt{ENCAPS}}
+
+On cherche à établir une clé partagée secrète $K$ des deux côtés du canal de communication.
+Pour la créer, l'opération \texttt{ENCAPS} prend en paramètre une clé publique $pk$ et retourne une clé partagée $K$ et un message chiffré $ck$ qui contient les informations nécessaires pour recréer $K$.
+On parle bien ici d'\textbf{une} clé $K$ possible car \texttt{ENCAPS} doit être probabiliste.
+Celà signifie que pour deux applications de l'opération sur la même clé $pk$, les sorties $K$ et $ck$ produites seront probablement différentes.
+Elle doit donc prendre ou trouver un paramètre additionnel implicite $r$, une information aléatoire.
+
+\subsection{Décapsulation de la clé temporaire \texttt{DECAPS}}
+
+Pour recréer la clé partagée $K$ du côté du canal correspondant à la clé privée, l'opération \texttt{DECAPS} prend en paramètre le message chiffré $ck$ créé par l'opération \texttt{ENCAPS} et la clé privée $sk$.
+Cette opération doit garantir que pour une paire de clés ($pk,sk$) saine, la clé reconstruite $K$ soit la même des deux côtés du canal.
+Pour celà, elle est de nature déterministe, contrairement à \texttt{ENCAPS}.
+
+
+\section{Utilité de la NTT dans le contexte de Kyber}
+
+Comme mentionné précédemment, l'implémentation de Kyber génère et traite des vecteurs de valeurs interprétables comme des polynômes.
+Certaines opérations sur les polynômes utilisées dans l'algorithme, comme la multiplication, sont coûteuses.
+Ces mêmes opérations deviennent beaucoup plus simples ou plus rapides à exécuter si les valeurs sont représentées dans le domaine de la \gls{ntt}.
+La \gls{ntt} est mise à profit à d'autres niveaux également.
+Par exemple, les clés privées sont constituées de trois polynômes dans le domaine de la \gls{ntt}.
+
+
+\section{Opérations mathématiques dans la NTT appliquée}
+
+Cette section résume les opérations mathématiques qui constituent l'application de la \gls{ntt} dans le cadre de Kyber.
+
+\subsection{Papillon}
+
+De manière générale, un \textit{papillon} est une opération qui prend en entrée deux données et en présente également deux en sortie, aux mêmes \textit{positions} ou dans les mêmes \textit{rôles} que les données d'entrée.
+On retrouve typiquement cette logique quand on veut mettre en relation tous les éléments d'un vecteur entre eux, comme c'est effectivement le cas dans la \gls{ntt}.
+
+\tbfigure{0.8}{papillon}{Principe d'une opération papillon}{tiré de https://slideplayer.com, ref. URL2.1}
+
+Cette image illustre bien ce principe d'interaction entre les éléments et la manière dont une suite d'opérations papillon font interagir les éléments d'un vecteur entre eux.
+Chaque élément du vecteur de sortie subit l'influence de tous les éléments du vecteur d'entrée.
+Cela est visible sur l'illustration si on observe chaque élément du vecteur de sortie comme la racine d'un arbre dont les feuilles sont tous les éléments des entrées: on constate bien que chaque élément de $X_{out}$ est connecté à tous les éléments de $x_{in}$.
+
+La nature d'une opération papillon unique dépend de l'application choisie.
+L'opération papillon particulière à laquelle nous nous intéressons dans ce travail est décrite par ces lignes, extraites du code de référence.
+
+\lstset{style=cstyle}
+\begin{lstlisting}[language=c]
+	t = fqmul(zeta, r[j + len]);
+	r[j + len] = r[j] - t;
+	r[j] = r[j] + t;
+\end{lstlisting}
+
+Ici, \texttt{r} est un tableau d'entiers de 16 bits (\texttt{int16\_t}).
+
+\subsection{Expression mathématique}
+
+On peut exprimer cette opération papillon sous forme d'équation de la manière suivante :
+
+\begin{equation}
+	butterfly(a,b,\zeta) = ( \; a + fqmul(b,\zeta) \; , \; a - fqmul(b,\zeta) \; )
+\end{equation}
+
+La fonction $fqmul$ est essentiellement une multiplication modulaire de Montgomery (d'après le mathématicien Peter Lawrence Montgomery) dont une formulation appliquée à notre problème figure ci-dessous.
+
+\begin{equation}
+	fqmul(x,y) = \floor{\frac{(x \times y) - (((((x \times y) \; mod \; 2^{16}) \times q_{inv}) \; mod \; 2^{16}) \times q)}{2^{16}}}
+\end{equation}
+
+Avec les constantes :
+
+\begin{equation}
+	q = 3329
+\end{equation}
+
+et
+
+\begin{equation}
+	q_{inv} = -3327
+\end{equation}
+
+Ces deux constantes sont propres à l'anneau dans lequel on effectue nos opérations, c'est-à-dire $\mathbb{Z}_q [X] / (X^n + 1)$ avec les valeurs constantes de $q = n = 256$\footcite{avanziCRYSTALSKyberAlgorithmSpecifications2021}.
diff --git a/meta/report/chapters/3_architecture.tex b/meta/report/chapters/3_architecture.tex
new file mode 100644
index 0000000000000000000000000000000000000000..34d208ca509bde8033686a55c23e63efadb4c613
--- /dev/null
+++ b/meta/report/chapters/3_architecture.tex
@@ -0,0 +1,237 @@
+% !TeX spellcheck = fr_FR
+
+
+\chapter{Chapitre 3 : Architecture}
+
+
+\section{Architecture globale}
+
+Le schéma ci-dessous montre les différents composants qui constituent notre implémentation de la \gls{ntt} et leurs interactions les plus importantes.
+
+\tbfigure{0.9}{NTT}{Schéma de l'architecture globale de l'implémentation de la NTT}{réalisé par Stefanovic Boris}
+
+Les éntrées \texttt{ADDR}, \texttt{DATA\_I} et \texttt{LOAD} permettent le chargement des données dans la mémoire.
+\texttt{GO} et \texttt{STOP} sont des signaux de contrôle et permettent respectivement de lancer l'opération de la \gls{ntt} et passer en mode d'écriture dans la mémoire.
+Les sorties \texttt{READY} et \texttt{VALID} sont des signaux de statut qui signifient respectivement que le composant est prêt à recevoir des données et que les données dans la mémoire sont le résultat d'une opération \gls{ntt} complétée.
+Il est possible de lire les données de la mémoire à l'aide du bus \texttt{DATA\_O}.
+Le bus d'adresse \texttt{ADDR} est utilisé aussi bien pour déterminer où un mot de données sera écrit en mémoire que quelle partie de la mémoire sera visible sur le bus de lecture de données.
+
+Cette implémentation se présente comme une machine d'état dont la coordination globale est confiée à \texttt{NttFsm}.
+Durant l'opération, un compteur (représenté dans le coin supérieur gauche du schéma) fournit une valeur représentant l'état d'avancement (on peut considérer celà comme une machine d'état subordonnée).
+Les données sont stockées dans des registres du composant au centre du schéma.
+Les opérations à effectuer sur ces données sont prises en charge par $N$ composants \texttt{Butterfly}, visibles à droite de la mémoire, $N$ étant un paramètre générique qui contrôle le degré de parallélisation de l'opération.
+Les deux composants restants, \texttt{IndexDispatcher} et \texttt{AddressTable}, permettent d'acheminer les bonnes données aux composants opérateurs en fonction de l'état d'avancement.
+Autrement dit, ils se chargent de faire en sorte que chaque composant \texttt{Butterfly} soit à tout moment connecté aux bons emplacements de la mémoire.
+
+
+\section{Butterfly}
+
+Revenons maintenant aux opérations de la \gls{ntt} elles-mêmes.
+Le composant \textit{Butterfly} implémente l'opération \textit{Papillon} décrite dans le chapitre précédent.
+Les opérations de la \gls{ntt} sont relativement basiques: trois multiplications, deux soustractions, une addition et quelques décalages.
+En voici une description graphique.
+
+\tbfigure{0.8}{Butterfly}{Schéma de Butterfly}{réalisé par Stefanovic Boris}
+
+Dans l'implémentation logicielle, cette opération est répétée un grand nombre de fois (896 fois, précisément) sur un tableau de 256 valeurs, affectant deux positions du tableau à chaque itération.
+Pour accélérer l'algorithme, nous répétons le placement de ce composant plusieures fois, de façon à paralléliser ces calculs.
+
+\subsection{Fqmul}
+
+L'îllustration suivante décrit l'implémentation du composant qui implémente la fonction $fqmul$.
+On notera que les divisions entières et les modulos de la formule ont toujours pour deuxième opérande une puissance de deux: il s'agit donc de décalages, des opérations peu coûteuses.
+L'essentiel du coût de ce composant est dû aux trois multiplicateurs.
+
+\tbfigure{0.8}{Fqmul}{Schéma de Fqmul}{réalisé par Stefanovic Boris}
+
+
+\section{MemoryBuffer}
+
+Isoler les opérations mathématiques de la \gls{ntt} est relativement facile.
+Une partie de notre implémentation qui a demandé beaucoup d'attention est la mémoire dans laquelle les données actives sont stockées.
+
+Notre méthode d'accélération impose trois contraintes à l'implémentation de la mémoire :
+
+\begin{itemize}
+	\item Chaque papillon doit pouvoir lire, traiter et écrire deux mots à la fois.
+	\item Cette logique de mise à jour doit pouvoir être répétée plusieurs fois en parallèle mais sur des paires de cellules-mémoire différentes.
+	\item Les suites de cellules-mémoire auxquelles on accède ne sont pas contigües.
+\end{itemize}
+
+Celà implique qu'une \gls{ram} traditionnelle se prête mal à ce cas de figure.
+Nous avons donc besoin d'implémenter une sorte de mémoire \textit{random access} à $2*N$ canaux de lecture/écriture, avec $N$, le nombre de papillons utilisés.
+Kyber requiert une application de la \gls{ntt} sur 256 mots à la fois.
+Naturellement, on peut deviner que le nombre ($N$) maximal de papillons sera inférieur ou égal à 128 car chaque papillon a besoin de lire et écrire dans deux cellules-mémoire à la fois, sans collisions avec les accès mémoires des autres papillons.
+De plus, toute valeur de $N$ qui est une puissance de deux inférieure ou égale à 128 est acceptable et possible en tant que nombre de papillons.
+Nous n'avons pas mis au propre de preuve mathématique formelle appuyant cette affirmation mais un code C la démontrant empiriquement a été produit et se trouve dans le dépôt git du projet ainsi qu'en annexe.
+
+Notre implémentation est bien entendu générique par rapport aux nombre de paires de ports.
+Ci dessous elle est illustrée pour une utilisation avec quatre papillons ($N = 4$)\footnote{Une version interactive de ce schéma, utilisable dans le logiciel logisim-evolution, est fournie dans le dépôt git du projet.}.
+
+\tbfigure{1.0}{MemoryBuffer}{Schéma de MemoryBuffer}{réalisé par Stefanovic Boris, à l'aide du logiciel logisim-evolution}
+
+Les différentes parties de la logique sont décrites ci-dessous.
+On peut déjà voir qu'une grande partie de la logique est constituée de démultiplexeurs.
+En réalité, il s'agit bien d'une logique de décodage d'adresses.
+Chaque mot de données en entrée, sur le bus de données, est accompagné d'une addresse, sur le bus d'adresses.
+Pour toute position $k$, le $k$-ième mot du bus de données est destiné au registre dont l'adresse est écrite au $k$-ième mot (de taille différente de la taille du mot de données) du bus d'adresses.
+
+\subsection{Entrées}
+
+Tout d'abord, intéressons nous aux entrées.
+
+\tbfigure{0.3}{mem1in}{MemoryBuffer : mise en évidence des entrées}{réalisé par Stefanovic Boris}
+
+Le signal \texttt{UPDATE} permet une mise à jour de tous les registres en parallèle.
+Le signal \texttt{LOAD} permet l'utilisation de cette mémoire un mot à la fois.
+Chacun de ces deux signaux est accompagné d'un bus d'adresses et d'un bus de données.
+Ces bus sont évidemment beaucoup plus grands du côté de \texttt{UPDATE} que du côté de \texttt{LOAD}.
+La séparation des logiques et des bus de \texttt{LOAD} et de \texttt{UPDATE} peut sembler peu efficace en termes de ressources au premier abord mais elle simplifie beaucoup (encore une fois en termes de ressources) la logique de décodage et d'acheminement des données.
+Il n'y a donc aucun avantage à faire en sorte que les logiques de \texttt{LOAD} et de \texttt{UPDATE} partagent le même bus\footnote{De plus, lors de la synthèse, le logiciel utilisé procèdera à toute une série de simplifications et d'optimisations qui réduiront un peu la quantité de ressources utilisées.}.
+
+\subsection{Write enable}
+
+Voici la logique correspondant au \textit{write enable} qui sera envoyé à un, tous ou une partie des registres (dépendamment du paramètre $N$ et de l'état de \texttt{LOAD} et \texttt{UPDATE}).
+
+\tbfigure{0.3}{mem2we}{MemoryBuffer : mise en évidence des la construction du write enable}{réalisé par Stefanovic Boris}
+
+Il faut garder à l'esprit que dans une utilisation correcte de \texttt{MemoryBuffer}, \texttt{LOAD} et \texttt{UPDATE} ne prendront jamais la valeur de \texttt{'1'} en même temps.
+Par conséquent, le fait que le multiplexeur au centre des deux illustrations suivantes donne la \textit{priorité} à la logique du \texttt{LOAD} n'est pas à interpréter; on aurait aussi bien pu faire que ce multiplexeur soit contrôlé par \texttt{UPDATE} et en intervertir les deux entrées.
+
+\subsection{Décodage des adresses}
+
+Sur l'image ci-dessous, on peut observer la logique du décodage des adresses.
+
+\tbfigure{1.0}{mem3addr}{MemoryBuffer : mise en évidence du décodage d'adresses}{réalisé par Stefanovic Boris}
+
+Pour la résumer, on peut dire qu'elle sert à envoyer le signal de \textit{write enable} sur les bons registres, en fonction des adresses présentes sur les bus d'adresse.
+Tout comme \texttt{LOAD} et \texttt{UPDATE} ne sont pas censés être actifs en même temps, le comportement du composant est \textbf{non-défini} pour le cas où le signal \texttt{UPDATE} serait actif et deux adresses du bus désigneraient le même registre.
+La grande porte \texttt{OU} n'est là que par souci de montrer une logique synthétisable.
+Il est possible que le code \gls{hdl} fourni produise une logique un peu différente.
+Les valeurs \texttt{REG\_IN\_X} sont décrites dans le schéma suivant.
+
+\subsection{Acheminement des données}
+
+Les données, quand à elles, sont acheminées par une logique fort similaire à celle des adresses mais au lieu d'affecter le port \texttt{WE} des registres, elle produit les données qui se présenteront sur le port \texttt{D}.
+
+\tbfigure{1.0}{mem4data}{MemoryBuffer : mise en évidence de l'acheminement des données}{réalisé par Stefanovic Boris}
+
+\subsection{Sorties parallèles}
+
+Voici une description du bus de données de sortie parallèles.
+
+\tbfigure{0.8}{mem5parallel}{MemoryBuffer : mise en évidence du bus de données de sortie à plusieurs mots en parallèle}{réalisé par Stefanovic Boris}
+
+\subsection{Sortie unique}
+
+Et finalement, le bus de données de sortie en accès unique.
+On notera que la logique de celui-ci est très similaire à celle du bus des sorties parallèles.
+
+\tbfigure{0.7}{mem6single}{MemoryBuffer : mise en évidence du bus de sortie à un mot}{réalisé par Stefanovic Boris}
+
+Pour ces deux derniers ports, les registres qu'ils représentent sont déterminés par les bus d'adresses qui servent aussi lors des écritures.
+Une écriture simple se fera en plaçant la bonne adresse sur le bus correspondant, en gardant \texttt{LOAD} et \texttt{UPDATE} à \texttt{'0'}.
+
+
+\section{Machine d'état}
+
+Le déroulement de la \gls{ntt} est contrôlé par une machine d'état.
+
+\tbfigure{0.9}{Fsm}{Machine d'état contrôlant l'implémentation de la NTT}{réalisé par Stefanovic Boris}
+
+On distingue trois états :
+
+\begin{itemize}
+	\item \texttt{IDLE} : prêt à recevoir les données sur lesquelles la \gls{ntt} sera effectuée
+	\item \texttt{CALC} : calcul en cours; il est impossible d'interagir avec le composant si ce n'est pour l'interrompre et invalider ses données
+	\item \texttt{DONE} : fin; le composant a terminé le calcul de la \gls{ntt} des données qui étaient présentes dans la mémoire à la sortie de l'état \texttt{IDLE}
+\end{itemize}
+
+Le lancement du calcul se contrôle à l'aide du signal \texttt{GO}.
+Le retour à l'état \texttt{IDLE} est toujours possible en un coup d'horloge et se fait au moyen du signal \texttt{STOP}.
+
+
+\section{Counter}
+
+Counter est un simple compteur à la différence près que la valeur maximale n'est pas déterminée par la taille du registre interne mais par une valeur arbitraire.
+
+\tbfigure{0.9}{Counter}{Exemple de Counter à sept positions}{réalisé par Stefanovic Boris}
+
+Les signaux \texttt{FULL} et \texttt{OVERFLOW} sont adaptés en conséquence de cette particularité.
+Dans le cadre de notre implémentation, \texttt{FULL} permet de contrôler le passage de la machine d'état de l'état \texttt{CALC} à l'état \texttt{DONE}.
+Utiliser \texttt{FULL} au lieu de \texttt{OVERFLOW} à cette fin nous gagne un coup d'horloge sans coût supplémentaire.
+
+
+\section{AddressTable}
+
+Ce composant permet de connecter la paire de registres du composant MemoryBuffer correspondant au coup d'horloge courant au papillon correspondant.
+Il ne contient plus de table d'adresses\footnote{Le nom du composant a été gardé car sa fonction n'a pas changé.}.
+Celles-ci ont été remplacées par des expressions matérielles de formules mathématiques, réduisant dramatiquement la quantité de ressources nécessaires.
+La seule table restante est celle des \texttt{ZETAS}.
+Le calcul de ses valeurs est cher et a été précalculé.
+Dans l'implémentation de référence, ces valeurs se présentent aussi sous forme d'un tableau de constantes.
+Cette sous-partie de ce composant est donc considéré comme non-simplifiable.
+
+\tbfigure{0.9}{AddressTable}{Schéma de AddressTable}{réalisé par Stefanovic Boris}
+
+
+\section{IndexDispatcher}
+
+IndexDispatcher informe chaque papillon (à travers \texttt{AddressTable}) des cellules-mémoire que ce dernier doit mettre à jour au prochain flanc montant du signal d'horloge.
+
+\tbfigure{0.9}{IndexDispatcher}{Schéma de IndexDispatcher}{réalisé par Stefanovic Boris}
+
+Ce composant est simple à comprendre mais un peu volumineux en raison de ses $N$ multiplicateurs.
+
+
+\section{Memory-map}
+
+Nous avons cherché à implémenter un memory-map qui permettrait l'utilisation du composant \gls{ntt} en tant que périphérique, sur un bus, à travers une interface \gls{axi}, par exemple.
+Nous le présentons à part du coeur de l'architecture car ces informations sont utiles dans des contextes très différents: d'un côté nous avons l'élaboration du matériel, de l'autre nous avons son utilisation depuis un logiciel ou firmware écrit en langage C, par exemple.
+Si au moment de l'écriture de ce document, ce memory-map n'a pas encore été complètement implémenté et testé, nous présentons tout de même les registres que nous prévoyons d'y inclure et leur utilisation.
+
+\subsection{Adresses}
+
+Pour un système dans lequel il y a suffisamment d'adresses, nous envisageons l'utilisation de \textbf{258 adresses}, dont les 256 premières seraient directement connectées au composant interne \texttt{MemoryBuffer}.
+Cette façon de faire a l'avantage de permettre l'utilisation de cette mémoire à partir d'un code C de la même manière que serait utilisé un buffer de 256 \texttt{int16\_t} du côté logiciel.
+On aurait donc \textbf{9 bits d'addresse} réservés à l'usage interne au composant.
+
+\subsection{Registres}
+
+Le tableau suivant présente les différents registres publiés par le wrapper.
+
+Dans l'ordre des colonnes, on a:
+
+\begin{itemize}
+	\item l'adresse du registre, relative à l'offset du périphérique dans le memory-map global du système
+	\item le type d'accès autorisé: R/W (lecture, écriture ou les deux)
+	\item le nom du registre
+	\item sa fonction bit par bit; l'effet de l'accès sur le composant \gls{ntt}
+\end{itemize}
+
+\tbtables{registerlist}{Liste des registres}{|l|c|c|m{18em}|}{
+	\hline
+	Adresse relative & Type d'accès & Nom & Fonction \\
+	\hline
+	\hline
+	\texttt{0x000 - 0x0FF} & R/W & \texttt{DATA} & [15..0] : lecture et écriture dans la mémoire interne \\
+	\hline
+	\texttt{0x100} & R & \texttt{STATUS} & [0]:ready (le composant est en mode lecture) ; [1]:valid (calcul terminé) \\
+	\hline
+	\texttt{0x101} & W & \texttt{CONTROL} & [0]:go (lance le calcul) ; [1]:stop (passe en mode lecture) ; [2]:intack (quittance de l'interruption) \\
+	\hline
+}
+
+\subsection{Interruptions}
+
+Le wrapper sera responsable de lever une interruption à la fin du calcul de la \gls{ntt}, c'est-à-dire lors du passage à l'état \texttt{DONE}.
+Elle serait quittancée par l'écriture d'un 1 dans le bit \texttt{intack} du registre de contrôle.
+
+\subsection{Modèle de memory-map alternatif}
+
+Une autre façon plus compacte d'adresser le périphérique serait de placer un compteur dans le périphérique et de n'avoir qu'une seule adresse de lecture et d'écriture de la mémoire interne.
+Le compteur garderait en mémoire le nombre de valeurs déjà lues.
+À chaque lecture/écriture, la valeur du compteur serait incrémentée de un.
+L'accès à la mémoire interne se ferait donc toujours dans l'ordre des adresses.
+Une signification serait ajoutée à un bit libre du registre de contrôle afin de permettre sa réinitialisation explicite, en plus de sa réinitialisation automatique lors de chaque changement d'état de la machine d'état.
+Cette méthode ne nécessiterait que \textbf{3 bits d'adresse}.
diff --git a/meta/report/chapters/4_resultats.tex b/meta/report/chapters/4_resultats.tex
new file mode 100644
index 0000000000000000000000000000000000000000..8bbdd3a1bb238b393245c36144317e224a72bc39
--- /dev/null
+++ b/meta/report/chapters/4_resultats.tex
@@ -0,0 +1,65 @@
+% !TeX spellcheck = fr_FR
+
+
+\chapter{Chapitre 4 : Résultats, Simulations, Mesures}
+
+
+\section{Note sur le matériel de test et de démonstration}
+
+Le matériel mis à disposition pour ce travail est une carte Kria KV260.
+Celle-ci contient, en plus de la logique de \gls{fpga}, plusieurs processeurs \textit{hardcore}\footnote{Un processeur dit hardcore est physiquement présent sur la carte et non-modifiable, contrairement à un processeur dit softcore qui serait implémenté dans la FPGA.}.
+Il est aussi possible de faire fonctionner un noyau linux et un système d'exploitation sur l'un d'eux.
+Cette carte se prête bien au test de notre \gls{ntt}, de par sa similarité avec notre hypothèse d'utilisation: un co-processeur qui irait de paire avec le \gls{cpu} qui prendrait en charge un système complet.
+
+
+\section{Utilisation des ressources}
+
+Le graphe suivant présente le nombre de \gls{lut} utilisées en fonction du degré de parallélisation $N$.
+
+\tbfigure{0.9}{resources}{LUT utilisées en fonction du degré de parallélisation}{réalisé par Stefanovic Boris}
+
+Les autres ressources (hormis les registres) suivent une progression similaire, à moindre échelle, mais ce seront toujours les \gls{lut} qui constitueront le facteur limitant sur la plupart des \gls{fpga}.
+En effet, à partir de $N = 32$, cette implémentation de la \gls{ntt} utilise plus de \gls{lut} que n'offre la Kria KV260\footnote{Il existe des cartes capables d'accomoder les versions aux degrés de parallélisation supérieurs mais ces versions n'ont pas été synthétisées, par manque de mémoire vive sur l'ordinateur utilisé.}.
+
+Le nombre de registres utilisés varie beaucoup moins, de \textbf{4108} pour la version la \textbf{moins} parallélisée à \textbf{4101} pour la version la \textbf{plus} parallélisée, avec un pas de 1 d'une version à l'autre.
+Il est normal que ce nombre change peu, sachant que la quantité de données à traiter est indépendante du degré de parallélisation.
+Le pas de 1 et la proportionalité inverse entre le degré de parallélisation et la contribution au nombre de registres utilisés sont probablement dues au compteur.
+En effet, si le nombre de composants papillons double, le temps nécessaire pour compléter l'opération de la \gls{ntt} diminue de moitié, réduisant le nombre de bits nécessaire pour stocker la valeur maximale du compteur de un.
+
+
+\section{Décompte des coups d'horloge pour une opération NTT complète}
+
+Voici les étapes de notre implémentation de la \gls{ntt}, associées au nombre de cycles d'horloge nécessaires pour les compléter.
+\texttt{N} est le degré de parallélisation de calcul (le nombre de papillons): une puissance de deux (entière) telle que $N \in [ 1 ; 128 ]$ donc $N_{max} = 128$.
+\texttt{P} est le degré de parallélisation de transfert, c'est-à-dire le nombre de mots écrits ou lus en une fois dans la mémoire\footnote{La parallélisation de transfert n'a pas encore été implémentée au moment de l'écriture de ces lignes mais nous considérons que cette amélioration sera triviale à implémenter.}.
+Sachant que pour le moment, la taille des mots utilisés est de 16 bits, la valeur maximale de \texttt{P} pour une communication par un bus \gls{axi} courant (limité à 32 bits de largeur de données) est $P_{max} = 2$.
+
+\tbtables{clockrepartition}{Répartition des coups d'horloge par opération}{|l|c|}{
+	\hline
+	Operation & Clock Cycles \\
+	\hline
+	Passer en mode \texttt{IDLE} & 1 \\
+	\hline
+	Remplir la mémoire & 256 \\
+	\hline
+	Calculer la NTT & $896 / N$ \\
+	\hline
+	Lire tous les contenus de la mémoire & 256 \\
+	\hline
+	\hline
+	Total & $1 + \frac{512}{P} + \frac{896}{N}$ \\
+	\hline
+}
+
+Concrètement, pour prendre l'exemple d'un périphérique \gls{ntt} avec un degré de parallélisation maximal, sur un bus \gls{axi} v4 standard, l'opération complète prendrait $1 + \frac{512}{2} + \frac{896}{128} = 264$ cycles d'horloge.
+
+
+\section{Fréquence d'exploitation}
+
+\tbfigure{0.9}{delay}{Retard dû aux chemins combinatiores en fonction du degré de parallélisation}{réalisé par Stefanovic Boris}
+
+Ce graphe met en relation les retards dûs aux chemins combinatoires et au routage réunis.
+Ces données ont été extraites du rapport d'implémentation de Vivado.
+Comme ces valeurs nous paraissent un peu hautes, nous considérons la forte possibilité d'erreurs dans notre manipulation du logiciel.
+En effet, nous attendions des valeurs qui ne dépasseraient pas 30 ns.
+Celà-dit, comme notre implémentation privilégie la parallélisation à une très haute fréquence d'horloge, ces valeurs n'atteindront jamais des minima exceptionnels.
diff --git a/meta/report/chapters/conclusion.tex b/meta/report/chapters/conclusion.tex
new file mode 100644
index 0000000000000000000000000000000000000000..48dec26e6b1743ecc8716fc43475836e4da14f67
--- /dev/null
+++ b/meta/report/chapters/conclusion.tex
@@ -0,0 +1,45 @@
+% !TeX spellcheck = fr_FR
+
+\chapter*{Conclusion}
+\addcontentsline{toc}{chapter}{Conclusion}
+
+
+Dans le cadre de ce travail, nous avons créé une architecture matérielle pour la \gls{ntt}.
+Avant de nous lancer dans l'élaboration elle-même, nous avons survolé les travaux de recherche existants dans le domaine des implémentations matérielles de Kyber et de la \gls{ntt}.
+Nous avons aussi exploré quelques bases théoriques sur lesquelles reposent Kyber et plus particulièrement la \gls{ntt}.
+Nous avons délimité le cadre de la \gls{ntt} propre à notre application et identifié de façon abstraite les différentes séquences d'opérations qui constitueraient une implémentation de cette \gls{ntt}.
+Parallèlement à ces recherches, nous avons pris en main et nous nous sommes habitués à SpinalHDL, un langage de description de matériel de haut-niveau et à travers son \gls{api} de simulation, Verilator, un outil permettant une simulation efficace avant la synthèse.
+À cette occasion, nous avons appris les bases du langage Scala et quelques concepts qui lui sont propres.
+Une fois ces préparations faites, nous avons conçu une architecture matérielle basée sur la \gls{ntt} telle qu'elle se présente dans l'implémentation logicielle de référence de Kyber.
+Pour continuer, nous avons identifié une méthode d'accélération dont le point central est un modèle de mémoire sur mesure qui offre une grande liberté au niveau des accès parallèles.
+Une fois l'architecture établie, nous avons écrit la description de chaque composant qui en fait partie, accompagnée à chaque fois d'un code de simulation.
+Après avoir validé tous les composants, nous avons validé l'architecture de la \gls{ntt} dans son ensemble en comparant les résultats qu'elle produisait en simulation à ceux de l'implémentation de référence.
+Finalement, nous avons évalué notre architecture, théoriquement et empiriquement, en nous aidant des rapports de synthèse et d'implémentation de Vivado pour la partie empirique.
+En celà, nous pouvons dire que la majeure partie des objectifs initiaux a été atteinte.
+
+Ce projet à regroupé nombre de techniques et de technologies différentes.
+Ceci est dû à la liberté qui nous a été donnée de choisir l’approche et l’outil adaptés à chaque situation rencontrée.
+Ce fut un exercice utile, formateur et agréable qui complète les connaissances acquises tout au long de notre formation.
+Pour citer les domaines où j'ai le plus appris, il y a : une compréhension de principes de cryptographie, l’apprentissage d’un langage de programmation, la modélisation en logiciel pour comprendre le fonctionnement d’un problème composite, une réflexion sur une interface hardware/software et l’évaluation d’une architecture par rapport à des métriques pertinentes.
+Pour toutes ces compétences approfondies, j'ai tout particulièrement apprécié découvrir le design flow de SpinalHDL.
+Finalement, ce travail m’a donné l’occasion d’exercer mes capacités de communication technique et même si elle peut encore être améliorée, j’ai acquis une appréciation un peu plus critique du travail que représente l’écriture d’une bonne documentation technique, une expérience essentielle pour un travail au sein d’une équipe.
+
+En ce qui concerne les améliorations immédiates qu'il serait possible d'apporter a notre implémentation de la \gls{ntt}, on considère les deux suivantes.
+D'une part, comme vu dans le quatrième chapitre, la période d'horloge augmente si le degré de parallélisation augmente.
+Une première approche pour en limiter les effets sur l'efficacité globale serait de placer notre logique dans un autre domaine d'horloge et communiquer entre les deux à l'aide de streams et de buffers.
+Si il s'avère que cette option n'est pas intéressante, il s'agirait de trouver le degré de parallélisation optimal qui serait un bon compromis entre parallélisation et fréquence d'horloge globale.
+D'autre part, un problème d'optimisation similaire se présente au niveau des multiplicateurs.
+Pour le moment, toutes les multiplications se font de façon entièrement combinatoire.
+Si cette approche est rapide localement, elle utilise beaucoup de ressources et la taille des chemins combinatoires résultants peut limiter la fréquence d'horloge maximale atteignable par cette architecture.
+Il s'agirait donc de faire des multiplicateurs qui fonctionneraient sur plusieurs coups d'horloge, ce qui réduirait la quantité des ressources utilisées et pourrait bien améliorer la fréquence d'horloge maximale.
+
+La continuation de ce projet, comme je l'imagine, se réaliserait en suivant à peu près les étapes suivantes.
+Actuellement, un seul des grands blocs de Kyber est implémenté.
+Il s'agit maintenant d'en implémenter les autres grandes parties.
+Pour chacune de ces parties, tout comme celà a été fait pour la \gls{ntt}, une fois le coeur de la logique implémenté, il faudrait prévoir deux interfaces: une pour son utilisation en tant que périphérique (memory-mapped) et une de plus bas-niveau, pour une interaction directe avec d'autres blocs matériels.
+Avec toutes les parties implémentées ainsi, il sera possible d'interconnecter tous les composants par leurs interfaces bas-niveau (en abandonnant le memory-maps des parties).
+C'est à ce moment-là que pourra commencer un grand travail d'optimisation sur l'ensembre de l'implémentation de Kyber, après laquelle le code résultant serait méconnaissable.
+Le travail se terminerait par la création et la documentation d'un memory-map global, pour toutes les opérations de Kyber accélérées dans l'implémentation résultante et d'une interface \gls{axi} (ou autre, selon les besoins).
+
+Malgré le fait que ce projet ne soit pas encore à l'état d'implémentation matérielle complète et optimisée, je suis heureux de l'avoir choisi et d'y avoir participé.
+J'espère aussi qu'un-e autre étudiant-e le reprendra et continuera son développement car je suis d'avis qu'il s'agit d'un magnifique projet, à l'intérêt aussi bien académique que pratique.
diff --git a/meta/report/chapters/introduction.tex b/meta/report/chapters/introduction.tex
new file mode 100644
index 0000000000000000000000000000000000000000..c68680a561514ae2a77def51677d0e9d420e07b3
--- /dev/null
+++ b/meta/report/chapters/introduction.tex
@@ -0,0 +1,64 @@
+% !TeX spellcheck = fr_FR
+\chapter*{Introduction}
+\addcontentsline{toc}{chapter}{Introduction}
+
+Les systèmes cryptographiques utilisés de nos jours sont à risque.
+Dans un futur proche, un ordinateur quantique pourrait être capable de mener avec succès des attaques sur des systèmes qui sont aujourd'hui considérés comme extrêmement sûrs.
+Même si les ordinateurs quantiques tardaient à se répandre, la recherche de systèmes cryptographiques supérieurs est toujours souhaitable.
+Dans cette optique, en 2016, le \gls{nist} a organisé un councours dans le but d'appeler les talents à élaborer des algorithmes qui seraient viables dès à présent mais aussi robustes face aux attaques qui s'appuieraient sur les moyens matériels du futur.
+Ainsi, le \gls{nist} lance le processus de standardisation de la cryptographie post-quantique, de façon à ce que la transition des systèmes actuels à un système post-quantique puisse se faire dans les temps.
+Six ans plus tard, l'organisme annonce les premiers algorithmes retenus.
+Parmi les finalistes du concours se trouve Kyber, un mécanisme d'encapsulation de clés (\gls{kem}).
+En août 2024, l'organisme publie trois standards de chiffrement dont Kyber fait partie\footcite{boutinNISTReleasesFirst2024}.
+Dans le standard, Kyber porte le nom de \gls{mlkem}.
+Ces deux appellations pourront être utilisées de manière interchangeable dans ce document.
+Les standards sont accompagnés de codes et d'outils facilitant leur mise en place.
+Le \gls{nist} recommande l'adoption immédiate de ces standards.
+
+Depuis des années, des \gls{asic} complémentent les \gls{cpu} afin d'accélérer les opérations cryptographiques.
+Les composants ajoutés dans les \gls{cpu} de Intel, responsables de prendre en charge les instructions de type \gls{aesni}, en sont un exemple\footcite{rottIntelAdvancedEncryption2012}.
+De la même manière, il est facile d'imaginer la création d'un co-processeur qui permettrait d'accélérer les opérations relatives à la cryptographie post-quantique (ou \gls{pqc}).
+Chaque implémentation \gls{asic}, au début de son élaboration, passe par une phase d'expérimentation sur \gls{fpga}.
+Les \gls{fpga} sont des circuits intégrés particuliers dont il est possible de reprogrammer la logique interne, au niveau du registre et de la porte logique.
+Une brève vulgarisation du fonctionnement des \gls{fpga} sera présentée dans le chapitre dédié aux outils.
+
+La spécification de Kyber, ainsi qu'une implémentation logicielle de référence écrite en C et son code source ont été rendues publiques.
+Une implémentation complète de Kyber a été faite en \gls{hls} par Guerrieri, Da Silva Marques, Regazzoni et Upegui\footcite{Guerrieri2022}.
+\gls{hls} est un outil permettant une implémentation matérielle rapide d'un code logiciel en C.
+Le prix du développement rapide qu'il offre est au détriment de la maîtrise précise de ce qu'il se passe au niveau \gls{rtl}.
+Au niveau \gls{rtl}, justement, il est encore beaucoup plus difficile de trouver une implémentation de Kyber fonctionnelle ou même accessible.
+Suite à ces travaux, la prochaine étape qui se présente naturellement est d'écrire une description dans un \gls{hdl} qui permet un contrôle précis du déroulement de l'opération, au coup d'horloge près.
+
+L'objet de ce travail de bachelor\footnote{Ce travail de bachelor n'a pas été effectué dans la continuité d'un travail de semestre mais à partir de zéro, après un changement de sujet.} est d'essayer d'accélérer matériellement certaines parties de Kyber.
+À défaut d'avoir suffisamment de temps pour la réalisation d'une implémentation matérielle complète, nous avons choisi de nous concentrer sur la \gls{ntt}.
+La \gls{ntt} est une transformation mathématique qui s'applique sur les polynômes d'un anneau modulaire.
+Elle permet de présenter les données sous une autre forme qui facilite nombre d'opérations et de calculs nécessaires à Kyber.
+Il s'agit donc d'un élément central de ce qui serait une implémentation efficace.
+De plus, dans l'implémentation \gls{hls} de Kyber, la \gls{ntt} est l'une des parties les plus importantes en termes de ressources utilisées, ce qui porte à croire qu'il s'agit soit d'un élément complexe, soit d'un élément hautement optimisable, ce qui nous conforte dans notre choix de commencer par cette partie-là.
+
+Les contraintes fixées pour ce travail sont les suivantes.
+Premièrement, la description doit se faire dans un \gls{hdl} qui offre un contrôle au niveau de la porte logique et du registre.
+Nous opposerons celà aux langages de type \gls{hls}.
+Deuxièmement, si pour le moment, la \gls{ntt} est la seule partie accélérée, il faut compter avec et sur l'intégration du composant dans une chaîne d'opérations matérielles.
+Il faut donc prévoir deux modes de fonctionnement: l'accès au composant de façon indépendante par un memory-map ainsi que l'intégration du composant dans une chaîne de traitement dont les données sont streamées.
+Troisièmement, l'implémentation doit être suffisamment générique, de façon à permettre de choisir le rapport entre les importances relatives accordées à la latence et à l'économie des ressources.
+Pour faciliter cette approche, nous avons décidé d'utiliser SpinalHDL.
+SpinalHDL est un \gls{hdl} de haut-niveau, offrant des outils de génération puissants mais dont les équivalences avec des \gls{hdl} de plus bas niveau comme le \gls{vhdl} restent évidentes.
+Les avantages et particularités de cet outil seront décrits dans le chapitre dédié aux outils utilisés.
+Ce choix a imposé une étape d'apprentissage de l'outil et de ses dépendances.
+
+Diverses équipes dans le monde se sont déjà intéressées à une description matériellle de Kyber.
+Ce qui distingue ce travail de leurs effors est d'une part, l'accessibilité du code source: celui-ci n'est soumis à aucun contrat de confidentialité.
+D'autre part, parmi les travaux trouvés en ligne, aucun n'utilise SpinalHDL, ce qui en fait une occasion d'en faire un test pratique de l'outil et en augmenter l'expérience cumulée au sein des équipes de la \gls{hepia}.
+Finalement, un intérêt plus académique et personnel s'ajoute aux précédents dans le fait que ce projet permet de suivre l'évolution d'une idée en partant de son expression mathématique jusqu'à la création d'un composant matériel effectuant la même opération.
+
+Nous avons commencé par un survol des bases mathématiques sur lesquelles reposent Kyber et la \gls{ntt}.
+En parallèle, nous avons parcouru les résultats obtenus par des chercheurs qui se sont déjà penchés sur la question traitée, de façon à identifier quelques métriques pour évaluer nos propres avancées.
+Ensuite, nous avons choisi l'angle par lequel nous allions aborder la matérialisation de Kyber: composant par composant, en commençant par la \gls{ntt}.
+S'ensuivit l'implémentation des sous-composants de la \gls{ntt} et la simulation poussée de chacun d'entre eux.
+Pour finir, nous avons spécifié la façon dont le co-processeur créé communiquerait avec le reste d'un système générique à travers un bus ainsi qu'une interface plus rapide pour la communication de type stream.
+
+Dans un premier temps, ce document passera en revue les outils principaux utilisés dans le cadre de ce travail et leur utilité spécifique à ce dernier.
+Dans un deuxième temps, il énoncera brièvement les principes et opérations mathématiques et cryptographiques utilisées par l'implémentation réalisée.
+Ensuite, il entamera la partie la plus riche du travail, qui décrira en détail l'architecture créée.
+Finalement, le dernier chapitre se penchera sur la question de la méthode et des métriques utilisées dans les tests ainsi que dans l'estimation des performances.
diff --git a/meta/report/img/AddressTable.png b/meta/report/img/AddressTable.png
new file mode 100644
index 0000000000000000000000000000000000000000..18f0add2366686f40aa98845e778d13b2259c004
Binary files /dev/null and b/meta/report/img/AddressTable.png differ
diff --git a/meta/report/img/Butterfly.png b/meta/report/img/Butterfly.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2a354998f6f1c3188d015c68ae1074700204a65
Binary files /dev/null and b/meta/report/img/Butterfly.png differ
diff --git a/meta/report/img/Counter.png b/meta/report/img/Counter.png
new file mode 100644
index 0000000000000000000000000000000000000000..35d1a9a24dad0aecd2f66f8543d730647bdd3e44
Binary files /dev/null and b/meta/report/img/Counter.png differ
diff --git a/meta/report/img/Fqmul.png b/meta/report/img/Fqmul.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ad421271405b9ffb963bce453ffdf8fd868d6db
Binary files /dev/null and b/meta/report/img/Fqmul.png differ
diff --git a/meta/report/img/Fsm.png b/meta/report/img/Fsm.png
new file mode 100644
index 0000000000000000000000000000000000000000..197f9745d8aad8ced54b760e084e916169855c2d
Binary files /dev/null and b/meta/report/img/Fsm.png differ
diff --git a/meta/report/img/IndexDispatcher.png b/meta/report/img/IndexDispatcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..e88718425e123f8b8d4be0c92a0efff9aff92ee8
Binary files /dev/null and b/meta/report/img/IndexDispatcher.png differ
diff --git a/meta/report/img/MemoryBuffer.png b/meta/report/img/MemoryBuffer.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a9b780e48187ef643baf34978418d4ccf99046b
Binary files /dev/null and b/meta/report/img/MemoryBuffer.png differ
diff --git a/meta/report/img/NTT.png b/meta/report/img/NTT.png
new file mode 100644
index 0000000000000000000000000000000000000000..68ed939ccdcaf153992b3875bab910d7b706051b
Binary files /dev/null and b/meta/report/img/NTT.png differ
diff --git a/meta/report/img/SpinalDesignFlow.png b/meta/report/img/SpinalDesignFlow.png
new file mode 100644
index 0000000000000000000000000000000000000000..843e1a9b19a6ae8c6870138d75235044b213a1f3
Binary files /dev/null and b/meta/report/img/SpinalDesignFlow.png differ
diff --git a/meta/report/img/delay.png b/meta/report/img/delay.png
new file mode 100644
index 0000000000000000000000000000000000000000..7f720e8086df43e14333718c5191bc1dd0939ff0
Binary files /dev/null and b/meta/report/img/delay.png differ
diff --git a/meta/report/img/fpga.jpg b/meta/report/img/fpga.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e002dd2e6debcdc5e506d7ec9aacc8c2a7ad6428
Binary files /dev/null and b/meta/report/img/fpga.jpg differ
diff --git a/meta/report/img/fpgainternal.jpg b/meta/report/img/fpgainternal.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a6daa66d20cef9e279514a653320eb119fff512f
Binary files /dev/null and b/meta/report/img/fpgainternal.jpg differ
diff --git a/meta/report/img/mem1in.png b/meta/report/img/mem1in.png
new file mode 100644
index 0000000000000000000000000000000000000000..743bac133aae3967b3d22bf15d6d2dc4383e3655
Binary files /dev/null and b/meta/report/img/mem1in.png differ
diff --git a/meta/report/img/mem2we.png b/meta/report/img/mem2we.png
new file mode 100644
index 0000000000000000000000000000000000000000..957e958f1313d07145f5c73e38cb0b2fd4774f62
Binary files /dev/null and b/meta/report/img/mem2we.png differ
diff --git a/meta/report/img/mem3addr.png b/meta/report/img/mem3addr.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2a3c7944d9030a28e03b8a830f690c1de788247
Binary files /dev/null and b/meta/report/img/mem3addr.png differ
diff --git a/meta/report/img/mem4data.png b/meta/report/img/mem4data.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c99afb79b16197b15896433155c2fc255ec8c8b
Binary files /dev/null and b/meta/report/img/mem4data.png differ
diff --git a/meta/report/img/mem5parallel.png b/meta/report/img/mem5parallel.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce6914d83affc4327d93092f442a39badcc5e087
Binary files /dev/null and b/meta/report/img/mem5parallel.png differ
diff --git a/meta/report/img/mem6single.png b/meta/report/img/mem6single.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce0cfc2297232e63367e88cf3212e9ee9d05beb4
Binary files /dev/null and b/meta/report/img/mem6single.png differ
diff --git a/meta/report/img/papillon.jpg b/meta/report/img/papillon.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a4d55389ca05f256c5a74847c63535c6cfe2411e
Binary files /dev/null and b/meta/report/img/papillon.jpg differ
diff --git a/meta/report/img/power.png b/meta/report/img/power.png
new file mode 100644
index 0000000000000000000000000000000000000000..3946752e933bf1da5e4a234008619d7b7bd4b9b6
Binary files /dev/null and b/meta/report/img/power.png differ
diff --git a/meta/report/img/resources.png b/meta/report/img/resources.png
new file mode 100644
index 0000000000000000000000000000000000000000..d93d2415e425dac0c1d75450b068f894b76e41b6
Binary files /dev/null and b/meta/report/img/resources.png differ
diff --git a/meta/report/img/spinalhdl_logo.png b/meta/report/img/spinalhdl_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd47f5afe4fb9366a875f1ed9983a699eb1be1aa
Binary files /dev/null and b/meta/report/img/spinalhdl_logo.png differ
diff --git a/meta/report/img/title.jpg b/meta/report/img/title.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..cc752bade161955a9020e2a8237be1a7cbc71fd0
Binary files /dev/null and b/meta/report/img/title.jpg differ
diff --git a/meta/report/img/verilator_logo.png b/meta/report/img/verilator_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..978e7fe1616b1d5cecc5a2e4e23f7e291681f84f
Binary files /dev/null and b/meta/report/img/verilator_logo.png differ
diff --git a/meta/report/meta/abstract.tex b/meta/report/meta/abstract.tex
new file mode 100644
index 0000000000000000000000000000000000000000..ba07cda744ca0898cf2d8e5fa10a74769cc9dbba
--- /dev/null
+++ b/meta/report/meta/abstract.tex
@@ -0,0 +1,54 @@
+% !TeX spellcheck = fr_FR
+\thispagestyle{noheader}
+\chapter*{Résumé}
+
+\tikz[remember picture,overlay] \node[shift={(4.165cm,-1.955cm)}]
+	at (current page.north west)
+	{\includegraphics[height=1.29cm]{template/images/title/hepia_logo}};
+	\tikz[remember picture,overlay] \node[shift={(-4.238cm,-1.97cm)}]
+	at (current page.north east)
+	{\includegraphics[height=1.29cm]{template/images/title/hes-so_geneve_logo}};
+
+\addcontentsline{toc}{chapter}{Résumé}
+\thispagestyle{noheader}
+
+\begin{spacing}{0.956}
+\vspace{0.5cm}
+
+
+Pour se préparer à l'apparition d'ordinateurs quantiques, le NIST a lancé un concours en 2016 dont le but était de construire un standard de cryptographie post-quantique.
+Un des algorithmes proposés est CRYSTALS-Kyber, qui est un mécanisme d'encapsulation de clés.
+L'objet de ce travail consiste à proposer une architecture permettant d'accélérer matériellement Kyber.
+La solution visée à long terme est la construction d'un co-processeur ASIC auquel l'intégralité ou les parties les plus coûteuses de Kyber seraint déléguées.
+Ce projet s'inscrit dans la continuité d'une implémentation de Kyber en HLS faite précédemment à HEPIA.
+Pour ce travail, nous avons découvert SpinalHDL et adopté son design flow.
+L'implémentation présentée dans ce travail a donc été décrite en HDL pour être testée sur FPGA.
+L'approche adoptée ici est modulaire et incrémentale : chaque grande partie de l'algorithme implémentée doit pouvoir être utilisée indépendamment, permettant le \textit{co-design} hardware/software et le remplacement progressif du code logiciel.
+Certaines données traitées dans le flot de Kyber doivent être présentées dans le domaine de la \textit{Number Theoretic Transform (NTT)}, une transformation mathématique qui s'applique sur des polynômes définis sur des anneaux modulaires.
+La première phase de ce projet consiste à analyser cette transformation.
+La deuxième partie de ce travail décrit l'implémentation de cette opération centrale de l'algorithme.
+L'architecture conçue se sépare en différents blocs qui s'inspirent fortement du code de référence.
+Elle privilégie la parallélisation et, pour ce faire, repose sur un modèle de mémoire particulier qui supporte un grand nombre d'accès simultanés.
+L'implémentation est fonctionnelle et atteint des niveaux de parallélisation très intéressants mais limite un peu trop la fréquence d'horloge et mériterait une optimisation à ce niveau-là.
+
+
+\vfill
+\begin{center}
+	{\includegraphics[]{img/title}}\\*
+\vfill
+
+{
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%% DO NOT MODIFY THE TABLE BELOW %%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\begin{tabular*}{16cm}{p{7.59cm} p{7.58cm}}
+		\small Candidat-e:					&	\small Professeur-e(s) responsable(s):\\*[10pt]
+		\small\textbf{\textsc{\Author}}		&	\small\textbf{\textsc{\Professor}}\\*[10pt]
+		\footnotesize  Filière d’études : ISC	&	\footnotesize  \textbf{En collaboration avec:} ELCA Security\\*[10pt]
+		\footnotesize  {} & \footnotesize  Travail de bachelor soumis à une convention de stage en entreprise: \Convention\\*[20pt]
+		\footnotesize  {} & \footnotesize  Travail soumis à un contrat de confidentialité: \Confidentiel\\*[10pt]
+	\end{tabular*}\\*[1.9cm]
+}
+
+\end{center}
+\end{spacing}
diff --git a/meta/report/meta/acknowledgements.tex b/meta/report/meta/acknowledgements.tex
new file mode 100644
index 0000000000000000000000000000000000000000..00d87e7d773e9a78d96d9a5ee909518b5a6eaa37
--- /dev/null
+++ b/meta/report/meta/acknowledgements.tex
@@ -0,0 +1,12 @@
+% !TeX spellcheck = fr_FR
+\chapter*{Remerciements}
+\addcontentsline{toc}{chapter}{Remerciements}
+
+\textit{
+	Je tiens avant tout à remercier Prof. Upegui de m'avoir proposé ce sujet d'étude en ciblant mes intérêts, ainsi que pour son soutien et ses conseils tout au long de mon travail.
+	Je souhaite aussi exprimer ma gratitude envers M. Gabriel da Silva pour ses conseils d'ordre pratique et son aide en termes d'utilisation des outils, sans qui je n'aurais probablement pas eu l'idée de découvrir SpinalHDL.
+	Je dois aussi beaucoup à Prof. Foukia pour son temps et ses explications concernant certains principes mathématiques qui forment la fondation du sujet étudié.
+	Un grand merci aussi à Marc pour sa bonne humeur, son soutien et pour une soirée passée ensemble à chercher une erreur tenace dans une suite de formules mathématiques.
+	Finalement, je suis infiniment reconnaissant à ma famille et mes amis que je n'ai pas mentionnés plus haut, pour leur patience durant mes absences répétées ces trois dernières années.
+	Leur soutien m'est précieux et même si ils ne sont pas mentionnés par leur nom ils se reconnaîtront et sauront que cette pensée s'adresse à eux.
+}
diff --git a/meta/report/meta/acronyms.tex b/meta/report/meta/acronyms.tex
new file mode 100644
index 0000000000000000000000000000000000000000..4bdf17620a1b12fedda65b87d9e42d4aa9fbd786
--- /dev/null
+++ b/meta/report/meta/acronyms.tex
@@ -0,0 +1,31 @@
+\newacronym{aes}{AES}{Advanced Encryption Standard}
+\newacronym{aesni}{AES-NI}{Advanced Encryption Standard - New Instructions}
+\newacronym{amba}{AMBA}{(Arm) Advanced Microcontroller Bus Architecture}
+\newacronym{api}{API}{Application Programming Interface}
+\newacronym{asic}{ASIC}{Application Specific Integrated Circuit}
+\newacronym{axi}{AXI}{Advanced eXtensible Interface}
+\newacronym{cern}{CERN}{Conseil Européen pour la Recherche Nucléaire}
+\newacronym{clb}{CLB}{Configurable Logic Block}
+\newacronym{cpu}{CPU}{Central Processing Unit}
+\newacronym{crystals}{CRYSTALS}{Cryptographic Suite for Algebraic Lattices}
+\newacronym{fpga}{FPGA}{Field Programmable Gate Array}
+\newacronym{hdl}{HDL}{Hardware Description Language}
+\newacronym{hepia}{HEPIA}{Haute École du Paysage, d'Ingénierie et d'Architecture}
+\newacronym{hes}{HES}{Haute École Spécialisée}
+\newacronym{hesso}{HES-SO}{Haute École Spécialisée de Suisse Occidentale}
+\newacronym{hls}{HLS}{High Level Synthesis}
+\newacronym{ide}{IDE}{Integrated Development Environment}
+\newacronym{ip}{IP}{Intellectual Property}
+\newacronym{kem}{KEM}{Key Encapsulation Mechanism}
+\newacronym{lhc}{LHC}{Large Hadron Collider}
+\newacronym{lut}{LUT}{Look-Up Table}
+\newacronym{lwe}{LWE}{Learning With Errors}
+\newacronym{mlkem}{ML-KEM}{Module-Lattice-based Key-Encapsulation Mechanism}
+\newacronym{nist}{NIST}{National Institute of Standards and Technology}
+\newacronym{ntt}{NTT}{Number Theoretic Transform}
+\newacronym{pqc}{PQC}{Post-Quantum Cryptography}
+\newacronym{ram}{RAM}{Random Access Memory}
+\newacronym{rtl}{RTL}{Register Transfer Level}
+\newacronym{svp}{SVP}{Shortest Vector Problem}
+\newacronym{tcl}{TCL}{Tool Command Language}
+\newacronym{vhdl}{VHDL}{Very High Speed Integrated Circuit Hardware Desctiption Language}
diff --git a/meta/report/meta/annexes.tex b/meta/report/meta/annexes.tex
new file mode 100644
index 0000000000000000000000000000000000000000..08291b4305f96226241f1eedb14dab510acf7eee
--- /dev/null
+++ b/meta/report/meta/annexes.tex
@@ -0,0 +1,214 @@
+% !TeX spellcheck = fr_FR
+
+\chapter*{Annexes}  % moved from below to avoid breaking toc page numbering
+\addcontentsline{toc}{chapter}{Annexes}
+
+%%% COMMENT IF NOT USING DEDICATED TOC FOR ANNEXES
+\stopcontents[default]
+\resumecontents[annexes]
+
+
+\chapter*{Annexe 0 : \linebreak Code source du projet}
+\addcontentsline{toc}{chapter}{Annexe 0 : Code source du projet}
+
+Il est possible de trouver le code source de ce projet à l'adresse : \href{https://gitedu.hesge.ch/boris.stefanov/kyber}{https://gitedu.hesge.ch/boris.stefanov/kyber} .
+Il s'agit d'un dépôt git (GitLab) géré par la \gls{hepia}.
+En cas de non-disponibilité du code, contacter \gls{hepia} directement.
+
+
+\chapter*{Annexe 1 : \linebreak Implémentation logicielle de la NTT dans le code de référence de Kyber}
+\addcontentsline{toc}{chapter}{Annexe 1 : Code de référence de la NTT}
+
+\lstset{style=cstyle}
+\begin{lstlisting}[language=c]
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#define KYBER_N 256
+#define KYBER_Q 3329
+
+#define KYBER_Q 3329
+#define QINV -3327
+
+const int16_t zetas[128] = {
+	-1044, -758, -359, -1517, 1493, 1422, 287, 202,
+	-171, 622, 1577, 182, 962, -1202, -1474, 1468,
+	573, -1325, 264, 383, -829, 1458, -1602, -130,
+	-681, 1017, 732, 608, -1542, 411, -205, -1571,
+	1223, 652, -552, 1015, -1293, 1491, -282, -1544,
+	516, -8, -320, -666, -1618, -1162, 126, 1469,
+	-853, -90, -271, 830, 107, -1421, -247, -951,
+	-398, 961, -1508, -725, 448, -1065, 677, -1275,
+	-1103, 430, 555, 843, -1251, 871, 1550, 105,
+	422, 587, 177, -235, -291, -460, 1574, 1653,
+	-246, 778, 1159, -147, -777, 1483, -602, 1119,
+	-1590, 644, -872, 349, 418, 329, -156, -75,
+	817, 1097, 603, 610, 1322, -1285, -1465, 384,
+	-1215, -136, 1218, -1335, -874, 220, -1187, -1659,
+	-1185, -1530, -1278, 794, -1510, -854, -870, 478,
+	-108, -308, 996, 991, 958, -1460, 1522, 1628
+};
+
+int16_t montgomery_reduce(int32_t a) {
+	int16_t t;
+	t = (int16_t) a * QINV;
+	t = (a - (int32_t) t * KYBER_Q) >> 16;
+	return t;
+}
+
+int16_t fqmul(int16_t a, int16_t b) {
+	return montgomery_reduce((int32_t) a * b);
+}
+
+void ntt(int16_t r[256]) {
+	unsigned int len, start, j, k;
+	int16_t t, zeta;
+	k = 1;
+	for (len = 128; len >= 2; len >>= 1) {
+		for (start = 0; start < 256; start = j + len) {
+			zeta = zetas[k++];
+			for (j = start; j < start + len; j++) {
+				t = fqmul(zeta, r[j + len]);
+				r[j + len] = r[j] - t;
+				r[j] = r[j] + t;
+			}
+		}
+	}
+}
+\end{lstlisting}
+~\footcite{pq-crystalsKyber2023}
+
+
+\chapter*{Annexe 2 : \linebreak Code de validation des valeurs N possibles, de Nmax et des formules de J(i) et L(i)}
+\addcontentsline{toc}{chapter}{Annexe 2 : Code de Validation de N, Nmax, J(i) et L(i)}
+
+\lstset{style=cstyle}
+\begin{lstlisting}[language=c]
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define ARRAY_SIZE   896
+#define NARRAYS        3
+#define ROW_SIZE      32
+#define NINDEXES     256
+
+size_t nttindex(unsigned int idxs[NARRAYS][ARRAY_SIZE]) {  // J, L, K
+	unsigned int len, start, j, k;
+	k = 1;
+	size_t c = 0;
+	for(len = 128; len >= 2; len >>= 1) {
+		for(start = 0; start < 256; start = j + len) {
+			for(j = start; j < start + len; j++) {
+				idxs[0][c] = j;
+				idxs[1][c] = j + len;
+				idxs[2][c] = k;
+				++c;
+			}
+			++k;
+		}
+	}
+	return c;
+}
+
+unsigned int butterfly_count_simple(const unsigned int idxs[NARRAYS][ARRAY_SIZE]) {
+	// 128 = largest power of 2 that divides ARRAY_SIZE ; here, we prove that we can not go higher
+	static const unsigned int CHUNK_SIZE_MAX = 256;
+	unsigned int max = 0;
+	unsigned int seen[2 * NINDEXES];
+	size_t seen_count;
+	for (unsigned int chunk_size = 1; chunk_size <= CHUNK_SIZE_MAX; chunk_size <<= 1) {  // for each possible number of butterflies
+		const unsigned int total_chunks = (ARRAY_SIZE / chunk_size);  // define number of data chunks to process
+		for (unsigned int chunk = 0; chunk < total_chunks; ++chunk) {  // for each chunk (of a number of rows equal to the number of butterflies)
+			seen_count = 0;
+			for (unsigned int row = 0; row < chunk_size; ++row) {  // for each row in chunk
+				const unsigned int read_index = chunk * chunk_size + row;
+				if (read_index >= ARRAY_SIZE) {
+					printf("butterfly_count_simple OUT OF BOUNDS :  chunk_size = %d  |  read_index = %d\n", chunk_size, read_index);
+				} else {
+					for (unsigned int a = 0; a < 2; ++a) {  // for each array of indexes
+						for (unsigned int s = 0; s < seen_count; ++s) {  // for each seen number
+							if (idxs[a][read_index] == seen[s]) {  // if read index is already covered
+								return max;
+							}
+						}
+						seen[seen_count++] = idxs[a][read_index];  // else, if read index is not already covered, put address in cache
+					}
+				}
+			}
+		}
+		max = chunk_size;  // if all criss-cross checks succeeded, validate as new maximum number of butterflies
+	}
+	return max;
+}
+
+unsigned int j_formula(const unsigned int n) {
+	const unsigned int loop = (n >> 7);
+	const unsigned int n_over_len = ((n & 127) >> (7 - loop));
+	return n - ((loop << 7) - (n_over_len << (7 - loop)));
+}
+
+unsigned int l_formula(const unsigned int n) {
+	const unsigned int loop = (n >> 7);
+	const unsigned int len = 1 << (7 - loop);
+	return j_formula(n) + len;
+}
+
+unsigned int k_formula(const unsigned int n) {
+	const unsigned int loop = (n >> 7);
+    const unsigned int n_over_len = ((n & 127) >> (7 - loop));
+    return (1 << loop) + n_over_len;
+}
+
+
+#define YN(B) (B ? "OK" : "FAIL")
+
+void test_formulas(const unsigned int (*f[NARRAYS])(const unsigned int), const unsigned int p[NARRAYS][ARRAY_SIZE]) {
+	bool ok[NARRAYS];
+	for (unsigned int n = 0; n < NARRAYS; ++n) {
+		ok[n] = true;
+		for (unsigned int i = 0; i < ARRAY_SIZE; ++i) {
+			if (f[n](i) != p[n][i]) {
+				printf("FUNCTION = %d  |  ITERATION = %d  |  EXPECTED = %d  |  ACTUAL = %d\n", n, i, p[n][i], f[n](i));
+				ok[n] = false;
+				getchar();
+			}
+		}
+	}
+	printf("\nJ formula :   %s\nL formula :   %s\nK formula :   %s\n\n", YN(ok[0]), YN(ok[1]), YN(ok[2]));
+}
+
+
+int main() {
+	const char* names[NARRAYS] = {"J", "L", "K"};
+	unsigned int idxs[NARRAYS][ARRAY_SIZE];  // J, L, K
+	if (nttindex(idxs) != ARRAY_SIZE) return EXIT_FAILURE;
+	const unsigned int (*formulas[NARRAYS])(const unsigned int) = { j_formula, l_formula, k_formula };
+	test_formulas(formulas, idxs);
+	printf("\nmax butterflies :  %u\n\n", butterfly_count_simple(idxs));
+	return EXIT_SUCCESS;
+}
+\end{lstlisting}
+
+
+\chapter*{Annexe 3 : \linebreak Préparation des outils et de l'environnement}
+\addcontentsline{toc}{chapter}{Annexe 3 : Préparation des outils et de l'Environnement}
+
+\section*{Projet SpinalHDL}
+
+Pour mettre en place un projet SpinalHDL générique, il est conseillé de cloner le dépôt git accessible à l'adresse \href{https://github.com/SpinalHDL/SpinalTemplateSbt}{https://github.com/SpinalHDL/SpinalTemplateSbt}.
+Toutes les instructions nécessaires pour continuer y sont répertoriées.
+Le code de ce projet a été fait sur cette base et son utilisation devrait fonctionner sur les mêmes principes.
+
+\section*{Verilator}
+
+Nous n'avons pas pu faire fonctionner la dernière version de Verilator avec SpinalHDL .
+La version de Verilator utilisée tout au long de ce travail, est la 4.228-1 , la dernière mise à jour mineure de la version majeure V4.
+
+
+%%% COMMENT IF NOT USING DEDICATED TOC FOR ANNEXES
+\stopcontents[annexes]
+\resumecontents[default]
diff --git a/meta/report/meta/dedication.tex b/meta/report/meta/dedication.tex
new file mode 100644
index 0000000000000000000000000000000000000000..384ad3646977be5580ec59a236305fb26bd20b2a
--- /dev/null
+++ b/meta/report/meta/dedication.tex
@@ -0,0 +1,12 @@
+% !TeX spellcheck = fr_FR
+\vspace*{120pt}
+\begin{flushright}
+	\textit{
+		Pour tes enseignements.\linebreak
+		Pour tes conseils.\linebreak
+		Pour ta confiance.\linebreak
+		Pour ta compassion.\linebreak
+		Pour ton écoute.\linebreak
+		A cinq amis dont le soutien constant et la bonne humeur m'ont à maintes reprises aidé à naviguer les turbulences de la vie académique avec humour.
+	}
+\end{flushright}
diff --git a/meta/report/meta/figureslist.tex b/meta/report/meta/figureslist.tex
new file mode 100644
index 0000000000000000000000000000000000000000..4ac4c115236daf26b89cca333e653f40bdbfcb1c
--- /dev/null
+++ b/meta/report/meta/figureslist.tex
@@ -0,0 +1,15 @@
+% !TeX spellcheck = fr_FR
+
+\renewcommand{\listfigurename}{Liste des illustrations}
+\listoffigures
+\addcontentsline{toc}{chapter}{\listfigurename}
+
+\paragraph{Références des URL}
+
+\begin{itemize}
+	\item URL1.1 \href{https://commons.wikimedia.org/wiki/File:Altera_StratixIVGX_FPGA.jpg}{commons.wikimedia.org/wiki/File:Altera\_StratixIVGX\_FPGA.jpg}
+	\item URL1.2 \href{https://iq.opengenus.org/structure-of-field-programmable-gate-array-fpga/}{iq.opengenus.org/structure-of-field-programmable-gate-array-fpga/}
+	\item URL1.3 \href{https://pic3.zhimg.com/80/v2-0057e0862bfff9e899fd137a91e14cca_1440w.webp}{pic3.zhimg.com/80/v2-0057e0862bfff9e899fd137a91e14cca\_1440w.webp}
+	\item URL2.1 \href{https://ieeexplore.ieee.org/document/8406610}{ieeexplore.ieee.org/document/8406610}
+	\item URL2.2 \href{https://slideplayer.com/slide/12828390/78/images/15/4-Point+Butterfly+Operation.jpg}{slideplayer.com/slide/12828390/78/images/15/4-Point+Butterfly+Operation.jpg}
+\end{itemize}
diff --git a/meta/report/meta/references.tex b/meta/report/meta/references.tex
new file mode 100644
index 0000000000000000000000000000000000000000..3d697802ff9dcc7d20bb8080b2fb848eb824c518
--- /dev/null
+++ b/meta/report/meta/references.tex
@@ -0,0 +1,11 @@
+% !TeX spellcheck = fr_FR
+%\chapter*{Références documentaires}
+%\addcontentsline{toc}{chapter}{Références documentaires}
+
+\nocite{*}
+
+%\printbibliography[title={Références documentaires}]
+\printbibliography[
+	heading=bibintoc,
+	title={Références documentaires}
+]
diff --git a/meta/report/meta/tableslist.tex b/meta/report/meta/tableslist.tex
new file mode 100644
index 0000000000000000000000000000000000000000..9262ccebf9e1b6a64ed89f98745137b1482dc710
--- /dev/null
+++ b/meta/report/meta/tableslist.tex
@@ -0,0 +1,17 @@
+% !TeX spellcheck = fr_FR
+\renewcommand{\listtablename}{Liste des tableaux}
+\listoftables
+\addcontentsline{toc}{chapter}{\listtablename} % Adding toc entry
+
+\vspace*{14.4pt}
+
+%\textit{N.B. Si vous avez peu de tableaux, vous pouvez les intégrer à la table des illustrations.}
+
+\vspace*{14.4pt}
+
+\paragraph{Références des URL}
+
+%\begin{itemize}
+%\item URL02 \href{ce-site.ch/bli/bla/blo/blou}{ce-site.ch/bli/bla/blo/blou}
+%\item URL05 \href{ce-site.ch/publications/documents/rapports/rapportsdestage/monrapportdestage.pdf}{ce-site.ch/publications/documents/rapports/rapportsdestage/monrapportdestage.pdf}
+%\end{itemize}
diff --git a/meta/report/meta/titleref.tex b/meta/report/meta/titleref.tex
new file mode 100644
index 0000000000000000000000000000000000000000..f6b50a4476c572a09a2216e21a0431c17013be30
--- /dev/null
+++ b/meta/report/meta/titleref.tex
@@ -0,0 +1,6 @@
+% !TeX spellcheck = fr_FR
+\thispagestyle{empty}
+\vspace*{500pt} % DO NOT MODIFY THIS VALUE
+Légende et source de l'illustration de couverture :\medskip
+
+Abstrait, <<Security>>, tiré de <<NXP Helps Standardize Next-gen Security with Post-quantum Cryptography - EE Times Asia>>, \href{https://www.eetasia.com/nxp-helps-standardize-next-gen-security-with-post-quantum-cryptography/}{https://www.eetasia.com/nxp-helps-standardize-next-gen-security-with-post-quantum-cryptography/}
diff --git a/meta/report/refs/refs.bib b/meta/report/refs/refs.bib
new file mode 100644
index 0000000000000000000000000000000000000000..9d419767d2a1f84b3bb0573096d061898e3e7e04
--- /dev/null
+++ b/meta/report/refs/refs.bib
@@ -0,0 +1,374 @@
+@article{bosCRYSTALSKyberCCAsecure2017,
+  title = {{{CRYSTALS}} – {{Kyber}}: A {{CCA-secure}} Module-Lattice-Based {{KEM}}},
+  author = {Bos, Joppe and Ducas, Léo and Kiltz, Eike and Lepoint, Tancrède and Lyubashevsky, Vadim and Schanck, John M. and Schwabe, Peter and Seiler, Gregor and Stehlé, Damien},
+  date = {2017},
+  url = {https://ieeexplore.ieee.org/abstract/document/8406610},
+  urldate = {2024-05-22},
+  abstract = {Rapid advances in quantum computing, together with the announcement by the National Institute of Standards and Technology (NIST) to define new standards for digital-signature, encryption, and key-establishment protocols, have created significant interest in post-quantum cryptographic schemes. This paper introduces Kyber (part of CRYSTALS – Cryptographic Suite for Algebraic Lattices – a package submitted to NIST post-quantum standardization effort in November 2017), a portfolio of post-quantum cryptographic primitives built around a key-encapsulation mechanism (KEM), based on hardness assumptions over module lattices. Our KEM is most naturally seen as a successor to the NEWHOPE KEM (Usenix 2016). In particular, the key and ciphertext sizes of our new construction are about half the size, the KEM offers CCA instead of only passive security, the security is based on a more general (and flexible) lattice problem, and our optimized implementation results in essentially the same running time as the aforementioned scheme. We first introduce a CPA-secure public-key encryption scheme, apply a variant of the Fujisaki–Okamoto transform to create a CCA-secure KEM, and eventually construct, in a black-box manner, CCA-secure encryption, key exchange, and authenticated-key-exchange schemes. The security of our primitives is based on the hardness of Module-LWE in the classical and quantum random oracle models, and our concrete parameters conservatively target more than 128 bits of post-quantum security.},
+  langid = {english},
+  annotation = {https://eprint.iacr.org/2017/634.pdf}
+}
+
+@article{heLightweightHardwareImplementation2024,
+  title = {A Lightweight Hardware Implementation of {{CRYSTALS-Kyber}}},
+  author = {He, Shiyang and Li, Hui and Li, Fenghua and Ma, Ruhui},
+  date = {2024},
+  journaltitle = {Journal of Information and Intelligence},
+  volume = {2},
+  number = {2},
+  pages = {167--176},
+  doi = {10.1016/j.jiixd.2024.02.004},
+  url = {https://www.sciencedirect.com/science/article/pii/S294971592400009X},
+  urldate = {2024-05-22},
+  abstract = {The security of cryptographic algorithms based on integer factorization and discrete logarithm will be threatened by quantum computers in future. Since December 2016, the National Institute of Standards and Technology (NIST) has begun to solicit post-quantum cryptographic (PQC) algorithms worldwide. CRYSTALS-Kyber was selected as the standard of PQC algorithm after 3 rounds of evaluation. Meanwhile considering the large resource consumption of current implementation, this paper presents a lightweight architecture for ASICs and its implementation on FPGAs for prototyping. In this implementation, a novel compact modular multiplication unit (MMU) and compression/decompression module is proposed to save hardware resources. We put forward a specially optimized schoolbook polynomial multiplication (SPM) instead of number theoretic transform (NTT) core for polynomial multiplication, which can reduce about 74\% SLICE cost. We also use signed number representation to save memory resources. In addition, we optimize the hardware implementation of the Hash module, which cuts off about 48\% of FF consumption by register reuse technology. Our design can be implemented on Kintex-7 (XC7K325T-2FFG900I) FPGA for prototyping, which occupations of 4777/4993 LUTs, 2661/2765 FFs, 1395/1452 SLICEs, 2.5/2.5 BRAMs, and 0/0 DSP respective of client/server side. The maximum clock frequency can reach at 244 \hspace{0pt}MHz. As far as we know, our design consumes the least resources compared with other existing designs, which is very friendly to resource-constrained devices.},
+  langid = {english}
+}
+
+@thesis{ricciCRYSTALSKyberVHDLImplementation,
+  title = {Towards {{CRYSTALS-Kyber VHDL Implementation}}},
+  author = {Ricci, Sara and Jedlicka, Petr and Cibik, Peter and Dzurenda, Petr and Malina, Lukas and Hajny, Jan},
+  institution = {Brno University of Technology},
+  location = {Brno, Czech Republic},
+  url = {https://www.semanticscholar.org/paper/Towards-CRYSTALS-Kyber-VHDL-Implementation-Ricci-Jedlicka/ab8c70f903d37806b7dd4d880f3c3416dda4fb01},
+  urldate = {2024-05-22},
+  abstract = {Kyber is one of the three finalists of the National Institute of Standards and Technology (NIST) post-quantum cryptography competition. This article presents an optimized Very High Speed Integrated Circuit Hardware Description Language (VHDL)-based implementation of the main components of the Kyber scheme, namely Number-Theoretic Transform (NTT) and Keccak. We focus specifically on NTT, Keccak and their derivatives since they largely determine Kyber’s performance due to their wide involvement in each step of the scheme. Our high-speed implementation also takes into account the trade-off between the degree of parallelization and the resources utilization. The NTT component is more than 27\% faster than the state-of-the-art implementations. Furthermore, the optimization helps the algorithm to achieve 1 572 839 NTT operations per second.},
+  langid = {english}
+}
+
+@thesis{jedlickaVHDLbasedImplementationCRYSTALSKyber2022,
+  type = {peer-reviewed},
+  title = {{{VHDL-based}} Implementation of {{CRYSTALS-Kyber}} Components on {{FPGA}}},
+  author = {Jedlicka, Petr and Hajny, Jan},
+  date = {2022},
+  institution = {Brno University of Technology},
+  location = {Brno, Czech Republic},
+  url = {https://www.semanticscholar.org/paper/VHDL-based-implementation-of-CRYSTALS-Kyber-on-FPGA-Jedlicka-Hajny/bcfed5eb81cff697363c39b43ac88e810230d433},
+  urldate = {2024-05-22},
+  abstract = {CRYSTALS-Kyber is one of the finalists of the National Institute of Standards and Technology (NIST) post-quantum cryptography competition. In this paper, we deal with effective hardware-accelerated implementations of components intended for the use in the FPGA (Field Programmable Gate Array) implementation of the above-mentioned lattice-based cryptography scheme. The discussed components are NTT (Number Theoretic Transform), inverse NTT (NTT−1), CBD (Centered Binomial Distribution) and the Parse Algorithm (shortly Parse). The improved implementation of NTT (NTT−1) requires 1189 (1568) Look-Up Tables (LUTs), 1469 (2161) Flip-Flops (FFs), 28 (50) Digital Signal Processing blocks (DSPs) and 1.5 (1.5) Block Memories (BRAMs). The latency of the design is 322 (334) clock cycles at the frequency 637 MHz which makes the presented NTT (NTT−1) implementations to be currently the fastest ones. The implementations of the sampling functions (CBD and Parse) requires less than 100 LUTs and FFs with maximum latency 5 clock cycles at the frequencies over 700 Mhz. All implementations has been synthesized for the Xilinx Virtex UltraScale+ architecture.},
+  langid = {english},
+  pagetotal = {5}
+}
+
+@inproceedings{chenEfficientKyberFPGAs2020,
+  title = {Towards {{Efficient Kyber}} on {{FPGAs}}: {{A Processor}} for {{Vector}} of {{Polynomials}}},
+  booktitle = {2020 25th {{Asia}} and {{South Pacific Design Automation Conference}} ({{ASP-DAC}})},
+  author = {Chen, Zhaohui and Ma, Yuan and Chen, Tianyu and Lin, Jingqiang and Jing, Jiwu},
+  date = {2020},
+  pages = {247--252},
+  doi = {10.1109/ASP-DAC47756.2020.9045459},
+  url = {https://ieeexplore.ieee.org/document/9045459},
+  keywords = {Clocks,Field programmable gate arrays,Hardware,Information security,NIST,Optimization}
+}
+
+@article{guoEfficientImplementationKYBER2022,
+  title = {An {{Efficient Implementation}} of {{KYBER}}},
+  author = {Guo, Wenbo and Li, Shuguo and Kong, Liang},
+  date = {2022},
+  journaltitle = {IEEE Transactions on Circuits and Systems II: Express Briefs},
+  volume = {69},
+  number = {3},
+  pages = {1562--1566},
+  doi = {10.1109/TCSII.2021.3103184},
+  url = {https://ieeexplore.ieee.org/document/9509281},
+  urldate = {2024-05-22},
+  abstract = {Quantum algorithms pose a huge threat to the current cryptosystems. In this article, we present a hardware implementation of CRYSTALS-KYBER which is one of the post-quantum cryptosystems based on the Module-LWE problem. Using the proposed modular reduction algorithm, modified modular adder and the reconfigurable data path, the design shares the computing resource for different polynomial related operations, and achieves higher degree of parallelism. Our design is implemented on a Xilinx Artix-7 FPGA. Compared with the leading hardware implementations, our design is more compact, the execution time is shorter, and it significantly consumes fewer registers.},
+  keywords = {Adders,Clocks,Computer architecture,CRYSTALS-KYBER,Hardware,hardware implementation,Mathematical model,modular reduction,NTT,Post-quantum cryptography,Pulse width modulation,Random access memory}
+}
+
+@software{crystalsKyber,
+  title = {Kyber},
+  author = {{CRYSTALS}},
+  url = {https://pq-crystals.org/kyber/software.shtml},
+  urldate = {2024-05-22},
+  organization = {CRYSTALS}
+}
+
+@software{pq-crystalsKyber2023,
+  title = {Kyber},
+  author = {{pq-crystals}},
+  date = {2023},
+  url = {https://github.com/pq-crystals/kyber},
+  urldate = {2024-05-22},
+  abstract = {This repository contains the official reference implementation of the Kyber key encapsulation mechanism, and an optimized implementation for x86 CPUs supporting the AVX2 instruction set. Kyber has been selected for standardization in round 3 of the NIST PQC standardization project.},
+  organization = {CRYSTALS},
+  version = {main}
+}
+
+@inproceedings{chiLatticeBasedCryptography2015,
+  title = {Lattice {{Based Cryptography}} for {{Beginners}}},
+  author = {Chi, Dong Pyo and Choi, Jeong Woon and Kim, Jeong San and Kim, Taewan},
+  date = {2015},
+  url = {https://eprint.iacr.org/2015/938.pdf},
+  urldate = {2024-05-27},
+  abstract = {The purpose of this lecture note is to introduce lattice based cryptography, which is thought to be a cryptosystem of post-quantum age. We have tried to give as many details possible specially for novice on the subject. Something may be trivial to an expert but not to a novice. Many fundamental problems about lattice are thought to be hard even against quantum computer, compared to factorization problem which can be solved easily with quantum computer, via the celebrated Shor factorization quantum algorithm. The first part of our presentation is based on slides of Christ Peikert 2013 Bonn lecture (crypt@b-it2013). We, more or less, give somewhat detailed explanation of Professor Peikert’s lecture slides. We unfortunately could not attend his Bonn class. We are afraid that there are many mistakes in this note; if any, they are due to our misunderstanding of the material. Part II of our lecture note is on ring LWE, based on the paper “A tool-kit for Ring-LWE Cryptography” by Lyubashevsky, Peikert and Regev. Part III is about multilinear maps together with cryptanalysis of GGH map due to Hu and Jia. Our presentation follows professor Steinfeld’s lecture slides on GGHLite, and the paper by Yupu Hu and Huiwen Jia. When you read this lecture note, the corresponding original paper should be accompanied. We thank professor Jung Hee Cheon for introducing the subject and asking Dong Pyo Chi to give a lecture on the subject at the department of mathematics in Seoul National University. We also thank Hyeongkwan Kim for many helps, especially many corrections and improvements of the manuscript during the 2015 Summer session at UNIST. We also thank the students who took the classes at SNU and UNIST. The lecture was given by a novice for novice, so many mistakes are unavoidable. If the reader lets us know any errors, we will very much appreciate it.},
+  langid = {english}
+}
+
+@report{avanziCRYSTALSKyberAlgorithmSpecifications2021,
+  title = {{{CRYSTALS-Kyber}} - {{Algorithm Specifications And Supporting Documentation}} (Version 3.02)},
+  author = {Avanzi, Roberto and Bos, Joppe and Ducas, Léo and Kiltz, Eike and Lepoint, Tancrède and Lyubashevsky, Vadim and Schanck, John M. and Schwabe, Peter and Seiler, Gregor and Stehlé, Damien},
+  date = {2021-08-04},
+  number = {3.02},
+  institution = {CRYSTALS},
+  url = {https://www.pq-crystals.org/kyber/data/kyber-specification-round3-20210804.pdf},
+  urldate = {2024-05-29},
+  langid = {english}
+}
+
+@inproceedings{bisheh-niasarHighSpeedNTTbasedPolynomial2021,
+  title = {High-{{Speed NTT-based Polynomial Multiplication Accelerator}} for {{Post-Quantum Cryptography}}},
+  booktitle = {2021 {{IEEE}} 28th {{Symposium}} on {{Computer Arithmetic}} ({{ARITH}})},
+  author = {Bisheh-Niasar, Mojtaba and Azarderakhsh, Reza and Mozaffari-Kermani, Mehran},
+  date = {2021},
+  pages = {94--101},
+  doi = {10.1109/ARITH51176.2021.00028},
+  keywords = {Cryptography,FPGA,hardware architecture,Kyber,lattice-based cryptography,Memory management,NIST,NTT,post-quantum cryptography,Public key cryptography,Standardization,Table lookup,Transforms}
+}
+
+@misc{satriawanCompleteBeginnerGuide2024,
+  title = {A {{Complete Beginner Guide}} to the {{Number Theoretic Transform}} ({{NTT}})},
+  author = {Satriawan, Ardianto and Mareta, Rella and Lee, Hanho},
+  date = {2024},
+  doi = {10.1109/ACCESS.2023.3294446},
+  url = {https://eprint.iacr.org/2024/585},
+  urldate = {2024-08-13},
+  annotation = {Published: Cryptology ePrint Archive, Paper 2024/585}
+}
+
+@article{jedlickaVHDLbasedImplementationNTT2021,
+  title = {{{VHDL-based Implementation Of NTT On FPGA}}},
+  author = {Jedlicka, Petr},
+  date = {2021},
+  journaltitle = {Proceedings II of the 27st Conference STUDENT EEICT 2021},
+  url = {https://api.semanticscholar.org/CorpusID:254486883}
+}
+
+@article{satriawanConceptualReviewNumber2023,
+  title = {Conceptual {{Review}} on {{Number Theoretic Transform}} and {{Comprehensive Review}} on {{Its Implementations}}},
+  author = {Satriawan, Ardianto and Syafalni, Infall and Mareta, Rella and Anshori, Isa and Shalannanda, Wervyan and Barra, Aleams},
+  date = {2023},
+  journaltitle = {IEEE Access},
+  volume = {11},
+  pages = {70288--70316},
+  doi = {10.1109/ACCESS.2023.3294446},
+  keywords = {Complexity theory,Convolution,Cryptography,Discrete Fourier transforms,homomorphic encryption,Homomorphic encryption,Number theoretic transform,post quantum cryptography,Quantum computing,Toy manufacturing industry}
+}
+
+@article{mertExtensiveStudyFlexible2020,
+  title = {An {{Extensive Study}} of {{Flexible Design Methods}} for the {{Number Theoretic Transform}}},
+  author = {Mert, A. C. and Karabulut, E. and Ozturk, E. and Savas, E. and Aysu, A.},
+  date = {2020},
+  journaltitle = {IEEE Transactions on Computers},
+  pages = {1--1},
+  doi = {10.1109/TC.2020.3017930},
+  url = {https://github.com/acmert/parametric-ntt}
+}
+
+@software{burchLogisimevolution2022,
+  title = {Logisim-Evolution},
+  author = {Burch, Carl and Hutchens, David H. and Walsh, Kevin and Berman, Moshe and Cruz Franqueira, Theldo and Kluter, Theo and Orlowski, Marcin and Niget, Tom and Yuchen, Liu and {Haute École spécialisée Bernoise} and {Haute École du paysage, d'ingénierie et d'architecture de Genève} and {Haute École d'Ingénierie et de Gestion du Canton de Vaud} and Hanyuan, Zhao and others},
+  date = {2022-10-02},
+  url = {https://github.com/logisim-evolution/logisim-evolution},
+  urldate = {2024-08-12},
+  abstract = {Logisim-evolution is educational software for designing and simulating digital logic circuits. Logisim-evolution is free, open-source, and cross-platform. Project highlights: - easy to use circuit designer, - logic circuit simulations, - chronogram (to see the evolution of signals in your circuit), - electronic board integration (schematics can be simulated on real hardware), - VHDL components (components behavior can be specified in VHDL!), - TCL/TK console (interfaces between the circuit and the user), - huge library of components (LEDs, TTLs, switches, SoCs), - supports multiple languages, - and more!},
+  version = {v3.8.0}
+}
+
+@misc{jatiConfigurableCrystalsKyberHardware2021,
+  title = {A {{Configurable Crystals-Kyber Hardware Implementation}} with {{Side-Channel Protection}}},
+  author = {Jati, Arpan and Gupta, Naina and Chattopadhyay, Anupam and Sanadhya, Somitra Kumar},
+  date = {2021},
+  url = {https://eprint.iacr.org/2021/1189},
+  annotation = {Published: Cryptology ePrint Archive, Paper 2021/1189}
+}
+
+@online{nationalinstituteofstandardsandtechnologyNISTAnnouncesFirst2022,
+  type = {Governmental},
+  title = {{{NIST Announces First Four Quantum-Resistant Cryptographic Algorithms}}},
+  shorttitle = {{{NIST Announces First Four Quantum-Resistant Cryptographic Algorithms}}},
+  author = {{National Institute of Standards and Technology}},
+  date = {2022-07-07},
+  url = {https://www.nist.gov/news-events/news/2022/07/nist-announces-first-four-quantum-resistant-cryptographic-algorithms},
+  urldate = {2024-08-12},
+  abstract = {Federal agency reveals the first group of winners from its six-year competition.},
+  langid = {english},
+  organization = {NIST News}
+}
+
+@standard{armlimitedAMBAAXIProtocol2023,
+  type = {Specification},
+  title = {{{AMBA AXI Protocol Specification}}},
+  shorttitle = {{{AXI Specification}}},
+  author = {{ARM Limited}},
+  date = {2023-09-30},
+  number = {ARM IHI 0022},
+  publisher = {ARM Limited},
+  location = {Cambridge, England},
+  url = {https://developer.arm.com/documentation/ihi0022/k/?lang=en},
+  urldate = {2024-08-12},
+  abstract = {The AXI protocol supports high-performance, high-frequency system designs for communication between Manager and Subordinate components. The AXI protocol features are: • Suitable for high-bandwidth and low-latency designs. • High-frequency operation is provided without using complex bridges. • The protocol meets the interface requirements of a wide range of components. • Suitable for memory controllers with high initial access latency. • Flexibility in the implementation of interconnect architectures is provided. • Backward-compatible with AHB and APB interfaces. The key features of the AXI protocol are: • Separate address/control and data phases. • Support for unaligned data transfers using byte strobes. • Uses burst-based transactions with only the start address issued. • Separate write and read data channels that can provide low-cost Direct Memory Access (DMA). • Support for issuing multiple outstanding addresses. • Support for out-of-order transaction completion. • Permits easy addition of register stages to provide timing closure.},
+  langid = {english},
+  pagetotal = {285},
+  version = {K}
+}
+
+@misc{armlimitedIntroductionAMBAAXI42020,
+  title = {Introduction to {{AMBA AXI4}}},
+  shorttitle = {Introduction to {{AMBA AXI4}}},
+  author = {{ARM Limited}},
+  date = {2020},
+  url = {https://developer.arm.com/-/media/Arm%20Developer%20Community/PDF/Learn%20the%20Architecture/102202_0100_01_Introduction_to_AMBA_AXI.pdf?revision=369ad681-f926-47b0-81be-42813d39e132},
+  urldate = {2024-08-12},
+  abstract = {This guide introduces the main features of Advanced Microcontroller Bus Architecture (AMBA) AXI4, highlighting the differences from the previous version AXI3. The guide explains the key concepts and details that help you implement the AXI4 protocol. In this guide, we describe: • What AMBA is. • Why AMBA is so popular in modern SoC design. • The concepts of transfers and transactions, which underpin how AMBA operates. • The different channel signals and the functionality that they provide. • Exclusive access transfers, which allow multiple masters to access the same slave at the same time. • The rules and conditions that the AMBA protocol dictates. • The key attributes and support for common elements like mixed endian structures.},
+  langid = {english},
+  organization = {ARM Limited}
+}
+
+@misc{armlimitedLearnArchitectureIntroduction2022,
+  title = {Learn the Architecture - {{An}} Introduction to {{AMBA AXI}}},
+  author = {{ARM Limited}},
+  date = {2022},
+  url = {https://documentation-service.arm.com/static/6560cd802c8b3557fee70a89},
+  urldate = {2024-08-12},
+  abstract = {This guide introduces the main features of Advanced Microcontroller Bus Architecture (AMBA) AXI. The guide explains the key concepts and details that help you implement the AXI protocol. In this guide, we describe: • What AMBA is. • Why AMBA is so popular in modern SoC design. • The concepts of transfers and transactions, which underpin how AMBA operates. • The different channel signals and the functionality that they provide. • Exclusive access transfers, which allow multiple managers to access the same subordinate at the same time. • The rules and conditions that the AMBA protocol dictates. • The key attributes and support for common elements like mixed endian structures. This document focuses on the key concepts of AXI, as defined in AXI4, and highlighting differences to AXI3 where applicable. AXI5 extended AXI4 and introduced a number of performance and Arm architecture features. The key concepts described here still apply, but the additional functionality of AXI5 is not covered here.},
+  langid = {english},
+  organization = {ARM Limited}
+}
+
+@misc{xilinxAXIReferenceGuide2012,
+  title = {{{AXI Reference Guide}}},
+  shorttitle = {{{AXI Reference Guide}}},
+  author = {{Xilinx}},
+  date = {2012-11-15},
+  url = {https://docs.amd.com/v/u/en-US/ug761_axi_reference_guide},
+  urldate = {2024-08-12},
+  abstract = {Xilinx ® adopted the Advanced eXtensible Interface (AXI) protocol for Intellectual Property (IP) cores beginning with the Spartan ® -6 and Virtex ® -6 devices. Xilinx continues to use of the AXI protocol for IP targeting the 7 series, and the Zynq™-7000 All Programmable SoC devices. This document is intended to: • Introduce key concepts of the AXI protocol • Give an overview of what Xilinx tools you can use to create AXI-based IP • Explain what features of AXI Xilinx has adopted • Provide guidance on how to migrate your existing design to AXI},
+  langid = {english},
+  organization = {Xilinx}
+}
+
+@software{milanovicOSSCADSuite2024,
+  title = {{{OSS CAD Suite}}},
+  author = {Milanovic, Miodrag and others},
+  date = {2024-08-12},
+  url = {https://github.com/YosysHQ/oss-cad-suite-build},
+  urldate = {2024-08-12},
+  abstract = {OSS CAD Suite is a binary software distribution for a number of open source software used in digital logic design. You will find tools for RTL synthesis, formal hardware verification, place \& route, FPGA programming, and testing with support for HDLs like Verilog, Migen, and Amaranth.},
+  version = {2024-08-12}
+}
+
+@software{dasilvamarquesCrystals2024,
+  title = {Crystals},
+  shorttitle = {Crystals},
+  author = {Da Silva Marques, Gabriel},
+  date = {2024-05-22},
+  location = {Genève, Suisse},
+  url = {https://gitedu.hesge.ch/gabriel.dasilvam/crystals},
+  urldate = {2024-08-12},
+  abstract = {Vitis HLS implementation of Post Quantum algorithms Crystals-Kyber and Crystals-Dilithium},
+  organization = {HEPIA},
+  version = {1354c695904f99f3eb97e7a69905b0537bd891f8}
+}
+
+@software{gantelHERVAHardwareFirmware2019,
+  title = {{{HERVA Hardware Firmware}}},
+  shorttitle = {{{HERVA Hardware Firmware}}},
+  author = {Gantel, Laurent},
+  date = {2019-10-20},
+  location = {Genève, Suisse},
+  url = {https://gitedu.hesge.ch/research_projects/herva/herva-hw},
+  urldate = {2024-08-12},
+  abstract = {Contains work about the FPGA firmware architecture designed in the HERVA project. The firmware includes both the software running on the processing system (embedded CPU) and the hardware design (FPGA logic).},
+  organization = {HEPIA},
+  version = {c7ec6834afb6cbd00e3e61f1852dd8a1dd3a3955}
+}
+
+@online{rottIntelAdvancedEncryption2012,
+  type = {documentation},
+  title = {{{Intel}}® {{Advanced Encryption Standard Instructions}} ({{AES-NI}})},
+  shorttitle = {Intel {{Advanced Encryption Standard Instructions}}},
+  author = {Rott, Jeffrey Keith},
+  date = {2012-02-02},
+  url = {https://www.intel.com/content/www/us/en/developer/articles/technical/advanced-encryption-standard-instructions-aes-ni.html},
+  urldate = {2024-08-13},
+  abstract = {AES (Advanced Encryption Standard) is an encryption standard adopted by the U.S. government starting in 2001. It is widely used across the software ecosystem to protect network traffic, personal data, and corporate IT infrastructure. AES is a symmetric block cipher that encrypts/decrypts data through several rounds. The new 2010 Intel® Core™ processor family (code name Westmere) includes a set of new instructions, Intel® Advanced Encryption Standard (AES) New Instructions (AES-NI). The instructions were designed to implement some of the complex and performance intensive steps of the AES algorithm using hardware and thus accelerating the execution of the AES algorithms. AES-NI can be used to accelerate the performance of an implementation of AES by 3 to 10x over a completely software implementation. The AES algorithm works by encrypting a fixed block size of 128 bits of plain text in several rounds to produce the final encrypted cipher text. The number of rounds (10, 12, or 14) used depends on the key length (128b, 192b, or 256b). Each round performs a sequence of steps on the input state, which is then fed into the following round. Each round is encrypted using a subkey that is generated using a key schedule. For more details on AES please refer to [1]. The new AES-NI instruction set is comprised of six new instructions that perform several compute intensive parts of the AES algorithm. These instructions can execute using significantly less clock cycles than a software solution. Four of the new instructions are for accelerating the encryption/decryption of a round and two new instructions are for round key generation.},
+  langid = {english},
+  organization = {intel}
+}
+
+@online{weissteinNumberTheoreticTransform2024,
+  type = {reference},
+  title = {Number {{Theoretic Transform}}},
+  shorttitle = {Number {{Theoretic Transform}}},
+  author = {Weisstein, Eric W.},
+  date = {2024-08-10},
+  url = {https://mathworld.wolfram.com/NumberTheoreticTransform.html},
+  urldate = {2024-08-14},
+  langid = {english},
+  organization = {MathWorld - A Wolfram Web Resource}
+}
+
+@online{spinalhdlSpinalHardwareDescription2024,
+  type = {documentation},
+  title = {Spinal {{Hardware Description Language}}},
+  shorttitle = {{{SpinalHDL}}},
+  author = {{SpinalHDL}},
+  date = {2024},
+  url = {https://spinalhdl.github.io/SpinalDoc-RTD/master/index.html},
+  urldate = {2024-08-15},
+  langid = {english},
+  organization = {SpinalHDL}
+}
+
+@software{spinalhdlSpinalHDLBaseProject2024,
+  title = {{{SpinalHDL Base Project}}},
+  author = {{SpinalHDL}},
+  date = {2024-07-04},
+  url = {https://github.com/SpinalHDL/SpinalTemplateSbt},
+  urldate = {2024-08-16},
+  version = {8456715b1c403daf6e88b4348fb6208a3582b074}
+}
+
+@article{govorkovaLHCPhysicsDataset2022,
+  title = {{{LHC}} Physics Dataset for Unsupervised {{New Physics}} Detection at 40\,{{MHz}}},
+  author = {Govorkova, Ekaterina and Puljak, Ema and Aarrestad, Thea and Pierini, Maurizio and Woźniak, Kinga Anna and Ngadiuba, Jennifer},
+  date = {2022-03-29},
+  journaltitle = {Scientific Data},
+  shortjournal = {Scientific Data},
+  volume = {9},
+  number = {1},
+  pages = {118},
+  issn = {2052-4463},
+  doi = {10.1038/s41597-022-01187-8},
+  url = {https://doi.org/10.1038/s41597-022-01187-8},
+  abstract = {In the particle detectors at the Large Hadron Collider, hundreds of millions of proton-proton collisions are produced every second. If one could store the whole data stream produced in these collisions, tens of~terabytes of data would be written to disk every second. The general-purpose experiments ATLAS and CMS reduce this overwhelming data volume to a sustainable level, by deciding in real-time whether each collision event should be kept for further analysis or be discarded. We introduce a dataset of proton collision events that emulates a typical data stream collected by such a real-time processing system, pre-filtered by requiring the presence of at least one electron or muon. This dataset could be used to develop novel event selection strategies and assess their sensitivity to new phenomena. In particular, we intend to stimulate a community-based effort towards the design of novel algorithms for performing unsupervised new physics detection, customized to fit the bandwidth, latency and computational resource constraints of the real-time event selection system of a typical particle detector.}
+}
+
+@online{boutinNISTReleasesFirst2024,
+  type = {news},
+  title = {{{NIST Releases First}} 3 {{Finalized Post-Quantum Encryption Standards}}},
+  shorttitle = {{{NIST Releases First}} 3 {{Finalized Post-Quantum Encryption Standards}}},
+  author = {Boutin, Charles},
+  date = {2024-08-13},
+  url = {https://www.nist.gov/news-events/news/2024/08/nist-releases-first-3-finalized-post-quantum-encryption-standards},
+  urldate = {2024-08-19},
+  langid = {english},
+  organization = {NIST}
+}
+
+@article{Guerrieri2022,
+  title = {Design Exploration and Code Optimizations for {{FPGA-based}} Post-Quantum Cryptography Using High-Level Synthesis},
+  author = {Guerrieri, Andrea and Da Silva Marques, Gabriel and Regazzoni, Francesco and Upegui, Andres},
+  date = {2022-03},
+  publisher = {{Institute of Electrical and Electronics Engineers (IEEE)}},
+  doi = {10.36227/techrxiv.19404413.v1},
+  url = {http://dx.doi.org/10.36227/techrxiv.19404413.v1}
+}
+
+@unpublished{foukiaComprehensionBasesNTT2024,
+  title = {Compréhension des bases de la NTT},
+  author = {Foukia, Noria},
+  date = {2024-06-26},
+  langid = {french},
+  venue = {Genève, Suisse}
+}
diff --git a/meta/report/template/acronyms.tex b/meta/report/template/acronyms.tex
new file mode 100644
index 0000000000000000000000000000000000000000..3cf34680f9d11fb8f6d5349131738aa8287c0648
--- /dev/null
+++ b/meta/report/template/acronyms.tex
@@ -0,0 +1,2 @@
+% !TeX spellcheck = fr_FR
+\printnoidxglossary[type=\acronymtype,title={Liste des acronymes}]
diff --git a/meta/report/template/annexestoc.tex b/meta/report/template/annexestoc.tex
new file mode 100644
index 0000000000000000000000000000000000000000..7f99fb207417a7620ae76b90fe96d68c1a16f210
--- /dev/null
+++ b/meta/report/template/annexestoc.tex
@@ -0,0 +1,5 @@
+% !TeX spellcheck = fr_FR
+\chapter*{Liste des annexes} % No (numbered) toc entry with *
+\addcontentsline{toc}{chapter}{Liste des annexes} % Adding toc entry
+
+\printcontents[annexes]{ }{2}{}
\ No newline at end of file
diff --git a/meta/report/template/config.tex b/meta/report/template/config.tex
new file mode 100644
index 0000000000000000000000000000000000000000..bddfe9a19526b8f506166a77ffb2fe48f889dc5d
--- /dev/null
+++ b/meta/report/template/config.tex
@@ -0,0 +1,115 @@
+%\documentclass[12pt]{report}
+\usepackage[T1]{fontenc}
+\usepackage[utf8]{inputenc}
+\usepackage[french]{babel}
+\usepackage[cm]{fullpage}
+\usepackage[a4paper,includeheadfoot,margin=2.5cm]{geometry}
+%\usepackage[a4paper,includehead,includefoot,top=2.1cm,bottom=2.5cm,right=2.5cm,left=2.5cm]{geometry}
+\usepackage{lmodern}  % fallback font : latin modern
+
+\usepackage{caption}
+\captionsetup{labelfont=sc}
+% You can change names of table and figure here
+\def\frenchtablename{Tableau}
+\def\frenchfigurename{Illustration}
+
+\usepackage{float}
+\usepackage{tikz}		% Image and drawing related package - TITLE PAGE
+\usepackage{setspace}	% Custom spacing package            - TITLE PAGE
+\usepackage{array}		% Array related package				- TITLE PAGE
+\usepackage{helvet}		% Helvetica font ~ Arial			- TITLE PAGE
+\usepackage{mathptmx}	% Times font ~ Times New Roman
+\usepackage{carlito}	% Calibri replacement font
+\usepackage[scaled=0.85]{beramono}	% Vera mononspace {fvm}
+
+%% This defines the default sans serif, roman and monospace fonts
+\renewcommand{\sfdefault}{phv}	% helvetica as sans serif font
+\renewcommand{\rmdefault}{ptm}	% times as roman (serif) font
+\renewcommand{\ttdefault}{fvm}	% Vera mononspace as monospace font
+\usepackage{bold-extra}	% Allow custom typsettings horrors like bold Small Caps
+\usepackage{slantsc}	% Allow custom typsettings horrors like bold Small Caps
+
+\usepackage[bigcaptions]
+			{listing}	% listing related package
+\usepackage{listings}	% listing related package
+\usepackage{titletoc}
+%\usepackage{tocbibind}	% TOC related package
+\usepackage[titles]{tocloft}	% TOC related package - here to add dots to chapter leader in TOC
+\renewcommand{\cftchapleader}{\cftdotfill{\cftdotsep}}
+\usepackage{lipsum}		% Lorem Ipsum generator
+
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{color}
+\usepackage{xcolor}
+\usepackage{chngcntr}	% counter related package
+%\usepackage{emptypage}	% adds blank pages without number, but keeps page numbering going on
+
+\graphicspath{{figures/}}
+
+\usepackage[acronym,toc,shortcuts,hyperfirst=true]{glossaries}
+\makenoidxglossaries
+\input{meta/acronyms}
+\glsenablehyper
+\renewcommand*{\glstextformat}[1]{\textcolor{darkblue}{#1}}
+
+\usepackage[htt]{hyphenat}	% hyphenation related package
+\usepackage[hyperfootnotes=true,
+			linkcolor=darkgray,
+			citecolor=black,
+			filecolor=black,
+			pagecolor=black,
+			urlcolor=darkblue,
+			linktoc=all,
+			bookmarks=true,
+			pdfborder={0 0 0},
+			pdfdisplaydoctitle=true,
+			pdftoolbar=true,
+			pdfmenubar=true,
+			pdfstartview=X Y Z,
+			pdfstartpage=1,
+			breaklinks]
+			{hyperref}	% URL and hyperlinks configuration, with hard break if too long lines
+
+\usepackage[hyphens]{url}
+\sloppy % helps with url hyphenation if we no not use xurl.
+%% IF YOUR URLS LOOK UGLY AND WAY TO LONG, UNCOMMENT THE LINE BELOW AND __DO NOT__ USE OVERLEAF, WHICH DOESN'T SUPPORT EXTENDED LATEX PACKAGES
+%\usepackage{xurl}
+\usepackage{numprint}	% number notation related package, e.g 10'000'000
+%\usepackage{amsmath}	% math related package
+
+\counterwithout{footnote}{chapter}
+
+\usepackage{setspace}	% linespacing related package
+
+\definecolor{codebg}{rgb}{0.98,0.98,0.98}
+\definecolor{sectcol}{rgb}{0.094,0.184,0.486}
+\definecolor{darkgray}{rgb}{0.2,0.2,0.2}
+\definecolor{darkblue}{rgb}{0.2,0.2,0.4}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CUSTOM TOC %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% This defines the way section and subsections are numbered.
+%% Uncomment to have section numbered without chapter number
+% \renewcommand\thesection{\arabic{section}}
+% having subsections numbered with letters
+\renewcommand{\thesubsection}{\alph{subsection}}
+
+%% This allows you to tweak the depth numbering of the TOC and the sections
+\setcounter{tocdepth}{3}	% TOC depth numbering set to 3
+\setcounter{secnumdepth}{3}	% section depth numbering set to 3
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /CUSTOM TOC %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CUSTOM CHAPTER TITLES %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\usepackage{titlesec}
+\titleformat{\chapter}[hang]{\fontsize{15.5}{18.7}\centering\bfseries\scshape}{}{1pc}{}
+\titleformat{name=\chapter,numberless}[hang]{\fontsize{15.5}{18.7}\centering \selectfont \bfseries\scshape}{}{1pc}{}
+\titlespacing{\chapter}{0pc}{-0.44cm}{0.64cm}
+\titleformat{\section}[hang] {\fontsize{13.5}{16.7}\bfseries\scshape}{\thesection.}{1pc}{}[]
+\titlespacing{\section}{0pc}{6pt}{5pt}
+\titleformat{\subsection}[hang] {\bfseries\large}{\hspace*{1em} \thesubsection.}{1pc}{}
+\titlespacing{\subsection}{0pc}{4pt}{15pt}
+\titleformat{\subsubsection}[hang] {\bfseries\large}{\hspace*{2em} \thesubsubsection.}{1pc}{}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /CUSTOM CHAPTER TITLES %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\author{\Author}
+\title{\Title}
diff --git a/meta/report/template/globaltoc.tex b/meta/report/template/globaltoc.tex
new file mode 100644
index 0000000000000000000000000000000000000000..9bebd145e0ff8f3b02eb977a19866067c638c35c
--- /dev/null
+++ b/meta/report/template/globaltoc.tex
@@ -0,0 +1,8 @@
+% !TeX spellcheck = fr_FR
+\chapter*{Table des matières}
+
+\startcontents[default]
+\printcontents[default]{ }{1}{}
+
+\startcontents[annexes]
+\stopcontents[annexes]
diff --git a/meta/report/template/header.tex b/meta/report/template/header.tex
new file mode 100644
index 0000000000000000000000000000000000000000..9ae5e13f47ff359379cc602a51c9ccf6633e267c
--- /dev/null
+++ b/meta/report/template/header.tex
@@ -0,0 +1,35 @@
+% !TeX spellcheck = fr_FR
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%                                                                             %
+%% HEPIA BACHELOR THESIS FRONTPAGE LATEX TEMPLATE                              %
+%% version 0.10 - 2020/04/25                                                    %
+%%                                                                             %
+%%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% set geometry
+\setlength{\headheight}{15pt}
+\setlength{\headsep}{0.5cm}
+% set text of header
+\newcommand{\Headertext}{\textcolor{black!50}{\scriptsize{\Author\space - \Shorttitle\space - Projet de bachelor - \Month\space\Year}}}
+% define page header page style
+\fancypagestyle{withheader}{%
+\lhead[\Headertext]{\Headertext}
+\chead[]{}
+\rhead[]{}
+\renewcommand{\headrulewidth}{0pt} 
+}
+% define page stlye with chapters
+\fancypagestyle{plain}{%
+\lhead[\Headertext]{\Headertext}
+\chead[]{}
+\rhead[]{}
+\renewcommand{\headrulewidth}{0pt} 
+}
+% define page style to be used where no header is needed
+\fancypagestyle{noheader}{%
+\lhead[]{}
+\chead[]{}
+\rhead[]{}
+}
+% set header page style
+\pagestyle{withheader}
\ No newline at end of file
diff --git a/meta/report/template/images/abstract/image.png b/meta/report/template/images/abstract/image.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f96ed2e92f6dae5d7cfbdd718714655a7367a7b
Binary files /dev/null and b/meta/report/template/images/abstract/image.png differ
diff --git a/meta/report/template/images/statements/date.png b/meta/report/template/images/statements/date.png
new file mode 100644
index 0000000000000000000000000000000000000000..16a534d7dda7fda32271c9d56d1315a40d30e6b4
Binary files /dev/null and b/meta/report/template/images/statements/date.png differ
diff --git a/meta/report/template/images/statements/initstatements.png b/meta/report/template/images/statements/initstatements.png
new file mode 100644
index 0000000000000000000000000000000000000000..08663a2a2a80499efde28595a112100f4b897424
Binary files /dev/null and b/meta/report/template/images/statements/initstatements.png differ
diff --git a/meta/report/template/images/statements/originalstatements.pdf b/meta/report/template/images/statements/originalstatements.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f38a777c85f1a63c10ef48f58ce10c9edb578b75
Binary files /dev/null and b/meta/report/template/images/statements/originalstatements.pdf differ
diff --git a/meta/report/template/images/title/hepia_logo.jpg b/meta/report/template/images/title/hepia_logo.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..d885c710084a2a1e79d08fe32170a848c446e3a1
Binary files /dev/null and b/meta/report/template/images/title/hepia_logo.jpg differ
diff --git a/meta/report/template/images/title/hes-so_geneve_logo.emf b/meta/report/template/images/title/hes-so_geneve_logo.emf
new file mode 100644
index 0000000000000000000000000000000000000000..16c24b590748ed1a212df1aadbc92f2eeaa320a5
Binary files /dev/null and b/meta/report/template/images/title/hes-so_geneve_logo.emf differ
diff --git a/meta/report/template/images/title/hes-so_geneve_logo.png b/meta/report/template/images/title/hes-so_geneve_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..90403e3e4c5829acf0a7e75507c64ef8fce032b1
Binary files /dev/null and b/meta/report/template/images/title/hes-so_geneve_logo.png differ
diff --git a/meta/report/template/images/title/hes-so_geneve_logo.svg b/meta/report/template/images/title/hes-so_geneve_logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b9f547e9f625665fcb01e3ecd7f872af510dbe05
--- /dev/null
+++ b/meta/report/template/images/title/hes-so_geneve_logo.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="80mm" height="23mm" viewBox="0 0 8000 2300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-width="28.222" stroke-linejoin="round" xml:space="preserve">
+ <image x="0" y="0" width="8000" height="2290" preserveAspectRatio="none" xlink:href="data:image/png;base64,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"/>
+</svg>
\ No newline at end of file
diff --git a/meta/report/template/images/title/title.png b/meta/report/template/images/title/title.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab96d4bac71d93d4719b0156f368e27f82ee21d9
Binary files /dev/null and b/meta/report/template/images/title/title.png differ
diff --git a/meta/report/template/statements.tex b/meta/report/template/statements.tex
new file mode 100644
index 0000000000000000000000000000000000000000..a63f2c0796821f9f195a6bc14dfa67dca5fdde60
--- /dev/null
+++ b/meta/report/template/statements.tex
@@ -0,0 +1,19 @@
+% !TeX spellcheck = fr_FR
+
+
+\thispagestyle{noheader}
+\chapter*{Énoncé du sujet}
+
+\tikz[remember picture,overlay] \node[shift={(4.165cm,-1.955cm)}]
+at (current page.north west)
+	{\includegraphics[height=1.29cm]{template/images/title/hepia_logo}};
+\tikz[remember picture,overlay] \node[shift={(-4.238cm,-1.97cm)}]
+at (current page.north east)
+	{\includegraphics[height=1.00cm]{template/images/statements/date}};
+
+\addcontentsline{toc}{chapter}{Énoncé du sujet}
+\thispagestyle{noheader}
+
+\begin{center}
+	\includegraphics[width=1.0\textwidth]{template/images/statements/initstatements}
+\end{center}
diff --git a/meta/report/template/title.tex b/meta/report/template/title.tex
new file mode 100644
index 0000000000000000000000000000000000000000..bbd0442bdfedaff51e74190cd3aa946f75734d57
--- /dev/null
+++ b/meta/report/template/title.tex
@@ -0,0 +1,51 @@
+% !TeX spellcheck = fr_FR
+\begin{titlepage}
+	\newgeometry{top=2cm,bottom=2cm,right=2cm,left=2cm}
+	%% HEADER IMAGES
+	\tikz[remember picture,overlay] \node[shift={(4.165cm,-1.955cm)}]
+	at (current page.north west)
+	{\includegraphics[height=1.29cm]{template/images/title/hepia_logo}};
+	\tikz[remember picture,overlay] \node[shift={(-4.238cm,-1.97cm)}]
+	at (current page.north east)
+	{\includegraphics[height=1.29cm]{template/images/title/hes-so_geneve_logo}};
+
+	\begin{center}
+		%% CONTENT STARTS HERE
+		{\fontfamily{phv}\selectfont
+			\vspace*{51pt}
+			{
+				%% TITLE
+				\begin{spacing}{1.5}
+					{\fontsize{16pt}{20pt} \textbf{\Title}}\\[29pt]
+				\end{spacing}
+
+				%% IMAGE IF ANY
+				{\color{white}
+					%\includegraphics[height=8cm,width=8cm]{\TitleImage}\\[35pt]
+					\includegraphics[height=8cm]{\TitleImage}\\[35pt]
+				}
+
+				%% PROJET DE SEMESTRE
+				{\large Thèse de Bachelor présentée par}\\[21pt]
+
+				%% AUTHOR
+				{\fontsize{16pt}{20pt} \textbf{\Author}}\\[17pt]
+
+				{\large pour l'obtention du titre Bachelor of Science HES-SO en}\\[21pt]
+
+				%% DEGREE
+				{\large
+				 \fontsize{14pt}{20pt} \textbf{Informatique et systèmes de communication avec orientation\\ \Orientation }\\[32pt]
+
+				%% DATE
+				\textbf{\Month, \Year}}\\[49pt]
+
+				%% SUPERVISOR
+				Professeur-e HES responsable\\[13pt]
+				\textbf{ \Professor }
+			}
+			\vfill
+		}%\fontfamily
+	\end{center}
+\end{titlepage}
+\addtocounter{page}{1}
diff --git a/meta/report/toplevel.tex b/meta/report/toplevel.tex
new file mode 100644
index 0000000000000000000000000000000000000000..739b186fc3aaab75cf54fc05f71bc62e97f1068a
--- /dev/null
+++ b/meta/report/toplevel.tex
@@ -0,0 +1,196 @@
+% !TeX spellcheck = fr_FR
+
+\RequirePackage[hyphens]{url}
+\RequirePackage{setspace}
+\RequirePackage{etoolbox}
+
+
+
+\documentclass[12pt  % , twoside, openright  % have chapter start on the page on the right
+]{report}  % should use memoir documentclass
+\input{template/config}
+
+
+
+%%% PACKAGES
+%\usepackage[style=iso-authoryear]{biblatex}
+\usepackage[style=verbose-note, bibstyle=iso-authoryear, sorting=nyt]{biblatex}
+\addbibresource{refs/refs.bib}
+\usepackage{amsfonts}
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage[bottom]{footmisc}  % footnotes actually at page bottom
+\usepackage{mathtools}
+\usepackage{todo}
+
+
+%%% COMMANDS
+\AtBeginEnvironment{quote}{\par\singlespacing\small}
+\newcommand{\inspired}[1]{\begin{flushright}\textit{#1}\linebreak\end{flushright}}
+\newcommand{\tbfigure}[4]{
+	%\begin{figure}[tbph!]  % place where there is space
+	\begin{figure}[H]  % place precisely relative to text and make space for it
+		\centering
+		\includegraphics[width=#1\linewidth]{img/#2}
+		\caption[#3.]{#3. Source : #4.}
+		\label{fig:#2}
+	\end{figure}
+}
+\newcommand{\tbtables}[4]{
+	\begin{table}[H]
+	\centering{
+		\begin{tabular}{ #3 }
+		#4
+		\end{tabular}
+		\caption[#2]{#2. Source: réalisé par Stefanovic Boris.}
+		\label{tab:#1}
+	}
+	\end{table}
+}
+
+\DeclarePairedDelimiter\floorpair{\lfloor}{\rfloor}
+\newcommand{\floor}[1]{\floorpair*{#1}}
+
+\definecolor{strongcolour}{RGB}{108,48,130}
+\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
+\definecolor{commentgreen}{RGB}{2,112,10}
+\definecolor{codegray}{rgb}{0.5,0.5,0.5}
+\definecolor{codepurple}{rgb}{0.58,0,0.82}
+\lstdefinestyle{cstyle}{
+    backgroundcolor=\color{backcolour},
+    commentstyle=\color{commentgreen},
+    keywordstyle=\color{blue},
+    numberstyle=\tiny\color{codegray},
+    stringstyle=\color{codepurple},
+    basicstyle=\ttfamily\footnotesize,
+    breakatwhitespace=false,
+    breaklines=true,
+    captionpos=b,
+    keepspaces=true,
+    numbers=left,
+    numbersep=5pt,
+    showspaces=false,
+    showstringspaces=false,
+    showtabs=false,
+	emph={int,char,double,float,unsigned,void,bool,int16\_t,int32\_t,size\_t},
+	emphstyle=\color{strongcolour},
+    tabsize=4
+}
+
+
+
+\newcommand{\Author}{Boris STEFANOVIC}
+\newcommand{\TitleImage}{img/title}
+\newcommand{\Title}{
+	%Accélération matérielle de la NTT sur FPGA en vue de son utilisation dans l'algorithme CRYSTALS-Kyber
+	Accélération du calcul de CRYSTALS-Kyber sur FPGA
+}
+\newcommand{\Shorttitle}{Accélération Matérielle de la NTT}
+\newcommand{\Orientation}{systèmes embarqués}
+\newcommand{\Professor}{Andrés UPEGUI POSADA}
+\newcommand{\Client}{-}
+\newcommand{\Year}{2024}
+\newcommand{\Month}{Août}
+%% THE LINES BELOW ARE FOR PDF REFERENCING PURPOSES.
+\newcommand{\Keywords}{cryptography, FPGA, hardware, HDL, NTT, SpinalHDL, VHDL}
+\newcommand{\Subject}{hardware-acceleration}
+\newcommand{\Convention}{non}
+\newcommand{\Confidentiel}{non}
+
+
+%%% DO NOT MODIFY
+\hypersetup{
+	pdftitle={\Title},
+	pdfauthor={\Author},
+	pdfkeywords={\Keywords},
+	pdfsubject={\Subject}
+}
+
+%\usepackage{showframe}  % Prints document frame
+
+\input{template/header}
+
+
+
+%%% DOCUMENT STARTS HERE
+\begin{document}
+\pagenumbering{roman}
+
+%%% TITLE PAGE
+\input{template/title}
+%\clearpage  % originally, used instead of cleardoublepage
+\cleardoublepage
+
+%%% TITLE IMAGE REFERENCE
+\newgeometry{top=2.1cm,bottom=3.5cm,right=2.5cm,left=2.5cm}
+\begin{spacing}{1.5}
+\input{meta/titleref}
+\end{spacing}
+\cleardoublepage
+
+%%% TABLE OF CONTENTS
+\begin{spacing}{1}
+\input{template/globaltoc}
+\end{spacing}
+\cleardoublepage
+
+%%% DEDICATION
+\begin{spacing}{1.5}
+\input{meta/dedication}
+\cleardoublepage
+
+%%% ACKNOWLEDGEMENTS
+\input{meta/acknowledgements}
+\cleardoublepage
+
+%%% STATEMENTS
+\input{template/statements}
+\cleardoublepage
+
+%%% ABSTRACT
+\input{meta/abstract}
+\cleardoublepage
+
+%%% LIST OF ACRONYMS
+\input{template/acronyms}
+\cleardoublepage
+
+%%% LIST OF FIGURES
+\input{meta/figureslist}
+\cleardoublepage
+
+%%% LIST OF TABLES
+\input{meta/tableslist}
+\end{spacing}
+\cleardoublepage
+
+%%% LIST OF ANNEXES
+%%% COMMENT THIS PART IF YOU DO NOT USE DEDICATED TOC FOR ANNEXES AND COMMENT
+%%% HEADER AND FOOTER PART IN annexes FILE
+\begin{spacing}{1}
+\input{template/annexestoc}
+\end{spacing}
+\cleardoublepage
+
+
+\begin{spacing}{1.5}
+\pagenumbering{arabic}
+
+%%% INTRODUCTION
+\input{chapters/introduction}
+\cleardoublepage
+
+%%% CHAPTERS
+\input{chapters/1_outils}
+\input{chapters/2_operations}
+\input{chapters/3_architecture}
+\input{chapters/4_resultats}
+
+%%% CONCLUSION
+\input{chapters/conclusion}
+
+%%% ANNEXES AND REFERENCES
+\input{meta/annexes}
+\input{meta/references}
+\end{spacing}
+\end{document}