From 1152932547aac4169c645a9cc894bd1783fb22ae Mon Sep 17 00:00:00 2001
From: Felipe Lisboa <lisboafelipe5@gmail.com>
Date: Tue, 13 Feb 2024 16:23:59 +0100
Subject: [PATCH] Cleanning CavaDRAM code, added silveroak recompiled to
 sub-module list

---
 .gitmodules                                   |    3 +
 framework/CavaDRAM/CavaFIFO/CavaFIFO.v        |  333 ----
 .../CavaDRAM/CavaFIFO/CavaFIFOProperties.v    | 1654 -----------------
 framework/CavaDRAM/CavaFIFOREF/CavaFIFOREF.v  |  376 ----
 .../CavaFIFOREF/CavaFIFOREFProperties.v       | 1630 ----------------
 .../CavaFIFOREF/CavaFIFOREFProperties2.v      |  311 ----
 framework/CavaDRAM/CavaTDM/CavaTDMREF.v       |  527 ------
 .../CavaDRAM/CavaTDM/CavaTDMREFProperties.v   |  111 --
 framework/CavaDRAM/Core/CavaCommonInstances.v |    4 +-
 framework/CavaDRAM/Core/CavaCounter.v         |   47 -
 .../CavaDRAM/Core/CavaCounterProperties.v     |  201 --
 framework/CavaDRAM/Core/CavaDemux.v           |   69 -
 framework/CavaDRAM/Core/CavaMemory.v          |   66 -
 framework/CavaDRAM/Core/CavaReqQueue.v        |    7 +-
 framework/CavaDRAM/Core/CavaSM.v              |   51 -
 framework/CavaDRAM/Core/CavaSMExtraction.v    |   25 -
 framework/CavaDRAM/Core/CavaSMProperties.v    |  666 -------
 framework/CavaDRAM/Core/CavaSMProperties2.v   |  843 ---------
 framework/CavaDRAM/Core/CavaSM_.v             |  115 --
 framework/CavaDRAM/Core/CavaSMbackup.v        |  424 -----
 framework/CavaDRAM/Core/CavaSubtractor.v      |  117 --
 .../CavaDRAM/Core/CavaSubtractorProperties.v  |   72 -
 framework/CavaDRAM/Core/CavaSystem.v          |    3 +-
 framework/CavaDRAM/Core/Memory.v              |  296 ---
 framework/CavaDRAM/Lib/CavaTactics.v          |   26 -
 framework/CavaDRAM/Lib/CavaUtil.v             |   59 -
 framework/CavaDRAM/Lib/Step.v                 |   16 +-
 framework/CavaDRAM/Lib/Util.v                 |   32 +-
 framework/CavaDRAM/Lib/backup.v               | 1256 -------------
 framework/CavaDRAM/_CoqProject                |   20 +-
 .../gencode/fifo_gencode/CavaFIFOSV.hs        |   14 -
 .../CavaDRAM/gencode/fifo_gencode/cava2sv.sh  |   12 -
 .../CavaDRAM/gencode/tdm_gencode/CavaTDMSV.hs |   14 -
 .../CavaDRAM/gencode/tdm_gencode/cava2sv.sh   |   12 -
 framework/DRAM/Core/ImplementationInterface.v |   36 +-
 .../DRAM/Implementations/TS/FIFOREF/FIFOREF.v |   44 +-
 framework/DRAM/_CoqProject                    |    1 +
 37 files changed, 91 insertions(+), 9402 deletions(-)
 delete mode 100644 framework/CavaDRAM/CavaFIFO/CavaFIFO.v
 delete mode 100644 framework/CavaDRAM/CavaFIFO/CavaFIFOProperties.v
 delete mode 100644 framework/CavaDRAM/CavaFIFOREF/CavaFIFOREF.v
 delete mode 100644 framework/CavaDRAM/CavaFIFOREF/CavaFIFOREFProperties.v
 delete mode 100644 framework/CavaDRAM/CavaFIFOREF/CavaFIFOREFProperties2.v
 delete mode 100644 framework/CavaDRAM/CavaTDM/CavaTDMREF.v
 delete mode 100644 framework/CavaDRAM/CavaTDM/CavaTDMREFProperties.v
 delete mode 100644 framework/CavaDRAM/Core/CavaCounter.v
 delete mode 100644 framework/CavaDRAM/Core/CavaCounterProperties.v
 delete mode 100644 framework/CavaDRAM/Core/CavaDemux.v
 delete mode 100644 framework/CavaDRAM/Core/CavaMemory.v
 delete mode 100644 framework/CavaDRAM/Core/CavaSM.v
 delete mode 100644 framework/CavaDRAM/Core/CavaSMExtraction.v
 delete mode 100644 framework/CavaDRAM/Core/CavaSMProperties.v
 delete mode 100644 framework/CavaDRAM/Core/CavaSMProperties2.v
 delete mode 100644 framework/CavaDRAM/Core/CavaSM_.v
 delete mode 100644 framework/CavaDRAM/Core/CavaSMbackup.v
 delete mode 100644 framework/CavaDRAM/Core/CavaSubtractor.v
 delete mode 100644 framework/CavaDRAM/Core/CavaSubtractorProperties.v
 delete mode 100644 framework/CavaDRAM/Core/Memory.v
 delete mode 100644 framework/CavaDRAM/Lib/CavaTactics.v
 delete mode 100644 framework/CavaDRAM/Lib/CavaUtil.v
 delete mode 100644 framework/CavaDRAM/Lib/backup.v
 delete mode 100644 framework/CavaDRAM/gencode/fifo_gencode/CavaFIFOSV.hs
 delete mode 100755 framework/CavaDRAM/gencode/fifo_gencode/cava2sv.sh
 delete mode 100644 framework/CavaDRAM/gencode/tdm_gencode/CavaTDMSV.hs
 delete mode 100755 framework/CavaDRAM/gencode/tdm_gencode/cava2sv.sh

diff --git a/.gitmodules b/.gitmodules
index 850692d..56e6bd4 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,3 +4,6 @@
 [submodule "mcsimcoq"]
 	path = mcsimcoq
 	url = git@gitlab.enst.fr:sdram20/mcsimcoq.git
+[submodule "silveroak"]
+	path = silveroak
+	url = git@gitlab.enst.fr:sdram/silveroak_dram.git
diff --git a/framework/CavaDRAM/CavaFIFO/CavaFIFO.v b/framework/CavaDRAM/CavaFIFO/CavaFIFO.v
deleted file mode 100644
index af6dd3b..0000000
--- a/framework/CavaDRAM/CavaFIFO/CavaFIFO.v
+++ /dev/null
@@ -1,333 +0,0 @@
-From Cava Require Export Cava.
-From Cava Require Export CavaProperties.
-
-Export Circuit.Notations.
-
-Require Export Coq.Vectors.Fin.
-Require Export Coq.Bool.Bool.
-Require Export Coq.Program.Basics.
-
-From CavaDRAM Require Export CavaSystem.
-(* From CavaDRAM Require Export CavaUtil. *)
-From CavaDRAM Require Export CavaMemory.
-From CavaDRAM Require Export CavaSubtractor.
-
-From CoqDRAM Require Export FIFO.
-
-Infix "++" := Vector.append.
-
-Section CavaFIFO.
-
-	Context {CAVA_SYS : CavaSystem}.
-	Context {signal : SignalType -> Type} {semantics : Cava signal}.
-
-	Context {SYS_CFG : System_configuration}.
-	Context {FIFO_CFG : FIFO_configuration}.
-
-	Definition COUNTER_WIDTH := Nat.log2 WAIT.	
-	Definition REQUEST_WIDTH := FE_CMD_WIDTH + FE_ADDR_WIDTH + FE_ID_WIDTH.
-	Definition ADDR_WIDTH := Nat.log2 QUEUE_MAX_SIZE.
-	Definition QUEUE_WIDTH := QUEUE_MAX_SIZE * REQUEST_WIDTH.
-	Definition STATE_VEC_WIDTH := 2 * ADDR_WIDTH + QUEUE_WIDTH.
-
-	Definition NOP := Vec.bitvec_literal (N2Bv_sized DRAM_CMD_WIDTH 0).
-	Definition null_req := Vec.bitvec_literal (N2Bv_sized REQUEST_WIDTH 0).
-	Definition cnt_nil := Vec.bitvec_literal (N2Bv_sized COUNTER_WIDTH 0).
-
-	Definition fifo_memory :=
-	 memory_dp (Vec Bit REQUEST_WIDTH) ADDR_WIDTH (QUEUE_MAX_SIZE - 1).
-
-	Definition FullVEC := Vec.bitvec_literal (N2Bv_sized ADDR_WIDTH (N.of_nat QUEUE_MAX_SIZE - 1)).
-	Definition EmptyVec := Vec.bitvec_literal (N2Bv_sized ADDR_WIDTH 0).
-
-	(* Compares a bit vector passed as argument with FullVEC *)
-	Definition EqFULL
-		: Circuit (signal (Vec Bit ADDR_WIDTH)) (signal Bit)
-		:= Comb (fun '(input) => CavaPrelude.eqb (input,FullVEC)).
-
-	Definition NotZero (input : signal (Vec Bit ADDR_WIDTH))
-		: cava (signal Bit) :=
-		eq <- CavaPrelude.eqb (input,EmptyVec) ;;
-		inv eq.
-
-	(* write address, read address -> full *)
-	Definition FullLogic
-		: Circuit (signal (Vec Bit ADDR_WIDTH) * signal (Vec Bit ADDR_WIDTH)) (signal Bit)
-		:= Subtractor >==> Comb (dropr) >==> EqFULL.
-
-	(* if (w@ - 1) - r@ = FullVEC then fifo is full *)
-	Definition FullLogicAlt
-		: Circuit (signal (Vec Bit ADDR_WIDTH) * signal (Vec Bit ADDR_WIDTH)) (signal Bit)
-		:= Comb (fun '(wa,ra) =>
-				wa_eq_zero <- CavaPrelude.eqb (wa,EmptyVec) ;;
-				wa_minus_1 <- subtractor (wa,Vec.bitvec_literal(N2Bv_sized ADDR_WIDTH 1)) ;;
-				wa_out <- mux2 wa_eq_zero (fst(wa_minus_1),EmptyVec) ;;
-				wa_minus_ra <- subtractor (wa_out,ra) ;;
-				CavaPrelude.eqb (fst(wa_minus_ra),FullVEC)
-			).
-
-	Definition EmptyLogic
-		: Circuit (signal (Vec Bit ADDR_WIDTH) * signal (Vec Bit ADDR_WIDTH)) (signal Bit)
-		:= Comb (CavaPrelude.eqb).
-
-	Definition FullEmptyLogic
-		: Circuit (signal (Vec Bit ADDR_WIDTH) * signal (Vec Bit ADDR_WIDTH)) (signal Bit * signal Bit)
-		:= Comb (fun '(a,b) => ret((a,b),(a,b)))
-		>==> First (FullLogic)
-		>==> Second (EmptyLogic).
-
-	Definition incr_pointr
-	 : Circuit (signal (Vec Bit ADDR_WIDTH) * signal Bit) (signal (Vec Bit ADDR_WIDTH))
-	 := Comb (fun '(ptr,en) =>
-			ptr_p1 <- incrN ptr ;;
-			mux2 en (ptr,ptr_p1)
-	 ).
-
-	(* rewrite and test CavaFIFOqueue -> is data_o ok ? *)
-	Definition CavaFifoQueue_t
-	 : Circuit ((signal Bit) 											* (* push_i  *)
-	 						(signal (Vec Bit REQUEST_WIDTH)) 	* (* data_i  *)
-							(signal Bit))											 	(* pop_i   *)
-						 ((signal Bit)											* (* full_o  *)
-						  (signal (Vec Bit REQUEST_WIDTH))	*	(* data_o  *)
-						 	(signal Bit))											  (* empty_o *)
-	 :=	let state_init : combType (Vec Bit (ADDR_WIDTH + ADDR_WIDTH))
-				:= (Vector.const zero (ADDR_WIDTH + ADDR_WIDTH)) in
-			LoopInit state_init (
-				Second (Comb (fun '(state) =>
-					(* separes the two pointers;*)
-					stateV <- unpackV (state) ;;
-					wr_ad <- packV (slice_default zero stateV 0 ADDR_WIDTH) ;;
-					rd_ad <- packV (slice_default zero stateV ADDR_WIDTH ADDR_WIDTH) ;;
-					(* assignment of full_o & empty_o *)
-					ret (wr_ad,rd_ad)) >==> Comb (fork2) >==> Second (FullEmptyLogic))
-				>==> Comb (fun '(push_i, data_i, pop_i, ((wr_ad,rd_ad),(full_o,empty_o))) =>
-					(* logic for write enable *)
-					n_full <- inv full_o ;;
-					wr_en <- and2 (push_i,n_full) ;;
-					(* logic for read enable *)
-					n_empt <- inv empty_o ;;
-					rd_en <- and2 (pop_i,n_empt) ;;
-					(* duplicate rd@ : first one will be incremented and second one to access the memory *)
-					ret (full_o,data_i,empty_o,wr_ad,wr_en,rd_ad,rd_en,rd_ad))
-				>==> Comb (fun '(full_o,data_i,empty_o,wr_ad,w_en,r_ad,rd_en,rd_ad) =>
-					(* logic for read address going into the memory : not the most elegant solution for now: *)
-					(* a better solution would be to make a memory with read enable *)
-					(* if (rd_en = 0 && rd@ != 0) -> read from rd@ - 1  *)
-					(* else read from rd@ *)
-					rd_diff_0 <- NotZero rd_ad ;;
-					n_r_en <- inv rd_en ;;
-					sel_rd_ad <- and2 (rd_diff_0,n_r_en) ;;
-					sub_result <- subtractor(rd_ad,Vec.bitvec_literal (N2Bv_sized ADDR_WIDTH 1)) ;;
-					n_rd_ad <- mux2 sel_rd_ad (rd_ad,fst(sub_result)) ;;
-					ret (full_o,empty_o,wr_ad,w_en,rd_ad,rd_en,(data_i,wr_ad,n_rd_ad,w_en)))
-					(* memory access *)
-				>==> Second(fifo_memory)
-					(* re-organizes *)
-				>==> Comb (fun '(full_o, empty_o, wr_ad, w_en, r_ad,r_en, data_o) =>
-					ret (full_o,data_o,empty_o,((wr_ad,w_en),(r_ad,r_en))))
-					(* increment pointers *)
-				>==> Second (First (incr_pointr) >==> Second (incr_pointr) >==>
-					Comb (fun '(n_wr_ad,n_rd_ad) =>
-						wrV <- unpackV n_wr_ad ;;
-						rdV <- unpackV n_rd_ad ;;
-						packV (Vector.append wrV rdV)))
-			).
-	
-	(* different full logics *)
-	Definition CavaFifoQueue_t_alt
-		: Circuit 
-			( signal Bit
-			* signal (Vec Bit REQUEST_WIDTH)
-			* signal Bit)
-			( signal Bit
-			* signal (Vec Bit REQUEST_WIDTH)
-			* signal Bit) := 
-		Loop ( (* push_i,data_i,pop_i,wr_ad *)
-			Loop ( (* push_i, data_i, pop_i, wr_ad,rd_adr *)
-				Comb (fun '(push_i,data_i,pop_i,wr_ad,rd_ad) => ret (push_i,data_i,pop_i,(wr_ad,rd_ad)))
-				>==> Second (Comb fork2 >==> (Second FullEmptyLogic))
-				>==> Comb (fun '(push_i, data_i, pop_i, ((wr_ad, rd_ad), (full_o, empty_o))) =>
-					n_full <- inv full_o ;; 
-					n_empt <- inv empty_o ;;
-					wr_en <- and2 (push_i,n_full) ;;
-					rd_en <- and2 (pop_i,n_empt) ;;
-					ret (full_o,data_i,empty_o,wr_ad,wr_en,rd_ad,rd_en,rd_ad))
-				>==> Comb (fun '(full_o,data_i,empty_o,wr_ad,w_en,r_ad,rd_en,rd_ad) =>
-					rd_diff_0 <- NotZero rd_ad ;; 
-					n_r_en <- inv rd_en ;;
-					sel_rd_ad <- and2 (rd_diff_0,n_r_en) ;;
-					sub_result <- subtractor(rd_ad,Vec.bitvec_literal (N2Bv_sized ADDR_WIDTH 1)) ;;
-					(* if (rd@ != 0 && !r_en) then rd@' := rd_ad - 1 else rd_ad *)
-					n_rd_ad <- mux2 sel_rd_ad (rd_ad,fst(sub_result)) ;;
-					ret (full_o,empty_o,wr_ad,w_en,rd_ad,rd_en,(data_i,wr_ad,n_rd_ad,w_en)))
-				>==> Second(fifo_memory)
-				>==> Comb (fun '(full_o, empty_o, wr_ad, w_en, r_ad,r_en, data_o) =>
-					ret (full_o,data_o,empty_o,((wr_ad,w_en),(r_ad,r_en))))
-				>==> Second (First (incr_pointr) >==> Second (incr_pointr))
-				>==> Comb (fun '(full_o,data_o,empty_o,(n_wr_ad,n_rd_ad)) => 
-					ret (full_o,data_o,empty_o,n_wr_ad,n_rd_ad))
-			)
-		).
-
-	Definition CavaFifoQueue_t_NF (* this is the right one *)
-	: Circuit 
-		( signal Bit
-		* signal (Vec Bit REQUEST_WIDTH)
-		* signal Bit)
-		( signal Bit
-		* signal (Vec Bit REQUEST_WIDTH)
-		* signal Bit) := 
-	Loop ( (* push_i,data_i,pop_i,wr_ad *)
-		Loop ( (* push_i, data_i, pop_i, wr_ad,rd_adr *)
-			Comb (fun '(push_i,data_i,pop_i,wr_ad,rd_ad) => ret (push_i,data_i,pop_i,(wr_ad,rd_ad)))
-			>==> Second (Comb fork2 >==> (Second FullEmptyLogic))
-			>==> Comb (fun '(push_i, data_i, pop_i, ((wr_ad, rd_ad), (full_o, empty_o))) =>
-				n_full <- inv full_o ;; 
-				n_empt <- inv empty_o ;;
-				wr_en <- and2 (push_i,n_full) ;;
-				rd_en <- and2 (pop_i,n_empt) ;;
-				ret (full_o,data_i,empty_o,wr_ad,wr_en,rd_ad,rd_en,rd_ad))
-			>==> Comb (fun '(full_o,data_i,empty_o,wr_ad,w_en,r_ad,rd_en,rd_ad) =>
-				rd_diff_0 <- NotZero rd_ad ;; 
-				n_r_en <- inv rd_en ;;
-				sel_rd_ad <- and2 (rd_diff_0,n_r_en) ;;
-				sub_result <- subtractor(rd_ad,Vec.bitvec_literal (N2Bv_sized ADDR_WIDTH 1)) ;;
-				(* if (rd@ != 0 && !r_en) then rd@' := rd_ad - 1 else rd_ad *)
-				n_rd_ad <- mux2 sel_rd_ad (rd_ad,fst(sub_result)) ;;
-				ret (full_o,empty_o,wr_ad,w_en,rd_ad,rd_en,(data_i,wr_ad,n_rd_ad,w_en)))
-			>==> Second(fifo_memory)
-			>==> Comb (fun '(full_o, empty_o, wr_ad, w_en, r_ad,r_en, data_o) =>
-				ret (full_o,data_o,empty_o,((wr_ad,w_en),(r_ad,r_en))))
-			>==> Second (First (incr_pointr) >==> Second (incr_pointr))
-			>==> Second (Comb(fork2) >==> First(FullEmptyLogic))
-			(* the empty signal is purposely delayed *)
-			>==> Comb (fun '(full_o,data_o,empty_o,(n_full_o, n_empty_o,(n_wr_ad,n_rd_ad))) => 
-				ret (n_full_o,data_o,empty_o,n_wr_ad,n_rd_ad))
-		)
-	).
-
-	Definition CavaFifoQueue_t_NF_RD (* this is the right one *)
-	: Circuit 
-		( signal Bit
-		* signal (Vec Bit REQUEST_WIDTH)
-		* signal Bit)
-		( signal Bit
-		* signal (Vec Bit REQUEST_WIDTH)
-		* signal Bit) := 
-	Loop ( (* push_i,data_i,pop_i,wr_ad *)
-		Loop ( (* push_i, data_i, pop_i, wr_ad,rd_zadr *)
-			Comb (fun '(push_i,data_i,pop_i,wr_ad,rd_ad) => ret (push_i,data_i,pop_i,(wr_ad,rd_ad)))
-			>==> Second (Comb fork2 >==> (Second FullEmptyLogic))
-			>==> Comb (fun '(push_i, data_i, pop_i, ((wr_ad, rd_ad), (full_o, empty_o))) =>
-				n_full <- inv full_o ;; 
-				n_empt <- inv empty_o ;;
-				wr_en <- and2 (push_i,n_full) ;;
-				rd_en <- and2 (pop_i,n_empt) ;;
-				ret (full_o,empty_o,wr_ad,wr_en,rd_ad,rd_en,(data_i,wr_ad,rd_ad,wr_en)))
-			>==> Second (fifo_memory)
-			>==> Comb (fun '(full_o, empty_o,wr_ad,w_en,r_ad,r_en,data_o) =>
-				ret (full_o,data_o,empty_o,((wr_ad,w_en),(r_ad,r_en))))
-			>==> Second (First (incr_pointr) >==> Second (incr_pointr))
-			>==> Second (Comb(fork2) >==> First(FullEmptyLogic))
-			(* the empty signal is purposely delayed *)
-			>==> Comb (fun '(full_o,data_o,empty_o,(n_full_o, n_empty_o,(n_wr_ad,n_rd_ad))) => 
-				ret (n_full_o,data_o,empty_o,n_wr_ad,n_rd_ad))
-		)
-	).
-
-End CavaFIFO.
-
-Section CodeGeneration.
-
-	Existing Instance CavaCombinationalNet.
-
-	Program Instance CAVA_SYS : CavaSystem := {
-		FE_CMD_WIDTH := 2;
-		FE_ADDR_WIDTH := 2;
-		FE_ID_WIDTH := 2;
-		ROW_ADDR_WIDTH := 1;
-		BANK_ADDR_WIDTH := 1;
-		DRAM_BUS_WIDTH := 1;
-		DRAM_BANKS := 1;
-		DRAM_CMD_WIDTH := 2;
-		BL := 4;
-		CLK_RATIO := 2;
-		QUEUE_MAX_SIZE := 16;
-		MEM_ADDR_WIDTH := 4;
-		(* WAIT := 8;
-		T_RP := 2;
-		T_RCD := 2; *)
-	}.
-
-	Definition FIFO_out := (bool * Vector.t bool REQUEST_WIDTH * bool)%type.
-
-	Definition cmd2string (cmd : Vector.t bool DRAM_CMD_WIDTH) : string :=
-		if (Vector.eqb bool eqb cmd [true;false]) then "ACT"
-		else if (Vector.eqb bool eqb cmd [true;true]) then "PRE" 
-		else if (Vector.eqb bool eqb cmd [false;true]) then "CAS"
-		else "NOP".
-	
-	Definition tuple2string (e : FIFO_out) : (string * N * string) :=
-		let '(full,req,empty) := e in
-		let full_str := if full then "FULL" else "NOT FULL" in
-		let empty_str := if empty then "EMPTY" else "NOT EMPTY" in
-		let req_N := Bv2N req in (full_str,req_N,empty_str).
-
-	Definition map_FIFO_out (input : seq FIFO_out)
-		:= map (tuple2string) input.
-
-	Compute simulate FullLogic [(N2Bv_sized ADDR_WIDTH 0,N2Bv_sized ADDR_WIDTH 0)].
-
-	Compute (map_FIFO_out (simulate CavaFifoQueue_t_NF_RD [
-		(true, N2Bv_sized REQUEST_WIDTH 1, false);
-		(true, N2Bv_sized REQUEST_WIDTH 2, false);
-		(true, N2Bv_sized REQUEST_WIDTH 3, true)
-		(* (false,N2Bv_sized REQUEST_WIDTH 0, true); *)
-		(* (true, N2Bv_sized REQUEST_WIDTH 3, false) *)
-		(* (true, N2Bv_sized REQUEST_WIDTH 2, false); *)
-		(* (true, N2Bv_sized REQUEST_WIDTH 3, false) *)
-	])).
-	
-	Compute (map_FIFO_out (simulate CavaFifoQueue_t_NF_RD [
-		(true, N2Bv_sized REQUEST_WIDTH 1, false);
-		(* write 1 @ 0 -> n_ w@ : 1. reads nothing, r@ : 0 (empty queue) *)
-
-		(true, N2Bv_sized REQUEST_WIDTH 2, true);
-		(* write 2 @ 1 -> n_w@ : 2 , reads 1 (r@ 		 = 0), n_r@ : 1 *)
-
-		(true, N2Bv_sized REQUEST_WIDTH 3, false);
-		(* write 3 @ 2 -> n_w@ : 3 , reads 1 (r@ - 1 = 0), n_r@ : 1 *)
-
-		(true, N2Bv_sized REQUEST_WIDTH 4, true)
-		(* write 4 @ 3 -> n_w@ : 0 , reads 2 (r@     = 1), n_r@ : 2 *)
-
-		(* (true, N2Bv_sized REQUEST_WIDTH 5, false); *)
-		(* write 5 @ 0 -> n_w@ : 1 , reads 2 (r@ - 1 = 1), n_r@ : 2 *)
-
-		(* (true, N2Bv_sized REQUEST_WIDTH 6, false); *)
-		(* R6 fails 	 -> n_w@ : 1 , reads 2 (r@ - 1 = 1), n_r@ : 2 *)
-
-		(* (true, N2Bv_sized REQUEST_WIDTH 6, true); *)
-		(* R6 fails 	 -> n_w@ : 1 , reads 3 (r@     = 1), n_r@ : 3 *)
-
-		(* (true, N2Bv_sized REQUEST_WIDTH 6, true); *)
-		(* write 6 @ 1 -> n_w@ : 2 , reads 4 (r@     = 3), n_r@ : 0 *)
-
-		(* (false, N2Bv_sized REQUEST_WIDTH 0, true); *)
-		(* no arrivals -> n_w@ : 2 , reads 5 (r@     = 0), n_r@ : 1 *)
-
-		(* (false, N2Bv_sized REQUEST_WIDTH 0, true) *)
-		(* no arrivals -> n_w@ : 2 , reads 6 (r@     = 1), n_r@ : 2 *)
-	])).
-
-	 Definition fifo_interface
-		:= sequentialInterface "fifo_interface"
-		"clk" PositiveEdge "rst" PositiveEdge
-		[mkPort "push_i" Bit; mkPort "data_i" (Vec Bit REQUEST_WIDTH); mkPort "pop_i" Bit]
-		[mkPort "full_o" Bit; mkPort "data_o" (Vec Bit REQUEST_WIDTH); mkPort "empty_o" Bit].
-
-	Definition fifo_netlist :=
-		(makeCircuitNetlist fifo_interface CavaFifoQueue_t).
-
-End CodeGeneration.
\ No newline at end of file
diff --git a/framework/CavaDRAM/CavaFIFO/CavaFIFOProperties.v b/framework/CavaDRAM/CavaFIFO/CavaFIFOProperties.v
deleted file mode 100644
index 3ab6753..0000000
--- a/framework/CavaDRAM/CavaFIFO/CavaFIFOProperties.v
+++ /dev/null
@@ -1,1654 +0,0 @@
-Set Printing Projections.
-Set Warnings "-notation-overridden,-parsing". 
-
-From CavaDRAM Require Import CavaFIFOREF CavaReqQueue CavaReqQueueProperties 
-CavaCommonInstances CavaSubtractor Step CavaSystem Memory Util UtilSM.
-From CoqDRAM Require Import FIFO.
-From Coq Require Import Program BinaryString HexString NArith.
-From Cava Require Import Cava CavaProperties Util.Vector Util.Tactics.
-From mathcomp Require Import fintype ssrZ zify ring.
-
-Section CavaFIFOProperties.
-
-	Context {signal : SignalType -> Type} {semantics : Cava signal}.
-	(* From Cava *)
-	Existing Instance CombinationalSemantics.
-	(* From CavaDRAM*)
-	Context {CAVA_SYS : CavaSystem}.
-	(* From CoqDRAM *)
-	Existing Instance REQESTOR_CFG.
-  Context {SYS_CFG      : System_configuration}.
-	Context {FIFO_CFG     : FIFO_configuration}.
-	Context {HAF					: HW_Arrival_function_t}.
-	Existing Instance ARBITER_CFG.
-	Existing Instance FIFO_implementation.
-
-	Import Memory.Properties BvectorNotations.
-	Open Scope Bvector_scope.
-
-	Definition mem_cells_ := 
-		mem_cells (Vec Bit REQUEST_WIDTH) ADDR_WIDTH (Nat.pow 2 ADDR_WIDTH) InitMem.
-
-	Lemma nth_cells_read {T W I} (ad : Bvector W) c_req def
-		(c : circuit_state (mem_cells T W (2 ^ W) I)) :
-		nth_default def (N.to_nat (Bv2N ad)) (Cells_read true (N.to_nat (Bv2N ad)) c_req c) = c_req.
-	Admitted.
-
-	Lemma nth_cells_read_ {T W I N} (ad : Bvector (Nat.log2 N)) c_req def
-		(c : circuit_state (mem_cells T W N I)) : N > 0 ->
-		nth_default def (N.to_nat (Bv2N ad)) (Cells_read true (N.to_nat (Bv2N ad)) c_req c) = c_req.
-	Proof.
-		intros Hpos; rewrite nth_default_to_list.
-		induction N; intros; [ discriminate | ].
-		rewrite leq_eqVlt in Hpos; move: Hpos => /orP [/eqP Heq | Hpos].
-		{ assert (N = 0); [ lia | ]; clear IHN Heq; subst N.
-			revert ad; rewrite Nat.log2_1; intros.
-			apply Vector.case0 with (v := ad).
-			simpl in c; destruct_products.
-			rewrite /Cells_read //= andb_true_r.
-		}
-		assert (0 < N); [ lia | ]; clear Hpos.
-		simpl in c; destruct_products; rewrite //= andb_true_r.
-		specialize (Nat.log2_succ_or N) as Hor; destruct Hor as [Hor | Hor].
-		{ revert ad; rewrite Hor; intros.
-			destruct (Nat.eqb (N.to_nat (Bv2N ad)) N) eqn:HH; set memvec := Cells_read true _ _ _.
-			{ assert (N.to_nat (Bv2N ad) = N) as H0; [ lia | ]; clear HH;
-				rewrite H0.
-				specialize (@length_to_list_shiftin (combType T) N memvec c_req) as HH.
-				assert (N = (Datatypes.length (Vector.to_list (Vector.shiftin c_req memvec))) - 1)%coq_nat; [ lia | ].
-				apply nth_last with (d := def) in H1; rewrite H1.
-				by rewrite last_shiftin. }
-			{ unfold memvec.
-				specialize (IHN (VectorDef.tl ad) c0); apply IHN in H as IH; clear IHN.
-				rewrite (Vector.eta ad) Bv2N_cons.
-				destruct (Vector.hd ad). 
-				{ rewrite N2Nat.inj_succ_double //= !Nat.add_0_r.
-					rewrite -nth_tl.
-					set adtl := N.to_nat (Bv2N (VectorDef.tl ad)).
-					fold adtl in IH.
-					admit. }
-				{ admit. }
-	Admitted.
-
-	Lemma memcell_nch (c: circuit_state mem_cells_) (wra rda : Bvector ADDR_WIDTH) c_req def:
-		wra <> rda ->
-		nth_default def (N.to_nat (Bv2N rda)) (Cells_data c) =
-		nth_default def (N.to_nat (Bv2N rda)) (Cells_read true (N.to_nat (Bv2N wra)) c_req c).
-	Admitted.
-
-	(* ----------------------------------------------------------------------- *)
-	(* Getters and state signals manipulation -------------------------------- *)
-
-	Definition State_t := circuit_state FIFOSM_.
-
-	Definition get_fields (s : State_t) :=
-	let '(_,(_,(_,(_,(_,(_,(_,_,_,mem,_,_,_,_,rda),wra)),_,(_,(_,cr)),_,_,_,_,_,cref),cnt),st)) := s
-	in (mem,rda,wra,cr,cref,cnt,st).
-
-	Definition get_st (s : State_t) :=
-	let '(_,_,_,_,_,_,st) := get_fields s in st.
-	
-	Definition get_cnt (s : State_t) :=
-	let '(_,_,_,_,_,cnt,_) := get_fields s in cnt.
-
-	Definition get_cref (s : State_t) :=
-	let '(_,_,_,_,cref,_,_) := get_fields s in cref.
-
-	Definition get_cr (s : State_t) :=
-	let '(_,_,_,cr,_,_,_) := get_fields s in cr.
-
-	Definition get_wra (s : State_t) :=
-	let '(_,_,wra,_,_,_,_) := get_fields s in wra.
-
-	Definition get_rda (s : State_t) :=
-	let '(_,rda,_,_,_,_,_) := get_fields s in rda.
-
-	Definition get_mem (s : State_t) : circuit_state memqueue' := 
-	let '(mem,_,_,_,_,_,_) := get_fields s in mem.
-
-	Definition get_reqqueue (s : State_t) : circuit_state RequestQueue' :=
-	let '(_,(_,(_,(_,cs_requeue,_,_,_,_,_,_,_,_),_),_)) := s in cs_requeue.
-
-	Create HintDb get_state.
-	Hint Unfold get_fields get_st get_cnt get_cref get_reqqueue get_addr_RequestQueue get_mem
-	get_memcells_RequestQueue get_mem_RequestQueue get_memcells get_cr : get_state.
-
-	(* --------------------------Bounding the counter ------------------- *)
-	Lemma cnt_bounded (cnt : Bvector COUNTER_WIDTH) :
-		N.to_nat (Bv2N cnt) < WAIT.
-	Proof.
-		specialize @Bv2N_upper_bound_nat with (bv := cnt) as H.
-		by rewrite /COUNTER_WIDTH WAIT_PW_2 in H.
-	Qed.
-
-	Definition Bv2cnt (cnt : Bvector COUNTER_WIDTH) : Counter_t :=
-		Ordinal (cnt_bounded cnt).
-
-	Definition cnt2Bv (cnt : Counter_t) := 
-		N2Bv_sized COUNTER_WIDTH (N.of_nat (nat_of_ord cnt)).
-
-	(* -------------------------- cref counter -------------------------- *)
-	Definition cref2Bv (cref : Counter_ref_t) := 
-		N2Bv_sized COUNTER_REF_WIDTH (N.of_nat (nat_of_ord cref)).
-
-	Lemma cref_bound (c : Counter_ref_t) :
-		c < 2 ^ COUNTER_REF_WIDTH.
-	Proof.
-		unfold COUNTER_REF_WIDTH.
-		destruct (_ == PREA_date + (WAIT - 1)) eqn:HPW2; destruct c.
-		{ simpl in *; move: HPW2 => /eqP HPW2; rewrite HPW2; lia. }
-		{ specialize (Nat.log2_spec (PREA_date + (WAIT - 1))) as h.
-			specialize WAIT_pos as Hwpos; assert ((0 < PREA_date + (WAIT - 1))%coq_nat) as H0; [ lia | ].
-			apply h in H0; destruct H0 as [_ H1]; move: H1 => /ltP H1.
-			set aux := 2 ^ (Nat.log2 (PREA_date + (WAIT - 1))).+1; simpl; unfold aux; clear aux; lia.
-		}
-	Qed.
-
-	Lemma prea_date_bound :
-		PREA_date -1 < 2 ^ COUNTER_REF_WIDTH.
-	Proof.
-		unfold COUNTER_REF_WIDTH.
-		destruct (_ == PREA_date + (WAIT - 1)) eqn:HPW2.
-		{ simpl in *; move: HPW2 => /eqP HPW2; rewrite HPW2; specialize WAIT_gt_one; lia. }
-		{ specialize (Nat.log2_spec (PREA_date + (WAIT - 1))) as h.
-			assert ((0 < PREA_date + (WAIT - 1))%coq_nat) as H0; 
-			specialize WAIT_gt_one as Hwt1; [ lia | ]; clear Hwt1.
-			apply h in H0; destruct H0 as [H0 H1]; lia.
-		}
-	Qed.
-
-	Lemma wait_bound :
-		WAIT - 1 < 2 ^ COUNTER_REF_WIDTH.
-	Proof.
-		unfold COUNTER_REF_WIDTH.
-		destruct (_ == PREA_date + (WAIT - 1)) eqn:HPW2.
-		{ simpl in *; move: HPW2 => /eqP HPW2; rewrite HPW2. specialize PREA_date_pos; lia. }
-		{ specialize (Nat.log2_spec (PREA_date + (WAIT - 1))) as h.
-			assert ((0 < PREA_date + (WAIT - 1))%coq_nat) as H0; 
-			specialize WAIT_gt_one as Hwt1; [ lia | ]; clear Hwt1.
-			apply h in H0; destruct H0 as [H0 H1]; lia.
-		}
-	Qed.
-
-	Lemma cref_preadate_false (c : Counter_ref_t) :
-		(cref2Bv c =? CNT_REF_PREA) = false <->
-		(nat_of_ord c == PREA_date - 1) = false.
-	Proof.
-		split. {
-			unfold cref2Bv, CNT_REF_PREA; intros.
-			apply BVEq_iff_neq in H; rewrite bitvec_literal_correct in H.
-			apply N2Bv_sized_neq_if in H.
-			apply of_nat_neq in H.
-			by apply /eqP. }
-		{ intros.
-			apply BVEq_iff_neq.
-			rewrite /cref2Bv /CNT_REF_PREA bitvec_literal_correct.
-			apply N2Bv_sized_neq_iff; [ | | move: H => /eqP H; by rewrite Nat2N.inj_iff ];
-			apply /leP; apply N.size_nat_le_nat; apply /leP;
-			[ apply cref_bound | apply prea_date_bound ]. }
-	Qed.
-
-	Lemma cref_preadate_true (c : Counter_ref_t) :
-		(cref2Bv c =? CNT_REF_PREA) = true <->
-		(nat_of_ord c == PREA_date - 1) = true.
-	Proof.
-		split.
-		{ unfold cref2Bv, CNT_REF_PREA; intros.
-			apply BVEq_iff_eq in H; rewrite bitvec_literal_correct in H.
-			apply N2Bv_sized_eq_iff in H;
-			[ apply Nat2N.inj in H; rewrite H; by apply /eqP | | ];
-			apply N.size_nat_le_nat; apply /leP;
-			[ apply cref_bound | apply prea_date_bound ].
-		} 
-		{ intros Href_prea; move: Href_prea => /eqP Href_prea; apply BVEq_iff_eq.
-			rewrite /cref2Bv /CNT_REF_PREA bitvec_literal_correct; f_equal.
-			by rewrite Href_prea. 
-		}
-	Qed.
-
-	Lemma CrefPREA_lt_CNT_REF_PREA:
-		CrefPREA_lt CNT_REF_PREA = false.
-	Proof.
-		cbv [CrefPREA_lt]; simpl_ident.
-		unfold greaterThanOrEqual; simpl_ident; unfold greaterThanOrEqualBool.
-		apply /negbF.
-		rewrite {1}/CNT_REF_PREA; rewrite !bitvec_literal_correct.
-		apply /N.leb_spec0; rewrite /CNT_REF_PREA /CNT_REF_WAIT !bitvec_literal_correct.
-		rewrite !Bv2N_N2Bv_sized. { apply N.le_add_r. }
-		all: apply to_nat_lt_pow; try rewrite -Nat2N.inj_add; rewrite Nat2N.id.
-		2 : { 
-			unfold COUNTER_REF_WIDTH; destruct (_ == PREA_date + (WAIT - 1)) eqn:Hpw2.
-			{ move: Hpw2 => /eqP Hpw2; rewrite Hpw2;
-				specialize WAIT_gt_one; specialize PREA_date_gt_one; lia. }
-			{ specialize (Nat.log2_spec (PREA_date + (WAIT - 1))) as h.
-				specialize WAIT_gt_one as Hwpos; assert ((0 < PREA_date + (WAIT - 1))%coq_nat) as H0; [ lia | ].
-				apply h in H0; destruct H0 as [H0 H1]; lia.
-			}
-		}
-		all: try (apply wait_bound || apply prea_date_bound).
-	Qed.
-
-	Lemma CrefPREA_lt_CNT_REF_WAIT cref:
-		(cref2Bv cref =? CNT_REF_PREA) = false -> (cref + WAIT < PREA_date) = true ->
-		CrefPREA_lt (cref2Bv cref) = true.
-	Proof.
-		intros Href_prea Href_service.
-		rewrite /CrefPREA_lt; simpl_ident; rewrite /greaterThanOrEqual; simpl_ident.
-		rewrite /greaterThanOrEqualBool /CNT_REF_WAIT /CNT_REF_PREA !bitvec_literal_correct !Bv2N_N2Bv_sized.
-		{ destruct (~~ _) eqn:Hbug; [ done | ].
-			apply negbFE in Hbug; move: Hbug => /N.leb_spec0 Hbug.
-			assert (cref + (WAIT - 1) < (PREA_date - 1)).
-			{ rewrite addnBA; [ | exact WAIT_pos].
-				rewrite subn1 -ltnS prednK; [ | by rewrite addn_gt0 WAIT_pos orb_true_r ].
-				rewrite subn1 prednK; [ | exact PREA_date_pos].
-				by rewrite Href_service.
-			}
-			move: H => /ltP H; apply N_lt_inj in H.
-			contradict Hbug; apply N.nle_gt; by rewrite -Nat2N.inj_add.
-		}
-		all: apply to_nat_lt_pow; try rewrite -Nat2N.inj_add; rewrite Nat2N.id.
-		all: try (apply cref_bound || apply wait_bound || apply prea_date_bound).
-		{ unfold COUNTER_REF_WIDTH.
-			destruct (_ == PREA_date + (WAIT - 1)) eqn:Heq.
-			{ move: Heq => /eqP Heq; rewrite Heq.
-				destruct cref; simpl in *; lia. }
-			{ destruct cref.
-				set aux := 2 ^ (Nat.log2 (PREA_date + (WAIT - 1))).+1; simpl.
-				assert ((m + (WAIT - 1))%coq_nat < PREA_date + (WAIT - 1)); [ lia | ].
-				specialize (Nat.log2_spec (PREA_date + (WAIT - 1))) as HH; lia.
-			}
-		}
-	Qed.
-
-	Lemma CrefPREA_lt_CNT_REF_WAIT_F (c1 : Counter_ref_t) :
-		(c1 + WAIT < PREA_date) = false -> 
-		CrefPREA_lt (cref2Bv c1) = false.
-	Proof.
-		intros; 
-		rewrite /CrefPREA_lt; simpl_ident; rewrite /greaterThanOrEqual; simpl_ident.
-		rewrite /greaterThanOrEqualBool /CNT_REF_WAIT /CNT_REF_PREA !bitvec_literal_correct !Bv2N_N2Bv_sized.
-		{ apply negb_false_iff; apply /N.leb_spec0; lia. }
-		all: apply to_nat_lt_pow; try rewrite -Nat2N.inj_add; rewrite Nat2N.id.
-		all: try (apply cref_bound || apply wait_bound || apply prea_date_bound).
-		all: try (apply cref_bound || apply wait_bound || apply prea_date_bound).
-		{ unfold COUNTER_REF_WIDTH.
-			destruct (_ == PREA_date + (WAIT - 1)) eqn:Heq.
-			{ move: Heq => /eqP Heq; rewrite Heq.
-				destruct c1; simpl in *; lia. }
-			{ destruct c1.
-				set aux := 2 ^ (Nat.log2 (PREA_date + (WAIT - 1))).+1; simpl.
-				assert ((m + (WAIT - 1))%coq_nat < PREA_date + (WAIT - 1)); [ lia | ].
-				specialize (Nat.log2_spec (PREA_date + (WAIT - 1))) as HH; lia.
-			}
-		}
-	Qed.
-
-	(* -------------------------- Predicates -------------------------------- *)
-	Program Definition EqReq (r : Request_t) (r' : Bvector REQUEST_WIDTH) : bool.
-	Admitted.
-
-	Lemma EqReqNil : EqReq nullreq REQUEST_NIL = true.
-	Admitted.
-
-	Hypothesis HaltIfFull : forall t c,
-		let wra := get_wra c in
-		let rda := get_rda c in
-		if (HW_Arrival_at t != []) then ~~ fullQueue wra rda else true.
-
-	Definition EqCmd (f_cmd : Command_kind_t) (c_cmd : Bvector DRAM_CMD_WIDTH) : bool :=
-		match f_cmd with
-			| ACT => (c_cmd =? ACT_VEC)
-			| PRE => (c_cmd =? PRE_VEC)
-			| PREA => (c_cmd =? PREA_VEC)
-			| CRD => (c_cmd =? RD_VEC)
-			| CWR => (c_cmd =? WR_VEC)
-			| REF => (c_cmd =? REF_VEC)
-			| NOP => (c_cmd =? NOP_VEC)
-		end.
-
-	Fixpoint EqQueue (P : Requests_t) (wra rda : Bvector ADDR_WIDTH) :=
-		match P with
-			| [::] => (wra =? rda)
-			| x :: x0 => negb (wra =? rda) && (EqQueue x0 wra (N2Bv_sized ADDR_WIDTH (Bv2N rda + 1)))
-		end.
-
-	Lemma EqQueue_diff_adr r0 r1 wra rda:
-		EqQueue (r0 :: r1) wra rda -> wra <> rda.
-	Proof.
-		simpl; intros; move: H => /andP [Hd H];
-		by move: Hd => /negPf Hd; apply BVEq_iff_neq in Hd.
-	Qed.
-
-	(* ----------------------------------------- *)
-	Lemma leN_leqn a b:
-		leq (S (addn (nat_of_bin a) 1)) (nat_of_bin b) -> N.lt (N.add a 1) b.
-	Proof. lia. Qed.
-
-	Lemma ltN_ltn a b:
-		leq (S (nat_of_bin a)) (nat_of_bin b) <-> N.lt a b.
-	Proof. lia. Qed.
-
-	Lemma succ_double_inj_neq a b:
-		a <> b -> N.succ_double a <> N.succ_double b.
-	Proof.
-		intros; rewrite !N.succ_double_spec; lia.
-	Qed.
-
-	Lemma succ_double_double_inj_neq a b:
-		a <> b -> N.succ_double a <> N.double b.
-	Proof.
-		intros; rewrite N.succ_double_spec N.double_spec; lia.
-	Qed.
-
-	Lemma neq_nat_of_bin (a b : N) :
-		not (@eq N a b) <->
-		not (@eq nat (nat_of_bin a) (nat_of_bin b)).
-	Proof. lia. Qed.
-
-	Lemma cons_neq_BV {n} (a : bool) (x y: Bvector n) :
-		((a :: x)%vector) <> ((a :: y) %vector) -> x <> y.
-	Admitted.
-
-	Lemma Bv2N_neq_inj {W} (a b : Bvector W):
-		a <> b -> Bv2N a <> Bv2N b.
-	Proof.
-		intros; induction W; [ admit | ].
-		rewrite (Vector.eta a) (Vector.eta b); simpl;
-		destruct (Vector.hd a) eqn:Ha, (Vector.hd b) eqn:Hb;
-		specialize (IHW (VectorDef.tl a) (VectorDef.tl b)).
-		{ assert ((VectorDef.tl a) <> (VectorDef.tl b)) as H0.
-			{ rewrite (Vector.eta a) (Vector.eta b) in H; rewrite Ha Hb in H. 
-				by apply cons_neq_BV in H. }
-			apply IHW in H0; by apply succ_double_inj_neq. }
-		all: admit.
-	Admitted.
-
-	(* Use in EqQueue_aux *)
-	Lemma Bvector_neq_N2Bv_sized_p1_neq {W} (a b : Bvector W) :
-		W > 0 -> a <> b -> 
-		N2Bv_sized W (Bv2N a + 1) <> N2Bv_sized W (Bv2N b + 1).
-	Proof.
-		intros.
-		specialize (@Bv2N_upper_bound_nat W b) as Hub_b.
-		specialize (@Bv2N_upper_bound_nat W a) as Hub_a.
-		specialize (N2Bv_sized_neq_iff W (Bv2N a) (Bv2N b)) as Hneq.
-		apply Bv2N_neq_inj in H0; apply Hneq in H0; try (apply /leP; apply N.size_nat_le);
-		[ | by apply to_nat_lt_pow in Hub_a | by apply to_nat_lt_pow in Hub_b]; clear Hneq.
-		rewrite !N.add_1_r.
-		(* apply N2Bv_sized_neq_iff. *)
-		specialize (N2Bv_sized_neq_succ W (Bv2N a)) as Hsucc_a.
-		specialize (N2Bv_sized_neq_succ W (Bv2N b)) as Hsucc_b.
-		apply Hsucc_a in H as Ha'; clear Hsucc_a. 
-		apply Hsucc_b in H as Hb'; clear Hsucc_b.
-	Admitted.
-
-	(* Use in EqQueue_aux *)
-	Lemma notfull_rd (wr rd : Bvector ADDR_WIDTH) :
-		let rdp1 := N2Bv_sized ADDR_WIDTH (Bv2N rd + 1) in
-		wr <> rd -> wr <> rdp1 -> ~~ fullQueue wr rd ->
-		~~ fullQueue wr rdp1.
-	Proof.
-		intros rdp1 Hdif1 Hdif2 HF; unfold fullQueue in HF.
-		destruct (leq _ _) eqn:Hleq.
-		{ rewrite leq_eqVlt in Hleq; move: Hleq => /orP [/eqP Heq | Hleq].
-			{ admit. (* impossible *)}
-			unfold fullQueue.
-			destruct (Bv2N rdp1 <= _) eqn:Hleq2.
-			{ apply /negPf; apply Nat.eqb_neq.
-				specialize (N.lt_neq (Bv2N wr - Bv2N rdp1) (N.of_nat QUEUE_MAX_SIZE - 1)) as H.
-				apply neq_nat_of_bin; apply H; clear H.
-				move: HF => /negPf HF; apply Nat.eqb_neq in HF.
-				apply neq_nat_of_bin in HF.
-				apply (N.lt_gt_cases (Bv2N wr - Bv2N rd) (N.of_nat QUEUE_MAX_SIZE - 1)) in HF as HF';
-				destruct HF' as [H0 | H1].
-				2: admit. (* Impossible, Bv2N wr - Bv2N rd cannot be bigger than QMS *)
-				apply (N.lt_trans (Bv2N wr - Bv2N rdp1) (Bv2N wr - Bv2N rd) (N.of_nat QUEUE_MAX_SIZE - 1));
-				[ | exact H0 ].
-				assert (N.lt (Bv2N rd) (Bv2N rdp1)); [ admit | ].
-				lia.
-			}
-			{ admit. }
-		}
-		{ admit. }
-	Admitted.
-
-	(* Use in EqQueue_aux *)
-	Lemma notfull_adrs (wr rd : Bvector ADDR_WIDTH) :
-		let rdp1 := N2Bv_sized ADDR_WIDTH (Bv2N rd + 1) in
-		let wrp1 := N2Bv_sized ADDR_WIDTH (Bv2N wr + 1) in
-		wr <> rd -> ~~ fullQueue wr rd ->
-		wrp1 <> rd.
-	Proof.
-		intros rdp1 wrp1 Hdif NF; unfold fullQueue in NF.
-		destruct (leq _ _) eqn:Hleq.
-		{ move: NF => /negPf NF; apply Nat.eqb_neq in NF.
-			rewrite leq_eqVlt in Hleq; move: Hleq => /orP [/eqP Hbug | Hltn].
-			{ admit. (* Impossible *)}
-			apply neq_nat_of_bin in NF.
-			apply (N.lt_gt_cases (Bv2N wr - Bv2N rd) (N.of_nat QUEUE_MAX_SIZE - 1)) in NF as NF';
-			destruct NF' as [NF'| _].
-			2: admit. (* Impossible *)
-			unfold wrp1.
-			specialize (N2Bv_sized_Bv2N ADDR_WIDTH rd) as HH; rewrite -HH; clear HH.
-			apply N2Bv_sized_neq_iff;
-			admit.
-		}
-		{ admit. }
-	Admitted.
-
-	Lemma EqQueue_aux wra rda r0 r1 r:
-		~~ fullQueue wra rda -> wra <> rda ->
-		EqQueue (r0 :: r1)%SEQ wra rda ->
-		EqQueue ((r0 :: r1)%SEQ ++ [r])%SEQ (N2Bv_sized ADDR_WIDTH (Bv2N wra + 1)) rda.
-	Proof.
-		intros NFULL Hadr HQ; rewrite //=.
-		simpl in HQ; move: HQ => /andP [_ HQ].
-		revert HQ Hadr NFULL; generalize wra rda; induction r1; intros; simpl in HQ.
-		{ apply /andP; split.
-			{ unfold fullQueue in NFULL.
-				move: NFULL; apply contraPN; intros; apply /negP; rewrite negb_involutive.
-				specialize ADDR_WIDTH_pos as Hawp; move: Hawp => /ltP Hawp.
-				destruct (Bv2N rda0 <= _) eqn:Hleq.
-				{ apply BVEq_iff_eq in HQ as HQ'; rewrite HQ' in H; clear HQ'.
-					apply Bvector_wrap in H; [ | apply /ltP; exact ADDR_WIDTH_pos ].
-					apply log2_eq1_pw2 in H as H2 ; [ | by rewrite QUEUE_MAX_SIZE_PW2 ]; clear H.
-					rewrite H2; simpl ((N.of_nat 2 - 1)%N); simpl (N.add (Npos _) (Npos _)).
-					apply BVEq_iff_eq in HQ; rewrite HQ Bv2N_N2Bv_sized; [ lia | ].
-					apply /N.ltb_spec0.
-					destruct ((Bv2N rda0 + 1 <? 2 ^ N.of_nat ADDR_WIDTH)%N) eqn:Hcont; [ done | ].
-					move: Hcont => /negP /negP Hcont; rewrite -N.leb_antisym in Hcont.
-					move: Hcont => /N.leb_spec0 Hcont.
-					unfold ADDR_WIDTH in Hcont; rewrite QUEUE_MAX_SIZE_PW2_N in Hcont.
-					rewrite leq_eqVlt in Hleq; move: Hleq => /orP [/eqP Hbug | Hltn].
-					{ specialize (@Bv2N_inj ADDR_WIDTH rda0 wra0) as HH.
-						apply Bv_eq_translation in Hbug; apply HH in Hbug; by rewrite Hbug in Hadr. }
-					{ apply N.le_lteq in Hcont; destruct Hcont as [Hcont0 | Hcont1];
-						specialize (@Bv2N_upper_bound_nat ADDR_WIDTH wra0) as H;
-						apply Bv_ltn_translation in Hltn;
-						apply to_nat_lt_pow in H;
-						rewrite /ADDR_WIDTH QUEUE_MAX_SIZE_PW2_N in H;
-						apply lt_trans_le with (p := N.of_nat QUEUE_MAX_SIZE) in Hltn; try by apply ltN_ltn.
-						{ contradict Hcont0; apply N.lt_asymm; by apply leN_leqn in Hltn. }
-						{ contradict Hcont1; apply N.neq_sym; apply N.lt_neq; by apply leN_leqn. }
-					}
-				}
-				{ apply BVEq_iff_eq in H; rewrite -H Bv2N_N2Bv_sized; [ lia | ].
-					move: Hleq => /negP /negP Hleq; rewrite -ltnNge in Hleq; rename Hleq into Hltn.
-					apply /N.ltb_spec0.
-					destruct ((Bv2N wra0 + 1 <? 2 ^ N.of_nat ADDR_WIDTH)%N) eqn:Hcont; [ done | ].
-					unfold ADDR_WIDTH in Hcont; rewrite QUEUE_MAX_SIZE_PW2_N in Hcont.
-					move: Hcont => /negP /negP Hcont; rewrite -N.leb_antisym in Hcont; move: Hcont => /N.leb_spec0 Hcont.
-					apply N.le_lteq in Hcont; destruct Hcont as [Hcont0 | Hcont1];
-					specialize (@Bv2N_upper_bound_nat ADDR_WIDTH rda0) as Hub;
-					apply Bv_ltn_translation in Hltn;
-					apply to_nat_lt_pow in Hub;
-					rewrite /ADDR_WIDTH QUEUE_MAX_SIZE_PW2_N in Hub;
-					apply lt_trans_le with (p := N.of_nat QUEUE_MAX_SIZE) in Hltn; try by apply ltN_ltn.
-					{ contradict Hcont0; apply N.lt_asymm; by apply leN_leqn in Hltn. }
-					{ contradict Hcont1; apply N.neq_sym; apply N.lt_neq; by apply leN_leqn. }
-				}
-			}
-			{ simpl; apply BVEq_iff_eq in HQ; apply /andP; split. 
-				{ apply /negPf; apply BVEq_iff_neq.
-					apply Bvector_neq_N2Bv_sized_p1_neq; [ apply /ltP; exact ADDR_WIDTH_pos | done]. }
-				{ rewrite HQ; by apply BVEq_iff_eq. }
-			}
-		}
-		move: HQ => /andP [neq HQ].
-		specialize (IHr1 wra0 (N2Bv_sized ADDR_WIDTH (Bv2N rda0 + 1))); apply IHr1 in HQ as IH; clear IHr1.
-		3: {
-			move: neq => /negPf neq; apply BVEq_iff_neq in neq.
-			apply notfull_rd; done.
-		}
-		2: by move: neq => /negPf neq; apply BVEq_iff_neq in neq.
-		simpl; apply /andP; split.
-		{ move: IH => /andP [neq_ IH].
-			apply /negPf; apply BVEq_iff_neq.
-			apply notfull_adrs; try done.
-		}
-		exact IH.
-	Qed.
-
-	Fixpoint EqMem_ {W} (P : Requests_t) (rda : Bvector W)
-		(memcells_vec : Vector.t (Bvector REQUEST_WIDTH) (Nat.pow 2 W)) : bool :=
-		match P with
-			| [::] => true
-			| x :: x0 =>
-				let nrda := N2Bv_sized W (Bv2N rda + 1) in
-				let s := nth_default REQUEST_NIL (N.to_nat (Bv2N rda)) memcells_vec in
-				(EqReq x s) && (EqMem_ x0 nrda memcells_vec)
-		end.
-
-	Lemma EqMem_rcons r1 (rda wra : Bvector ADDR_WIDTH) c R (c_req : combType (Vec Bit REQUEST_WIDTH)) :
-		EqQueue r1 wra rda ->
-		EqMem_ r1 rda (@Cells_data (Vec Bit REQUEST_WIDTH) ADDR_WIDTH (Nat.pow 2 ADDR_WIDTH) InitMem c) -> 
-		EqReq R c_req ->
-		EqMem_ (r1 ++ [R])%SEQ rda (Cells_read true (N.to_nat (Bv2N wra)) c_req c).
-	Proof.
-		intros HQ Mem EqR; fold mem_cells_ in c; rewrite cats1.
-		revert Mem HQ; generalize wra rda; induction r1; intros.
-		{ simpl; rewrite andb_true_r; simpl in HQ; apply BVEq_iff_eq in HQ; rewrite HQ.
-			rewrite VectorSpec.map_id.
-			unfold ADDR_WIDTH in wra,rda.
-			specialize (@nth_cells_read (Vec Bit REQUEST_WIDTH) ADDR_WIDTH InitMem
-			rda0 c_req REQUEST_NIL) as HH; rewrite /REQUEST_NIL bitvec_literal_correct //= in HH;
-			unfold mem_cells_ in c; by rewrite HH. }
-		simpl in Mem,HQ; simpl.
-		move: Mem => /andP [EqR_ Mem]; apply /andP; split.
-		{ move: HQ => /andP [/negPf Heq HQ];
-			apply BVEq_iff_neq in Heq; rewrite VectorSpec.map_id; rewrite VectorSpec.map_id in EqR_.
-			rewrite -memcell_nch; done. 
-		}
-		{ move: HQ => /andP [neq HQ].
-			specialize (IHr1 wra0 (N2Bv_sized ADDR_WIDTH (Bv2N rda0 + 1))); apply IHr1; done. 
-		}	
-	Qed.
-
-	(* Just use the circuit directly <-> circuit does the work directly *)
-	Definition EqMem (P : Requests_t) rda (mem : circuit_state RequestQueue') :=
-		let memcells_vec := Cells_data (get_memcells_RequestQueue mem) in
-		EqMem_ P rda memcells_vec.
-		
-	Definition State_Eq (fram_state : FIFO_state_t) (cava_state : State_t) : bool :=
-		let s 		:= get_st cava_state 	 in
-		let c' 		:= get_cnt cava_state  in  
-		let cref' := get_cref cava_state in
-		let r' 		:= get_cr cava_state 	 in
-		let RQ		:= get_reqqueue cava_state in
-		let wra 	:= fst (get_addr_RequestQueue RQ) in
-		let rda 	:= snd (get_addr_RequestQueue RQ) in
-		match fram_state with
-			| IDLE c cref P =>
-				(s =? STATE_IDLE_VEC) && (c' =? cnt2Bv c) && (cref' =? cref2Bv cref) && 
-				(EqMem P rda RQ) && (EqQueue P wra rda)
-			| RUNNING c cref P r => 
-  			(s =? STATE_RUN_VEC) && (c' =? cnt2Bv c) && (cref' =? cref2Bv cref) && (EqMem P rda RQ) && 
-				(EqQueue P wra rda) && (EqReq r r')
-			| REFRESHING cref P =>
-				(s =? STATE_REF_VEC) && (cref' =? cref2Bv cref) && 
-				(EqMem P rda RQ) && (EqQueue P wra rda)
-		end.
-
-	(* -------------- Proofs about CmdGen ------------------------------- *)
-	Lemma CmdGen_equiv_idle_to_idle_E (c : circuit_state CmdGen) cnt cref:
-		(cref =? CNT_REF_PREA) = false ->
-		exists c', step CmdGen c (STATE_IDLE_VEC,true,cnt,cref,REQUEST_NIL) =
-		(c',NOP_VEC).
-	Proof.
-		intros H; simpl in c; destruct_products.
-		eapply ex_intro.
-		cbv [CmdGen]; cbn [step fst snd].
-		simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		fast_simpl_bool; simpl.
-		cbv [CrefPREA_eq].
-		apply BVEq_iff_neq in H.
-		specialize @CavaPreludeProperties.eqb_neq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		apply HH in H; rewrite H VectorSpec.map_id; reflexivity.
-	Qed.
-
-	Lemma CmdGen_equiv_idle_to_idle (c : circuit_state CmdGen) cnt cref:
-		(cref2Bv cref =? CNT_REF_PREA) = false ->
-		(cref + WAIT < PREA_date) = false ->
-		exists c', step CmdGen c (STATE_IDLE_VEC,false,cnt,(cref2Bv cref),REQUEST_NIL) =
-		(c',NOP_VEC).
-	Proof.
-		intros H Href_service; simpl in c; destruct_products; eapply ex_intro.
-		cbv [CmdGen]; cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		fast_simpl_bool; simpl.
-		cbv [CrefPREA_eq]; apply BVEq_iff_neq in H.
-		specialize @CavaPreludeProperties.eqb_neq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		apply HH in H; rewrite H !VectorSpec.map_id.
-		rewrite CrefPREA_lt_CNT_REF_WAIT_F; done.
-	Qed.
-
-	Lemma CmdGen_equiv_idle_to_ref (c : circuit_state CmdGen) cnt cref e:
-		(cref =? CNT_REF_PREA) = true ->
-		exists c', step CmdGen c (STATE_IDLE_VEC,e,cnt,cref,REQUEST_NIL) = (c',PREA_VEC).
-	Proof.
-		intros; simpl in c; destruct_products; eapply ex_intro.
-		cbv [CmdGen]; cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		fast_simpl_bool; simpl; rewrite VectorSpec.map_id.
-		apply BVEq_iff_eq in H; subst cref; rewrite CrefPREA_lt_CNT_REF_PREA !VectorSpec.map_id.
-		rewrite andb_false_r; rewrite /CrefPREA_eq.
-		specialize @CavaPreludeProperties.eqb_eq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		assert (CNT_REF_PREA = CNT_REF_PREA); [done | ]; apply HH in H; by rewrite H.
-	Qed.
-
-	Lemma CmdGen_equiv_idle_to_running (c : circuit_state CmdGen) cnt cref tr:
-		(cref2Bv cref =? CNT_REF_PREA) = false ->
-		(cref + WAIT < PREA_date) = true ->
-		exists c', step CmdGen c (STATE_IDLE_VEC,false,cnt,(cref2Bv cref),tr) = (c',PRE_VEC).
-	Proof.
-		intros; simpl in c; destruct_products; eapply ex_intro.
-		cbv [CmdGen]; cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		fast_simpl_bool; simpl; rewrite !VectorSpec.map_id.
-		rewrite CrefPREA_lt_CNT_REF_WAIT; done.
-	Qed.
-	(* ------------------------------------------------------------------ *)
-
-	(* -------------- Proofs about NextCR ------------------------------- *)
-	Lemma NextCR_equiv (c : circuit_state NextCR) cnt cref tr:
-		exists c', step NextCR c (STATE_IDLE_VEC,true,cnt,cref,tr) = 
-		(c',REQUEST_NIL).
-	Proof.
-		simpl in c; destruct_products.
-		eapply ex_intro.
-		cbv [NextCR LoopInit]; cbn [step fst snd].
-		simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		fast_simpl_bool; by simpl.
-	Qed.
-
-	Lemma NextCR_equiv_IDLE_NE_PREA c cnt cref tr:
-		(cref =? CNT_REF_PREA) = true ->
-		exists c', step NextCR c (STATE_IDLE_VEC,false,cnt,cref,tr) =
-		(c',REQUEST_NIL).
-	Proof.
-		intros; simpl in c; destruct_products; eapply ex_intro.
-		cbv [NextCR LoopInit]; cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		rewrite negb_false andb_true_l; rewrite /Srun //= VectorSpec.map_id.
-		apply BVEq_iff_eq in H; subst cref.
-		by rewrite CrefPREA_lt_CNT_REF_PREA.
-	Qed.
-
-	Lemma NextCR_equiv_IDLE_IDLE c cnt (cref : Counter_ref_t) tr:
-		(cref + WAIT < PREA_date) = false ->
-		exists c', step NextCR c (STATE_IDLE_VEC,false,cnt,cref2Bv cref,tr) =
-		(c',REQUEST_NIL).
-	Proof.
-		intros Href_service; simpl in c; destruct_products; eapply ex_intro.
-		cbv [NextCR LoopInit]; cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		rewrite negb_false andb_true_l; rewrite /Srun //= VectorSpec.map_id.
-		rewrite CrefPREA_lt_CNT_REF_WAIT_F; done.
-	Qed.
-
-	Lemma NextCR_equiv_IDLE_RUNNING c cnt (cref : Counter_ref_t) tr:
-		(cref2Bv cref =? CNT_REF_PREA) = false ->
-		(cref + WAIT < PREA_date) = true ->
-		exists c',
-		step NextCR c (STATE_IDLE_VEC,false,cnt,cref2Bv cref,tr) = (c',tr) /\
-		(snd (snd c')) = tr.
-	Proof.	
-		intros Href_service Href_prea; simpl in c; destruct_products; eapply ex_intro.
-		cbv [NextCR LoopInit]; cbn [step fst snd]; simpl_ident.
-		rewrite negb_false andb_true_l; rewrite /Srun //= VectorSpec.map_id.
-		rewrite CrefPREA_lt_CNT_REF_WAIT; done.
-	Qed.
-	(* ------------------------------------------------------------------ *)
-
-	Create HintDb update.
-	Lemma Sidle_true :
-		Sidle STATE_IDLE_VEC = true.
-	Proof.
-		apply CavaPreludeProperties.eqb_refl.
-	Qed.
-	Hint Rewrite @Sidle_true : update.
-
-	Lemma Sref_idle_false :
-		Sref STATE_IDLE_VEC = false.
-	Proof.
-		by apply CavaPreludeProperties.eqb_neq.
-	Qed.
-	Hint Rewrite @Sref_idle_false : update.
-
-	Lemma cnt_equiv (cnt : Bvector COUNTER_WIDTH) :
-		(if CeqWAIT cnt then Bvect_false COUNTER_WIDTH
-		else N2Bv_sized COUNTER_WIDTH (Bv2N cnt + 1)) = cnt2Bv (Next_cycle (Bv2cnt cnt)).
-	Proof.
-		cbv [CeqWAIT].
-		destruct (CavaPrelude.eqb (cnt, CNT_WAIT)) eqn:Heq; rewrite Heq.
-		{ specialize @CavaPreludeProperties.eqb_eq with (t := Vec Bit COUNTER_WIDTH) (x := cnt) as H.
-			apply H in Heq; clear H.
-			unfold Next_cycle; set (Hc := (Bv2cnt cnt).+1 < WAIT); dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-			{ rewrite /CNT_WAIT bitvec_literal_correct in Heq. 
-				rewrite Heq /Bv2cnt //= Bv2N_N2Bv_sized in x.
-					2: { 
-						rewrite /COUNTER_WIDTH; have id := (N2Nat.id 2).
-						rewrite -id Nat2N.inj_pow //= /Pos.to_nat //= WAIT_PW_2.
-						apply: N_lt_inj; apply /ltP; by rewrite subn1 ltn_predL WAIT_pos. 
-					}
-				rewrite Nat2N.id subn1 prednK in x; [ | exact WAIT_pos ]; by rewrite ltnn in x.
-			}
-			{ unfold cnt2Bv,OCycle0; by simpl. }}
-		{ unfold Next_cycle; set (Hc := (Bv2cnt cnt).+1 < WAIT); dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-			{ unfold cnt2Bv; apply f_equal; simpl.
-				rewrite N.add_1_r -(N.succ_pos_pred (Pos.of_succ_nat (N.to_nat (Bv2N cnt)))).
-				apply f_equal; by rewrite predN_of_succ_nat. }
-			{ apply ltn_gt in e,x.
-				rewrite leq_eqVlt in e; move: e => /orP [/eqP e | e].
-				{	have HH := (@eqb_iff_neq (Vec Bit (@COUNTER_WIDTH SYS_CFG FIFO_CFG))).
-					apply HH in Heq. rewrite /CNT_WAIT bitvec_literal_correct in Heq;
-					rewrite -(N2Bv_sized_Bv2N (@COUNTER_WIDTH SYS_CFG FIFO_CFG) cnt) in Heq.
-					apply N2Bv_sized_neq_if in Heq.
-					by rewrite e subn1 -pred_Sn N2Nat.id in Heq. }
-				{ specialize ltn_ord with  (n := @WAIT SYS_CFG FIFO_CFG) (i := Ordinal (cnt_bounded cnt)) as H.
-					rewrite //= in H.
-					contradict H; apply /negP; by rewrite -ltnNge. 
-				}
-			}
-		}
-	Qed.
-
-	(* -------------- Proofs about Update ------------------------------- *)
-	Lemma Update_equiv_idle_idle_E (c : circuit_state Update) cnt cref :
-		(cref =? CNT_REF_PREA) = false ->
-		let nc := cnt2Bv (Next_cycle (Bv2cnt cnt)) in
-		let ncref := N2Bv_sized COUNTER_REF_WIDTH (Bv2N cref + 1) in
-		exists c', step Update_ c (STATE_IDLE_VEC,true,cnt,cref) =
-		(c',(STATE_IDLE_VEC,nc,ncref)).
-	Proof.
-		intros Hcref Hcnt; simpl in c; eapply ex_intro.
-		cbv [cnt2Bv]; unfold Hcnt; clear Hcnt.
-		cbv [Update_ Update_s Update_c Update_cref].
-		cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		autorewrite with update; vm_compute (false && _).
-		apply BVEq_iff_neq in Hcref.
-		specialize @CavaPreludeProperties.eqb_neq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		apply pair_equal_spec; split.
-		2: { 
-			rewrite orb_false_l andb_true_l.
-			rewrite /CrefPREA_eq; apply HH in Hcref; by rewrite Hcref.
-		}
-		cbv [CrefPREA_eq]; apply HH in Hcref as Hcref'; rewrite Hcref';
-		vm_compute (false || true && false); simpl; rewrite !VectorSpec.map_id andb_false_r.
-		apply pair_equal_spec; split; [ done | ]. 
-		vm_compute (orb false false); rewrite orb_false_r; by specialize (cnt_equiv cnt).
-	Qed.
-
-	Lemma Update_equiv_idle_idle (c : circuit_state Update) cnt cref :
-		(cref2Bv cref =? CNT_REF_PREA) = false ->
-		(cref + WAIT < PREA_date) = false ->
-		let nc := cnt2Bv (Next_cycle (Bv2cnt cnt)) in
-		let ncref := N2Bv_sized COUNTER_REF_WIDTH (Bv2N (cref2Bv cref) + 1) in
-		exists c', step Update_ c (STATE_IDLE_VEC,false,cnt,(cref2Bv cref)) =
-		(c',(STATE_IDLE_VEC,nc,ncref)).
-	Proof.
-		intros Hcref Href_service Hcnt; simpl in c; eapply ex_intro.
-		cbv [cnt2Bv]; unfold Hcnt; clear Hcnt.
-		cbv [Update_ Update_s Update_c Update_cref].
-		cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		autorewrite with update; vm_compute (false && _).
-		apply BVEq_iff_neq in Hcref.
-		specialize @CavaPreludeProperties.eqb_neq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		apply pair_equal_spec; split.
-		2: { 
-			rewrite orb_false_l andb_true_l /CrefPREA_eq.
-			apply HH in Hcref; by rewrite Hcref.
-		}
-		cbv [CrefPREA_eq]; apply HH in Hcref as Hcref'; rewrite Hcref';
-		vm_compute (false || true && false); simpl; rewrite !VectorSpec.map_id andb_true_r !orb_false_r.
-		rewrite !CrefPREA_lt_CNT_REF_WAIT_F; [ | done].
-		rewrite //=.
-		apply pair_equal_spec; split; [ done | ].
-		rewrite orb_false_r; by specialize (cnt_equiv cnt).
-	Qed.
-	
-	Lemma Update_equiv_idle_ref (c : circuit_state Update) cnt cref e:
-		(cref =? CNT_REF_PREA) = true ->
-		let nc := cnt2Bv (Next_cycle (Bv2cnt cnt)) in
-		let ncref := CNT_REF_NIL in
-		exists c', (step Update_ c (STATE_IDLE_VEC,e,cnt,cref)) = 
-		(c',(STATE_REF_VEC,nc,ncref)).
-	Proof.
-		intros Hcref Hcnt; simpl in c; eapply ex_intro.
-		cbv [cnt2Bv]; unfold Hcnt; clear Hcnt.
-		cbv [Update_ Update_s Update_e Update_c Update_cref].
-		cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		autorewrite with update; vm_compute (false && _).
-		apply BVEq_iff_eq in Hcref.
-		specialize @CavaPreludeProperties.eqb_eq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		apply pair_equal_spec; split. 
-		2: {
-			rewrite orb_false_l andb_true_l.
-			rewrite /CrefPREA_eq; apply HH in Hcref; by rewrite Hcref. 
-		}
-		cbv [CrefPREA_eq]; apply HH in Hcref as Hcref'; rewrite Hcref';
-		vm_compute (false || true && false); simpl; rewrite !VectorSpec.map_id.
-		apply pair_equal_spec; split.
-		2: {	
-			vm_compute (orb false false); rewrite orb_false_r. 
-			destruct e; [rewrite negb_true | rewrite negb_false].
-			{ rewrite andb_false_r orb_false_r; by specialize (cnt_equiv cnt). }
-			{ rewrite andb_true_r.
-				destruct (CrefPREA_lt cref) eqn:Hbug.
-				{ by rewrite Hcref CrefPREA_lt_CNT_REF_PREA in Hbug. }
-				{ rewrite orb_false_r; by specialize (cnt_equiv cnt). }
-			}
-		}
-		done.
-	Qed.
-
-	Lemma Update_equiv_idle_running (c : circuit_state Update) cnt 
-		(cref : Counter_ref_t) :
-		(cref2Bv cref =? CNT_REF_PREA) = false ->
-		(cref + WAIT < PREA_date) = true ->
-		let nc := CNT_NIL in
-		let ncref := N2Bv_sized COUNTER_REF_WIDTH (Bv2N (cref2Bv cref) + 1) in
-		exists c', step Update_ c (STATE_IDLE_VEC,false,cnt,(cref2Bv cref)) = 
-		(c',(STATE_RUN_VEC,nc,ncref)).
-	Proof.
-		intros Href_prea Href_service Hcnt;
-		simpl in c; destruct_products; eapply ex_intro.
-		cbv [cnt2Bv]; unfold Hcnt; clear Hcnt.
-		cbv [Update_ Update_s Update_e Update_c Update_cref].
-		cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ];
-		autorewrite with update; fast_simpl_bool.
-		rewrite !orb_false_l !andb_true_l /CrefPREA_eq.
-		specialize @CavaPreludeProperties.eqb_neq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		apply BVEq_iff_neq in Href_prea as Haux; apply HH in Haux.
-		rewrite Haux //= !orb_false_r andb_true_r !VectorSpec.map_id; clear Haux.
-		apply pair_equal_spec; split; [ | done].
-		apply pair_equal_spec; split; rewrite CrefPREA_lt_CNT_REF_WAIT; try done.
-		by rewrite orb_true_r.
-	Qed.
-	(* ------------------------------------------------------------------ *)
-
-	(* ----------------------------- Cases ------------------------------ *)
-	Theorem SM_Eq_3b (t : nat) (c_state : State_t) c0 (r0 r : Request_t) r1
-		(c1 : Counter_ref_t) (c_req : Bvector REQUEST_WIDTH) :
-		(c1 + WAIT < PREA_date) = false ->	
-		(nat_of_ord c1 == PREA_date - 1) = false ->
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in 
-		R == [:: r] -> EqReq r c_req -> State_Eq (IDLE c0 c1 (r0 :: r1)) c_state ->
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 (r0 :: r1)) in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM_ c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Proof.
-		intros Href_service Href_prea f_state R NF EqR H; unfold FIFOSM_.
-		unfold R in NF; specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF.
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		rewrite NF //= in NFULL; cbv [get_wra get_rda get_fields] in NFULL.
-		rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda.
-		rewrite /State_Eq /EqMem in H; autounfold with get_state in H; cbn [fst snd] in H.
-
-		move: H => /andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] HQ].
-		apply EqQueue_diff_adr in HQ as Hadr.
-
-		apply BVEq_iff_eq in EqS, EqCnt, EqCref; subst s cnt cref.
-		cbv [LoopInit]; cbn [step fst snd]; simpl_ret; cbv [and2]; cbn [fst snd].
-
-		assert ((Sidle STATE_IDLE_VEC && CrefPREA_lt (cref2Bv c1)) = false) as Haux;
-		[ apply CrefPREA_lt_CNT_REF_WAIT_F in Href_service; by rewrite Href_service andb_false_r | ].
-		rewrite Haux; clear Haux.
-
-		rewrite (surjective_pairing (step RequestQueue' _ _)).
-		apply (Queue_WR_NF_NE_snd ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req false) in NFULL as S; 
-		apply S in Hadr as S'; clear S.
-		cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S'.
-		destruct S' as [full_o H]; rewrite H; clear H; cbn [fst snd].
-
-		set tr := nth_default req_null (N.to_nat (Bv2N rda)) _.
-		apply (NextCR_equiv_IDLE_IDLE (u7, (u8, cr)) (cnt2Bv c0) c1 tr) in Href_service as H. 
-		destruct H as [cs_nextcr H]; rewrite H; clear H; cbn [fst snd].
-
-		apply cref_preadate_false in Href_prea as Href_prea_.
-		apply (CmdGen_equiv_idle_to_idle u5 (cnt2Bv c0) c1) in Href_prea_ as H; [ | done ].
-		destruct H as [cs_cmdgen H]; rewrite H; clear H; cbn [fst snd].
-
-		apply (Update_equiv_idle_idle u3 (cnt2Bv c0) c1) in Href_prea_ as H; [ | done].
-		destruct H as [cs_update H]; rewrite H; clear H; cbn [fst snd].
-
-		rewrite /Next_state Href_prea Href_service /State_Eq.
-		specialize (Queue_WR_NF_NE_fst (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra)) c_req false) as S.
-		apply S in NFULL as H; clear S; apply H in Hadr as H'; clear H; rename H' into H.
-		destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']].
-		autounfold with get_state.
-
-		apply /andP; split.
-		2 : exact EqReqNil.
-		apply /andP; split.
-		2 : unfold EqCmd; by apply BVEq_iff_eq.
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H.
-			cbv [get_addr_RequestQueue] in Hwra'; rewrite Hwra'; clear Hwra'.
-			cbv [get_addr_RequestQueue] in Hrda'; rewrite Hrda'; clear Hrda'.
-			rewrite /Enqueue /R NF.
-			apply (EqQueue_aux wra rda r0 r1 r); done.
-		}
-		apply /andP; split.
-		2 : {
-			rewrite /EqMem (surjective_pairing (step RequestQueue' _ _)) H Hrda'; cbn [fst snd];
-			unfold R; rewrite NF Hrw /Enqueue.
-			cbv [get_memcells_RequestQueue get_mem_RequestQueue get_memcells].
-			apply EqMem_rcons; try done.
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H;
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end; cbn [fst snd].
-			rewrite //= /Next_cycle_ref. 
-			set Hc := c1.+1 < PREA_date; dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-			{ rewrite /cref2Bv //= Bv2N_N2Bv_sized.
-				2: apply to_nat_lt_pow; rewrite Nat2N.id; apply cref_bound.
-				rewrite /N2Bv_sized.
-				destruct (N.of_nat c1 + 1)%N eqn:Hbug;
-				[ rewrite N.add_1_r in Hbug; contradict Hbug; apply N.neq_succ_0 | ].
-				apply BVEq_iff_eq; f_equal; lia.
-			}
-			{ specialize (cref_bound c1) as Hc1_bound.
-				destruct c1; clear H Hrw Hwra' Hrda' cs_requeue' cs_nextcr; simpl in *.
-				apply ltn_gt in x; rewrite leq_eqVlt in x; move: x => /orP [/eqP x | x]; [ | lia].
-				assert (m = PREA_date.-1); [ lia | ].
-				rewrite H in Href_prea; contradict Href_prea; apply not_false_iff_true; by rewrite subn1 eq_refl.
-			}
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H;
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end; cbn [fst snd].
-			rewrite /cnt2Bv //=; apply BVEq_iff_eq; f_equal; apply Nat2N.inj_iff.
-			rewrite /Bv2cnt /Next_cycle //= Bv2N_N2Bv_sized //=.
-			2: {
-				destruct c0; rewrite //= /COUNTER_WIDTH.
-				rewrite WAIT_PW_2_N; apply N_lt_inj; by apply /ltP.
-			}
-			set (Hc := _ < WAIT); dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro; try rewrite Nat2N.id;
-			try by rewrite Nat2N.id in x; move: Logic.eq_refl; rewrite {2 3}x; simpl; intro.
-		}
-		rewrite (surjective_pairing (step RequestQueue' _ _)) H;
-		repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-		end; cbn [fst snd]. 
-		by [].
-	Qed.
-
-	Theorem SM_Eq_3a (t : nat) (c_state : State_t) c0 (r : Request_t)
-		(c1 : Counter_ref_t) (c_req : Bvector REQUEST_WIDTH) :
-		(c1 + WAIT < PREA_date) = false ->	
-		(nat_of_ord c1 == PREA_date - 1) = false ->
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in 
-		R == [:: r] -> EqReq r c_req -> State_Eq (IDLE c0 c1 []) c_state ->
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 []) in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM_ c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Proof.
-		intros Href_service Href_prea f_state R NF EqR H; unfold FIFOSM_.
-		unfold R in NF; specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF.
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		rewrite NF //= in NFULL; cbv [get_wra get_rda get_fields] in NFULL.
-		rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda.
-		rewrite /State_Eq /EqMem in H; autounfold with get_state in H; cbn [fst snd] in H.
-
-		move: H => /andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] Hadr].
-		simpl in Hadr.
-		apply BVEq_iff_eq in EqS, EqCnt, EqCref, Hadr; subst s cnt cref.
-		cbv [LoopInit]; cbn [step fst snd]; simpl_ret; cbv [and2]; cbn [fst snd].
-
-		assert ((Sidle STATE_IDLE_VEC && CrefPREA_lt (cref2Bv c1)) = false) as Haux;
-		[ apply CrefPREA_lt_CNT_REF_WAIT_F in Href_service; by rewrite Href_service andb_false_r | ].
-		rewrite Haux; clear Haux.
-
-		rewrite (surjective_pairing (step RequestQueue' _ _)).
-		specialize (Queue_WR_E_snd ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req false) as S.
-		cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S.
-		apply S in Hadr as H; clear S; destruct H as [full_o H].
-		rewrite H; clear H; cbn [fst snd].
-
-		set tr := nth_default req_null (N.to_nat (Bv2N rda)) _.
-		specialize NextCR_equiv with (c := (u7, (u8, cr))) (cnt := cnt2Bv c0) 
-		(cref := cref2Bv c1) (tr := tr) as [cs_nextcr H].
-		rewrite H; cbv [fst]; clear H. cbn [snd].
-
-		apply cref_preadate_false in Href_prea as Href_prea_.
-		apply (CmdGen_equiv_idle_to_idle_E u5 (cnt2Bv c0) (cref2Bv c1)) in Href_prea_ as H.
-		destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd].
-
-		apply (Update_equiv_idle_idle_E u3 (cnt2Bv c0) (cref2Bv c1)) in Href_prea_ as H.
-		destruct H as [cs_update H]; rewrite H; clear H; cbn [fst snd].
-
-		rewrite /Next_state Href_prea Href_service /State_Eq.
-		specialize (Queue_WR_NF_E_fst (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra)) c_req false) as S.
-		apply S in NFULL as H; clear S; apply H in Hadr as H'; clear H; rename H' into H.
-		destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']].
-		autounfold with get_state.
-
-		apply /andP; split.
-		2 : exact EqReqNil.
-		apply /andP; split.
-		2 : unfold EqCmd; by apply BVEq_iff_eq.
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H.
-			cbv [get_addr_RequestQueue] in Hwra'; rewrite Hwra'; clear Hwra'.
-			cbv [get_addr_RequestQueue] in Hrda'; rewrite Hrda'; clear Hrda'.
-			simpl; rewrite Hadr; unfold R; rewrite NF //=.
-			apply /andP; split.
-			{ apply /negPf; apply (@N2Bv_sized_eq_p1_false ADDR_WIDTH rda);
-				specialize ADDR_WIDTH_pos as Hpos; by move: Hpos => /ltP Hpos. }
-			by apply BVEq_iff_eq.
-		}
-		apply /andP; split.
-		2 : { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H.
-			cbv [get_addr_RequestQueue] in Hrda'; rewrite Hrda'; clear Hrda'.
-			simpl; unfold R; rewrite NF //= /EqMem //= andb_true_r.
-			rewrite Hrw; autounfold with get_state; rewrite Hadr VectorSpec.map_id.
-			specialize (@nth_cells_read (Vec Bit REQUEST_WIDTH) ADDR_WIDTH InitMem rda c_req 
-			(Bvect_false REQUEST_WIDTH) c) as H'.
-			rewrite H'; exact EqR.
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H;
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end; cbn [fst snd].
-			rewrite //= /Next_cycle_ref. 
-			set Hc := c1.+1 < PREA_date; dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-			{ rewrite /cref2Bv //= Bv2N_N2Bv_sized.
-				2: apply to_nat_lt_pow; rewrite Nat2N.id; apply cref_bound.
-				rewrite /N2Bv_sized.
-				destruct (N.of_nat c1 + 1)%N eqn:Hbug;
-				[ rewrite N.add_1_r in Hbug; contradict Hbug; apply N.neq_succ_0 | ].
-				apply BVEq_iff_eq; f_equal; lia.
-			}
-			{ specialize (cref_bound c1) as Hc1_bound.
-				destruct c1; clear H Hrw Hwra' Hrda' cs_requeue' cs_nextcr; simpl in *.
-				apply ltn_gt in x; rewrite leq_eqVlt in x; move: x => /orP [/eqP x | x]; [ | lia].
-				assert (m = PREA_date.-1); [ lia | ].
-				rewrite H in Href_prea; contradict Href_prea; apply not_false_iff_true; by rewrite subn1 eq_refl.
-			}
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H;
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end; cbn [fst snd].
-			rewrite /cnt2Bv //=; apply BVEq_iff_eq; f_equal; apply Nat2N.inj_iff.
-			rewrite /Bv2cnt /Next_cycle //= Bv2N_N2Bv_sized //=.
-			2: {
-				destruct c0; rewrite //= /COUNTER_WIDTH.
-				rewrite WAIT_PW_2_N; apply N_lt_inj; by apply /ltP.
-			}
-			set (Hc := _ < WAIT); dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro; try rewrite Nat2N.id;
-			try by rewrite Nat2N.id in x; move: Logic.eq_refl; rewrite {2 3}x; simpl; intro.
-		}
-		rewrite (surjective_pairing (step RequestQueue' _ _)) H;
-		repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-		end; cbn [fst snd]. 
-		by [].
-	Qed.
-
-	Theorem SM_Eq_2b (t : nat) (c_state : State_t) c0 r0 r1
-		(c1 : Counter_ref_t) (c_req : Bvector REQUEST_WIDTH) r :
-		(c1 + WAIT < PREA_date) = true ->	
-		(nat_of_ord c1 == PREA_date - 1) = false ->
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in 
-		R == [:: r] -> EqReq r c_req -> State_Eq (IDLE c0 c1 (r0 :: r1)) c_state ->
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 (r0 :: r1)) in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM_ c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Proof.
-		intros Href_service Href_prea f_state R NF EqR H; unfold FIFOSM_.
-		unfold R in NF; specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF.
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		rewrite NF //= in NFULL; cbv [get_wra get_rda get_fields] in NFULL.
-		rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda.
-		rewrite /State_Eq /EqMem in H; autounfold with get_state in H; cbn [fst snd] in H.
-
-		move: H => /andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] HQ].
-		apply EqQueue_diff_adr in HQ as Hadr.
-
-		apply BVEq_iff_eq in EqS, EqCnt, EqCref; subst s cnt cref.
-		cbv [LoopInit]; cbn [step fst snd]; simpl_ret; cbv [and2].
-		assert ((Sidle STATE_IDLE_VEC && CrefPREA_lt (cref2Bv c1)) = true) as Haux; [
-			rewrite //= ; apply CrefPREA_lt_CNT_REF_WAIT; 
-			[ by apply cref_preadate_false in Href_prea | done ] | ]; rewrite Haux; clear Haux; cbn [snd].
-
-		rewrite (surjective_pairing (step RequestQueue' _ _)).
-		specialize (Queue_WR_NF_NE_snd ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req true) as S.
-		cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S.
-		apply S in NFULL as S'; [ | done]; clear S; destruct S' as [full_o H].
-		rewrite H; clear H; cbn [fst snd].
-
-		set tr := nth_default req_null (N.to_nat (Bv2N rda)) _.
-		apply NextCR_equiv_IDLE_RUNNING with (c := (u7, (u8, cr))) (cnt := cnt2Bv c0) 
-		(cref := c1) (tr := tr) in Href_service as H.
-		2: by apply cref_preadate_false in Href_prea.
-		destruct H as [cs_nextcr H]; destruct H as [H Htr].
-		rewrite H; clear H; cbv [fst snd].
-
-		specialize (CmdGen_equiv_idle_to_running u5 (cnt2Bv c0) c1 tr) as S.
-		specialize Href_service as Href_service_.
-		apply S in Href_service; clear S; rename Href_service into H.
-		2: by apply cref_preadate_false in Href_prea.
-		destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd].
-
-		specialize (Update_equiv_idle_running u3 (cnt2Bv c0) c1) as S;
-		apply S in Href_service_ as S'; clear S.
-		2: by apply cref_preadate_false in Href_prea.
-		destruct S' as [cs_update H]; rewrite H; clear H; cbn [fst snd].
-
-		rewrite /Next_state Href_prea Href_service_ /State_Eq.
-		specialize Queue_NF_WR_RD_fst with (c := (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra))) (c_req := c_req) as S.
-		apply S in NFULL as H; clear S.
-		apply H in Hadr as H'; clear H; rename H' into H.
-		destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']].
-		autounfold with get_state.
-
-		apply /andP; split.
-		2: {
-			unfold tr; simpl in Mem; move: Mem => /andP [EqReq_r0 Mem].
-			rewrite {2}/get_memcells_RequestQueue /get_mem_RequestQueue /get_memcells in Hrw.
-			apply (memcell_nch c wra rda c_req req_null) in Hadr as HH.
-			rewrite /req_null //= in HH.
-			rewrite VectorSpec.map_id /Bvect_false HH in EqReq_r0.
-			by rewrite /req_null //=.
-		}
-		apply /andP; split.
-		2 : unfold EqCmd; by apply BVEq_iff_eq.
-		apply /andP; split.
-		2 : {
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end; rewrite Htr;
-			unfold tr; simpl in Mem; move: Mem => /andP [EqReq_r0 Mem].
-			rewrite {2}/get_memcells_RequestQueue /get_mem_RequestQueue /get_memcells in Hrw.
-			apply (memcell_nch c wra rda c_req req_null) in Hadr as HH.
-			rewrite /req_null //= in HH.
-			rewrite VectorSpec.map_id /Bvect_false HH in EqReq_r0.
-			by rewrite /req_null //=.
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H Hwra' Hrda'.
-			simpl; rewrite eq_refl.
-			rewrite /Enqueue /R NF.
-			simpl in HQ.
-			specialize (EqQueue_aux wra rda r0 r1 r) as HH.
-			apply HH in NFULL as HH'; clear HH; try done.
-			move: HH'; simpl; intros HH.
-			by move: HH => /andP [_ HH].
-		}
-		apply /andP; split.
-		2 : {
-			rewrite /EqMem (surjective_pairing (step RequestQueue' _ _)) H Hrda' /Enqueue.
-			simpl; unfold R; rewrite NF //=.
-			rewrite Hrw eq_refl.
-			simpl in Mem; move: Mem => /andP [_ Mem].
-			apply EqMem_rcons; try done.
-			simpl in HQ; by move: HQ => /andP [_ HQ].
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H //=.
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end. 
-			rewrite VectorSpec.map_id; cbn [fst snd].
-			rewrite /Next_cycle_ref. 
-			set Hc := c1.+1 < WAIT_REF; dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-			{ rewrite /cref2Bv //= Bv2N_N2Bv_sized.
-				2: { 
-					unfold COUNTER_REF_WIDTH; rewrite WAIT_REF_PW_N.
-					destruct c1; simpl; apply N_lt_inj; by apply /ltP.
-				}
-				rewrite /N2Bv_sized.
-				destruct (N.of_nat c1 + 1)%N eqn:Hbug;
-				[ rewrite N.add_1_r in Hbug; contradict Hbug; apply N.neq_succ_0 | ].
-				apply BVEq_iff_eq; f_equal; lia.
-			}
-			{ apply cref_preadate_false in Href_prea as Href_prea_.
-				destruct c1; simpl in x,e,Hc0,Href_service_,Href_prea,Href_prea_.
-				rewrite /cref2Bv VectorSpec.map_id //= in Href_prea_.
-				apply ltn_gt in x; rewrite leq_eqVlt in x; move: x => /orP [/eqP x | x].
-				{ assert (m = WAIT_REF.-1); [ lia | ].
-					rewrite H0 addnC -ltn_subRL in Href_service_.
-					rewrite -subn1 ltn_subLR in Href_service_; [ | exact WAIT_REF_pos ].
-					contradict Href_service_; apply /negP.
-					rewrite -leqNgt leq_eqVlt addnC.
-					specialize WAIT_REF_PREA_date as HH.
-					apply ltn_trans with (m := PREA_date - WAIT + 1) in HH;
-					[ by rewrite HH orb_true_r | ].
-					rewrite -subnA.
-					{ by rewrite ltn_subrL subn_gt0 WAIT_gt_one PREA_date_pos. }
-					{ exact WAIT_pos. }
-					{ by rewrite leq_eqVlt PREA_date_WAIT orb_true_r. }
-				}
-				{ rewrite ltnS in x; contradict x; apply /negP; by rewrite -ltnNge. }
-			}
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H //=.
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end. cbn [fst snd]. rewrite VectorSpec.map_id.
-			rewrite /cnt2Bv; apply BVEq_iff_eq; f_equal.
-			rewrite /Bv2cnt /Next_cycle //= Bv2N_N2Bv_sized //=.
-		}
-		rewrite (surjective_pairing (step RequestQueue' _ _)) H //=.
-		repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-		end; cbn [fst snd]. by [].
-	Qed. *)
-
-	Theorem SM_Eq_2a (t : nat) (c_state : State_t) c0 
-		(c1 : Counter_ref_t) (c_req : Bvector REQUEST_WIDTH) r :
-		(c1 + WAIT < PREA_date) = true ->	
-		(nat_of_ord c1 == PREA_date - 1) = false ->
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in 
-		R == [:: r] -> EqReq r c_req -> State_Eq (IDLE c0 c1 []) c_state ->
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 []) in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM_ c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Admitted.
-	(* Proof.
-		intros Href_service Href_prea f_state R NF EqR H; unfold FIFOSM_.
-		unfold R in NF; specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF.
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		rewrite NF //= in NFULL.
-		rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda.
-		rewrite /State_Eq /EqMem in H; autounfold with get_state in H; cbn [fst snd] in H.
-		move: H => /andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] Hadr].
-		simpl in Hadr.
-
-		apply BVEq_iff_eq in EqS, EqCnt, EqCref, Hadr; subst s cnt cref.
-		cbv [LoopInit]; cbn [step fst snd]; simpl_ret.
-		cbv [and2].
-		assert ((Sidle STATE_IDLE_VEC && CrefPREA_lt (cref2Bv c1)) = true) as Haux; [
-			rewrite //= ; apply CrefPREA_lt_CNT_REF_WAIT; 
-			[ by apply cref_preadate_false in Href_prea | done ] | ]; rewrite Haux; clear Haux.
-		cbn [snd].
-
-		rewrite (surjective_pairing (step RequestQueue' _ _)).
-		specialize (Queue_EMP_WR_snd ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req true) as S.
-		cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S.
-		apply S in Hadr as H; clear S; destruct H as [full_o H].
-		rewrite H; clear H; cbn [fst snd].
-
-		set tr := nth_default req_null (N.to_nat (Bv2N rda)) _.
-		specialize NextCR_equiv with (c := (u7, (u8, cr))) (cnt := cnt2Bv c0) 
-		(cref := cref2Bv c1) (tr := tr) as [cs_nextcr H].
-		rewrite H; cbv [fst]; clear H. cbn [snd].
-
-		apply cref_preadate_false in Href_prea as Href_prea_.
-		apply (CmdGen_equiv_idle_to_idle_E u5 (cnt2Bv c0) (cref2Bv c1)) in Href_prea_ as H.
-		destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd].
-
-		apply (Update_equiv_idle_idle_E u3 (cnt2Bv c0) (cref2Bv c1)) in Href_prea_ as H.
-		destruct H as [cs_update H]; rewrite H; clear H; cbn [fst snd].
-
-		cbv [get_rda get_wra get_fields] in NFULL.
-		rewrite /Next_state Href_prea Href_service /State_Eq.
-		specialize Queue_NF_EMP_WR_fst with (c := (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra))) (c_req := c_req) as S.
-		apply S in NFULL as H; clear S. apply H in Hadr as H'; clear H; rename H' into H.
-		destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']].
-		autounfold with get_state.
-
-		apply /andP; split.
-		2 : exact EqReqNil.
-		apply /andP; split.
-		2 : unfold EqCmd; by apply BVEq_iff_eq.
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H Hwra' Hrda'.
-			simpl; rewrite Hadr; unfold R; rewrite NF //=.
-			apply /andP; split.
-			{ apply /negPf; apply (@N2Bv_sized_eq_p1_false ADDR_WIDTH rda);
-				specialize ADDR_WIDTH_pos as Hpos; by move: Hpos => /ltP Hpos. }
-			by apply BVEq_iff_eq.
-		}
-		apply /andP; split.
-		2 : { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H Hrda'.
-			simpl; unfold R; rewrite NF //= /EqMem //= andb_true_r.
-			rewrite Hrw; autounfold with get_state; rewrite Hadr VectorSpec.map_id.
-			specialize (@nth_cells_read (Vec Bit REQUEST_WIDTH) ADDR_WIDTH InitMem rda c_req 
-			(Bvect_false REQUEST_WIDTH) c) as H'.
-			rewrite H'; exact EqR.
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H //=.
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end. 
-			cbn [fst snd].
-			rewrite /Next_cycle_ref. 
-			set Hc := c1.+1 < WAIT_REF; dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-			{ rewrite /cref2Bv //= Bv2N_N2Bv_sized.
-				2: { 
-					unfold COUNTER_REF_WIDTH; rewrite WAIT_REF_PW_N.
-					destruct c1; simpl; apply N_lt_inj; by apply /ltP.
-				}
-				rewrite /N2Bv_sized.
-				destruct (N.of_nat c1 + 1)%N eqn:Hbug;
-				[ rewrite N.add_1_r in Hbug; contradict Hbug; apply N.neq_succ_0 | ].
-				apply BVEq_iff_eq; f_equal; lia.
-			}
-			{ destruct c1; simpl in x,e,Hc0,Href_prea,Href_prea_,Href_service.
-				rewrite /cref2Bv VectorSpec.map_id //= in Href_prea_.
-				apply ltn_gt in x; rewrite leq_eqVlt in x; move: x => /orP [/eqP x | x].
-				{ assert (m = WAIT_REF.-1); [ lia | ].
-					rewrite H0 addnC -ltn_subRL in Href_service.
-					rewrite -subn1 ltn_subLR in Href_service; [ | exact WAIT_REF_pos ].
-					contradict Href_service; apply /negP.
-					rewrite -leqNgt leq_eqVlt addnC.
-					specialize WAIT_REF_PREA_date as HH.
-					apply ltn_trans with (m := PREA_date - WAIT + 1) in HH;
-					[ by rewrite HH orb_true_r | ].
-					rewrite -subnA.
-					{ by rewrite ltn_subrL subn_gt0 WAIT_gt_one PREA_date_pos. }
-					{ exact WAIT_pos. }
-					{ by rewrite leq_eqVlt PREA_date_WAIT orb_true_r. }
-				}
-				{ rewrite ltnS in x; contradict x; apply /negP; by rewrite -ltnNge. }
-			}
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H //=.
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end. cbn [fst snd].
-			rewrite /cnt2Bv; apply BVEq_iff_eq; f_equal.
-			apply Nat2N.inj_iff.
-			rewrite /Bv2cnt /Next_cycle //= Bv2N_N2Bv_sized //=.
-			2: {
-				destruct c0; rewrite //= /COUNTER_WIDTH.
-				rewrite WAIT_PW_2_N; apply N_lt_inj; by apply /ltP.
-			}
-			set (Hc := _ < WAIT); dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro; try rewrite Nat2N.id;
-			try by rewrite Nat2N.id in x; move: Logic.eq_refl; rewrite {2 3}x; simpl; intro.
-		}
-		rewrite (surjective_pairing (step RequestQueue' _ _)) H //=.
-		repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-		end; cbn [fst snd]. by [].
-	Qed. *)
-
-
-	(* Assuming a non-full regime, i.e., the front-end has yielded a valid request *)
-	(* If R is non empty than the queue is not full *)
-	Theorem SM_Eq_1b (t : nat) (c_state : State_t) c0 c1 (c_req : Bvector REQUEST_WIDTH) r0 r1 (r : Request_t) :
-		(nat_of_ord c1 == PREA_date - 1) = true ->
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in 
-		R == [:: r] -> EqReq r c_req -> State_Eq (IDLE c0 c1 (r0 :: r1)) c_state ->
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 (r0 :: r1)) in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM_ c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Admitted.
-	(* Proof.
-		intros Href_prea f_state R NF EqR H; unfold FIFOSM_.
-		unfold R in NF; specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF.
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		rewrite NF //= in NFULL; cbv [get_wra get_rda get_fields] in NFULL.
-		rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda.
-		rewrite /State_Eq /EqMem in H; autounfold with get_state in H; cbn [fst snd] in H.
-		move: H => /andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] HQ].
-		apply EqQueue_diff_adr in HQ as Hadr.
-
-		apply BVEq_iff_eq in EqS, EqCnt, EqCref; subst s cnt cref.
-		cbv [LoopInit]; cbn [step fst snd]; simpl_ret.
-
-		apply cref_preadate_true in Href_prea as Href_prea_;
-		apply BVEq_iff_eq in Href_prea_ as H'.
-		cbv [and2]. cbn [fst snd]. 
-		rewrite {1}H' CrefPREA_lt_CNT_REF_PREA andb_false_r.
-
-		rewrite (surjective_pairing (step RequestQueue' _ _)).
-		specialize (Queue_NEMP_NF_WR_snd ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req false) as S.
-		cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S.
-		apply S in NFULL as S'; [ | done]; clear S; destruct S' as [full_o H].
-		rewrite H; clear H; cbn [fst snd].
-
-		set tr := nth_default req_null (N.to_nat (Bv2N rda)) _.
-		specialize (NextCR_equiv_IDLE_NE_PREA (u7, (u8, cr)) (cnt2Bv c0) (cref2Bv c1) tr) as S.
-		apply S in Href_prea_ as S'; clear S; destruct S' as [cs_nextcr H]; rewrite H.
-
-		cbn [fst snd]; clear H.
-		apply (CmdGen_equiv_idle_to_ref u5 (cnt2Bv c0) (cref2Bv c1) false) in Href_prea_ as H.
-		destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd].
-
-		apply (Update_equiv_idle_ref u3 (cnt2Bv c0) (cref2Bv c1) false) in Href_prea_ as H.
-		destruct H as [cs_update H]; rewrite H; clear H; cbn [fst snd].
-
-		rewrite /Next_state Href_prea /State_Eq.
-		specialize Queue_NF_WR_fst with (c := (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra))) (c_req := c_req) as S.
-		apply S in NFULL as H; clear S.
-		destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']].
-		autounfold with get_state.
-
-		apply /andP; split.
-		2 : exact EqReqNil.
-		apply /andP; split.
-		2 : unfold EqCmd; by apply BVEq_iff_eq.
-		apply /andP; split.
-		2 : {
-			rewrite H /Enqueue /R NF.
-			cbv [get_addr_RequestQueue] in Hwra'; rewrite Hwra'.
-			cbv [get_addr_RequestQueue] in Hrda'; rewrite Hrda'.
-			by apply (EqQueue_aux wra rda r0 r1 r).
-		}
-		apply /andP; split.
-		2 : {
-			rewrite H.
-			cbv [get_addr_RequestQueue] in Hrda'; rewrite Hrda'; clear Hrda'.
-			rewrite /EqMem Hrw /Enqueue.
-			autounfold with get_state; unfold R; rewrite NF.
-			apply EqMem_rcons; done.
-		}
-		apply /andP; split.
-		2 : { 
-			rewrite H.
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end. cbn [fst snd]; simpl; rewrite VectorSpec.map_id.
-			rewrite /cref2Bv /OCycle0REF //=; by apply BVEq_iff_eq.
-		}
-		rewrite H;
-		repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-		end; cbn [fst snd]. by [].
-	Qed. *)
-
-	Theorem SM_Eq_1a (t : nat) (c_state : State_t) c0 c1 (c_req : Bvector REQUEST_WIDTH) r :
-		(nat_of_ord c1 == PREA_date - 1) = true ->
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in 
-		R == [:: r] -> EqReq r c_req -> State_Eq (IDLE c0 c1 []) c_state ->
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 []) in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM_ c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Admitted.
-	(* Proof.
-		intros Href_prea f_state R NF EqR H; unfold FIFOSM_.
-		unfold R in NF; specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF.
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		rewrite NF //= in NFULL; cbv [get_wra get_rda get_fields] in NFULL.
-		rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda.
-		rewrite /State_Eq /EqMem in H; autounfold with get_state in H; cbn [fst snd] in H.
-		move: H => /andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] Hadr].
-
-		apply BVEq_iff_eq in EqS, EqCnt, EqCref,Hadr; subst s cnt cref.
-		cbv [LoopInit]; cbn [step fst snd]; simpl_ret.
-
-		apply cref_preadate_true in Href_prea as Href_prea_;
-		apply BVEq_iff_eq in Href_prea_ as H'.
-		cbv [and2]. cbn [fst snd]. 
-		rewrite {1}H' CrefPREA_lt_CNT_REF_PREA andb_false_r.
-
-		rewrite (surjective_pairing (step RequestQueue' _ _)).
-		specialize (Queue_EMP_WR_snd ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req false) as S.
-		cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S.
-		apply S in Hadr as H; clear S; destruct H as [full_o H].
-		rewrite H; clear H; cbn [fst snd].
-
-		set tr := nth_default req_null (N.to_nat (Bv2N rda)) _.
-		specialize NextCR_equiv with (c := (u7, (u8, cr))) (cnt := cnt2Bv c0) 
-		(cref := cref2Bv c1) (tr := tr) as [cs_nextcr H].
-		rewrite H; cbv [fst snd]; clear H.
-
-		apply (CmdGen_equiv_idle_to_ref u5 (cnt2Bv c0) (cref2Bv c1) true) in Href_prea_ as H.
-		destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd].
-
-		apply (Update_equiv_idle_ref u3 (cnt2Bv c0) (cref2Bv c1) true) in Href_prea_ as H.
-		destruct H as [cs_update H]; rewrite H; clear H.
-
-		rewrite /Next_state Href_prea /State_Eq.
-		specialize Queue_NF_WR_fst with (c := (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra))) (c_req := c_req) as S.
-		apply S in NFULL as H; clear S.
-		destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']].
-		autounfold with get_state.
-
-		apply /andP; split.
-		2 : exact EqReqNil.
-		apply /andP; split.
-		2 : unfold EqCmd; by apply BVEq_iff_eq.
-		apply /andP; split.
-		2 : {
-			rewrite /Enqueue.
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H.
-			cbv [get_addr_RequestQueue] in Hwra'; rewrite Hwra'; clear Hwra'.
-			cbv [get_addr_RequestQueue] in Hrda'; rewrite Hrda'; clear Hrda'.
-			rewrite //= /R NF //= Hadr.
-			apply /andP; split.
-			{ apply /negPf; apply (@N2Bv_sized_eq_p1_false ADDR_WIDTH rda);
-				specialize ADDR_WIDTH_pos as Hpos; by move: Hpos => /ltP Hpos. }
-			by apply BVEq_iff_eq.
-		}
-		apply /andP; split.
-		2 : { 
-			rewrite /Enqueue.
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H.
-			cbv [get_addr_RequestQueue] in Hrda'; rewrite Hrda'; clear Hrda'.
-			simpl; unfold R; rewrite NF //= /EqMem //= andb_true_r VectorSpec.map_id.
-			rewrite Hrw; autounfold with get_state; rewrite Hadr.
-			specialize (@nth_cells_read (Vec Bit REQUEST_WIDTH) ADDR_WIDTH InitMem rda c_req 
-			(Bvect_false REQUEST_WIDTH) c) as HH.
-			rewrite HH; exact EqR.
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H.
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end; cbn [fst snd].
-			rewrite //= VectorSpec.map_id. 
-			rewrite /cref2Bv /OCycle0REF //=; by apply BVEq_iff_eq.
-		}
-		rewrite (surjective_pairing (step RequestQueue' _ _)) H.
-		repeat lazymatch goal with
-		| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-		end; cbn [fst snd].
-		by [].
-	Qed. *)
-
-	Theorem SM_Eq_NFULL (t : nat) (c_state : State_t) (f_req: Request_t) 
-		(c_req : Bvector REQUEST_WIDTH) (push : bool) :
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in
-		R == [:: f_req] -> EqReq f_req c_req -> State_Eq f_state c_state -> 
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R f_state in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM_ c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Proof.
-		destruct (f_state) eqn:Hf_state. 
-		{ destruct (nat_of_ord c0 == PREA_date - 1) eqn:Hcref_prea; move: Hcref_prea.
-			{ destruct r eqn:HR.
-				{ apply SM_Eq_1a. }
-				{ apply SM_Eq_1b. }
-			}
-			{ destruct (c0 + WAIT < PREA_date) eqn:Hcref_service; move: Hcref_service.
-				{ destruct r eqn:HR.
-					{ apply SM_Eq_2a. }
-					{ apply SM_Eq_2b. }
-				}
-				{ destruct r eqn:HR.
-					{ apply SM_Eq_3a. (* Case 3a: IDLE -> IDLE (empty queue )*) }
-					{ apply SM_Eq_3b. (* Case 3b: IDLE -> IDLE (non empty queue) *) }
-				}
-			}
-		}
-		{ destruct (nat_of_ord c == OACT_date) eqn:Hact_date.
-			{ destruct r eqn:HR.
-				{ admit. (* Case 4a : RUNNING -> RUNNING (ACT) (empty queue) *) }
-				{ admit. (* Case 4b : RUNNING -> RUNNING (ACT) (non empty queue) *)}
-			}
-			{	destruct (nat_of_ord c == OCAS_date) eqn:Hcas_date.
-				{ destruct r eqn:HR.
-					{ admit. (* Case 5a : RUNNING -> RUNNING (CAS) (empty queue )*) }
-					{ admit. (* Case 5b : RUNNING -> RUNNING (CAS) (non-empty queue) *)}	 
-				}
-				{ destruct (nat_of_ord c == WAIT.-1) eqn:Hend_date.
-					{ destruct r eqn:HR.
-						{ admit. (* Case 6a : RUNNING -> IDLE (empty queue) *) }
-						{ admit. (* Case 6b : RUNNING -> IDLE (non empty queue) *)}
-					}
-					{ destruct r eqn:HR.
-						{ admit. (* Case 7a : RUNNING -> RUNNING (empty queue) *) } 
-						{ admit. (* Case 7b : RUNNING -> RUNNING (non empty queue) *) }
-					}
-				}
-			}
-		}
-		{ destruct (nat_of_ord c == OREF_date) eqn:Href_date.
-			{ destruct r eqn:HR. 
-				{ admit. (* Case 8a REFRESHING -> REFRESHING (REF) *)}
-				{ admit. (* Case 8b REFRESHING -> REFRESHING (REF) *)}
-			}
-			{ destruct (nat_of_ord c == OENDREF_date) eqn:Hendref_date.
-				{ destruct r eqn:HR.
-					{ admit. (* Case 9a REFRESHING -> IDLE*) }
-					{ admit. (* Case 9b REFRESHING -> IDLE *) }
-				}
-				{ destruct r eqn:HR.
-					{ admit. (* Case 10a REFRESHING -> REFRESHING (REF) *) }
-					{ admit. (* Case 10b REFRESHING -> REFRESHING (REF) *) }
-				}
-			}
-		}
-	Admitted.
-
-End EquivalenceProof.
\ No newline at end of file
diff --git a/framework/CavaDRAM/CavaFIFOREF/CavaFIFOREF.v b/framework/CavaDRAM/CavaFIFOREF/CavaFIFOREF.v
deleted file mode 100644
index 1813e30..0000000
--- a/framework/CavaDRAM/CavaFIFOREF/CavaFIFOREF.v
+++ /dev/null
@@ -1,376 +0,0 @@
-Set Warnings "-notation-overridden,-parsing". 
-
-From CavaDRAM Require Import CavaReqQueue CavaCommonInstances Util CavaSystem Memory.
-From DRAM Require Import FIFO.
-From Coq Require Import BinaryString HexString NArith Program.Equality.
-From Cava Require Import Cava.
-
-Section CavaFIFOREF.
-	
-	Context {CAVA_SYS : CavaSystem}.
-	Context {signal : SignalType -> Type} {semantics : Cava signal}.
-	Context {SYS_CFG : System_configuration}.
-	Context {FIFO_CFG : FIFO_configuration}.
-
-	Import CavaReqQueue.DataNotation.
-	Open Scope data_scope.
-
-	Definition STATE_WIDTH := 2.
-
-	Definition COUNTER_WIDTH := Nat.log2 (WAIT).
-
-	Definition CNT_WAIT	 := Vec.bitvec_literal (#D (N.of_nat (WAIT - 1)) | COUNTER_WIDTH).
-	Definition CNT_ACT   := Vec.bitvec_literal (#D (N.of_nat ACT_date) | COUNTER_WIDTH).
-	Definition CNT_CAS   := Vec.bitvec_literal (#D (N.of_nat CAS_date) | COUNTER_WIDTH).
-	Definition CNT_NIL   := Vec.bitvec_literal (#D (N.of_nat 0) | COUNTER_WIDTH).
-	Definition CNT_NIL_VEC := Vector.const false COUNTER_WIDTH.
-
-	(* Definition COUNTER_REF_WIDTH := Nat.log2 (WAIT_REF). *)
-	Definition COUNTER_REF_WIDTH :=
-		if Nat.pow 2 (Nat.log2 (PREA_date + (WAIT - 1))) == (PREA_date + (WAIT - 1))
-		then Nat.log2 (PREA_date + (WAIT - 1))
-		else (Nat.log2 (PREA_date + (WAIT - 1))).+1.
-
-	Definition state := Vec Bit STATE_WIDTH.
-	Definition counter := Vec Bit COUNTER_WIDTH.
-	Definition counter_ref := Vec Bit COUNTER_REF_WIDTH.
-
-	Definition empty_t := signal Bit.
-	Definition state_t := signal state.
-	Definition counter_t := signal counter.
-	Definition counter_ref_t := signal counter_ref.
-	
-	Definition NOP_VEC 	:= (#B "11111" | DRAM_CMD_WIDTH).
-	Definition NOP      := Vec.bitvec_literal NOP_VEC.
-	Definition PRE_VEC 	:= (#B "10010" | DRAM_CMD_WIDTH).
-	Definition PRE      := Vec.bitvec_literal PRE_VEC.
-	Definition ACT_VEC 	:= (#B "10011" | DRAM_CMD_WIDTH).
-	Definition ACT      := Vec.bitvec_literal ACT_VEC.
-	Definition RD_VEC 	:= (#B "10101" | DRAM_CMD_WIDTH).
-	Definition RD       := Vec.bitvec_literal RD_VEC.
-	Definition WR_VEC 	:= (#B "10100" | DRAM_CMD_WIDTH).
-	Definition WR       := Vec.bitvec_literal WR_VEC.
-	Definition PREA_VEC := (#B "10110" | DRAM_CMD_WIDTH).
-	Definition PREA     := Vec.bitvec_literal PREA_VEC.
-	Definition REF_VEC 	:= (#B "10001" | DRAM_CMD_WIDTH).
-	Definition REF      := Vec.bitvec_literal REF_VEC.
-	
-	Definition CNT_REF_WAIT := Vec.bitvec_literal (#D (N.of_nat (WAIT - 1)) | COUNTER_REF_WIDTH).
-	Definition CNT_REF_PREA := Vec.bitvec_literal (#D (N.of_nat (PREA_date - 1)) | COUNTER_REF_WIDTH).
-	Definition CNT_REF_REF  := Vec.bitvec_literal (#D (N.of_nat REF_date) | COUNTER_REF_WIDTH).
-	Definition CNT_REF_END  := Vec.bitvec_literal (#D (N.of_nat END_REF_date) | COUNTER_REF_WIDTH).
-	Definition CNT_REF_NIL  := Vec.bitvec_literal (#D (N.of_nat 0) | COUNTER_REF_WIDTH).
-	Definition CNT_REF_NIL_VEC := Vector.const false COUNTER_REF_WIDTH.
-	
-	Definition STATE_IDLE_VEC := Vector.const false STATE_WIDTH.
-	Definition STATE_IDLE 	  := Vec.bitvec_literal (#D 0 | STATE_WIDTH).
-	Definition STATE_RUN_VEC  := (#D 1 | STATE_WIDTH).
-	Definition STATE_RUN      := Vec.bitvec_literal STATE_RUN_VEC.
-	Definition STATE_REF_VEC  := (#D 2 | STATE_WIDTH).
-	Definition STATE_REF      := Vec.bitvec_literal STATE_REF_VEC.
-
-	Definition Sidle (input : state_t) : cava (signal Bit) :=
-		CavaPrelude.eqb (input,STATE_IDLE).
-
-	Definition Srun (input : state_t) : cava (signal Bit) :=
-		CavaPrelude.eqb (input,STATE_RUN).
-
-	Definition Sref (input : state_t) : cava (signal Bit) :=
-		CavaPrelude.eqb (input,STATE_REF).
-
-	Definition CeqWAIT (input : counter_t) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,CNT_WAIT).
-
-	Definition CeqCAS (input : counter_t) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,CNT_CAS).
-	
-	Definition CeqACT (input : counter_t) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,CNT_ACT).
-
-	Definition CrefPREA_eq (input : counter_ref_t) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,CNT_REF_PREA).
-
-	Definition CrefPREA_lt (input : counter_ref_t) : cava (signal Bit) :=
-		t <- addN (input,CNT_REF_WAIT) ;;
-		s <- greaterThanOrEqual (t,CNT_REF_PREA) ;; inv s.
-	
-	Definition CrefREF (input : counter_ref_t) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,CNT_REF_REF).
-
-	Definition CrefEND (input : counter_ref_t) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,CNT_REF_END).
-		
-	(* Find a way to write this things more concisely *)
-	Definition NextCR : Circuit 
-	(state_t * empty_t * counter_t * counter_ref_t * request_t) (request_t)
-	:= let state_init : combType (request) := Vector.const one (REQUEST_WIDTH) in
-	LoopInit state_init (
-		Comb (fun '(s,e,c,cref,tr,cr) =>
-			(* signals *)
-			s_idle <- Sidle s ;; 
-			s_run <- Srun s ;; 
-			(* s_ref <- Sref s ;; *)
-			nc_wait <- (CeqWAIT >=> inv) c ;; 
-			c_prea <- (CrefPREA_lt) cref ;;
-			ne <- inv e ;;
-			(* first mux *)
-			mux1_sel <- and2(s_run,nc_wait) ;;
-			mux1_out <- mux2 mux1_sel (REQUEST_NIL,cr) ;;
-			(* second mux *)
-			t0 <- and2 (ne,c_prea) ;;
-			mux2_sel <- and2 (s_idle,t0) ;;
-			mux2_out <- mux2 mux2_sel (mux1_out,tr) ;;
-			ret (mux2_out,mux2_out)
-		)).
-
-	Definition CmdGen : Circuit
-	(state_t * empty_t * counter_t * counter_ref_t * request_t) (command_t) :=
-	Comb (fun '(s,e,c,cref,req) =>
-		(* signals *)
-		s_idle <- Sidle s ;; 
-		s_run <- Srun s ;; 
-		s_ref <- Sref s ;;
-		c_cas <- CeqCAS c ;; 
-		c_act <- CeqACT c ;;
-		c_prea <- CrefPREA_eq cref ;;
-		c_prea' <- CrefPREA_lt cref ;;
-		(* c_prea_n <- inv c_prea ;; *)
-		c_ref <- CrefREF cref ;;
-		ne <- inv e ;;
-		(* REF mux *)
-		ref_mux_sel <- and2 (s_ref,c_ref) ;;
-		ref_mux_out <- mux2 ref_mux_sel (NOP,REF) ;;
-		(* PREA mux *)
-		prea_mux_sel <- and2 (s_idle,c_prea) ;;
-		prea_mux_out <- mux2 prea_mux_sel (ref_mux_out,PREA);;
-		(* CAS mux *)
-		rd_wr_mux_sel <- RequestType (req) ;;
-		rd_wr_mux_out <- mux2 rd_wr_mux_sel (RD,WR) ;;
-		cas_mux_sel <- and2 (s_run,c_cas) ;;
-		cas_mux_out <- mux2 cas_mux_sel (prea_mux_out,rd_wr_mux_out) ;;
-		(* ACT mux *)
-		act_mux_sel <- and2 (s_run,c_act) ;;
-		act_mux_out <- mux2 act_mux_sel (cas_mux_out,ACT) ;;
-		(* PRE mux *)
-		t0 <- and2 (ne,c_prea') ;;
-		pre_mux_sel <- and2 (s_idle,t0) ;;
-		mux2 pre_mux_sel (act_mux_out,PRE)
-	).
-
-	Definition Update_s (input : state_t * empty_t * counter_t * counter_ref_t) :
-	cava (state_t) := let '(s,e,c,cref) := input in 
-		s_idle <- Sidle s ;; 
-		s_run <- Srun s ;; 
-		s_ref <- Sref s ;;
-		nc_eqwait <- (CeqWAIT >=> inv) c ;;
-		(* true if there is enough time to treat a request *)
-		c_service <- CrefPREA_lt cref ;;
-		(* true if it is refresh time *)
-		c_prea <- CrefPREA_eq cref ;;
-		nc_refend <- (CrefEND >=> inv) cref ;;
-		ne <- inv e ;;
-		(* first mux *)
-		t0 <- and2 (ne,c_service) ;;
-		t1 <- and2 (s_idle,t0) ;;
-		t2 <- and2 (s_run,nc_eqwait) ;;
-		mux_idle_run_sel <- or2 (t1,t2) ;;
-		mux_idle_run_out <- mux2 mux_idle_run_sel (STATE_IDLE,STATE_RUN) ;;
-		(* second mux *)
-		t3 <- and2 (s_ref,nc_refend) ;;
-		t4 <- and2 (s_idle,c_prea) ;;
-		mux_ref_sel <- or2 (t3,t4) ;;
-		mux2 mux_ref_sel (mux_idle_run_out,STATE_REF).
-
-	Definition Update_c (input : state_t * empty_t * counter_t * counter_ref_t) :
-	cava (counter_t) := let '(s,e,c,cref) := input in 
-		s_idle <- Sidle s ;; 
-		s_ref <- Sref s ;;
-		c_eqwait <- CeqWAIT c ;;
-		c_prea <- CrefPREA_lt cref ;; 
-		c_refend <- CrefEND cref ;;
-		ne <- inv e ;;
-		(* mux logic *)
-		t1 <- and2 (s_ref,c_refend) ;;
-		t2 <- and2 (c_prea,ne) ;;
-		t3 <- and2 (s_idle,t2) ;;
-		t4 <- or2 (t3,t1) ;;
-		mux_sel <- or2 (c_eqwait,t4) ;;
-		cp1 <- incrN c ;;
-		mux2 mux_sel (cp1,CNT_NIL).
-
-	Definition Update_cref (input : state_t * empty_t * counter_t * counter_ref_t) :
-	cava (counter_ref_t) := let '(s,_,_,cref) := input in 
-		s_idle <- Sidle s ;; 
-		s_ref <- Sref s ;;
-		cref_prea <- CrefPREA_eq cref ;;
-		cref_end <- CrefEND cref ;;
-		t0 <- and2 (s_ref,cref_end) ;;
-		t1 <- and2 (s_idle,cref_prea) ;;
-		mux2_sel <- or2 (t0,t1) ;;
-		crefp1 <- incrN cref ;;
-		mux2 mux2_sel (crefp1,CNT_REF_NIL).
-
-	Definition Update_ : Circuit
-	(state_t * empty_t * counter_t * counter_ref_t) 
-	(state_t * counter_t * counter_ref_t) :=
-	Comb (fun '(s,e,c,cref) =>
-		s' <- Update_s (s,e,c,cref) ;;
-		c' <- Update_c (s,e,c,cref) ;;
-		cref' <- Update_cref (s,e,c,cref) ;;
-		ret (s',c',cref')
-	).
-
-	Definition FIFOSM_ : Circuit
-	(signal Bit * signal (Vec Bit REQUEST_WIDTH)) 
-	(signal Bit * signal (Vec Bit DRAM_CMD_WIDTH) * signal (Vec Bit REQUEST_WIDTH)) :=
-	let s_init    : combType (state) := STATE_IDLE_VEC in
-	let cnt_init  : combType (counter) := CNT_NIL_VEC in 
-	let cref_init : combType (counter_ref) := CNT_REF_NIL_VEC in
-	LoopInit s_init ( (* Rp, Rd, s *)
-		LoopInit cnt_init ( (* Rp, Rd, s, cnt *)
-			LoopInit cref_init ( (* Rp, Rd, s, cref, cref *)
-				Comb (fun '(Rp,Rd,s,cnt,cref) =>
-					s_idle <- Sidle s ;;
-					c_service <- CrefPREA_lt cref ;;
-					pop <- and2 (s_idle,c_service) ;;	
-					ret(s,cnt,cref,(Rp,Rd,pop))
-				) >==>
-				Second (RequestQueue') >==>
-				Comb (fun '(s,c,cref,(full,data,empty)) => ret (full,s,empty,c,cref,(s,empty,c,cref,data)))
-				>==> Second (NextCR) >==>
-				Comb (fun '(full,s,e,c,cref,cr) => ret (full,cr,s,e,c,cref,(s,e,c,cref,cr)))
-				>==> Second (CmdGen) >==>
-				Comb (fun '(full,cr,s,e,c,cref,cmd) => ret (full,cmd,cr,(s,e,c,cref)))
-				>==> Second (Update_) >==>
-				Comb (fun '(full,cmd,cr,(ns,nc,ncref)) => ret (full,cmd,cr,ns,nc,ncref))))).
-
-End CavaFIFOREF.
-
-Section SimCodeGen.
-
-	Existing Instance CavaCombinationalNet.
-
-	(* Defined in CommonInstances *)
-	Existing Instance SYS_CFG.
-	Existing Instance CAVA_SYS.
-
-	Program Instance FIFO_CFG : FIFO_configuration := {
-		(* orig: 65 *)
-    WAIT := 32;
-	}.
-
-	Definition fifo_interface
-		:= sequentialInterface "fifo_interface"
-		"clk" PositiveEdge "rst" PositiveEdge
-		[mkPort "Rp" Bit; mkPort "Rd" (Vec Bit REQUEST_WIDTH)]
-		[mkPort "full_o" Bit; mkPort "cmd_o" (Vec Bit DRAM_CMD_WIDTH); mkPort "CR" (Vec Bit REQUEST_WIDTH)].
-	
-	Definition sm_netlist := makeCircuitNetlist fifo_interface FIFOSM_.
-
-	(* Compute circuit_state memqueue'.
-	Compute circuit_state RequestQueue'.
-	Compute circuit_state FIFOSM_.
-
-	Compute circuit_state NextCR. *)
-
-	(* Compute circuit_state FIFOSM. *)
-
-	(* Compute circuit_state memqueue'. *)
-
-	(* Compute circuit_state memqueue'. *)
-	(* Compute circuit_state *)
-
-	(*
-	Import CavaSM.DataNotation.
-	Open Scope data_scope.
-	Definition Rsim1_wr := #H "00fe468b00000" | REQUEST_WIDTH.
-	Definition Rsim1_rd := #H "00fe468b10000" | REQUEST_WIDTH.
-	Definition Rsim2_wr := #H "027f234500001" | REQUEST_WIDTH.
-	Definition Rsim2_rd := #H "027f234510001" | REQUEST_WIDTH.
-	Definition Rsim3_wr := #H "033f91a200001" | REQUEST_WIDTH.
-	Definition Rsim3_rd := #H "033f91a210001" | REQUEST_WIDTH.
-	Definition Rsim5_wr := #H "00467f2300007" | REQUEST_WIDTH.
-	
-	(* Compute simulate RequestTypeCircuit [Rsim1_wr; Rsim1_rd; Rsim2_wr; Rsim2_rd; Rsim3_wr; Rsim3_rd; Rsim5_wr]. *)
-
-	Definition SM_out := (bool * Vector.t bool DRAM_CMD_WIDTH * Vector.t bool REQUEST_WIDTH)%type.
-
-	Definition cmd2string (cmd : Vector.t bool DRAM_CMD_WIDTH) : string :=
-		let eq := Vector.eqb bool eqb cmd in if eq NOP_VEC then "NOP"
-		else if eq PRE_VEC then "PRE"
-		else if eq ACT_VEC then "ACT" 
-		else if eq RD_VEC then "RD"
-		else if eq WR_VEC then "WR"
-		else if eq PREA_VEC then "PREA"
-		else if eq REF_VEC then "REF"
-		else "INVALID".
-
-	Infix "+s+" := String.append (at level 0).
-
-	Definition tuple2string (e : SM_out) : (string) :=
-		let '(full,cmd,req) := e in
-		let full_str := if full then "FULL, " else "NOT FULL, " in
-		let cmd_str := cmd2string cmd in
-		let req_N := HexString.of_N (Bv2N req) in (full_str +s+ cmd_str +s+ " ," +s+ req_N).
-
-	Fixpoint index_ {T} (e : seq T) : seq nat :=
-		match e with
-		| [::] => [0]
-		| x :: s => [length e] ++ (index_ s)
-		end.
-
-	Definition map_out (input : seq (bool * Vector.t bool DRAM_CMD_WIDTH * Vector.t bool REQUEST_WIDTH))
-		:= zip (rev (index_ input)) (map (tuple2string) input).
-
-	Definition map_queue_out (e : seq (bool * Vector.t bool REQUEST_WIDTH * bool))
-		:= map (fun '(full,data,empty) => (full,HexString.of_N (Bv2N data),empty)) e.
-
-	Definition state2string (s : Vector.t bool STATE_WIDTH) : string := 
-		let eq := Vector.eqb bool eqb s in if eq STATE_IDLE_VEC then "IDLE"
-		else if eq STATE_RUN_VEC then "RUNNING"
-		else if eq STATE_REF_VEC then "REFRESHING"
-		else "STATE INVALID".
-	
-	Definition map_update_out (e : seq (Vector.t bool STATE_WIDTH * bool * Vector.t bool COUNTER_WIDTH *
-		Vector.t bool COUNTER_REF_WIDTH)) 
-		:= map (fun '(s,e,cnt,cref) => (state2string s,e,Bv2N cnt,Bv2N cref)) e.
-
-	(* Compute map_queue_out (simulate RequestQueue [
-		(true,Rsim1_wr,false);
-		(true,Rsim1_rd,false)
-	]).
-
-	Compute (map HexString.of_N (map Bv2N (simulate NextCR [
-		(STATE_IDLE_VEC,true,CNT_NIL,CNT_REF_NIL,REQUEST_NIL);
-		(STATE_IDLE_VEC,false,(#D 1 | COUNTER_WIDTH),(#D 1 | COUNTER_REF_WIDTH),Rsim1_wr)
-	]))).
-
-	Compute (map BinaryString.of_N (map Bv2N (simulate CmdGen [
-		(STATE_IDLE_VEC,true,CNT_NIL,CNT_REF_NIL,REQUEST_NIL);
-		(STATE_IDLE_VEC,false,(#D 1 | COUNTER_WIDTH),(#D 1 | COUNTER_REF_WIDTH),Rsim1_wr))
-	]))).
-
-	Compute (map_update_out (simulate Update [
-		(STATE_IDLE_VEC,true,CNT_NIL,CNT_REF_NIL)
-	])). *)
-
-	Open Scope seq_scope.
-	Definition sm_inputs := [
-		(true,Rsim1_wr);
-		(true,Rsim1_rd);
-		(true,Rsim2_wr);
-		(true,Rsim2_rd);
-		(true,Rsim3_wr);
-		(true,Rsim3_rd)
-		] ++ (repeat (false,REQUEST_NIL) 20).
-	Close Scope seq_scope.
-
-	Compute (map_out (simulate FIFOSM sm_inputs)).
-
-	Definition expected_out := simulate FIFOSM sm_inputs.
-
-	Definition sm_tb := 
-		testBench "sm_tb" (sm_interface) sm_inputs expected_out.
-
-	*)
-End SimCodeGen.
\ No newline at end of file
diff --git a/framework/CavaDRAM/CavaFIFOREF/CavaFIFOREFProperties.v b/framework/CavaDRAM/CavaFIFOREF/CavaFIFOREFProperties.v
deleted file mode 100644
index 1e336a4..0000000
--- a/framework/CavaDRAM/CavaFIFOREF/CavaFIFOREFProperties.v
+++ /dev/null
@@ -1,1630 +0,0 @@
-Set Printing Projections.
-Set Warnings "-notation-overridden,-parsing". 
-
-From CavaDRAM Require Import CavaFIFOREF CavaSM CavaReqQueue CavaCommonInstances CavaSubtractor Step CavaSystem Memory Util UtilSM.
-From CoqDRAM Require Import FIFO.
-From Coq Require Import Program BinaryString HexString NArith.
-From Cava Require Import Cava CavaProperties Util.Vector Util.Tactics.
-From mathcomp Require Import fintype ssrZ zify ring.
-
-Section CavaFIFOREFProperties.
-
-	Context {signal : SignalType -> Type} {semantics : Cava signal}.
-	(* From Cava *)
-	Existing Instance CombinationalSemantics.
-	(* From CavaDRAM*)
-	Context {CAVA_SYS : CavaSystem}.
-	(* From CoqDRAM *)
-	Existing Instance REQESTOR_CFG.
-  Context {SYS_CFG      : System_configuration}.
-	Context {FIFO_CFG     : FIFO_configuration}.
-	Context {HAF					: HW_Arrival_function_t}.
-	Existing Instance ARBITER_CFG.
-	Existing Instance FIFO_implementation.
-
-	Import Memory.Properties BvectorNotations.
-	Open Scope Bvector_scope.
-
-	Lemma leq_Nle (a b : N) :
-		leq (nat_of_bin a) (nat_of_bin b) -> (a <= b)%N.
-	Proof.
-		lia.
-	Qed.
-
-	Lemma ltn_Ntn (a b : N) :
-		leq (S (nat_of_bin a)) (nat_of_bin b) -> (a < b)%N.
-	Proof.
-		lia.
-	Qed.
-
-	Lemma log2_eq1_pw2 (n : nat) :
-		Nat.pow 2 (Nat.log2 n) = n ->
-		Nat.log2 n = 1 -> n = 2.
-	Proof.
-		intros. by rewrite H0 in H.
-	Qed.
-
-	Lemma Bv_eq_translation {n} (a b : Bvector n) :
-		(nat_of_bin (Bv2N a) = nat_of_bin (Bv2N b)) ->
-		(Bv2N a = Bv2N b)%N.
-	Proof.
-		lia.
-	Qed.
-
-	Lemma Bv_ltn_translation {n} (a b : Bvector n) :
-		(nat_of_bin (Bv2N a) < nat_of_bin (Bv2N b)) ->
-		(Bv2N a < Bv2N b)%N.
-	Proof.
-		lia.
-	Qed.
-
-	Lemma lt_trans_le (n m p : N):
-		(m < n)%N -> (n < p)%N -> (m + 1 < p)%N.
-	Proof.
-		lia.
-	Qed.
-
-	Lemma to_nat_lt_of_nat (a : N) (n : nat) :
-		N.to_nat a < n -> (a < N.of_nat n)%N.
-	Proof.
-		intros.
-		induction n; [ discriminate | ].
-		rewrite leq_eqVlt in H; move: H => /orP [/eqP H | H].
-		{ rewrite -H Nat2N.inj_succ N2Nat.id; by specialize (N.lt_succ_diag_r a). }
-		assert (N.to_nat a < n).
-		{ specialize (ltn_add2r 1 (N.to_nat a) n) as S; rewrite !addn1 in S; by rewrite S in H. }
-		apply IHn in H0.
-		apply N.lt_trans with (m := N.of_nat n); [ done | ].
-		rewrite Nat2N.inj_succ; by specialize (N.lt_succ_diag_r (N.of_nat n)).
-	Qed.
-
-	Lemma to_nat_lt_pow a b:
-		N.to_nat a < Nat.pow 2 b -> (a < 2 ^ N.of_nat b)%N.
-	Proof.
-		intros; apply to_nat_lt_of_nat in H.
-		rewrite -Nat2N.inj_pow in H.
-		by simpl (N.of_nat 2) in H.
-	Qed.
-
-	Lemma length_to_list_shiftin {A N} (v : Vector.t A N) (e : A) :
-		Datatypes.length (Vector.to_list (Vector.shiftin e v)) = N + 1.
-	Proof.
-		induction v; [ rewrite //= | ]. 
-		unfold Vector.shiftin; fold @Vector.shiftin.
-		rewrite to_list_cons cons_length IHv; lia.
-	Qed.
-
-	Lemma last_shiftin {A N} (v : Vector.t A N) (def e : A) :
-		last (Vector.to_list (Vector.shiftin e v)) def = e.
-	Proof.
-		induction v; [ rewrite //= | ].
-		unfold Vector.shiftin; fold @Vector.shiftin.
-		rewrite to_list_cons //=.
-		destruct (Vector.to_list (Vector.shiftin e v)) eqn:Hbug;
-		[ contradict Hbug; induction v; simpl; done | ].
-		done.
-	Qed.
-
-	Lemma Bv2N_upper_bound {n : nat} (bv : Bvector n) :
-		(N.to_nat (Bv2N bv) < (Nat.pow 2 n)).
-	Proof.
-		induction bv; [ by simpl | ]; destruct h; rewrite Bv2N_cons.
-		{ rewrite N.succ_double_spec.
-			set z := Bv2N _; fold z in IHbv.
-			rewrite N2Nat.inj_add N2Nat.inj_mul.
-			vm_compute (N.to_nat 1); vm_compute (N.to_nat 2).
-			assert ((2 * N.to_nat z)%coq_nat = (2 * N.to_nat z)%nat); try done; rewrite H; clear H.
-			assert ((2 * N.to_nat z + 1)%coq_nat = (2 * N.to_nat z + 1)%nat); try done; rewrite H; clear H.
-			apply ltn_mul_add1 in IHbv.
-			rewrite Nat.pow_succ_r; [ | apply /leP; by rewrite leq0n ].
-			assert ((2 * (2 ^ n))%coq_nat = (2 * (2 ^ n))%nat); try done; rewrite H; clear H. }
-		{ rewrite N.double_spec N2Nat.inj_mul; set z := Bv2N _; fold z in IHbv; vm_compute (N.to_nat 2).
-			assert ((2 * N.to_nat z)%coq_nat = (2 * N.to_nat z)%nat); try done; rewrite H; clear H.
-			have aux : (0 < 2); [ done | ].
-			have H := (ltn_pmul2l aux); rewrite -H in IHbv.
-			rewrite Nat.pow_succ_r; [ | apply /leP; by rewrite leq0n ]; clear H.
-			assert ((2 * (2 ^ n))%coq_nat = (2 * (2 ^ n))%nat); try done; rewrite H; clear H.
-		}
-	Qed.
-
-	Lemma size_nat_sub_leq {n} (a b : Bvector n):
-		(Bv2N b <= Bv2N a)%N ->
-		N.size_nat (Bv2N a - Bv2N b) <= n.
-	Proof.
-		intros; apply /leP; apply N.size_nat_le. 
-		specialize (@Bv2N_upper_bound n a) as Ha.
-		specialize (@Bv2N_upper_bound n b) as Hb.
-		destruct (Bv2N b) eqn:Hb0, (Bv2N a) eqn:Ha0; try discriminate.
-		{ simpl in *; by apply to_nat_lt_pow. }
-		{ rewrite N.sub_0_r; by apply to_nat_lt_pow in Ha. }
-		{ by contradict H. }
-		{ apply to_nat_lt_pow in Ha,Hb.
-			apply (N.lt_trans (N.pos p0 - N.pos p) (N.pos p0) (2 ^ N.of_nat n)%N); [ | done].
-			apply N.sub_lt; done.
-		}
-	Qed.
-
-	Lemma N2Bv_sized_eq_p1_false {W} (v : Bvector W):
-		W > 0 -> (N2Bv_sized W (Bv2N v + 1) =? v) = false.
-	Proof.
-		intros; apply BVEq_iff_neq.
-		rewrite N.add_1_r.
-		specialize (N2Bv_sized_Bv2N W v) as H0; rewrite -{2}H0.
-		by apply N2Bv_sized_neq_succ.
-	Qed.
-
-	Lemma cons_eq {n} (x : bool) (a b : Vector.t bool n):
-		(x :: a)%vector =? (x :: b)%vector ->
-		BVeq n n a b.
-	Proof.
-	Admitted.
-
-	Lemma Bvector_wrap {W} (v : Bvector W) :
-		W > 0 -> N2Bv_sized W (Bv2N (N2Bv_sized W (Bv2N v + 1)) + 1) =? v ->
-		W = 1.
-	Proof.
-		intros Hpos H.
-		induction v; intros; try discriminate.
-		rewrite ltnS leq_eqVlt in Hpos; move: Hpos => /orP [/eqP Heq | Hpos];
-		[ by subst n | ].
-		apply (IHv) in Hpos as IH; clear IHv.
-		2: {
-			destruct h; simpl in H; [ 
-			rewrite N.succ_double_succ N2Bv_sized_double Bv2N_cons N.double_succ_double 
-			N2Bv_sized_succ_double N2Bv_sized_Bv2N in H |
-			rewrite N.double_succ_double N2Bv_sized_succ_double Bv2N_cons N.succ_double_succ
-			N2Bv_sized_double N2Bv_sized_Bv2N in H ];
-			apply cons_eq in H;
-			specialize (@N2Bv_sized_eq_p1_false n v) as HH; apply HH in Hpos;
-			by rewrite Hpos in H.
-		}
-		revert H; generalize v; clear v; rewrite IH; intros.
-		simpl in H; destruct h; rewrite (Vector.eta v) in H;
-		specialize (@tl_0 bool v) as H0; rewrite H0 in H;
-		destruct (VectorDef.hd v); simpl in H; discriminate H.
-	Qed.
-
-	(* --------------------------------------------------------------- *)
-	(* Start of FIFO specific proofs *)
-	Lemma N2Bv_sized_queuemax_neq0 :
-		N2Bv_sized ADDR_WIDTH 0 <> N2Bv_sized ADDR_WIDTH (N.of_nat QUEUE_MAX_SIZE - 1).
-	Proof.
-		apply N2Bv_sized_neq_iff; unfold ADDR_WIDTH.
-		{ rewrite /N.size_nat /Nat.log2 //=. }
-		{ rewrite -N.pred_sub -Nat2N.inj_pred.
-			apply /leP; apply N.size_nat_le_nat.
-			rewrite QUEUE_MAX_SIZE_PW2; apply /leP.
-			rewrite ltn_predL; apply /leP.
-			exact QUEUE_MAX_SIZE_GT_0. }
-		{ rewrite -N.pred_sub -Nat2N.inj_pred.
-			specialize QUEUE_MAX_SIZE_DIFF_0 as HH.
-			move: HH => /N.eqb_spec HH.
-			by apply /N.eqb_spec.
-		}
-	Qed.
-
-	Definition mem_cells_ := 
-		mem_cells (Vec Bit REQUEST_WIDTH) ADDR_WIDTH (Nat.pow 2 ADDR_WIDTH) InitMem.
-
-	Lemma shiftin_nth_default {A} (def : A) (a : A) n (v: Vector.t A n) (k1 k2 : nat) (eq: k1 = k2):
-		k1 < n ->
-		nth_default def k1 (Vector.shiftin a v) = nth_default def k2 v.
-	Admitted.
-
-	(* --------------------------------------------------------------- *)
-	(* Solving the memory problem *)
-
-	Lemma nth_cells_read {T W I} (ad : Bvector W) c_req def
-		(c : circuit_state (mem_cells T W (2 ^ W) I)) :
-		nth_default def (N.to_nat (Bv2N ad)) (Cells_read true (N.to_nat (Bv2N ad)) c_req c) = c_req.
-	Admitted.
-
-	Lemma nth_cells_read_ {T W I N} (ad : Bvector (Nat.log2 N)) c_req def
-		(c : circuit_state (mem_cells T W N I)) : N > 0 ->
-		nth_default def (N.to_nat (Bv2N ad)) (Cells_read true (N.to_nat (Bv2N ad)) c_req c) = c_req.
-	Proof.
-		intros Hpos; rewrite nth_default_to_list.
-		induction N; intros; [ discriminate | ].
-		rewrite leq_eqVlt in Hpos; move: Hpos => /orP [/eqP Heq | Hpos].
-		{ assert (N = 0); [ lia | ]; clear IHN Heq; subst N.
-			revert ad; rewrite Nat.log2_1; intros.
-			apply Vector.case0 with (v := ad).
-			simpl in c; destruct_products.
-			rewrite /Cells_read //= andb_true_r.
-		}
-		assert (0 < N); [ lia | ]; clear Hpos.
-		simpl in c; destruct_products; rewrite //= andb_true_r.
-		specialize (Nat.log2_succ_or N) as Hor; destruct Hor as [Hor | Hor].
-		{ revert ad; rewrite Hor; intros.
-			destruct (Nat.eqb (N.to_nat (Bv2N ad)) N) eqn:HH; set memvec := Cells_read true _ _ _.
-			{ assert (N.to_nat (Bv2N ad) = N) as H0; [ lia | ]; clear HH;
-				rewrite H0.
-				specialize (@length_to_list_shiftin (combType T) N memvec c_req) as HH.
-				assert (N = (Datatypes.length (Vector.to_list (Vector.shiftin c_req memvec))) - 1)%coq_nat; [ lia | ].
-				apply nth_last with (d := def) in H1; rewrite H1.
-				by rewrite last_shiftin. }
-			{ unfold memvec.
-				specialize (IHN (VectorDef.tl ad) c0); apply IHN in H as IH; clear IHN.
-				rewrite (Vector.eta ad) Bv2N_cons.
-				destruct (Vector.hd ad). 
-				{ rewrite N2Nat.inj_succ_double //= !Nat.add_0_r.
-					rewrite -nth_tl.
-					set adtl := N.to_nat (Bv2N (VectorDef.tl ad)).
-					fold adtl in IH.
-					admit. }
-				{ admit. }
-	Admitted.
-	(*-----------------------------------------------------------------------------------*)
-
-	Lemma memcell_nch (c: circuit_state mem_cells_) (wra rda : Bvector ADDR_WIDTH) c_req def:
-		wra <> rda ->
-		nth_default def (N.to_nat (Bv2N rda)) (Cells_data c) =
-		nth_default def (N.to_nat (Bv2N rda)) (Cells_read true (N.to_nat (Bv2N wra)) c_req c).
-	Admitted.
-
-	(* Need a to be bigger than b  *)
-	Lemma size_nat_qms_sub (a b: Bvector ADDR_WIDTH) :
-		(Bv2N b < Bv2N a)%N ->
-		N.size_nat (N.of_nat QUEUE_MAX_SIZE - (Bv2N a - Bv2N b)) <= ADDR_WIDTH.
-	Proof.
-		intros Hlt; apply /leP.
-		destruct (Bv2N b) eqn:Hb0, (Bv2N a) eqn:Ha0; try done;
-		apply N.size_nat_le; unfold ADDR_WIDTH; rewrite QUEUE_MAX_SIZE_PW2_N; try rewrite N.sub_0_r.
-		{ apply N.sub_lt; [ | done].
-			unfold ADDR_WIDTH in a,b.
-			specialize (@Bv2N_upper_bound (Nat.log2 QUEUE_MAX_SIZE) a) as Ha.
-			rewrite QUEUE_MAX_SIZE_PW2 in Ha.
-			rewrite Ha0 in Ha.
-			apply to_nat_lt_of_nat in Ha.
-			apply N.le_lteq; left; exact Ha.
-		}
-		{ apply N.sub_lt; [ | apply N.lt_add_lt_sub_l; by rewrite N.add_0_r ].
-			unfold ADDR_WIDTH in a,b.
-			specialize (@Bv2N_upper_bound (Nat.log2 QUEUE_MAX_SIZE) a) as Ha.
-			rewrite QUEUE_MAX_SIZE_PW2 in Ha.	
-			specialize (@Bv2N_upper_bound (Nat.log2 QUEUE_MAX_SIZE) b) as Hb.
-			rewrite QUEUE_MAX_SIZE_PW2 in Hb.
-			apply to_nat_lt_of_nat in Ha,Hb; rewrite Ha0 in Ha; rewrite Hb0 in Hb.
-			apply N.le_sub_le_add_l; rewrite N.add_comm.
-			apply N.lt_trans with (m := N.of_nat (@QUEUE_MAX_SIZE CAVA_SYS)) (n := N.pos p0)
-			(p := N.add (N.of_nat (@QUEUE_MAX_SIZE CAVA_SYS)) (N.pos p)) in Ha as H;
-			[ apply N.le_lteq; by left | ].
-			apply N.lt_add_pos_r; done.
-		}
-	Qed.
-	
-	Lemma size_nat_qms :
-		N.size_nat (N.of_nat QUEUE_MAX_SIZE - 1) <= Nat.log2 QUEUE_MAX_SIZE.
-	Proof.
-		rewrite N.sub_1_r -Nat2N.inj_pred.
-		apply /leP; apply N.size_nat_le_nat.
-		rewrite QUEUE_MAX_SIZE_PW2.
-		apply /ltP; rewrite ltn_predL; apply /ltP.
-		exact QUEUE_MAX_SIZE_GT_0.
-	Qed.
-
-	Definition State_t := circuit_state FIFOSM.
-
-	Definition get_mem (s : State_t) : circuit_state memqueue' := 
-	let '(_,(_,(_,(_,_,_,memqueue_state,_,_,_,_,_),_),_,_)) := s in memqueue_state.
-
-	Definition get_pop (s : State_t) :=
-	let '(_,(_,_,_,pop)) := s in pop.
-
-	Definition get_st (s : State_t) :=
-	let '(_,(_,_,(_,(_,_,st)),_)) := s in st.
-
-	Definition get_cnt (s : State_t) :=
-	let '(_,(_,_,(_,(_,(_,_,cnt),_)),_)) := s in cnt.
-
-	Definition get_cref (s : State_t) :=
-	let '(_,(_,_,(_,(_,(_,(_,_,_,_,_,_,_,cref),_),_)),_)) := s in cref.
-
-	Definition get_cr (s : State_t) :=
-	let '(_,(_,_,(_,(_,(_,(_,(_,(_,cr)),_,_,_,_,_,_),_),_)),_)) := s in cr.
-
-	Definition get_wra (s : State_t) :=
-	let '(_,(_,(_,_,wra),_,_)) := s in wra.
-
-	Definition get_rda (s : State_t) :=
-	let '(_,(_,(_,(_,_,_,_,_,_,_,_,rda),_),_,_)) := s in rda.
-
-	Definition get_reqqueue (s : State_t) : circuit_state RequestQueue' :=
-	let '(_,(cs_requeue,_,_)) := s in cs_requeue.
-
-	Definition get_mem_RequestQueue (c : circuit_state RequestQueue') :=
-		let '(_,(_,(_,_, _,memqueue_state,_,_,_,_,_),_)) := c in memqueue_state.
-	
-	Definition get_addr_RequestQueue (c : circuit_state RequestQueue') :=
-	let '(_,(_,(_,_, _,_,_,_,_,_,rda),wra)) := c in (wra,rda).
-
-	Definition get_memcells (s : circuit_state memqueue') :=
-		let '(_,memcells_state,_) := s in memcells_state.
-
-	Definition get_memcells_RequestQueue (c : circuit_state RequestQueue') :=
-	get_memcells (get_mem_RequestQueue c).
-
-	(* --------------------------Bounding the counter ------------------- *)
-	Lemma cnt_bounded (cnt : Bvector COUNTER_WIDTH) :
-		N.to_nat (Bv2N cnt) < WAIT.
-	Proof.
-		specialize @Bv2N_upper_bound with (bv := cnt) as H.
-		by rewrite /COUNTER_WIDTH WAIT_PW_2 in H.
-	Qed.
-
-	Definition Bv2cnt (cnt : Bvector COUNTER_WIDTH) : Counter_t :=
-		Ordinal (cnt_bounded cnt).
-
-	Definition cnt2Bv (cnt : Counter_t) := 
-		N2Bv_sized COUNTER_WIDTH (N.of_nat (nat_of_ord cnt)).
-	(* ------------------------------------------------------------------ *)
-
-	(* --------------------------Bounding cref counter ------------------- *)
-	Lemma cref_bounded (cref : Bvector COUNTER_REF_WIDTH) :
-		N.to_nat (Bv2N cref) < WAIT_REF.
-	Proof.
-		specialize @Bv2N_upper_bound with (bv := cref) as H.
-		by rewrite /COUNTER_REF_WIDTH WAIT_REF_PW2 in H.
-	Qed.
-
-	Definition Bv2cref (cnt : Bvector COUNTER_REF_WIDTH) : Counter_ref_t :=
-		Ordinal (cref_bounded cnt).
-
-	Definition cref2Bv (cref : Counter_ref_t) := 
-		N2Bv_sized COUNTER_REF_WIDTH (N.of_nat (nat_of_ord cref)).
-	(* ------------------------------------------------------------------ *)
-
-	Lemma cref_preadate_false (c : Counter_ref_t) :
-		(cref2Bv c =? CNT_REF_PREA) = false <->
-		(nat_of_ord c == PREA_date - 1) = false.
-	Proof.
-		split. {
-			unfold cref2Bv, CNT_REF_PREA; intros.
-			apply BVEq_iff_neq in H; rewrite bitvec_literal_correct in H.
-			apply N2Bv_sized_neq_if in H.
-			apply of_nat_neq in H.
-			by apply /eqP. 
-		}
-		{ intros.
-			apply BVEq_iff_neq.
-			rewrite /cref2Bv /CNT_REF_PREA bitvec_literal_correct.
-			apply N2Bv_sized_neq_iff; [ | | move: H => /eqP H; by rewrite Nat2N.inj_iff ];
-			apply /leP; apply N.size_nat_le_nat; unfold COUNTER_REF_WIDTH; apply /leP;
-			rewrite WAIT_REF_PW2; [ by destruct c | specialize WAIT_REF_PREA_date as HH; by lia ].
-		}
-	Qed.
-
-	Lemma cref_preadate_true (c : Counter_ref_t) :
-		(cref2Bv c =? CNT_REF_PREA) = true <->
-		(nat_of_ord c == PREA_date - 1) = true.
-	Proof.
-		split.
-		{ unfold cref2Bv, CNT_REF_PREA; intros.
-			apply BVEq_iff_eq in H; rewrite bitvec_literal_correct in H.
-			apply N2Bv_sized_eq_iff in H.
-			{ apply Nat2N.inj in H; rewrite H; by apply /eqP. }
-			{ apply N.size_nat_le_nat. 
-				destruct c; simpl in *; rewrite /COUNTER_REF_WIDTH; apply /ltP.
-				by rewrite WAIT_REF_PW2. }
-			{ apply N.size_nat_le_nat; unfold COUNTER_REF_WIDTH.
-				rewrite WAIT_REF_PW2 subn1; apply /ltP.
-				specialize WAIT_REF_PREA_date as HH.
-				apply ltn_trans with (m := PREA_date.-1) in HH; [ exact HH | ].
-				by rewrite ltn_predL PREA_date_pos.
-			}
-		}
-		{ intros Href_prea; move: Href_prea => /eqP Href_prea; apply BVEq_iff_eq.
-			rewrite /cref2Bv /CNT_REF_PREA bitvec_literal_correct; f_equal.
-			by rewrite Href_prea. 
-		}
-	Qed.
-
-	Definition fullQueue (wa ra : Bvector ADDR_WIDTH) : bool :=
-		let waN := Bv2N wa in
-		let raN := Bv2N ra in
-		let qms := N.sub (N.of_nat QUEUE_MAX_SIZE) 1 in
-		if (raN <= waN)%nat then ((Bv2N wa - Bv2N ra)%N == qms)
-		else (((N.add qms 1) - (raN - waN))%N == qms).
-
-	Hypothesis HaltIfFull : forall t c,
-		let wra := get_wra c in
-		let rda := get_rda c in
-		if (HW_Arrival_at t != []) then ~~ fullQueue wra rda else true.
-
-	Program Definition EqReq (r : Request_t) (r' : Bvector REQUEST_WIDTH) : bool.
-	Admitted.
-
-	Lemma EqReqNil : EqReq nullreq REQUEST_NIL = true.
-	Admitted.
-
-	Definition EqCmd (f_cmd : Command_kind_t) (c_cmd : Bvector DRAM_CMD_WIDTH) : bool :=
-		match f_cmd with
-			| ACT => (c_cmd =? ACT_VEC)
-			| PRE => (c_cmd =? PRE_VEC)
-			| PREA => (c_cmd =? PREA_VEC)
-			| CRD => (c_cmd =? RD_VEC)
-			| CWR => (c_cmd =? WR_VEC)
-			| REF => (c_cmd =? REF_VEC)
-			| NOP => (c_cmd =? NOP_VEC)
-		end.
-
-	Fixpoint EqQueue (P : Requests_t) (wra rda : Bvector ADDR_WIDTH) :=
-		match P with
-			| [::] => (wra =? rda)
-			| x :: x0 => negb (wra =? rda) && (EqQueue x0 wra (N2Bv_sized ADDR_WIDTH (Bv2N rda + 1)))
-		end.
-
-	Lemma EqQueue_diff_adr r0 r1 wra rda:
-		EqQueue (r0 :: r1) wra rda -> wra <> rda.
-	Proof.
-		simpl; intros; move: H => /andP [Hd H];
-		by move: Hd => /negPf Hd; apply BVEq_iff_neq in Hd.
-	Qed.
-
-	Lemma EqQueue_aux wra rda r0 r1 r:
-		~~ fullQueue wra rda -> wra <> rda ->
-		EqQueue (r0 :: r1)%SEQ wra rda ->
-		EqQueue ((r0 :: r1)%SEQ ++ [r])%SEQ (N2Bv_sized ADDR_WIDTH (Bv2N wra + 1)) rda.
-	Proof.
-		intros NFULL Hadr HQ; rewrite //=.
-		simpl in HQ; move: HQ => /andP [_ HQ].
-		revert HQ Hadr NFULL; generalize wra rda; induction r1; intros; simpl in HQ.
-		{ apply /andP; split.
-			{ unfold fullQueue in NFULL.
-				move: NFULL; apply contraPN; intros; apply /negP; rewrite negb_involutive.
-				specialize ADDR_WIDTH_pos as Hawp; move: Hawp => /ltP Hawp.
-				destruct (Bv2N rda0 <= _) eqn:Hleq.
-				{ apply BVEq_iff_eq in HQ as HQ'; rewrite HQ' in H; clear HQ'.
-					apply Bvector_wrap in H; [ | apply /ltP; exact ADDR_WIDTH_pos ].
-					apply log2_eq1_pw2 in H as H2 ; [ | by rewrite QUEUE_MAX_SIZE_PW2 ]; clear H.
-					rewrite H2; simpl ((N.of_nat 2 - 1)%N); simpl (N.add (Npos _) (Npos _)).
-					apply BVEq_iff_eq in HQ; rewrite HQ Bv2N_N2Bv_sized; [ lia | ].
-					apply /N.ltb_spec0.
-					destruct ((Bv2N rda0 + 1 <? 2 ^ N.of_nat ADDR_WIDTH)%N) eqn:Hcont; [ done | ].
-					move: Hcont => /negP /negP Hcont; rewrite -N.leb_antisym in Hcont.
-					move: Hcont => /N.leb_spec0 Hcont.
-					unfold ADDR_WIDTH in Hcont; rewrite QUEUE_MAX_SIZE_PW2_N in Hcont.
-					rewrite leq_eqVlt in Hleq; move: Hleq => /orP [/eqP Hbug | Hltn].
-					{ specialize (@Bv2N_inj ADDR_WIDTH rda0 wra0) as HH.
-						apply Bv_eq_translation in Hbug; apply HH in Hbug; by rewrite Hbug in Hadr. }
-					apply N.le_lteq in Hcont; destruct Hcont as [Hcont0 | Hcont1];
-					specialize (@Bv2N_upper_bound ADDR_WIDTH wra0) as H;
-					apply Bv_ltn_translation in Hltn;
-					apply to_nat_lt_pow in H;
-					rewrite /ADDR_WIDTH QUEUE_MAX_SIZE_PW2_N in H;
-					apply lt_trans_le with (p := N.of_nat QUEUE_MAX_SIZE) in Hltn; try done.
-					{ contradict Hcont0; by apply N.lt_asymm. }
-					{	contradict Hcont1; apply N.neq_sym; by apply N.lt_neq. }
-				}
-				{ apply BVEq_iff_eq in H; rewrite -H Bv2N_N2Bv_sized; [ lia | ].
-					move: Hleq => /negP /negP Hleq; rewrite -ltnNge in Hleq.
-					apply /N.ltb_spec0.
-					destruct ((Bv2N wra0 + 1 <? 2 ^ N.of_nat ADDR_WIDTH)%N) eqn:Hcont; [ done | ].
-					unfold ADDR_WIDTH in Hcont; rewrite QUEUE_MAX_SIZE_PW2_N in Hcont.
-					move: Hcont => /negP /negP Hcont; rewrite -N.leb_antisym in Hcont; move: Hcont => /N.leb_spec0 Hcont.
-					apply N.le_lteq in Hcont; destruct Hcont as [Hcont0 | Hcont1].
-					{ (* use rda bound*) admit. (* proof on page 11 of FIFO notebook *) }
-					{ specialize (@Bv2N_upper_bound ADDR_WIDTH rda0) as Hu.
-						unfold ADDR_WIDTH in Hu; rewrite QUEUE_MAX_SIZE_PW2 in Hu.
-						assert (QUEUE_MAX_SIZE = N.to_nat (Bv2N wra0 + 1)).
-						{ specialize (N2Nat.id (Bv2N wra0 + 1)) as H_; rewrite -H_ in Hcont1.
-							by apply Nat2N.inj in Hcont1. }
-						admit.
-						(* finish proof by rewriting H1 in Hu, which results in
-						(Bv2N rda < Bv2N wra + 1) -> (Bv2N rda <= Bv2N wra), which contradicts 
-						Bv2N wra < Bv2N rda *)
-					}
-				}
-			}
-			{ simpl; apply BVEq_iff_eq in HQ; apply /andP; split. 
-				{ admit. (* should be easy *) }
-				{ rewrite HQ; by apply BVEq_iff_eq. }
-			}
-		}
-		move: HQ => /andP [neq HQ].
-		specialize (IHr1 wra0 (N2Bv_sized ADDR_WIDTH (Bv2N rda0 + 1))); apply IHr1 in HQ as IH; clear IHr1.
-		3: { 
-			(* Don't know how to prove that *)
-			(* holds logically (page 12 FIFO notebook) *)
-			unfold fullQueue; unfold fullQueue in NFULL.
-			admit.
-		}
-		2: by move: neq => /negPf neq; apply BVEq_iff_neq in neq.
-		simpl; apply /andP; split.
-		{ move: IH => /andP [neq_ IH].
-			admit. (* holds logically (page 12 FIFO notebook )*) }
-		exact IH.
-	Admitted.
-
-	Check nth_default.
-
-	Fixpoint EqMem_ {W} (P : Requests_t) (rda : Bvector W)
-		(memcells_vec : Vector.t (Bvector REQUEST_WIDTH) (Nat.pow 2 W)) : bool :=
-		match P with
-			| [::] => true
-			| x :: x0 =>
-				let nrda := N2Bv_sized W (Bv2N rda + 1) in
-				let s := nth_default REQUEST_NIL (N.to_nat (Bv2N rda)) memcells_vec in
-				(EqReq x s) && (EqMem_ x0 nrda memcells_vec)
-		end.
-
-	Lemma EqMem_rcons r1 (rda wra : Bvector ADDR_WIDTH) c R (c_req : combType (Vec Bit REQUEST_WIDTH)) :
-		EqQueue r1 wra rda ->
-		EqMem_ r1 rda (@Cells_data (Vec Bit REQUEST_WIDTH) ADDR_WIDTH (Nat.pow 2 ADDR_WIDTH) InitMem c) -> 
-		EqReq R c_req ->
-		EqMem_ (r1 ++ [R])%SEQ rda (Cells_read true (N.to_nat (Bv2N wra)) c_req c).
-	Proof.
-		intros HQ Mem EqR; fold mem_cells_ in c; rewrite cats1.
-		revert Mem HQ; generalize wra rda; induction r1; intros.
-		{ simpl; rewrite andb_true_r; simpl in HQ; apply BVEq_iff_eq in HQ; rewrite HQ.
-			rewrite VectorSpec.map_id.
-			unfold ADDR_WIDTH in wra,rda.
-			specialize (@nth_cells_read (Vec Bit REQUEST_WIDTH) ADDR_WIDTH InitMem
-			rda0 c_req REQUEST_NIL) as HH; rewrite /REQUEST_NIL bitvec_literal_correct //= in HH;
-			unfold mem_cells_ in c; by rewrite HH. }
-		simpl in Mem,HQ; simpl.
-		move: Mem => /andP [EqR_ Mem]; apply /andP; split.
-		{ move: HQ => /andP [/negPf Heq HQ];
-			apply BVEq_iff_neq in Heq; rewrite VectorSpec.map_id; rewrite VectorSpec.map_id in EqR_.
-			rewrite -memcell_nch; done. 
-		}
-		{ move: HQ => /andP [neq HQ].
-			specialize (IHr1 wra0 (N2Bv_sized ADDR_WIDTH (Bv2N rda0 + 1))); apply IHr1; done. 
-		}	
-	Qed.
-
-	(* Just use the circuit directly <-> circuit does the work directly *)
-	Definition EqMem (P : Requests_t) rda (mem : circuit_state RequestQueue') :=
-		let memcells_vec := Cells_data (get_memcells_RequestQueue mem) in
-		EqMem_ P rda memcells_vec.
-		
-	Definition State_Eq (fram_state : FIFO_state_t) (cava_state : State_t) : bool :=
-		let s 		:= get_st cava_state 	 in
-		let c' 		:= get_cnt cava_state  in  
-		let cref' := get_cref cava_state in
-		let r' 		:= get_cr cava_state 	 in
-		let RQ		:= get_reqqueue cava_state in
-		let wra 	:= fst (get_addr_RequestQueue RQ) in
-		let rda 	:= snd (get_addr_RequestQueue RQ) in
-		let pop 	:= get_pop cava_state  in
-		match fram_state with
-			| IDLE c cref P =>
-				(s =? STATE_IDLE_VEC) && (c' =? cnt2Bv c) && (cref' =? cref2Bv cref) && (EqMem P rda RQ) &&
-				(EqQueue P wra rda) && (pop == false)
-			| RUNNING c cref P r => 
-  			(s =? STATE_RUN_VEC) && (c' =? cnt2Bv c) && (cref' =? cref2Bv cref) && (EqMem P rda RQ) && 
-				(EqQueue P wra rda) && (EqReq r r') && (pop == (c == OCycle0))
-			| REFRESHING cref P =>
-				(s =? STATE_REF_VEC) && (cref' =? cref2Bv cref) && (EqMem P rda RQ) && 
-				(EqQueue P wra rda) && (pop == false)
-		end.
-
-	(* -------------- Proofs about CmdGen ------------------------------- *)
-	Lemma CmdGen_equiv_idle_to_idle (c : circuit_state CmdGen) cnt cref:
-		(cref =? CNT_REF_PREA) = false ->
-		exists c', step CmdGen c (STATE_IDLE_VEC,true,cnt,cref,REQUEST_NIL) =
-		(c',NOP_VEC).
-	Proof.
-		intros H; simpl in c; destruct_products.
-		eapply ex_intro.
-		cbv [CmdGen]; cbn [step fst snd].
-		simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		fast_simpl_bool; simpl.
-		cbv [CrefPREA_eq].
-		apply BVEq_iff_neq in H.
-		specialize @CavaPreludeProperties.eqb_neq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		apply HH in H; rewrite H VectorSpec.map_id; reflexivity.
-	Qed.
-
-	Lemma CrefPREA_lt_CNT_REF_PREA:
-		CrefPREA_lt CNT_REF_PREA = false.
-	Proof.
-		cbv [CrefPREA_lt]; simpl_ident.
-		unfold greaterThanOrEqual; simpl_ident; unfold greaterThanOrEqualBool.
-		apply /negbF.
-		rewrite {1}/CNT_REF_PREA; rewrite !bitvec_literal_correct.
-		apply /N.leb_spec0; rewrite /CNT_REF_PREA /CNT_REF_WAIT !bitvec_literal_correct.
-		rewrite !Bv2N_N2Bv_sized. { apply N.le_add_r. }
-		all: rewrite /COUNTER_REF_WIDTH WAIT_REF_PW_N.
-		all: try apply N_lt_inj.
-		all: specialize WAIT_REF_PREA_date_WAIT as H; lia.
-	Qed.
-
-	Lemma CmdGen_equiv_idle_to_ref (c : circuit_state CmdGen) cnt cref e:
-		(cref =? CNT_REF_PREA) = true ->
-		exists c', step CmdGen c (STATE_IDLE_VEC,e,cnt,cref,REQUEST_NIL) = (c',PREA_VEC).
-	Proof.
-		intros; simpl in c; destruct_products; eapply ex_intro.
-		cbv [CmdGen]; cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		fast_simpl_bool; simpl; rewrite VectorSpec.map_id.
-		apply BVEq_iff_eq in H; subst cref; rewrite CrefPREA_lt_CNT_REF_PREA !VectorSpec.map_id.
-		rewrite andb_false_r; rewrite /CrefPREA_eq.
-		specialize @CavaPreludeProperties.eqb_eq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		assert (CNT_REF_PREA = CNT_REF_PREA); [done | ]; apply HH in H; by rewrite H.
-	Qed.
-
-	Lemma CrefPREA_lt_CNT_REF_WAIT cref:
-		(cref2Bv cref =? CNT_REF_PREA) = false -> (cref + WAIT < PREA_date) = true ->
-		CrefPREA_lt (cref2Bv cref) = true.
-	Proof.
-		intros Href_prea Href_service.
-		rewrite /CrefPREA_lt; simpl_ident; rewrite /greaterThanOrEqual; simpl_ident.
-		rewrite /greaterThanOrEqualBool /CNT_REF_WAIT /CNT_REF_PREA !bitvec_literal_correct !Bv2N_N2Bv_sized.
-		{ destruct (~~ _) eqn:Hbug; [ done | ].
-			apply negbFE in Hbug; move: Hbug => /N.leb_spec0 Hbug.
-			assert (cref + (WAIT - 1) < (PREA_date - 1)). 
-			{ rewrite addnBA; [ | exact WAIT_pos].
-				rewrite subn1 -ltnS prednK; [ | by rewrite addn_gt0 WAIT_pos orb_true_r ].
-				rewrite subn1 prednK; [ | exact PREA_date_pos].
-				by rewrite Href_service.
-			}
-			move: H => /ltP H; apply N_lt_inj in H.
-			contradict Hbug; apply N.nle_gt; by rewrite -Nat2N.inj_add.
-		}
-		all: unfold COUNTER_REF_WIDTH; rewrite WAIT_REF_PW_N.
-		all: try rewrite -Nat2N.inj_add; apply N_lt_inj; apply /ltP.
-		all: destruct cref; simpl in *; try done.
-		all: specialize WAIT_REF_PREA_date_WAIT; lia.
-	Qed.
-
-	Lemma CmdGen_equiv_idle_to_running (c : circuit_state CmdGen) cnt cref tr:
-		(cref2Bv cref =? CNT_REF_PREA) = false ->
-		(cref + WAIT < PREA_date) = true ->
-		exists c', step CmdGen c (STATE_IDLE_VEC,false,cnt,(cref2Bv cref),tr) = (c',PRE_VEC).
-	Proof.
-		intros; simpl in c; destruct_products; eapply ex_intro.
-		cbv [CmdGen]; cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		fast_simpl_bool; simpl; rewrite !VectorSpec.map_id.
-		rewrite CrefPREA_lt_CNT_REF_WAIT; done.
-	Qed.
-	(* ------------------------------------------------------------------ *)
-
-	(* -------------- Proofs about NextCR ------------------------------- *)
-	Lemma NextCR_equiv (c : circuit_state NextCR) cnt cref tr:
-		exists c', step NextCR c (STATE_IDLE_VEC,true,cnt,cref,tr) = 
-		(c',REQUEST_NIL).
-	Proof.
-		simpl in c; destruct_products.
-		eapply ex_intro.
-		cbv [NextCR LoopInit]; cbn [step fst snd].
-		simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		fast_simpl_bool; by simpl.
-	Qed.
-
-	Lemma NextCR_equiv_IDLE_NE_PREA c cnt cref tr:
-		(cref =? CNT_REF_PREA) = true ->
-		exists c', step NextCR c (STATE_IDLE_VEC,false,cnt,cref,tr) =
-		(c',REQUEST_NIL).
-	Proof.
-		intros; simpl in c; destruct_products; eapply ex_intro.
-		cbv [NextCR LoopInit]; cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		rewrite negb_false andb_true_l; rewrite /Srun //= VectorSpec.map_id.
-		apply BVEq_iff_eq in H; subst cref.
-		by rewrite CrefPREA_lt_CNT_REF_PREA.
-	Qed.
-
-	Lemma NextCR_equiv_IDLE_RUNNING c cnt (cref : Counter_ref_t) tr:
-		(cref2Bv cref =? CNT_REF_PREA) = false ->
-		(cref + WAIT < PREA_date) = true ->
-		exists c',
-		step NextCR c (STATE_IDLE_VEC,false,cnt,cref2Bv cref,tr) = (c',tr) /\
-		(snd (snd c')) = tr.
-	Proof.	
-		intros Href_service Href_prea; simpl in c; destruct_products; eapply ex_intro.
-		cbv [NextCR LoopInit]; cbn [step fst snd]; simpl_ident.
-		rewrite negb_false andb_true_l; rewrite /Srun //= VectorSpec.map_id.
-		rewrite CrefPREA_lt_CNT_REF_WAIT; done.
-	Qed.
-
-	(* Lemma NextCR_equiv_IDLE_RUNNING c cnt (cref : Counter_ref_t) tr:
-		(cref2Bv cref =? CNT_REF_PREA) = false ->
-		(cref + WAIT < PREA_date) = true ->
-		exists c', step NextCR c (STATE_IDLE_VEC,false,cnt,cref2Bv cref,tr) =
-		(c',tr).
-	Proof.
-		intros Href_service Href_prea; simpl in c; destruct_products; eapply ex_intro.
-		cbv [NextCR LoopInit]; cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		rewrite negb_false andb_true_l; rewrite /Srun //= VectorSpec.map_id.
-		rewrite CrefPREA_lt_CNT_REF_WAIT; done.
-	Qed. *)
-	(* ------------------------------------------------------------------ *)
-
-	Create HintDb update.
-	Lemma Sidle_true :
-		Sidle STATE_IDLE_VEC = true.
-	Proof.
-		apply CavaPreludeProperties.eqb_refl.
-	Qed.
-	Hint Rewrite @Sidle_true : update.
-
-	Lemma Sref_idle_false :
-		Sref STATE_IDLE_VEC = false.
-	Proof.
-		by apply CavaPreludeProperties.eqb_neq.
-	Qed.
-	Hint Rewrite @Sref_idle_false : update.
-
-	Lemma cnt_equiv (cnt : Bvector COUNTER_WIDTH) :
-		(if CeqWAIT cnt then Bvect_false COUNTER_WIDTH
-		else N2Bv_sized COUNTER_WIDTH (Bv2N cnt + 1)) = cnt2Bv (Next_cycle (Bv2cnt cnt)).
-	Proof.
-		cbv [CeqWAIT].
-		destruct (CavaPrelude.eqb (cnt, CNT_WAIT)) eqn:Heq; rewrite Heq.
-		{ specialize @CavaPreludeProperties.eqb_eq with (t := Vec Bit COUNTER_WIDTH) (x := cnt) as H.
-			apply H in Heq; clear H.
-			unfold Next_cycle; set (Hc := (Bv2cnt cnt).+1 < WAIT); dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-			{ rewrite /CNT_WAIT bitvec_literal_correct in Heq. 
-				rewrite Heq /Bv2cnt //= Bv2N_N2Bv_sized in x.
-					2: { 
-						rewrite /COUNTER_WIDTH; have id := (N2Nat.id 2).
-						rewrite -id Nat2N.inj_pow //= /Pos.to_nat //= WAIT_PW_2.
-						apply: N_lt_inj; apply /ltP; by rewrite subn1 ltn_predL WAIT_pos. 
-					}
-				rewrite Nat2N.id subn1 prednK in x; [ | exact WAIT_pos ]; by rewrite ltnn in x.
-			}
-			{ unfold cnt2Bv,OCycle0; by simpl. }}
-		{ unfold Next_cycle; set (Hc := (Bv2cnt cnt).+1 < WAIT); dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-			{ unfold cnt2Bv; apply f_equal; simpl.
-				rewrite N.add_1_r -(N.succ_pos_pred (Pos.of_succ_nat (N.to_nat (Bv2N cnt)))).
-				apply f_equal; by rewrite predN_of_succ_nat. }
-			{ apply ltn_gt in e,x.
-				rewrite leq_eqVlt in e; move: e => /orP [/eqP e | e].
-				{	have HH := (@eqb_iff_neq (Vec Bit (@COUNTER_WIDTH SYS_CFG FIFO_CFG))).
-					apply HH in Heq. rewrite /CNT_WAIT bitvec_literal_correct in Heq;
-					rewrite -(N2Bv_sized_Bv2N (@COUNTER_WIDTH SYS_CFG FIFO_CFG) cnt) in Heq.
-					apply N2Bv_sized_neq_if in Heq.
-					by rewrite e subn1 -pred_Sn N2Nat.id in Heq. }
-				{ specialize ltn_ord with  (n := @WAIT SYS_CFG FIFO_CFG) (i := Ordinal (cnt_bounded cnt)) as H.
-					rewrite //= in H.
-					contradict H; apply /negP; by rewrite -ltnNge. 
-				}
-			}
-		}
-	Qed.
-
-	(* -------------- Proofs about Update ------------------------------- *)
-	Lemma Update_equiv_idle_idle (c : circuit_state Update) cnt cref :
-		(cref =? CNT_REF_PREA) = false ->
-		let nc := cnt2Bv (Next_cycle (Bv2cnt cnt)) in
-		let ncref := N2Bv_sized COUNTER_REF_WIDTH (Bv2N cref + 1) in
-		exists c', step Update c (STATE_IDLE_VEC,true,cnt,cref) =
-		(c',(STATE_IDLE_VEC,false,nc,ncref)).
-	Proof.
-		intros Hcref Hcnt; simpl in c; eapply ex_intro.
-		cbv [cnt2Bv]; unfold Hcnt; clear Hcnt.
-		cbv [Update Update_s Update_e Update_c Update_cref].
-		cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		autorewrite with update; vm_compute (false && _).
-		apply BVEq_iff_neq in Hcref.
-		specialize @CavaPreludeProperties.eqb_neq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		apply pair_equal_spec; split.
-		2: { 
-			rewrite orb_false_l andb_true_l.
-			rewrite /CrefPREA_eq; apply HH in Hcref; by rewrite Hcref.
-		}
-		cbv [CrefPREA_eq]; apply HH in Hcref as Hcref'; rewrite Hcref';
-		vm_compute (false || true && false); simpl; rewrite !VectorSpec.map_id andb_false_r.
-		apply pair_equal_spec; split; [
-			apply pair_equal_spec; split; [ by unfold STATE_IDLE_VEC | reflexivity] | ].
-		vm_compute (orb false false); rewrite orb_false_r; by specialize (cnt_equiv cnt).
-	Qed.
-	
-	Lemma Update_equiv_idle_ref (c : circuit_state Update) cnt cref e:
-		(cref =? CNT_REF_PREA) = true ->
-		let nc := cnt2Bv (Next_cycle (Bv2cnt cnt)) in
-		let ncref := CNT_REF_NIL in
-		exists c', (step Update c (STATE_IDLE_VEC,e,cnt,cref)) = 
-		(c',(STATE_REF_VEC,false,nc,ncref)).
-	Proof.
-		intros Hcref Hcnt; simpl in c; eapply ex_intro.
-		cbv [cnt2Bv]; unfold Hcnt; clear Hcnt.
-		cbv [Update Update_s Update_e Update_c Update_cref].
-		cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		autorewrite with update; vm_compute (false && _).
-		apply BVEq_iff_eq in Hcref.
-		specialize @CavaPreludeProperties.eqb_eq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		apply pair_equal_spec; split. 
-		2: {
-			rewrite orb_false_l andb_true_l.
-			rewrite /CrefPREA_eq; apply HH in Hcref; by rewrite Hcref. 
-		}
-		cbv [CrefPREA_eq]; apply HH in Hcref as Hcref'; rewrite Hcref';
-		vm_compute (false || true && false); simpl; rewrite !VectorSpec.map_id.
-		apply pair_equal_spec; split.
-		2: {	
-			vm_compute (orb false false); rewrite orb_false_r. 
-			destruct e; [rewrite negb_true | rewrite negb_false].
-			{ rewrite andb_false_r orb_false_r; by specialize (cnt_equiv cnt). }
-			{ rewrite andb_true_r.
-				destruct (CrefPREA_lt cref) eqn:Hbug.
-				{ by rewrite Hcref CrefPREA_lt_CNT_REF_PREA in Hbug. }
-				{ rewrite orb_false_r; by specialize (cnt_equiv cnt). }
-			}
-		}
-		apply pair_equal_spec; split; [ done | ].
-		rewrite Hcref CrefPREA_lt_CNT_REF_PREA; by rewrite andb_false_l.
-	Qed.
-
-	Lemma Update_equiv_idle_running (c : circuit_state Update) cnt 
-		(cref : Counter_ref_t) :
-		(cref2Bv cref =? CNT_REF_PREA) = false ->
-		(cref + WAIT < PREA_date) = true ->
-		let nc := CNT_NIL in
-		let ncref := N2Bv_sized COUNTER_REF_WIDTH (Bv2N (cref2Bv cref) + 1) in
-		exists c', step Update c (STATE_IDLE_VEC,false,cnt,(cref2Bv cref)) = 
-		(c',(STATE_RUN_VEC,true,nc,ncref)).
-	Proof.
-		intros Href_prea Href_service Hcnt;
-		simpl in c; destruct_products; eapply ex_intro.
-		cbv [cnt2Bv]; unfold Hcnt; clear Hcnt.
-		cbv [Update Update_s Update_e Update_c Update_cref].
-		cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		autorewrite with update; fast_simpl_bool; 
-		rewrite !orb_false_l !andb_true_l /CrefPREA_eq.
-		specialize @CavaPreludeProperties.eqb_neq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		apply BVEq_iff_neq in Href_prea as Haux; apply HH in Haux.
-		rewrite Haux //= !orb_false_r andb_true_r !VectorSpec.map_id; clear Haux.
-		apply pair_equal_spec; split; [ | done].
-		apply pair_equal_spec; split; rewrite CrefPREA_lt_CNT_REF_WAIT; try done.
-		by rewrite orb_true_r.
-	Qed.
-	(* ------------------------------------------------------------------ *)
-	
-	(* -------------- Proofs about FullEmptyLogic ------------------------------- *)
-	Lemma FEL_emp_equiv (c : circuit_state FullEmptyLogic) wra rda :
-		wra = rda -> exists c', step FullEmptyLogic c (wra,rda) = (c',(false,true)).
-	Proof.
-		intros H; eapply ex_intro.
-		cbv [FullEmptyLogic FullLogic EmptyLogic Subtractor subtractor dropr EqFULL FullVEC unpackV]; 
-		cbn [step]; simpl_ret; cbn [fst snd].
-		apply pair_equal_spec; split; [ reflexivity | ].
-		apply pair_equal_spec; split; [ | by rewrite H CavaPreludeProperties.eqb_refl ].
-		rewrite inv_correct; cbv [bind].
-		rewrite fullAdder_cin; cbv [unpackV]; simpl_ret.
-		destruct (one) eqn:Hone; [ | discriminate].
-		destruct ((Bv2N rda) <= (Bv2N wra)) eqn:Hleq;
-		[ | by rewrite H leqnn in Hleq ].
-		assert (N.sub (Bv2N wra) (Bv2N rda) = 0%N); [ by rewrite H N.sub_diag | ].
-		rewrite H0 !bitvec_literal_correct.
-		set (N := N.sub _ _).
-		specialize N2Bv_sized_queuemax_neq0 as H2.
-		specialize @CavaPreludeProperties.eqb_neq with (t := Vec Bit (@ADDR_WIDTH CAVA_SYS)) 
-			(x := N2Bv_sized ADDR_WIDTH 0) (y := N2Bv_sized ADDR_WIDTH N) as HH.
-		by apply HH in H2.
-	Qed.
-
-	Lemma FEL_nemp_wrap1_equiv (c : circuit_state FullEmptyLogic) (wra rda : Bvector ADDR_WIDTH) :
-		let wrap1 := N2Bv_sized ADDR_WIDTH (Bv2N wra + 1) in
-		wra = rda -> exists c' f', step FullEmptyLogic c (wrap1,rda) = (c',(f',false)).
-	Proof.
-		intros; repeat eapply ex_intro; unfold wrap1.
-		cbv [FullEmptyLogic FullLogic EmptyLogic Subtractor subtractor dropr EqFULL FullVEC unpackV]; 
-		cbn [step]; simpl_ret; cbn [fst snd].
-		apply pair_equal_spec; split; [ reflexivity | ].
-		apply pair_equal_spec; split; [ reflexivity | ].
-		apply CavaPreludeProperties.eqb_neq; rewrite H.
-		apply N2Bv_sized_plusone_diff; unfold ADDR_WIDTH.
-		specialize QUEUE_MAX_SIZE_GT_1 as HQ; apply Nat.log2_pos in HQ.
-		by move: HQ => /ltP HQ.
-	Qed.
-
-	Lemma FEL_nemp_NF_equiv (c : circuit_state FullEmptyLogic) (wra rda : Bvector ADDR_WIDTH) :
-		~~ (fullQueue wra rda) ->
-		wra <> rda -> exists c', step FullEmptyLogic c (wra,rda) = (c',(false,false)).
-	Proof.
-		intros NF H; eapply ex_intro.
-		rewrite /fullQueue in NF.
-		cbv [FullEmptyLogic FullLogic EmptyLogic Subtractor subtractor dropr EqFULL FullVEC unpackV]; 
-		cbn [step]; simpl_ret; cbn [fst snd].
-		apply pair_equal_spec; split; [ reflexivity | ].
-		apply pair_equal_spec; split; [  | by apply CavaPreludeProperties.eqb_neq ].
-		rewrite bitvec_literal_correct. 
-		rewrite fullAdder_cin; destruct (one) eqn:Hbug; try discriminate; clear Hbug.
-		cbv [unpackV].
-		destruct (_ <= _) eqn:Hleq; apply CavaPreludeProperties.eqb_neq.
-		{ set (xx := (Bv2N wra - Bv2N rda)%N); fold xx in NF.
-			set (yy := ((N.of_nat QUEUE_MAX_SIZE - 1)%N)); fold yy in NF.
-			assert (N.size_nat xx <= ADDR_WIDTH);
-			[ apply size_nat_sub_leq; by apply leq_Nle in Hleq | ].
-			assert (N.size_nat yy <= ADDR_WIDTH);
-			[ unfold ADDR_WIDTH, yy; by apply size_nat_qms | ].
-			apply N2Bv_sized_neq_iff; try done; by apply /eqP.	
-		}
-		{	rewrite {3}/ADDR_WIDTH QUEUE_MAX_SIZE_PW2; apply N2Bv_sized_neq_iff.
-			{ assert (Bv2N rda > Bv2N wra); [ lia | ].
-				apply size_nat_qms_sub; by apply ltn_Ntn in H0. 
-			}
-			{ unfold ADDR_WIDTH; by apply size_nat_qms. }
-			specialize add_1_sub1 with (x := N.of_nat (@QUEUE_MAX_SIZE CAVA_SYS)) as HH.
-			rewrite HH in NF; [ | exact QUEUE_MAX_SIZE_GT_0_N].
-			apply /eqP; exact NF.
-		}
-	Qed.
-
-	Lemma FEL_NF_equiv (c : circuit_state FullEmptyLogic) (wra rda : Bvector ADDR_WIDTH) :
-		~~ (fullQueue wra rda) -> 
-		exists c' e', step FullEmptyLogic c (wra,rda) = (c',(false,e')).
-	Proof.
-		intros NF; unfold fullQueue in NF; repeat eapply ex_intro.
-		cbv [FullEmptyLogic]; cbn [step]; simpl_ret; cbn [fst snd].
-		apply pair_equal_spec; split; [reflexivity |  ].
-		apply pair_equal_spec; split; [ | reflexivity ].
-		cbv [dropr subtractor EqFULL FullVEC unpackV]; simpl_ident.
-		destruct ((Bv2N rda) <= (Bv2N wra)) eqn:Hleq;
-		destruct (one) eqn:Hone; try discriminate;
-		rewrite fullAdder_cin Hleq;
-		apply CavaPreludeProperties.eqb_neq; move: NF => /eqP NF.
-		{ set (xx := (Bv2N wra - Bv2N rda)%N); fold xx in NF.
-			set (yy := ((N.of_nat QUEUE_MAX_SIZE - 1)%N)); fold yy in NF.
-			assert (N.size_nat xx <= ADDR_WIDTH);
-			[ apply size_nat_sub_leq; by apply leq_Nle in Hleq | ].
-			assert (N.size_nat yy <= ADDR_WIDTH);
-			[ unfold ADDR_WIDTH, yy; by apply size_nat_qms | ].
-			apply N2Bv_sized_neq_iff; try done; by apply /eqP.	
-		}
-		{	rewrite {3}/ADDR_WIDTH QUEUE_MAX_SIZE_PW2; apply N2Bv_sized_neq_iff.
-			{ assert (Bv2N rda > Bv2N wra) as H; [ lia | ].
-				apply size_nat_qms_sub; by apply ltn_Ntn in H.
-			}
-			{ unfold ADDR_WIDTH; by apply size_nat_qms. }
-			specialize add_1_sub1 with (x := N.of_nat (@QUEUE_MAX_SIZE CAVA_SYS)) as HH.
-			by rewrite HH in NF; [ | exact QUEUE_MAX_SIZE_GT_0_N].
-		}
-	Qed.
-	(* ------------------------------------------------------------------ *)
-
-	Lemma incrn_pointr_true_equiv (c : circuit_state incr_pointr) ad :
-		step incr_pointr c (ad,true) =
-		(tt,N2Bv_sized ADDR_WIDTH (Bv2N ad + 1)).
-	Proof.
-		cbv [incr_pointr step] ; by simpl_ident.
-	Qed.
-
-	Lemma incrn_pointr_false_equiv (c : circuit_state incr_pointr) ad :
-		step incr_pointr c (ad,false) = (tt,ad).
-	Proof.
-		cbv [incr_pointr step] ; by simpl_ident.
-	Qed.
-
-	Create HintDb get_state.
-	Hint Unfold get_st get_cnt get_cref get_reqqueue get_addr_RequestQueue get_pop get_mem
-	get_memcells_RequestQueue get_mem_RequestQueue get_memcells get_cr : get_state.
-
-	(* the not full could come either be satisfies from the not full hypothesis 
-		 or from wra = rda *)
-	Lemma RQ_fst_pushT_popF_NF (c : circuit_state RequestQueue') c_req :
-		let '(wra,rda)     := get_addr_RequestQueue c in
-		let S 				 	   := get_memcells_RequestQueue c in 
-		let wra_idx 			 := N.to_nat (Bv2N wra) in
-		let memcells_spec  := Cells_read true wra_idx c_req S in
-		~~ (fullQueue wra rda) -> exists c',
-		((Cells_data (get_memcells_RequestQueue c') = memcells_spec) /\
-		(fst (get_addr_RequestQueue c')) = (N2Bv_sized ADDR_WIDTH (Bv2N wra + 1)) /\ 
-		(snd (get_addr_RequestQueue c')) = rda) /\
-		fst (step RequestQueue' c (true,c_req,false)) = c'.
-	Admitted.
-	(* Proof.
-		simpl in c; destruct_products.
-		unfold get_addr_RequestQueue; intros Hfull; eapply ex_intro; split; [ | reflexivity].
-		set (p := step RequestQueue' _ _).
-		cbv [RequestQueue' LoopInit fork2] in p.
-		cbn [step] in p; cbn [fst snd] in p; simpl_ret_H p; cbv [fst snd] in p.
-		specialize FEL_NF_equiv with (c := (u17, (u19, u20, u18), u16)) 
-		(rda := t0) (wra := t) as H; apply H in Hfull; clear H.
-		destruct Hfull as [cs_FEL' [empty_o Hfull]].
-		unfold p; clear p; rewrite Hfull.
-		cbn [fst snd bind inv and2 or2]; fast_simpl_bool.
-		rewrite (surjective_pairing (step memqueue' _ _)).
-		rewrite incrn_pointr_true_equiv incrn_pointr_false_equiv.
-		rewrite (surjective_pairing (step FullEmptyLogic _ _)).
-		set (fel := step FullEmptyLogic _ _).
-		split.
-		{ simpl in fel; unfold fel; cbv [snd fst].
-			cbv [get_memcells_RequestQueue get_mem_RequestQueue get_memcells].
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end.
-			cbv [memqueue' Memory' mem_write mem_read]; cbn [step fst snd]; simpl_ident; cbv [fst snd].
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end.
-			cbv [fst snd].
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end.
-			fold mem_cells_.
-			specialize @Cells_matchX with (T := Vec Bit (@REQUEST_WIDTH CAVA_SYS)) 
-			(W := @ADDR_WIDTH CAVA_SYS) (N := (Nat.pow 2 (@ADDR_WIDTH CAVA_SYS))) (I := InitMem) 
-			(S0 := c) (we := true) (wd := c_req) (wa := (N.to_nat (Bv2N t))) as HH.
-			rewrite -HH; [reflexivity | | ].
-			{ intros.
-				rewrite /indexConst; simpl_ident.
-				rewrite /decode; simpl_ident.
-				admit.
-			}
-			{ rewrite /indexConst; simpl_ident.
-				rewrite /decode; simpl_ident.
-				admit.
-			}
-		}
-		split; by simpl.
-	Admitted. *)
-
-	(* Ignoring the full signal because it just goes to the output *)
-	Lemma RQ_snd_pushT_empty (c : circuit_state RequestQueue') c_req pop :
-		let '(wra,rda) := get_addr_RequestQueue c in
-		let S := get_memcells_RequestQueue c in 
-		let rda_idx := N.to_nat (Bv2N rda) in
-		let wra_idx := N.to_nat (Bv2N wra) in
-		let memcells' := Cells_read true wra_idx c_req S in
-		let mem_val := nth_default (req_null) rda_idx memcells' in
-		wra = rda -> exists f',
-		snd (step RequestQueue' c (true,c_req,pop)) = (f',mem_val,true).
-	Admitted.
-		(* simpl in c; destruct_products; rename t0 into rda, t into wra.
-		autounfold with get_state; intros.
-		cbv [RequestQueue' LoopInit fork2]; simpl_ret; cbn [step fst snd].
-		eapply FEL_emp_equiv with (c := (u17,(u19,u20,u18), u16)) in H as HH.
-		destruct HH as [cs_FEL HH]; rewrite HH.
-		cbn [fst snd bind inv and2 or2].
-		rewrite (surjective_pairing (step memqueue' (u12,c,u11) _)).
-		cbv [fst snd]; fast_simpl_bool.
-		rewrite incrn_pointr_true_equiv if_same incrn_pointr_false_equiv; clear HH.
-		eapply FEL_nemp_wrap1_equiv with (c := (u4, (u6, u7, u5), u3)) in H as HH.
-		destruct HH as [cs_FELL [full_o HH]]; rewrite HH; clear HH.
-		eapply ex_intro.
-		apply pair_equal_spec; split; [ | reflexivity ].
-		apply pair_equal_spec; split; [ reflexivity | ].
-		cbv [memqueue' Memory' mem_write mem_read].
-		cbn [step fst snd]; simpl_ret.
-		rewrite (surjective_pairing (step (mem_cells _ _ _ _) c _)).
-		specialize @Cells_data_match with (T := Vec Bit (@REQUEST_WIDTH CAVA_SYS)) 
-		(W := @ADDR_WIDTH CAVA_SYS) (N := (Nat.pow 2 (@ADDR_WIDTH CAVA_SYS))) (I := InitMem) 
-		(S0 := c) (we := true) (wa := (N.to_nat (Bv2N wra))) (wd := c_req) as HH.
-		rewrite -HH.
-		{	cbv [indexAt indexConst defaultCombValue].
-			cbv [unpackV bind]; simpl_ret.
-			rewrite nth_0; simpl; unfold req_null.
-			reflexivity. 
-		}
-		all: admit.
-	Admitted. *)
-
-	Lemma RQ_snd_pushT_popF_NF_nempty (c : circuit_state RequestQueue') c_req:
-		let '(wra,rda) := get_addr_RequestQueue c in
-		let S := get_memcells_RequestQueue c in 
-		let rda_idx := N.to_nat (Bv2N rda) in
-		let wra_idx := N.to_nat (Bv2N wra) in
-		let memcells' := Cells_read true wra_idx c_req S in
-		let mem_val := nth_default (req_null) rda_idx memcells' in
-		~~ (fullQueue wra rda) -> wra <> rda -> exists full_o,
-		snd (step RequestQueue' c (true,c_req,false)) = (full_o,mem_val,false).
-	Admitted.
-	(*
-		simpl in c; destruct_products; rename t0 into rda, t into wra.
-		autounfold with get_state; intros.
-		cbv [RequestQueue' LoopInit fork2]; simpl_ret; cbn [step fst snd].
-		apply FEL_nemp_NF_equiv with (c := (u17,(u19,u20,u18), u16)) in H as HH; [ | done].
-		destruct HH as [cs_FEL HH]; rewrite HH.
-		cbn [fst snd bind inv and2 or2]; fast_simpl_bool.
-		rewrite (surjective_pairing (step memqueue' (u12,c,u11) _)).
-		cbv [fst snd]; fast_simpl_bool.
-		rewrite incrn_pointr_true_equiv.
-		rewrite incrn_pointr_false_equiv; clear HH.
-		(* The second logic doesn't really matter much *)
-		rewrite (surjective_pairing (step FullEmptyLogic _ _)).
-		eapply ex_intro.
-		apply pair_equal_spec; split; [ | reflexivity].
-		apply pair_equal_spec; split; [ reflexivity | ].
-		destruct_pair_let.
-		cbv [memqueue' Memory' mem_write mem_read].
-		cbn [step fst snd]; simpl_ret.
-		rewrite (surjective_pairing (step (mem_cells _ _ _ _) c _)).
-		specialize @Cells_data_match with (T := Vec Bit (@REQUEST_WIDTH CAVA_SYS)) 
-		(W := @ADDR_WIDTH CAVA_SYS) (N := (Nat.pow 2 (@ADDR_WIDTH CAVA_SYS))) (I := InitMem) 
-		(S0 := c) (we := true) (wa := (N.to_nat (Bv2N wra))) (wd := c_req) as HH.
-		rewrite -HH //=.
-		all: admit.
-	Admitted. *)
-
-	(* IDLE -> RUNNING *)
-	Theorem SM_Eq_2b (t : nat) (c_state : State_t) c0 r0 r1
-		(c1 : Counter_ref_t) (c_req : Bvector REQUEST_WIDTH) r :
-		(c1 + WAIT < PREA_date) = true ->	
-		(nat_of_ord c1 == PREA_date - 1) = false ->
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in 
-		R == [:: r] -> EqReq r c_req -> State_Eq (IDLE c0 c1 (r0 :: r1)) c_state ->
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 (r0 :: r1)) in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Proof.
-		intros Href_service Href_prea f_state R NF EqR H; unfold FIFOSM.
-		unfold R in NF; specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF.
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		rewrite NF //= in NFULL.
-		rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda, b into pop.
-		rewrite /State_Eq /EqMem in H; autounfold with get_state in H; cbn [fst snd] in H.
-		move: H => /andP [/andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] HQ] /eqP EqPop].
-		apply EqQueue_diff_adr in HQ as Hadr.
-
-		apply BVEq_iff_eq in EqS, EqCnt, EqCref; subst s cnt cref pop.
-		cbv [LoopInit]; cbn [step fst snd]; simpl_ret.
-
-		rewrite (surjective_pairing (step RequestQueue' _ _)).
-		specialize (RQ_snd_pushT_popF_NF_nempty ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req) as S.
-		cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S.
-		apply S in NFULL as S'; [ | done]; clear S; destruct S' as [full_o H].
-		rewrite H. clear H; cbn [fst snd].
-
-		set tr := nth_default req_null (N.to_nat (Bv2N rda)) _.
-		apply NextCR_equiv_IDLE_RUNNING with (c := (u9, (u10, cr))) (cnt := cnt2Bv c0) 
-		(cref := c1) (tr := tr) in Href_service as H.
-		2: by apply cref_preadate_false in Href_prea.
-		destruct H as [cs_nextcr H]; destruct H as [H Htr].
-		rewrite H; clear H; cbv [fst snd].
-
-		specialize (CmdGen_equiv_idle_to_running u6 (cnt2Bv c0) c1 tr) as S.
-		specialize Href_service as Href_service_.
-		apply S in Href_service; clear S; rename Href_service into H.
-		2: by apply cref_preadate_false in Href_prea.
-		destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd].
-
-		specialize (Update_equiv_idle_running u4 (cnt2Bv c0) c1) as S;
-		apply S in Href_service_ as S'; clear S.
-		2: by apply cref_preadate_false in Href_prea.
-		destruct S' as [cs_update H]; rewrite H; clear H; cbn [fst snd].
-
-		rewrite /Next_state Href_prea Href_service_ /State_Eq.
-		specialize RQ_fst_pushT_popF_NF with (c := (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra))) (c_req := c_req) as S.
-		apply S in NFULL as H; clear S.
-		destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']].
-		autounfold with get_state.
-
-		apply /andP; split.
-		2: {
-			unfold tr; simpl in Mem; move: Mem => /andP [EqReq_r0 Mem].
-			rewrite {2}/get_memcells_RequestQueue /get_mem_RequestQueue /get_memcells in Hrw.
-			apply (memcell_nch c wra rda c_req req_null) in Hadr as HH.
-			rewrite /req_null //= in HH.
-			rewrite VectorSpec.map_id /Bvect_false HH in EqReq_r0.
-			by rewrite /req_null //=.
-		}
-		apply /andP; split.
-		2 : unfold EqCmd; by apply BVEq_iff_eq.
-		apply /andP; split.
-		2: { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)); cbv [get_pop];
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end; simpl; trivial. }
-		apply /andP; split.
-		2 : {
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end; rewrite Htr;
-			unfold tr; simpl in Mem; move: Mem => /andP [EqReq_r0 Mem].
-			rewrite {2}/get_memcells_RequestQueue /get_mem_RequestQueue /get_memcells in Hrw.
-			apply (memcell_nch c wra rda c_req req_null) in Hadr as HH.
-			rewrite /req_null //= in HH.
-			rewrite VectorSpec.map_id /Bvect_false HH in EqReq_r0.
-			by rewrite /req_null //=.
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H Hwra' Hrda'.
-			simpl; rewrite eq_refl.
-			rewrite /Enqueue /R NF.
-			simpl in HQ.
-			(* specialize (EqQueue_aux wra rda r0 r1 r) as HH; apply HH; done. *)
-			specialize (EqQueue_aux wra rda r0 r1 r) as HH.
-			apply HH in NFULL as HH'; clear HH; try done.
-			(* move: HH' => /andP [neqq HH]; fold @EqQueue in HH. *)
-			move: HH'; simpl; intros HH.
-			move: HH => /andP [Hadr_neq HH].
-			rewrite /EqQueue in HH'.
-
-			simpl; rewrite Hadr; unfold R; rewrite NF //=.
-
-		}
-
-		2 : { 
-			rewrite /Enqueue (surjective_pairing (step RequestQueue' _ _)) H.
-			autounfold with get_state in Hrda',Hwra'; cbn [fst snd]; rewrite Hwra' Hrda'; clear Hwra' Hrda'.
-			unfold R; rewrite NF.
-			specialize (EqQueue_aux wra rda r0 r1 r) as HH; apply HH; done.
-		}
-
-
-
-
-
-
-
-
-	Theorem SM_Eq_2a (t : nat) (c_state : State_t) c0 
-		(c1 : Counter_ref_t) (c_req : Bvector REQUEST_WIDTH) r :
-		(c1 + WAIT < PREA_date) = true ->	
-		(nat_of_ord c1 == PREA_date - 1) = false ->
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in 
-		R == [:: r] -> EqReq r c_req -> State_Eq (IDLE c0 c1 []) c_state ->
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 []) in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Proof.
-		intros Href_service Href_prea f_state R NF EqR H; unfold FIFOSM.
-		unfold R in NF; specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF.
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		rewrite NF //= in NFULL.
-		rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda, b into pop.
-		rewrite /State_Eq /EqMem in H; autounfold with get_state in H; cbn [fst snd] in H.
-		move: H => /andP [/andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] Hadr] /eqP EqPop].
-		simpl in Hadr.
-
-		apply BVEq_iff_eq in EqS, EqCnt, EqCref, Hadr; subst s cnt cref pop.
-		cbv [LoopInit]; cbn [step fst snd]; simpl_ret.
-
-		rewrite (surjective_pairing (step RequestQueue' _ _)).
-		specialize (RQ_snd_pushT_empty ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req false) as S.
-		cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S.
-		apply S in Hadr as H; clear S; destruct H as [full_o H].
-		rewrite H; clear H; cbn [fst snd].
-
-		set tr := nth_default req_null (N.to_nat (Bv2N rda)) _.
-		specialize NextCR_equiv with (c := (u9, (u10, cr))) (cnt := cnt2Bv c0) 
-		(cref := cref2Bv c1) (tr := tr) as [cs_nextcr H].
-		rewrite H; cbv [fst]; clear H. cbn [snd].
-
-		apply cref_preadate_false in Href_prea as Href_prea_.
-		apply (CmdGen_equiv_idle_to_idle u6 (cnt2Bv c0) (cref2Bv c1)) in Href_prea_ as H.
-		destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd].
-
-		apply (Update_equiv_idle_idle u4 (cnt2Bv c0) (cref2Bv c1)) in Href_prea_ as H.
-		destruct H as [cs_update H]; rewrite H; clear H; cbn [fst snd].
-
-		rewrite /Next_state Href_prea /State_Eq.
-		specialize RQ_fst_pushT_popF_NF with (c := (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra))) (c_req := c_req) as S.
-		apply S in NFULL as H; clear S.
-		destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']].
-		autounfold with get_state.
-		rewrite Href_service.
-
-		apply /andP; split.
-		2 : exact EqReqNil.
-		apply /andP; split.
-		2 : unfold EqCmd; by apply BVEq_iff_eq.
-		apply /andP; split.
-		2: { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)); cbv [get_pop];
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end; simpl; trivial. }
-		apply /andP; split.
-		2 : { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H Hwra' Hrda'.
-			simpl; rewrite Hadr; unfold R; rewrite NF //=.
-			apply /andP; split.
-			{ apply /negPf; apply (@N2Bv_sized_eq_p1_false ADDR_WIDTH rda);
-				specialize ADDR_WIDTH_pos as Hpos; by move: Hpos => /ltP Hpos. }
-			by apply BVEq_iff_eq.
-		}
-		apply /andP; split.
-		2 : { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H Hrda'.
-			simpl; unfold R; rewrite NF //= /EqMem //= andb_true_r.
-			rewrite Hrw; autounfold with get_state; rewrite Hadr.
-			specialize (@nth_cells_read (Vec Bit REQUEST_WIDTH) ADDR_WIDTH InitMem rda c_req c) as H'.
-			rewrite H'; exact EqR.
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H //=.
-			destruct_pair_let.
-			rewrite /Next_cycle_ref. 
-			set Hc := c1.+1 < WAIT_REF; dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-			{ rewrite /cref2Bv //= Bv2N_N2Bv_sized.
-				2: { 
-					unfold COUNTER_REF_WIDTH; rewrite WAIT_REF_PW_N.
-					destruct c1; simpl; apply N_lt_inj; by apply /ltP.
-				}
-				rewrite /N2Bv_sized.
-				destruct (N.of_nat c1 + 1)%N eqn:Hbug;
-				[ rewrite N.add_1_r in Hbug; contradict Hbug; apply N.neq_succ_0 | ].
-				apply BVEq_iff_eq; f_equal; lia.
-			}
-			{ destruct c1; simpl in x,e,Hc0,Href_prea_,Href_service,Href_prea.
-				rewrite /cref2Bv VectorSpec.map_id //= in Href_prea_.
-				apply ltn_gt in x; rewrite leq_eqVlt in x; move: x => /orP [/eqP x | x].
-				{ assert (m = WAIT_REF.-1); [ lia | ].
-					rewrite H0 addnC -ltn_subRL in Href_service.
-					rewrite -subn1 ltn_subLR in Href_service; [ | exact WAIT_REF_pos ].
-					contradict Href_service; apply /negP.
-					rewrite -leqNgt leq_eqVlt addnC.
-					specialize WAIT_REF_PREA_date as HH.
-					apply ltn_trans with (m := PREA_date - WAIT + 1) in HH;
-					[ by rewrite HH orb_true_r | ].
-					rewrite -subnA.
-					{ by rewrite ltn_subrL subn_gt0 WAIT_gt_one PREA_date_pos. }
-					{ exact WAIT_pos. }
-					{ by rewrite leq_eqVlt PREA_date_WAIT orb_true_r. }
-				}
-				{ rewrite ltnS in x; contradict x; apply /negP; by rewrite -ltnNge. }
-			}
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H //=.
-			destruct_pair_let.
-			rewrite /cnt2Bv; apply BVEq_iff_eq; f_equal.
-			apply Nat2N.inj_iff.
-			rewrite /Bv2cnt /Next_cycle //= Bv2N_N2Bv_sized //=.
-			2: {
-				destruct c0; rewrite //= /COUNTER_WIDTH.
-				rewrite WAIT_PW_2_N; apply N_lt_inj; by apply /ltP.
-			}
-			set (Hc := _ < WAIT); dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro; try rewrite Nat2N.id;
-			try by rewrite Nat2N.id in x; move: Logic.eq_refl; rewrite {2 3}x; simpl; intro.
-		}
-		cbv [get_st]; rewrite (surjective_pairing (step RequestQueue' _ _)) H //=; destruct_pair_let.
-		by [].
-	Qed.
-
-
-	(* Assuming a non-full regime, i.e., the front-end has yielded a valid request *)
-	(* If R is non empty than the queue is not full *)
-	Theorem SM_Eq_1b (t : nat) (c_state : State_t) c0 c1 (c_req : Bvector REQUEST_WIDTH) r0 r1 (r : Request_t) :
-		(nat_of_ord c1 == PREA_date - 1) = true ->
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in 
-		R == [:: r] -> EqReq r c_req -> State_Eq (IDLE c0 c1 (r0 :: r1)) c_state ->
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 (r0 :: r1)) in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Admitted.
-	(* Proof.
-		intros Href_prea f_state R NF EqR H; unfold FIFOSM.
-		unfold R in NF; specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF.
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		rewrite NF //= in NFULL.
-		rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda, b into pop.
-		rewrite /State_Eq /EqMem in H; autounfold with get_state in H; cbn [fst snd] in H.
-		move: H => /andP [/andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] HQ] /eqP EqPop].
-		apply EqQueue_diff_adr in HQ as Hadr.
-
-		apply BVEq_iff_eq in EqS, EqCnt, EqCref; subst s cnt cref pop.
-		cbv [LoopInit]; cbn [step fst snd]; simpl_ret.
-
-		rewrite (surjective_pairing (step RequestQueue' _ _)).
-		specialize (RQ_snd_pushT_popF_NF_nempty ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req) as S.
-		cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S.
-		apply S in NFULL as S'; [ | done]; clear S; destruct S' as [full_o H].
-		rewrite H. clear H; cbn [fst snd].
-
-		set tr := nth_default req_null (N.to_nat (Bv2N rda)) _.
-		specialize (NextCR_equiv_IDLE_NE_PREA (u9, (u10, cr)) (cnt2Bv c0) (cref2Bv c1) tr) as S.
-		apply cref_preadate_true in Href_prea as Href_prea_.
-		apply S in Href_prea_ as S'; clear S; destruct S' as [cs_nextcr H]; rewrite H.
-
-		cbn [fst snd]; clear H.
-		apply (CmdGen_equiv_idle_to_ref u6 (cnt2Bv c0) (cref2Bv c1) false) in Href_prea_ as H.
-		destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd].
-
-		apply (Update_equiv_idle_ref u4 (cnt2Bv c0) (cref2Bv c1) false) in Href_prea_ as H.
-		destruct H as [cs_update H]; rewrite H; clear H; cbn [fst snd].
-
-		rewrite /Next_state Href_prea /State_Eq.
-		specialize RQ_fst_pushT_popF_NF with (c := (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra))) (c_req := c_req) as S.
-		apply S in NFULL as H; clear S.
-		destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']].
-		autounfold with get_state.
-
-		apply /andP; split.
-		2 : exact EqReqNil.
-		apply /andP; split.
-		2 : unfold EqCmd; by apply BVEq_iff_eq.
-		apply /andP; split.
-		2: { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)); cbv [get_pop];
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end; simpl; trivial. }
-		apply /andP; split.
-		2 : { 
-			rewrite /Enqueue (surjective_pairing (step RequestQueue' _ _)) H.
-			autounfold with get_state in Hrda',Hwra'; cbn [fst snd]; rewrite Hwra' Hrda'; clear Hwra' Hrda'.
-			unfold R; rewrite NF.
-			specialize (EqQueue_aux wra rda r0 r1 r) as HH; apply HH; done.
-		}
-		apply /andP; split.
-		2 : {
-			rewrite /EqMem (surjective_pairing (step RequestQueue' _ _)) H Hrw /Enqueue.
-			autounfold with get_state in Hrda'; cbn [fst snd]; rewrite Hrda'; clear Hrda'.
-			autounfold with get_state; unfold R; rewrite NF.
-			apply EqMem_rcons; done.
-		}
-		apply /andP; split.
-		2 : { 
-			cbv [get_cref].
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H //= VectorSpec.map_id.
-			destruct_pair_let.
-			rewrite /cref2Bv /OCycle0REF //=; by apply BVEq_iff_eq.
-		}
-		cbv [get_st]; rewrite (surjective_pairing (step RequestQueue' _ _)) H //=; destruct_pair_let.
-		by [].
-	Qed. *)
-
-	Theorem SM_Eq_1a (t : nat) (c_state : State_t) c0 c1 (c_req : Bvector REQUEST_WIDTH) r :
-		(nat_of_ord c1 == PREA_date - 1) = true ->
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in 
-		R == [:: r] -> EqReq r c_req -> State_Eq (IDLE c0 c1 []) c_state ->
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 []) in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Admitted.
-	(* Proof.
-		intros Href_prea f_state R NF EqR H; unfold FIFOSM.
-		unfold R in NF; specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF.
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		rewrite NF //= in NFULL.
-		rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda, b into pop.
-		rewrite /State_Eq /EqMem in H; autounfold with get_state in H; cbn [fst snd] in H.
-		move: H => /andP [/andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] Hadr] /eqP EqPop].
-		simpl in Hadr.
-
-		apply BVEq_iff_eq in EqS, EqCnt, EqCref, Hadr; subst s cnt cref pop.
-		cbv [LoopInit]; cbn [step fst snd]; simpl_ret.
-
-		rewrite (surjective_pairing (step RequestQueue' _ _)).
-		specialize (RQ_snd_pushT_empty ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req false) as S.
-		cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S.
-		apply S in Hadr as H; clear S; destruct H as [full_o H].
-		rewrite H; clear H; cbn [fst snd].
-
-		set tr := nth_default req_null (N.to_nat (Bv2N rda)) _.
-		specialize NextCR_equiv with (c := (u9, (u10, cr))) (cnt := cnt2Bv c0) 
-		(cref := cref2Bv c1) (tr := tr) as [cs_nextcr H].
-		rewrite H; cbv [fst]; clear H.
-
-		apply cref_preadate_true in Href_prea as Href_prea_; cbn [fst snd].
-		apply (CmdGen_equiv_idle_to_ref u6 (cnt2Bv c0) (cref2Bv c1) true) in Href_prea_ as H.
-		destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd].
-
-		apply (Update_equiv_idle_ref u4 (cnt2Bv c0) (cref2Bv c1) true) in Href_prea_ as H.
-		destruct H as [cs_update H]; rewrite H; clear H.
-
-		rewrite /Next_state Href_prea /State_Eq.
-		specialize RQ_fst_pushT_popF_NF with (c := (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra))) (c_req := c_req) as S.
-		apply S in NFULL as H; clear S.
-		destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']].
-		autounfold with get_state.
-
-		apply /andP; split.
-		2 : exact EqReqNil.
-		apply /andP; split.
-		2 : unfold EqCmd; by apply BVEq_iff_eq.
-		apply /andP; split.
-		2: { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)); cbv [get_pop];
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end; simpl; trivial. }
-		apply /andP; split.
-		2 : { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H Hwra' Hrda'.
-			simpl; rewrite Hadr; unfold R; rewrite NF //=.
-			apply /andP; split.
-			{ apply /negPf; apply (@N2Bv_sized_eq_p1_false ADDR_WIDTH rda);
-				specialize ADDR_WIDTH_pos as Hpos; by move: Hpos => /ltP Hpos. }
-			by apply BVEq_iff_eq.
-		}
-		apply /andP; split.
-		2 : { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H Hrda'.
-			simpl; unfold R; rewrite NF //= /EqMem //= andb_true_r.
-			rewrite Hrw; autounfold with get_state; rewrite Hadr.
-			specialize (@nth_cells_read (Vec Bit REQUEST_WIDTH) ADDR_WIDTH InitMem rda c_req c) as H'.
-			rewrite H'; exact EqR.
-		}
-		apply /andP; split.
-		2 : { 
-			cbv [get_cref].
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H //= VectorSpec.map_id.
-			destruct_pair_let.
-			rewrite /cref2Bv /OCycle0REF //=; by apply BVEq_iff_eq.
-		}
-		cbv [get_st]; rewrite (surjective_pairing (step RequestQueue' _ _)) H //=; destruct_pair_let.
-		by [].
-	Qed. *)
-
-	(* Have to add the full case *)
-	(* REF bounded with PREA_date or arbitrary parameter *)
-	(* if REF is bounded with PREA_date, a problem with cref + WAIT *)
-	(* try bound with random parameter, but will not be correspondent to Next_cycle *)
-	Theorem SM_Eq_NFULL (t : nat) (c_state : State_t) (f_req: Request_t) 
-		(c_req : Bvector REQUEST_WIDTH) (push : bool) :
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in
-		R == [:: f_req] -> EqReq f_req c_req -> State_Eq f_state c_state -> 
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R f_state in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Proof.
-		destruct (f_state) eqn:Hf_state. 
-		{ destruct (nat_of_ord c0 == PREA_date - 1) eqn:Hcref_prea; move: Hcref_prea.
-			{ destruct r eqn:HR.
-				{ apply SM_Eq_1a. }
-				{ apply SM_Eq_1b. }
-			}
-			{ destruct (c0 + WAIT < PREA_date) eqn:Hcref_service; move: Hcref_service.
-				{ destruct r eqn:HR.
-					{ apply SM_Eq_2a. }
-					{ admit. (* Case 2b: IDLE -> RUNNING (non-empty queue) *)}
-				}
-				{ destruct r eqn:HR.
-					{ admit. (* Case 3a: IDLE -> IDLE (empty queue )*)}
-					{ admit. (* Case 3b: IDLE -> IDLE (non empty queue) *) }
-				}
-			}
-		}
-		{ destruct (nat_of_ord c0 == OACT_date) eqn:Hact_date.
-			{ destruct r eqn:HR.
-				{ admit. (* Case 4a : RUNNING -> RUNNING (ACT) (empty queue) *) }
-				{ admit. (* Case 4b : RUNNING -> RUNNING (ACT) (non empty queue) *)}
-			}
-			{ destruct (nat_of_ord c0 == OCAS_date) eqn:Hcas_date.
-				{ destruct r eqn:HR.
-					{ admit. (* Case 5a : RUNNING -> RUNNING (CAS) (empty queue )*) }
-					{ admit. (* Case 5b : RUNNING -> RUNNING (CAS) (non-empty queue) *)}	 
-				}
-				{ destruct (nat_of_ord c0 == WAIT.-1) eqn:Hend_date.
-					{ destruct r eqn:HR.
-						{ admit. (* Case 6a : RUNNING -> IDLE (empty queue) *) }
-						{ admit. (* Case 6b : RUNNING -> IDLE (non empty queue) *)}
-					}
-					{ destruct r eqn:HR.
-						{ admit. (* Case 7a : RUNNING -> RUNNING (empty queue) *) } 
-						{ admit. (* Case 7b : RUNNING -> RUNNING (non empty queue) *) }
-					}
-				}
-			}
-		}
-		{ destruct (nat_of_ord c0 == OREF_date) eqn:Href_date.
-			{ destruct r eqn:HR. 
-				{ admit. }
-				{ admit. }
-			}
-			{ destruct (nat_of_ord c0 == OENDREF_date) eqn:Hendref_date.
-
-			}
-
-		}
-
-End EquivalenceProof.
\ No newline at end of file
diff --git a/framework/CavaDRAM/CavaFIFOREF/CavaFIFOREFProperties2.v b/framework/CavaDRAM/CavaFIFOREF/CavaFIFOREFProperties2.v
deleted file mode 100644
index 949d7ab..0000000
--- a/framework/CavaDRAM/CavaFIFOREF/CavaFIFOREFProperties2.v
+++ /dev/null
@@ -1,311 +0,0 @@
-Set Printing Projections.
-From CavaDRAM Require Import CavaFIFOREF.
-Require Import Program.
-
-Ltac destruct_products :=
-			repeat match goal with
-			| p: _ * _  |- _ => destruct p
-			| H: _ /\ _ |- _ => let Hl := fresh H "l" in let Hr := fresh H "r" in destruct H as [Hl Hr]
-			| E: exists y, _ |- _ => let yf := fresh y in destruct E as [yf E]
-			end.
-
-Ltac simplify_step :=
-	first [ destruct_pair_let
-			| rewrite eqb_nat_to_bitvec_sized; by Lia.lia
-			| rewrite nat_to_bitvec_to_nat; by Lia.lia
-			| progress simpl_ident
-			| progress autorewrite with to_spec
-			| progress cbn [fst snd map] ].
-
-Ltac simplify := repeat simplify_step.
-Ltac simpl_ret := cbv [ret monad CombinationalSemantics Identity.Monad_ident].
-
-Section CavaSMProperties2.
-	(* From Cava *)
-	Existing Instance CombinationalSemantics.
-	(* From CavaDRAM*)
-	Context {CAVA_SYS : CavaSystem}.
-	(* From CoqDRAM *)
-	Existing Instance REQESTOR_CFG.
-  Context {SYS_CFG      : System_configuration}.
-	Context {FIFO_CFG     : FIFO_configuration}.
-	Context {AF						: Arrival_function_t}.
-	Existing Instance FIFO_implementation.
-
-	Definition State_t := circuit_state FIFOSM.
-
-	Definition get_mem (s : State_t) :=
-	let '(_,(_,(_,(_,(_, (_, (_,_, _),_)),_,mem_state,_,
-	(_, _),(_, (_, (_, _, _),_)),_,_),_),(_,(_,(_,(_,
-	(_, (_,_)),_, _, _,_, _,_),_),_)),_)) := s in mem_state.
-	
-	Definition get_pop (s : State_t) :=
-	let '(_,(_,(_,(_,(_,(_,(_, _, _),_)),_,_,_, 
-	(_,_),(_,(_,(_,_,_),_)),_,_),_),(_,(_,(_,(_,
-	(_, (_,_)),_,_,_,_,_,_),_),_)),pop)) := s in pop.
-
-	Definition get_st (s : State_t) :=
-	let '(_,(_,(_,(_,(_,(_,(_, _, _),_)),_,_,_, 
-	(_,_),(_,(_,(_,_,_),_)),_,_),_),(_,(_,(_,(_,
-	(_, (_,_)),_,_,_,_,_,_),_),st)),_)) := s in st.
-
-	Definition get_cnt (s : State_t) :=
-	let '(_,(_,(_,(_,(_,(_,(_, _, _),_)),_,_,_, 
-	(_,_),(_,(_,(_,_,_),_)),_,_),_),(_,(_,(_,(_,
-	(_, (_,_)),_,_,_,_,_,_),cnt),_)),_)) := s in cnt.
-
-	Definition get_cref (s : State_t) :=
-	let '(_,(_,(_,(_,(_,(_,(_, _, _),_)),_,_,_, 
-	(_,_),(_,(_,(_,_,_),_)),_,_),_),(_,(_,(_,(_,
-	(_, (_,_)),_,_,_,_,_,cref),_),_)),_)) := s in cref.
-
-	Definition get_cr (s : State_t) :=
-	let '(_,(_,(_,(_,(_,(_,(_, _, _),_)),_,_,_, 
-	(_,_),(_,(_,(_,_,_),_)),_,_),_),(_,(_,(_,(_,
-	(_, (_,cr)),_,_,_,_,_,_),_),_)),_)) := s in cr.
-
-	Definition get_wra (s : State_t) :=
-	let '(_,(_,(_,(_,(_,(_,(_, _, _),_)),_,_,_, 
-	(_,_),(_,(_,(_,_,_),_)),_,_),wra),(_,(_,(_,(_,
-	(_, (_,_)),_,_,_,_,_,_),_),_)),_)) := s in wra.
-
-	Definition get_rda (s : State_t) :=
-	let '(_,(_,(_,(_,(_,(_,(_, _, _),_)),_,_,_, 
-	(_,_),(_,(_,(_,_,_),_)),_,rda),_),(_,(_,(_,(_,
-	(_, (_,_)),_,_,_,_,_,_),_),_)),_)) := s in rda.
-
-	Definition cnt2Bv (cnt : Counter_t) := 
-		N2Bv_sized COUNTER_WIDTH (N.of_nat (nat_of_ord cnt)).
-
-	Definition cref2Bv (cref : nat) := 
-		N2Bv_sized COUNTER_REF_WIDTH (N.of_nat cref).
-
-	Program Definition EqArrival (r : Requests_t) (r' : Bvector REQUEST_WIDTH) : bool.
-	Admitted.
-
-	Program Definition EqReq (r : Request_t) (r' : Bvector REQUEST_WIDTH) : bool.
-	Admitted.
-
-	(* Write this *)
-	Program Definition EqMem (P : Requests_t) (mem : circuit_state memqueue) : bool.
-	Admitted.
-
-	(* Rewrite the predicate *)
-	Import BvectorNotations.
-	Open Scope Bvector_scope.
-	Definition State_Eq' (fram_state : FIFO_state_t) (cava_state : State_t) : bool :=
-		let s 		:= get_st cava_state 	 in
-		let c' 		:= get_cnt cava_state  in  
-		let cref' := get_cref cava_state in
-		let r' 		:= get_cr cava_state 	 in
-		let wra 	:= get_wra cava_state  in
-		let rda 	:= get_rda cava_state  in
-		let pop 	:= get_pop cava_state  in
-		let mem   := get_mem cava_state  in
-		match fram_state with
-			| IDLE c cref P =>
-				(s =? STATE_IDLE_VEC) && (cnt2Bv c =? c') && (cref2Bv cref =? cref') && (
-				match P with
-					| [::] => (wra =? rda)
-					| x :: x0 => EqMem (x :: x0) mem
-				end)
-			| RUNNING c cref P r => 
-  			(s =? STATE_RUN_VEC) && (cnt2Bv c =? c') && (cref2Bv cref =? cref') && (
-				match P with
-					| [::] => (wra =? rda)
-					| x0 :: xS => EqMem (x0 :: xS) mem
-				end) &&
-				(EqReq r r')
-			| REFRESHING cref P =>
-				(s =? STATE_REF_VEC) && (cref2Bv cref =? cref') &&
-				((wra =? rda) == (P == [::]))
-		end.
-
-	Definition State_Eq (fram_state : FIFO_state_t) (cava_state : State_t) : bool :=
-		let s 		:= get_st cava_state in
-		let c' 		:= get_cnt cava_state in  
-		let cref' := get_cref cava_state in
-		let r' 		:= get_cr cava_state in
-		let wra 	:= get_wra cava_state in
-		let rda 	:= get_rda cava_state in
-		let pop 	:= get_pop cava_state in
-		match fram_state with
-			| IDLE c cref P =>
-				(s =? STATE_IDLE_VEC) && (cnt2Bv c =? c') && (cref2Bv cref =? cref') &&
-				((wra =? rda) == (P == [::]))
-			| RUNNING c cref P r => 
-  			(s =? STATE_RUN_VEC) && (cnt2Bv c =? c') && (cref2Bv cref =? cref') && (EqReq r r') &&
-				((wra =? rda) == (P == [::]))
-			| REFRESHING cref P =>
-				(s =? STATE_REF_VEC) && (cref2Bv cref =? cref') &&
-				((wra =? rda) == (P == [::]))
-		end.
-
-	Lemma BVEq_eq {N} (a b : Bvector N) :
-		(a =? b) = true -> a = b.
-	Proof.
-		intros.
-		specialize VectorEq.eqb_eq with (A_beq := Bool.eqb) (v1 := a) (v2 := b) as HH.
-		unfold BVeq in H.
-		apply HH in H; [exact H | exact Bool.eqb_true_iff ].
-	Qed.
-
-	(* NOT IMPORTANT FOR FULL PROOF -> FOR FALSE SIGNAL *)
-	Lemma fullAdder_cin {n} (x y : Vector.t bool n) cin:
-		let c := N.to_nat (Bv2N y) <= N.to_nat (Bv2N x) in 
-		let out := if cin
-			then (if c then (N.sub (Bv2N x) (Bv2N y)) else Bv2N (Vec.xor (x,y)))
-			else (if c then Bv2N (Vector.map negb (Vec.xor (x,y))) else N.add (Bv2N x) (Bv2N (Vector.map negb y))) in
-		fst (col fullAdder cin (vcombine x (Vector.map negb y))) = 
-		Vec.bitvec_literal (N2Bv_sized n out).
-	Admitted.
-
-	(* NOT IMPORTANT FOR FULL PROOF -> FOR FALSE SIGNAL *)
-	Lemma P2Bv_sized_neq_iff (n : nat) (x y : positive) :
-		(Pos.size_nat x <= n) ->
-		(Pos.size_nat y <= n) ->
-		(P2Bv_sized n x <> P2Bv_sized n y) <-> x <> y.
-	Proof.
-		revert x y; induction n; intros.
-		{ split; intros.
-			{ simpl in H1. contradict H1. reflexivity. }
-			{ pose proof (Pos_size_nat_nonzero x).
-				contradict H. apply /negP. rewrite -ltnNge.
-				apply /ltP; exact H2. }
-		}
-		{ split; try congruence; [].
-			cbn [P2Bv_sized].
-			destruct x,y; try congruence; [ | | | ].
-			all: cbn [Pos.size_nat] in *.
-			all: admit.
-		}
-	Admitted.
-
-	(* NOT IMPORTANT FOR FULL PROOF -> FOR FALSE SIGNAL *)
-	Lemma N2Bv_sized_neq_iff: forall (n : nat) (x y : N),
-		(N.size_nat x <= n)%coq_nat -> (N.size_nat y <= n)%coq_nat -> 
-		N2Bv_sized n x <> N2Bv_sized n y <-> x <> y.
-	Proof.
-		destruct x, y; cbn [N.size_nat N2Bv_sized]; intros; split; intros.
-		8: { 
-			rewrite P2Bv_sized_neq_iff; try congruence. 
-			all: apply /leP; try (exact H || exact H0).
-		}
-		all: try discriminate.
-		all: try (cbv [Bvect_false] in H1; done).
-		all: try (apply P2Bv_nonzero in H0; apply ssrfun.nesym in H0).
-		all: try exact H0.
-		all: try by apply P2Bv_nonzero in H.
-		all: try (congruence).
-	Qed.
-
-	(* NOT IMPORTANT FOR FULL PROOF -> FOR FALSE SIGNAL *)
-	Lemma FullEmptyLogic_equiv (c : circuit_state FullEmptyLogic) wra rda :
-		wra = rda -> exists c', step FullEmptyLogic c (wra,rda) = (c',(false,true)).
-	Proof.
-		intro H; evar (c' : circuit_state FullEmptyLogic); exists c'.
-		cbv [FullEmptyLogic FullLogic EmptyLogic Subtractor subtractor dropr EqFULL subtractor FullVEC]; 
-		cbn [step fst snd].
-		rewrite H CavaPreludeProperties.eqb_refl.
-		rewrite fullAdder_cin.
-		assert ((N.to_nat (Bv2N rda) <= N.to_nat (Bv2N rda)) = true); [by rewrite leqnn | ].
-		rewrite H0.
-		assert (N.sub (Bv2N rda) (Bv2N rda) = 0%N); [ by rewrite N.sub_diag | ]b_neq;
-			[ instantiate (c' := ((), ((), (), ()), ())); by unfold c' | ].
-		rewrite !bitvec_literal_correct.
-		apply N2Bv_sized_neq_iff.
-		{ apply Nat.le_0_l. }
-		{ rewrite N.sub_1_r -Nat2N.inj_pred.
-			apply N.size_nat_le_nat; unfold ADDR_WIDTH.
-			specialize QUEUE_MAX_SIZE_GT_0 as Hq0.
-			apply Nat.log2_spec in Hq0 as [H2 H2_].
-			admit. (* lt / log2 / pow 2*)
-		}
-		{ specialize QUEUE_MAX_SIZE_GT_1 as Hq1.
-			apply Lt.lt_0_neq in Hq1.
-			admit. (* Nat / nat*)
-		}
-	Admitted.
-
-	Definition get_addr (c : circuit_state RequestQueue) :=
-		let '(_,(_,(_,(_,(_,(_,_,_),_)),_,_,_, 
-    (_,_),(_,(_,(_,_,_),_)),_,rda),wra)) := c in (rda,wra).
-
-	(* if address are the same -> modify the RequestQueue circuit : send back REQUEST_nil *)
-	(* if addresses are different -> step through the queue will read whatever is stored in rda 
-		 is that used in the circuit ? -> yes
-		 cr will be taken from the queue when (Sidle /\ ~~ empty /\ Cprea)
-	*)
-
-	(* make a lemma for diff address 
-	   step RequestQueue c (true,c_req,pop) = (c',(f',MemRead@rda,p'))
-	*)
-
-	(* EMPTY OR NOT, data_o is always what is in rda *)
-
-	Lemma RequestQueue_equiv (c : circuit_state RequestQueue) c_req pop :
-		let '(rda,wra) := get_addr c in wra = rda -> exists c',
-		step RequestQueue c (true,c_req,pop) = (c',(false,REQUEST_NIL,true)).
-	Proof.
-		simpl in c; destruct_products.
-		rename t0 into rda, t into wra.
-		cbv [get_addr]; intros.
-		evar (c' : circuit_state RequestQueue); exists c'.
-		cbv [RequestQueue LoopInit fork2].
-		cbn [step fst snd].
-		simpl_ret.
-
-		specialize FullEmptyLogic_equiv with (c := (u15, (u17, u18, u16), u14)) (wra := wra) (rda := rda)
-			as Hequiv1; apply Hequiv1 in H as HH; clear Hequiv1; destruct HH as [cequiv1 Hequiv1].
-		rewrite Hequiv1.
-		cbn [fst snd bind inv and2 or2].
-
-		rewrite negb_false negb_true orbT.
-		rewrite andb_false_r andb_true_r.
-		Check memqueue.
-		rewrite ; simpl (true && true).
-
-		simpl (~~ false). 
-		rewrite orbT.
-		progress autorewrite with simpl_ident.
-		simpl_ident.
-
-		simpl in cequiv1.
-		unfold cequiv1. cbn [cequiv1].
-		destruct_products.
-		fold (memqueue c _).
-		repeat destruct_pair_let. cbn [step].
-	Admitted.
-
-	Theorem SM_Eq (t : nat) (c_state : State_t) (f_req: Request_t) 
-		(c_req : Bvector REQUEST_WIDTH) :
-		let f_state := (Default_arbitrate t).(Implementation_State) in
-		let R := Arrival_at t in
-		State_Eq f_state c_state -> EqArrival R c_req ->
-		let '(f_nextstate,_) := Next_state R f_state in
-		let '(c_nextstate,_) := step FIFOSM c_state (true,c_req) in
-		State_Eq f_nextstate c_nextstate.
-	Proof.
-		intros f_state R H Hreq; cbv [FIFOSM] in *.
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda, b into pop.
-		cbv [State_Eq get_st get_cnt get_cref get_wra get_rda get_cr] in H.
-		destruct (f_state) eqn:Hf_state.
-		{ destruct R eqn:HR; [ admit (* impossible, contradicts Hreq *) | ].
-			destruct r eqn:HP.
-			{ move: H => /andP [/andP [/andP [Hs Hc] Hcref] /eqP Haddr]; rewrite eq_refl in Haddr.
-				apply BVEq_eq in Hs,Hc,Hcref,Haddr.
-				subst s cnt cref wra.
-				cbv [LoopInit]. 
-				cbn [step fst snd].
-				cbv [ret monad CombinationalSemantics Identity.Monad_ident].
-				simpl_ident.
-				cbv [ret ].
-				destruct_pair_let.
-				(* Make a lemma to step through RequestQueue *)
-				
-			}
-		}
-
-	(* Default arbitrate should be equal to the simulate function *)
-End EquivalenceProof.
\ No newline at end of file
diff --git a/framework/CavaDRAM/CavaTDM/CavaTDMREF.v b/framework/CavaDRAM/CavaTDM/CavaTDMREF.v
deleted file mode 100644
index 27d5a29..0000000
--- a/framework/CavaDRAM/CavaTDM/CavaTDMREF.v
+++ /dev/null
@@ -1,527 +0,0 @@
-Set Warnings "-notation-overridden,-parsing". 
-From CavaDRAM Require Import CavaReqQueue CavaCommonInstances CavaSystem.
-From CoqDRAM Require Import TDM.
-From Coq Require Import BinaryString HexString NArith.
-From Cava Require Import Cava.
-
-Section CavaTDMREF.
-
-	(* From CavaDRAM *)
-	Context {CAVA_SYS : CavaSystem}.
-	(* From Cava *)
-	Context {signal : SignalType -> Type} {semantics : Cava signal}.
-	(* From CoqDRAM *)
-	Context {SYS_CFG : System_configuration} {TDM_CFG : TDM_configuration}.
-
-	Definition NR := BANKS.
-	Definition STATE_WIDTH := 2.
-
-	Definition SLOT_WIDTH := Nat.log2 NR.
-	Definition COUNTER_WIDTH := Nat.log2 SL.
-	Definition COUNTER_REF_WIDTH := Nat.log2 PREA_date.
-
-	Definition state := Vec Bit STATE_WIDTH.
-	Definition slot := Vec Bit SLOT_WIDTH.
-	Definition counter := Vec Bit COUNTER_WIDTH.
-	Definition counter_ref := Vec Bit COUNTER_REF_WIDTH.
-
-	Definition empty_t := signal Bit.
-	Definition state_t := signal state.
-	Definition slot_t := signal slot.
-	Definition counter_t := signal counter.
-	Definition counter_ref_t := signal counter_ref.
-
-	Import CavaReqQueue.DataNotation.
-	Open Scope ds.
-
-	Definition SLOT_SN   := Vec.bitvec_literal (#D (N.of_nat (SN - 1)) | SLOT_WIDTH).
-	Definition SLOT_NIL  := Vec.bitvec_literal (#D 0 | SLOT_WIDTH).
-	Definition SLOT_NIL_VEC  := Vector.const false SLOT_WIDTH.
-	
-	Definition CNT_SL	   := Vec.bitvec_literal (#D (N.of_nat (SL - 1)) | COUNTER_WIDTH).
-	Definition CNT_Z	   := Vec.bitvec_literal (#D 0 | COUNTER_WIDTH).
-	Definition CNT_ACT   := Vec.bitvec_literal (#D (N.of_nat ACT_date) | COUNTER_WIDTH).
-	Definition CNT_CAS   := Vec.bitvec_literal (#D (N.of_nat CAS_date) | COUNTER_WIDTH).
-	Definition CNT_NIL   := Vec.bitvec_literal (#D (N.of_nat 0) | COUNTER_WIDTH).
-	Definition CNT_NIL_VEC := Vector.const false COUNTER_WIDTH.
-	
-	Definition CNT_REF_SNtSN := Vec.bitvec_literal (#D (N.of_nat (SN * SL - 1)) | COUNTER_REF_WIDTH).
-	Definition CNT_REF_PREA := Vec.bitvec_literal (#D (N.of_nat PREA_date) | COUNTER_REF_WIDTH).
-	Definition CNT_REF_REF  := Vec.bitvec_literal (#D (N.of_nat REF_date) | COUNTER_REF_WIDTH).
-	Definition CNT_REF_END  := Vec.bitvec_literal (#D (N.of_nat END_REF_date) | COUNTER_REF_WIDTH).
-	Definition CNT_REF_NIL  := Vec.bitvec_literal (#D (N.of_nat 0) | COUNTER_REF_WIDTH).
-	Definition CNT_REF_NIL_VEC := Vector.const false COUNTER_REF_WIDTH.
-	
-	Definition STATE_IDLE_VEC := (#D 0 | STATE_WIDTH).
-	Definition STATE_IDLE 	  := Vec.bitvec_literal STATE_IDLE_VEC.
-	Definition STATE_RUN_VEC  := (#D 1 | STATE_WIDTH).
-	Definition STATE_RUN      := Vec.bitvec_literal STATE_RUN_VEC.
-	Definition STATE_REF_VEC  := (#D 2 | STATE_WIDTH).
-	Definition STATE_REF      := Vec.bitvec_literal STATE_REF_VEC.
-
-	(* Why redefine this ? *)
-	#[local] Definition NOP_VEC 	:= (#B "11111" | DRAM_CMD_WIDTH).
-	#[local] Definition NOP      := Vec.bitvec_literal NOP_VEC.
-	#[local] Definition PRE_VEC 	:= (#B "10010" | DRAM_CMD_WIDTH).
-	#[local] Definition PRE      := Vec.bitvec_literal PRE_VEC.
-	#[local] Definition ACT_VEC 	:= (#B "10011" | DRAM_CMD_WIDTH).
-	#[local] Definition ACT      := Vec.bitvec_literal ACT_VEC.
-	#[local] Definition RD_VEC 	:= (#B "10101" | DRAM_CMD_WIDTH).
-	#[local] Definition RD       := Vec.bitvec_literal RD_VEC.
-	#[local] Definition WR_VEC 	:= (#B "10100" | DRAM_CMD_WIDTH).
-	#[local] Definition WR       := Vec.bitvec_literal WR_VEC.
-	#[local] Definition PREA_VEC := (#B "10110" | DRAM_CMD_WIDTH).
-	#[local] Definition PREA     := Vec.bitvec_literal PREA_VEC.
-	#[local] Definition REF_VEC 	:= (#B "10001" | DRAM_CMD_WIDTH).
-	#[local] Definition REF      := Vec.bitvec_literal REF_VEC.
-
-	Definition Sidle (input : state_t) : cava (signal Bit) :=
-		CavaPrelude.eqb (input,STATE_IDLE).
-
-	Definition Srun (input : state_t) : cava (signal Bit) :=
-		CavaPrelude.eqb (input,STATE_RUN).
-
-	Definition Sref (input : state_t) : cava (signal Bit) :=
-		CavaPrelude.eqb (input,STATE_REF).
-
-	Definition CeqZ (input : counter_t) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,CNT_Z).
-
-	Definition CeqSL (input : counter_t) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,CNT_SL).
-
-	Definition CeqCAS (input : counter_t) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,CNT_CAS).
-		
-	Definition CeqACT (input : counter_t) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,CNT_ACT).
-	
-	Definition CrefPREA_eq (input : counter_ref_t) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,CNT_REF_PREA).
-
-	Definition CrefPREA_lt (input : counter_ref_t) : cava (signal Bit) :=
-		t <- addN (input,CNT_REF_SNtSN) ;;
-		s <- greaterThanOrEqual (t,CNT_REF_PREA) ;; inv s.
-	
-	Definition CrefREF (input : counter_ref_t) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,CNT_REF_REF).
-
-	Definition CrefEND (input : counter_ref_t) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,CNT_REF_END).
-
-	Definition SeqSN (input : signal (Vec Bit SLOT_WIDTH)) : cava (signal Bit) :=
-		CavaPrelude.eqb (input,SLOT_SN).
-
-	(* Cuts FE_ID_WIDTH to be just the SLOT_WIDTH lsb *)
-	(* Definition RequestId : Circuit 
-		(request_t) (signal (Vec Bit SLOT_WIDTH)) := Comb (fun r =>
-		rV <- unpackV r ;;
-		packV (slice_default defaultSignal rV 0 SLOT_WIDTH)). *)
-
-	(* Will not depend on the slot *)
-	Definition NextCR : Circuit 
-	(state_t * empty_t * counter_t * counter_ref_t * request_t) (request_t)
-	:= let state_init : combType (request) := Vector.const one (REQUEST_WIDTH) in
-	LoopInit state_init (Comb (fun '(s,e,c,cref,tr,cr) =>
-		(* signals *)
-		s_idle <- Sidle s ;; 
-		s_run <- Srun s ;; 
-		(* s_ref <- Sref s ;; *)
-		nc_sl <- (CeqSL >=> inv) c ;; cz <- CeqZ c ;;
-		c_prea <- (CrefPREA_lt) cref ;;
-		ne <- inv e ;;
-		(* first mux *)
-		mux1_sel <- and2(s_run,nc_sl) ;;
-		mux1_out <- mux2 mux1_sel (REQUEST_NIL,cr) ;;
-		(* second mux *)
-		t0 <- and2 (s_idle,ne) ;; 
-		t1 <- and2 (c_prea, cz);;
-		mux2_sel <- and2 (t0,t1) ;;
-		mux2_out <- mux2 mux2_sel (mux1_out,tr) ;;
-		ret (mux2_out,mux2_out)
-	)).
-
-	(* 
-	Definition CmdGen : Circuit
-	(state_t * empty_t * counter_t * counter_ref_t * request_t) (command_t) :=
-	Comb (fun '(s,e,c,cref,req) =>
-		(* signals *)
-		s_idle <- Sidle s ;; s_run <- Srun s ;; s_ref <- Sref s ;;
-		c_cas <- CeqCAS c ;; c_act <- CeqACT c ;; cz <- CeqZ c ;;
-		c_prea <- CrefPREA_eq cref ;; c_prea' <- CrefPREA_lt cref ;;
-		(* c_prea_n <- inv c_prea ;; *)
-		c_ref <- CrefREF cref ;;
-		ne <- inv e ;;
-		(* REF mux *)
-		ref_mux_sel <- and2 (s_ref,c_ref) ;;
-		ref_mux_out <- mux2 ref_mux_sel (NOP,REF) ;;
-		(* PREA mux *)
-		prea_mux_sel <- and2 (s_idle,c_prea) ;;
-		prea_mux_out <- mux2 prea_mux_sel (ref_mux_out,PREA);;
-		(* CAS mux *)
-		rd_wr_mux_sel <- RequestType (req) ;;
-		rd_wr_mux_out <- mux2 rd_wr_mux_sel (RD,WR) ;;
-		cas_mux_sel <- and2 (s_run,c_cas) ;;
-		cas_mux_out <- mux2 cas_mux_sel (prea_mux_out,rd_wr_mux_out) ;;
-		(* ACT mux *)
-		act_mux_sel <- and2 (s_run,c_act) ;;
-		act_mux_out <- mux2 act_mux_sel (cas_mux_out,ACT) ;;
-		(* PRE mux *)
-		t0 <- and2 (s_idle,ne) ;; 
-		t1 <- and2 (c_prea',cz);;
-		pre_mux_sel <- and2 (t0,t1) ;;
-		mux2 pre_mux_sel (act_mux_out,PRE)
-	). 
-	*)
-
-	(* Will not depend on the slot *)
-	Definition Update_s (input : state_t * empty_t * counter_t * counter_ref_t) :
-	cava (state_t) := let '(s,e,c,cref) := input in 
-		s_idle <- Sidle s ;; 
-		s_run <- Srun s ;; 
-		s_ref <- Sref s ;;
-		nc_eqsl <- (CeqSL >=> inv) c ;; cz <- CeqZ c ;;
-		(* true if there is enough time to treat a request *)
-		c_service <- CrefPREA_lt cref ;;
-		(* true if it is refresh time *)
-		c_prea <- CrefPREA_eq cref ;;
-		nc_refend <- (CrefEND >=> inv) cref ;;
-		ne <- inv e ;;
-		(* first mux *)
-		t0 <- and2 (ne,c_service) ;;
-		t1 <- and2 (s_idle,cz) ;;
-		t' <- and2 (t0,t1);;
-		t2 <- and2 (s_run,nc_eqsl) ;;
-		mux_idle_run_sel <- or2 (t',t2) ;;
-		mux_idle_run_out <- mux2 mux_idle_run_sel (STATE_IDLE,STATE_RUN) ;;
-		(* second mux *)
-		t3 <- and2 (s_ref,nc_refend) ;;
-		t4 <- and2 (s_idle,c_prea) ;;
-		mux_ref_sel <- or2 (t3,t4) ;;
-		mux2 mux_ref_sel (mux_idle_run_out,STATE_REF).
-
-	Definition Update_c (input : state_t * empty_t * counter_t * counter_ref_t) :
-	cava (counter_t) := let '(_,_,c,_) := input in 
-		c_sl <- CeqSL c ;;
-		cp1 <- incrN c ;;
-		mux2 c_sl (cp1,CNT_NIL).
-
-	Definition Update_cref (input : state_t * empty_t * counter_t * counter_ref_t) :
-	cava (counter_ref_t) := let '(s,_,_,cref) := input in
-		s_idle <- Sidle s ;; 
-		s_ref <- Sref s ;;
-		cref_prea <- CrefPREA_eq cref ;;
-		cref_end <- CrefEND cref ;;
-		t0 <- and2 (s_ref,cref_end) ;;
-		t1 <- and2 (s_idle,cref_prea) ;;
-		mux2_sel <- or2 (t0,t1) ;;
-		crefp1 <- incrN cref ;;
-		mux2 mux2_sel (crefp1,CNT_REF_NIL).
-	
-	Definition Update_slot (i : state_t * slot_t * empty_t * counter_t * counter_ref_t) 
-	: cava (slot_t) := let '(_,sl,_,cnt,_) := i in
-		mux1_sel <- SeqSN sl ;;
-		sp1 <- incrN sl ;;
-		mux1_out <- mux2 mux1_sel (sp1,SLOT_NIL) ;;
-		mux2_sel <- (CeqSL >=> inv) cnt ;;
-		mux2 mux2_sel (mux1_out,sl).
-
-	Definition Update : Circuit
-		(state_t * slot_t * empty_t * counter_t * counter_ref_t)
-		(state_t * slot_t * counter_t * counter_ref_t) :=
-		Comb (fun '(s,sl,e,c,cref) => 
-			s' <- Update_s (s,e,c,cref) ;;
-			sl' <- Update_slot (s,sl,e,c,cref) ;;
-			c' <- Update_c (s,e,c,cref) ;;
-			cref' <- Update_cref (s,e,c,cref) ;;
-			ret (s',sl',c',cref')
-		).
-
-	Definition Idx {W A} n
-		: signal (Vec A W.+1) -> cava (signal (Vec A W) * signal A) :=
-		fun i => o <- Vec.tl i ;; idx <- indexConst i n ;; ret(o,idx).
-
-	Fixpoint Queues N : Circuit 
-		(signal (Vec Bit N) * signal (Vec (Vec Bit REQUEST_WIDTH) N) * signal (Vec Bit N))
-		(signal (Vec Bit N) * signal (Vec (Vec Bit REQUEST_WIDTH) N) * signal (Vec Bit N)) :=
-		match N with
-			| 0 => (Comb (fun '(push_v,data_v,pop_v) =>
-				full_def <- Vec.const zero 0 ;;
-				data_def <- Vec.const REQUEST_NIL 0 ;;
-				empt_def <- Vec.const zero 0 ;;
-				ret (full_def,data_def,empt_def)))
-			| S n => Comb (fun '(push_v,data_v,pop_v) =>
-				let idx := N - (n + 1) in
-				'(push_v,push_i) <- Idx idx push_v ;;
-				'(data_v,data_i) <- Idx idx data_v ;;
-				'(pop_v,pop_i)   <- Idx idx pop_v ;;
-				ret((push_v,data_v,pop_v),(push_i,data_i,pop_i)))
-				>==> First (Queues n) >==> Second RequestQueue
-				>==> Comb (fun '((f_pred,d_pred,e_pred),(f,d,e)) =>
-					t0 <- Vec.cons f f_pred ;;
-					t1 <- Vec.cons d d_pred ;;
-					t2 <- Vec.cons e e_pred ;;
-					ret (t0,t1,t2)
-				)
-		end.
-
-	(* A 1:N 1-bit demultiplexer *)
-	Fixpoint demux_bit W N : Circuit
-		(signal Bit * signal (Vec Bit W)) (signal (Vec Bit N)) :=
-		match N with
-			| 0 => Comb (fun '(_,_) => Vec.const zero 0)
-			| S n => Comb (fun '(Rp,sel) =>
-				let i := (#D (N.of_nat (NR - (n + 1))) | W) in
-				i_vec <- Vec.bitvec_literal i ;;
-				eq_sel <- CavaPrelude.eqb(sel,i_vec) ;;
-				t <- mux2 eq_sel (zero,Rp) ;;
-				ret (t,(Rp,sel)))
-				>==> Second (demux_bit W n) >==>
-				Comb (fun '(t,t0) => Vec.cons t t0)
-		end.
-
-	Fixpoint repeatF {A} NR : Circuit (signal A) (signal (Vec A NR)) :=
-		match NR with
-			| 0 => Comb (fun e => Vec.const e 0)
-			| S n => Comb (fork2) 
-				>==> Second (repeatF n)
-				>==> Comb (fun '(t,t0) => Vec.cons t t0)
-		end.
-
-	Definition mux_sigs N : Circuit
-		(signal (Vec Bit N) * signal (Vec (Vec Bit REQUEST_WIDTH) N) * signal (Vec Bit N) * signal (Vec Bit SLOT_WIDTH))
-		(signal Bit * request_t * signal Bit) :=
-		Comb (fun '(f_vec,d_vec,e_vec,slot) =>
-			f <- indexAt f_vec slot ;;
-			d <- indexAt d_vec slot ;;
-			e <- indexAt e_vec slot ;;
-			ret (f,d,e)
-		).
-
-	(* push, pop, bank, slot, request -> slot, push_vec, req_vec, pop_vec *)
-	Definition DemuxInputs : Circuit
-	 (signal Bit * signal Bit * request_t * bank_t * slot_t )
-	 (slot_t * signal (Vec Bit NR) * signal(Vec request NR) * signal (Vec Bit NR)) :=
-	 Comb (fun '(push,pop,req,bank,sl) => ret (push,pop,bank,sl,(req)))
-	 (* Repeats req to all queues *)
-	 >==> Second (repeatF (A := request) NR)
-	 (* Use the slot to demux the pop signal into the queus*)
-	 >==> Comb (fun '(push,pop,bank,sl,req_vec) => ret (sl,push,bank,req_vec,(pop,sl)))
-	 >==> Second (demux_bit SLOT_WIDTH NR)
-	 (* Use the bank to demux the push signal into the queues *)
-	 >==> Comb (fun '(sl,push,bank,req_vec,pop_vec) => ret (sl,req_vec,pop_vec,(push,bank)))
-	 >==> Second (demux_bit BANK_ADDR_WIDTH NR)
-	 (* Return *)
-	 >==> Comb (fun '(sl,req_vec,pop_vec,push_vec) => ret (sl,push_vec,req_vec,pop_vec)).
-
-	Definition TDMSM_v3 : Circuit
-	(signal Bit * request_t) (signal Bit * command_t * request_t) :=
-	let slot_init : combType (slot) := SLOT_NIL_VEC in
-	let s_init    : combType (state) := STATE_IDLE_VEC in
-	let cnt_init  : combType (counter) := CNT_NIL_VEC in 
-	let cref_init : combType (counter_ref) := CNT_REF_NIL_VEC in
-	Second (Comb (fork2) >==> Second (StripRequest)) >==>
-		Comb (fun '(push,(req,(_,_,bank,type))) => ret (push,bank,type,req)) >==>
-	LoopInit slot_init (
-		LoopInit s_init (
-			LoopInit cnt_init (
-				LoopInit cref_init ( (* push, bank, type, slot, s, cnt, cref *)
-					Comb (fun '(push,bank,type,req,sl,s,cnt,cref) =>
-						s_idle <- Sidle s ;;
-						c_service <- CrefPREA_lt cref ;;
-						pop <- and2 (s_idle,c_service) ;;	
-						ret(type,req,s,cnt,cref,(push,pop,req,bank,sl))) 
-					>==> Second (DemuxInputs)
-					>==> Comb (fun '(type,req,s,cnt,cref,(sl,push_vec,reqin_vec,pop_vec)) => 
-						ret (type,req,s,cnt,cref,sl,(push_vec,reqin_vec,pop_vec)))
-					>==> Second (Queues NR)
-					>==> Comb (fun '(type,req,s,cnt,cref,sl,(full_vec,data_vec,empty_vec)) =>
-						ret (one,NOP,REQUEST_NIL,SLOT_NIL,STATE_IDLE,CNT_NIL,CNT_REF_NIL)))))).
-
-	(* Definition TDMSM_ : Circuit
-	(signal Bit * request_t) (signal Bit * command_t * request_t) :=
-	let slot_init : combType (slot) := SLOT_NIL_VEC in
-	let s_init    : combType (state) := STATE_IDLE_VEC in
-	let cnt_init  : combType (counter) := CNT_NIL_VEC in 
-	let cref_init : combType (counter_ref) := CNT_REF_NIL_VEC in
-	LoopInit slot_init (
-		LoopInit s_init (
-			LoopInit cnt_init (
-				LoopInit cref_init ( (* Rp, Rd, sl, st, cnt, cref *)
-					Comb (fun '(Rp,Rd,sl,s,cnt,cref) =>
-						s_idle <- Sidle s ;;
-						c_service <- CrefPREA_lt cref ;;
-						pop <- and2 (s_idle,c_service) ;;	
-						ret(s,cnt,cref,(Rp,Rd,pop,sl))
-					) >==>
-					Second (DemuxInputs) >==>
-					Comb (fun '(s,cnt,cref,(sl,f_vec,d_vec,e_vec)) => ret(s,cnt,cref,sl,(f_vec,d_vec,e_vec,sl)))
-					>==> Second (mux_sigs NR) >==> (* s,cnt,cref,sl,(f,d,e) *)
-					Comb (fun '(s,cnt,cref,sl,(full,data,empty)) => ret(full,sl,s,empty,cnt,cref,(s,empty,cnt,cref,data)))
-					>==> Second (NextCR) >==> (*full,sl,s,empty,cnt,cref,cr *)
-					Comb (fun '(full,sl,s,empty,cnt,cref,cr) => ret(full,cr,sl,s,empty,cnt,cref,(s,empty,cnt,cref,cr)))
-					>==> Second (CmdGen) >==>
-					Comb (fun '(full,cr,sl,s,empty,cnt,cref,cmd) => ret(full,cmd,cr,(s,sl,empty,cnt,cref)))
-					>==> Second (Update_) >==>
-					Comb (fun '(full,cmd,cr,(ns,nsl,nc,ncref)) => ret (full,cmd,cr,nsl,ns,nc,ncref)))))).
-
-	Definition TDMSM : Circuit
-	(signal Bit * request_t) (signal Bit * command_t * request_t) :=
-	let pop_init  : combType (Bit) := false in
-	let slot_init : combType (slot) := SLOT_NIL_VEC in
-	let s_init    : combType (state) := STATE_IDLE_VEC in
-	let cnt_init  : combType (counter) := CNT_NIL_VEC in 
-	let cref_init : combType (counter_ref) := CNT_REF_NIL_VEC in
-	LoopInit pop_init ( (* Rp, Rd, p *)
-		LoopInit slot_init ( (* Rp, Rd, p, sl*)
-			DemuxInputs >==> (* sl, Rp_vec, Rd_vec, E_vec *)
-			Comb (fun '(sl,f_vec,d_vec,e_vec) => ret (sl,(f_vec,d_vec,e_vec,sl)))
-			>==> Second (mux_sigs NR) >==>
-			Comb (fun '(sl,(f,d,e)) => ret (sl,f,d,e)) >==>
-			LoopInit s_init (
-				LoopInit cnt_init (
-					LoopInit cref_init ( (* slot,full,data,empty,state,counter,cref *)
-						Comb (fun '(sl,full,data,empty,s,cnt,cref) => ret(full,sl,s,empty,cnt,cref,(s,empty,cnt,cref,data)))
-						>==> Second (NextCR) >==> (*full,sl,s,empty,cnt,cref,cr *)
-						Comb (fun '(full,sl,s,empty,cnt,cref,cr) => ret(full,cr,sl,s,empty,cnt,cref,(s,empty,cnt,cref,cr)))
-						>==> Second (CmdGen) >==>
-						Comb (fun '(full,cr,sl,s,empty,cnt,cref,cmd) => ret(full,cmd,cr,(s,sl,empty,cnt,cref)))
-						>==> Second (Update) >==>
-						Comb (fun '(full,cmd,cr,(ns,nsl,np,nc,ncref)) => ret (full,cmd,cr,np,nsl,ns,nc,ncref))))))). *)
-
-End CavaTDMREF.
-
-Section CavaTDMREFsim.
-
-	Existing Instance CavaCombinationalNet.
-	Existing Instance CAVA_SYS.
-	Existing Instance SYS_CFG.
-
-	Program Instance TDM_CFG : TDM_configuration := {
-		SL := 32;
-		SN := 8
-	}.
-
-	(* 2 banks -> slot_width *)
-	(* Compute circuit_state TDMSM. *)
-
-	Definition tdm_interface
-		:= sequentialInterface "tdm_interface"
-		"clk" PositiveEdge "rst" PositiveEdge
-		[mkPort "Rp" Bit; mkPort "Rd" (Vec Bit REQUEST_WIDTH)]
-		[mkPort "full_o" Bit; mkPort "cmd_o" (Vec Bit DRAM_CMD_WIDTH); mkPort "CR" (Vec Bit REQUEST_WIDTH)].
-
-	Definition tdm_netlist := makeCircuitNetlist tdm_interface TDMSM.
-
-	(*
-
-	Import CavaSM.DataNotation.
-	Open Scope data_scope.
-	Definition Rsim1_wr := #H "00fe468b00000" | REQUEST_WIDTH.
-	Definition Rsim1_rd := #H "00fe468b10000" | REQUEST_WIDTH.
-	Definition Rsim2_wr := #H "027f234500001" | REQUEST_WIDTH.
-	Definition Rsim2_rd := #H "027f234510001" | REQUEST_WIDTH.
-	Definition Rsim3_wr := #H "033f91a200001" | REQUEST_WIDTH.
-	Definition Rsim3_rd := #H "033f91a210001" | REQUEST_WIDTH.
-	Definition Rsim5_wr := #H "00467f2300007" | REQUEST_WIDTH.
-
-	Definition test (e : seq (bool * Bvector REQUEST_WIDTH * bool)) :=
-		map (fun '(f,d,e) => (f,HexString.of_N (Bv2N d),e)) e.
-
-	Compute (test (simulate RequestQueue [
-		(* wra = 0, rda = 0*)
-		(true,Rsim1_wr,false);
-		(* wra = 1, rda = 0*)
-		(false,Rsim2_wr,true);
-		(* wra = 1 ,rda = 1 *)
-		(true,Rsim1_wr,false)
-	])).
-
-	Compute simulate memqueue [
-		(* Rsim1_wr @0 *)
-		(Rsim1_wr,(#D 0 | ADDR_WIDTH), (#D 0 | ADDR_WIDTH),true);
-		(* Reads Rsim_wr @0 *)
-		((#D 1 | REQUEST_WIDTH),(#D 0 | ADDR_WIDTH), (#D 0 | ADDR_WIDTH),true);
-		(* Reads R1 @0 *)
-		((#D 2 | REQUEST_WIDTH),(#D 0 | ADDR_WIDTH), (#D 0 | ADDR_WIDTH),true)
-	].
-
-	(*
-	Definition Rsim1_wr := #H "00fe468b00000" | REQUEST_WIDTH.
-	Definition Rsim1_rd := #H "00fe468b10000" | REQUEST_WIDTH.
-	Definition Rsim2_wr := #H "027f234500001" | REQUEST_WIDTH.
-	Definition Rsim2_rd := #H "027f234510001" | REQUEST_WIDTH.
-	Definition Rsim3_wr := #H "033f91a200001" | REQUEST_WIDTH.
-	Definition Rsim3_rd := #H "033f91a210001" | REQUEST_WIDTH.
-	Definition Rsim5_wr := #H "00467f2300007" | REQUEST_WIDTH.
-
-	Definition SM_out := (bool * Vector.t bool DRAM_CMD_WIDTH * Vector.t bool REQUEST_WIDTH)%type.
-
-	Definition cmd2string (cmd : Vector.t bool DRAM_CMD_WIDTH) : string :=
-		let eq := Vector.eqb bool eqb cmd in if eq NOP_VEC then "NOP"
-		else if eq PRE_VEC then "PRE"
-		else if eq ACT_VEC then "ACT" 
-		else if eq RD_VEC then "RD"
-		else if eq WR_VEC then "WR"
-		else if eq PREA_VEC then "PREA"
-		else if eq REF_VEC then "REF"
-		else "INVALID".
-
-	Infix "+s+" := String.append (at level 0).
-	Definition tuple2string (e : SM_out) : (string) :=
-		let '(full,cmd,req) := e in
-		let full_str := if full then "FULL, " else "NOT FULL, " in
-		let cmd_str := cmd2string cmd in
-		let req_N := HexString.of_N (Bv2N req) in (full_str +s+ cmd_str +s+ " ," +s+ req_N).
-
-	Fixpoint index_ {T} (e : seq T) : seq nat :=
-		match e with
-		| [::] => [0]
-		| x :: s => [length e] ++ (index_ s)
-		end.
-
-	Definition map_out (input : seq (bool * Vector.t bool DRAM_CMD_WIDTH * Vector.t bool REQUEST_WIDTH))
-		:= zip (rev (index_ input)) (map (tuple2string) input).
-
-	Open Scope seq_scope.
-	Definition sm_inputs := [
-	(true,Rsim1_wr);
-	(true,Rsim1_rd);
-	(true,Rsim2_wr)
-	] ++ (repeat (false,REQUEST_NIL) 150).
-
-	Definition Test1_inputs := [
-		(true,Rsim1_wr,false,(#D 0 | SLOT_WIDTH));
-		(true,Rsim1_rd,false,(#D 0 | SLOT_WIDTH));
-		(true,Rsim2_wr,false,(#D 0 | SLOT_WIDTH));
-		(false,REQUEST_NIL,false, (#D 0 | SLOT_WIDTH))
-	].
-	Close Scope seq_scope.
-
-	Definition map_dvec (e : Vector.t (Vector.t bool REQUEST_WIDTH) NR) :=
-		Vector.map (fun el => HexString.of_N (Bv2N el)) e.
-	
-	Definition map_queues_out (e : combType (Vec Bit NR) * combType (Vec request NR) * combType (Vec Bit NR)) :=
-		let '(f_vec,d_vec,e_vec) := e in (f_vec,map_dvec d_vec,e_vec).
-
-	Definition map_demux_out 
-		(e : combType (Vec Bit SLOT_WIDTH) * combType (Vec Bit NR) * combType (Vec request NR) * combType (Vec Bit NR)) :=
-		let '(sl,f_vec,d_vec,e_vec) := e in (Bv2N sl,f_vec,map_dvec d_vec,e_vec).
-
-	(* Compute (map map_demux_out) (simulate DemuxInputs Test1_inputs). *)
-
-	Definition state2string (s : Vector.t bool STATE_WIDTH) : string := 
-		let eq := Vector.eqb bool eqb s in if eq STATE_IDLE_VEC then "IDLE"
-		else if eq STATE_RUN_VEC then "RUNNING"
-		else if eq STATE_REF_VEC then "REFRESHING"
-		else "STATE INVALID".
-
-	Definition map_update_out (e : seq (Vector.t bool STATE_WIDTH * Vector.t bool SLOT_WIDTH * 
-		bool * Vector.t bool COUNTER_WIDTH * Vector.t bool COUNTER_REF_WIDTH)) 
-	:= map (fun '(s,sl,e,cnt,cref) => (state2string s,Bv2N sl, e,Bv2N cnt,Bv2N cref)) e.
-
-	Compute (map_out (simulate TDMSM sm_inputs)). *)
-
-	*)
-
-End CavaTDMREFsim.
diff --git a/framework/CavaDRAM/CavaTDM/CavaTDMREFProperties.v b/framework/CavaDRAM/CavaTDM/CavaTDMREFProperties.v
deleted file mode 100644
index e84159a..0000000
--- a/framework/CavaDRAM/CavaTDM/CavaTDMREFProperties.v
+++ /dev/null
@@ -1,111 +0,0 @@
-Set Printing Projections.
-Set Warnings "-notation-overridden,-parsing". 
-
-From CavaDRAM Require Import CavaTDMREF CavaSM CavaReqQueue CavaCommonInstances CavaSubtractor Step CavaSystem Memory Util UtilSM.
-From CoqDRAM Require Import TDM.
-From Coq Require Import Program BinaryString HexString NArith.
-From Cava Require Import Cava CavaProperties Util.Vector Util.Tactics.
-From mathcomp Require Import fintype ssrZ zify ring.
-
-Section CavaFIFOREFProperties.
-	(* From Cava *)
-	Existing Instance CombinationalSemantics.
-	(* From CavaDRAM*)
-	Context {CAVA_SYS : CavaSystem}.
-	(* From CoqDRAM *)
-	Existing Instance REQESTOR_CFG.
-  Context {SYS_CFG      : System_configuration}.
-	Context {TDM_CFG      : TDM_configuration}.
-	Context {HAF					: HW_Arrival_function_t}.
-	Existing Instance ARBITER_CFG.
-	Existing Instance TDM_implementation.
-
-	Import Memory.Properties BvectorNotations.
-	Open Scope Bvector_scope.
-
-	Definition State_t := circuit_state TDMSM.
-
-	Definition get_state (s : State_t) : combType (CavaTDMREF.state) :=
-	let '(_,(_,(_,_,_,_,_,_,_,_,_,_,_,_,(_,(_,_,st)),_),_)) := s in st.
-
-	Definition get_slot (s : State_t) : combType (Vec Bit SLOT_WIDTH) :=
-	let '(_,(_,(_,_, _,_,_,_,_,_,_,_,_,_,_,slot),_)) := s in slot. 
-
-	Definition get_pop (s : State_t) : combType Bit :=
-	let '(_,(_,_,pop)) := s in pop.
-
-	Definition get_cnt (s : State_t) : combType (Vec Bit COUNTER_WIDTH) := 
-	let '(_,(_,(_,_,_,_,_,_,_,_,_,_,_,_,(_,(_,(_,_,cnt),_)),_),_)) := s in cnt.
-
-	Definition get_cref (s : State_t) : combType (Vec Bit COUNTER_REF_WIDTH) :=
-	let '(_,(_,(_,_,_,_,_,_,_,_,_,_,_,_,(_,(_,(_,(_,_,_,_,_,_,_,cref),_),_)),_),_)) := s in cref.
-
-	Definition get_req (s : State_t) : combType (Vec Bit REQUEST_WIDTH) :=
-	let '(_,(_,(_,_,_,_,_,_,_,_,_,_,_,_,(_,(_,(_,(_,(_, (_,req)),_,_,_,_,_,_),_),_)),_),_)) := s in req.
-
-	Definition cnt2Bv (cnt : Counter_t) := 
-		N2Bv_sized COUNTER_WIDTH (N.of_nat (nat_of_ord cnt)).
-
-	Definition cref2Bv (cref : Counter_ref_t) := 
-		N2Bv_sized COUNTER_REF_WIDTH (N.of_nat (nat_of_ord cref)).
-
-	Definition slot2Bv (slot : Slot_t) := 
-		N2Bv_sized SLOT_WIDTH (N.of_nat (nat_of_ord slot)).
-
-	Definition get_mem (s : State_t) : circuit_state (Queues NR) :=
-	let '(_,(_,(_,_,_,_,_,_,_,mem,_,_,_,_,_,_),_)) := s in mem.
-
-	(* Think about this *)
-	Definition MemPred (P : Requests_t) (mem : circuit_state (Queues NR)) : bool.
-	Admitted.
-
-	Definition EqReq (r : Request_t) (r' : Bvector REQUEST_WIDTH) : bool.
-	Admitted.
-
-	(* Think about EqMem and EqQueues *)
-	Definition State_Eq (fs : TDM_state_t) (cs : State_t) : bool :=
-		let cs_state := get_state cs in
-		let cs_sl := get_slot cs in
-		let cs_cnt := get_cnt cs in
-		let cs_cref := get_cref cs in
-		let cs_mem := get_mem cs in 
-		let cs_pop := get_pop cs in
-		let cs_req := get_req cs in
-		match fs with
-			| IDLE sl cnt cref P => (cs_state =? STATE_IDLE_VEC) 
-			&& (cs_sl =? slot2Bv sl) && (cs_cnt =? cnt2Bv cnt) && (cs_cref =? cref2Bv cref) 
-			&& (MemPred P cs_mem) && (cs_pop == false)
-			| RUNNING sl cnt cref P r => (cs_state =? STATE_RUN_VEC)
-			&& (cs_sl =? slot2Bv sl) && (cs_cnt =? cnt2Bv cnt) && (cs_cref =? cref2Bv cref)
-			&& (MemPred P cs_mem) && (cs_pop == (nat_of_ord cnt == 1)) && (EqReq r cs_req)
-			| REFRESHING sl cnt cref P => (cs_state =? STATE_REF_VEC)
-			&& (cs_sl =? slot2Bv sl) && (cs_cnt =? cnt2Bv cnt) && (cs_cref =? cref2Bv cref)
-			&& (MemPred P cs_mem) && (cs_pop == false)
-		end.
-
-	Theorem TS_Bisimulation (c_req : Bvector REQUEST_WIDTH) :
-		forall c_state t,
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in
-		State_Eq f_state c_state -> EqReq R c_req ->
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R f_state in
-		exists c_nextstate, (c_nextstate = fst (step TDMSM c_state (true,c_req))) /\
-		State_Eq f_nextstate c_nextstate.
-	Proof.
-		intros c_state t f_state R H Hreq.
-		repeat destruct_pair_let.
-		eapply ex_intro; split; [reflexivity | ].
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		rename t4 into cr, t3 into cref, t2 into cnt, t1 into state, t0 into slot, b into pop.
-		unfold State_Eq in H; cbv [get_state get_slot get_cnt get_cref get_pop get_mem] in H.
-		destruct f_state eqn:Hf_state.
-		{ move: H => /andP [/andP [/andP [/andP [/andP [EqS EqSlot] EqCnt] EqCref] EqMem] EqPop].
-			apply BVEq_iff_eq in EqS, EqSlot, EqCnt, EqCref; move: EqPop => /eqP EqPop; 
-			subst state slot cnt cref pop.
-			cbv [TDMSM LoopInit].
-			cbn [step fst snd]; simpl_ret.
-			admit.
-		}
-	Admitted.
-
-End CavaFIFOREFProperties.
\ No newline at end of file
diff --git a/framework/CavaDRAM/Core/CavaCommonInstances.v b/framework/CavaDRAM/Core/CavaCommonInstances.v
index a150dfc..c996903 100644
--- a/framework/CavaDRAM/Core/CavaCommonInstances.v
+++ b/framework/CavaDRAM/Core/CavaCommonInstances.v
@@ -1,11 +1,13 @@
 Set Warnings "-notation-overridden,-parsing". 
+
 From CavaDRAM Require Import CavaSystem.
-From CoqDRAM Require Import System.
+From DRAM Require Import System.
 From Coq Require Program.
 From mathcomp Require Import fintype ssrZ zify ring.
 
 Section CommonInstances.
 
+(* Useful for testing *)
 	Program Instance CAVA_SYS : CavaSystem := {
 		DRAM_CMD_WIDTH	:= 5;
 		(* FE_ADDR_WIDTH		:= 32 *)
diff --git a/framework/CavaDRAM/Core/CavaCounter.v b/framework/CavaDRAM/Core/CavaCounter.v
deleted file mode 100644
index b261b5a..0000000
--- a/framework/CavaDRAM/Core/CavaCounter.v
+++ /dev/null
@@ -1,47 +0,0 @@
-Require Export Cava.Cava.
-Require Export Cava.CavaProperties.
-
-Export Circuit.Notations.
-
-Require Export Coq.Vectors.Fin.
-Require Export Coq.Bool.Bool.
-Require Export Coq.Program.Basics.
-Require Export FunInd.
-
-Require Export CavaSystem.
-(* Require Export CavaUtil. *)
-Require Export CavaMemory.
-
-Require Export Lia.
-Require Export Omega.
-
-From CoqDRAM Require Export FIFO.
-
-Section CavaCounter.
-
-	Context {SYS_CFG : System_configuration}.
-	Context {FIFO_CFG : FIFO_configuration}.
-
-	Context {CAVA_SYS : CavaSystem}.
-	Context {signal : SignalType -> Type} {semantics : Cava signal}.
-
-	Definition COUNTER_WIDTH := Nat.log2 WAIT.
-
-	Definition incrN_circ : 
-		Circuit (signal (Vec Bit COUNTER_WIDTH)) (signal (Vec Bit COUNTER_WIDTH)) :=
-		Comb (incrN).
-
-	(* Counter with wrap arround : assynchronous reset input *)
-	Definition CavaCounter_t
-		: Circuit (signal Bit) (signal (Vec Bit COUNTER_WIDTH)) :=
-		let count_init : combType (Vec Bit COUNTER_WIDTH) := Vector.const zero COUNTER_WIDTH in
-		LoopInit count_init ( (* rst, count *)
-			Comb (fun '(rst,count) =>
-				let zero_out := Vec.bitvec_literal (N2Bv_sized COUNTER_WIDTH 0) in
-				cp1 <- incrN count ;;
-				out <- mux2 rst (cp1,zero_out) ;;
-				ret (out,out)
-			)
-		).
-
-End CavaCounter.
\ No newline at end of file
diff --git a/framework/CavaDRAM/Core/CavaCounterProperties.v b/framework/CavaDRAM/Core/CavaCounterProperties.v
deleted file mode 100644
index a12f233..0000000
--- a/framework/CavaDRAM/Core/CavaCounterProperties.v
+++ /dev/null
@@ -1,201 +0,0 @@
-Require Import CavaCounter.
-
-Section CavaCounterProperties.
-
-	Context {SYS_CFG : System_configuration}.
-	Context {FIFO_CFG : FIFO_configuration}.
-	Context {CAVA_SYS : CavaSystem}.
-	Existing Instance CombinationalSemantics.
-
-	Axiom WAIT_gt_one : 1 < WAIT.
-
-	Fixpoint counter_spec_ (rst : list bool) : list nat :=
-		match rst with
-			| [] 		=> []
-			| h :: t 	=>
-					let prev := counter_spec_ t in
-					let e := hd 0 prev in
-					if (eqb h true || Nat.eqb e WAIT.-1) then app[0] prev
-						else (if (Nat.eqb e 0) then app [1] prev else app [e + 1] prev)
-		end.
-
-	Definition counter_spec (rst : list (combType Bit)) : list N :=
-		map (N.of_nat) (rev (counter_spec_ (rev rst))).
-
-	Definition counter_spec_vec (rst : list (combType Bit)) : list (combType (Vec Bit COUNTER_WIDTH)) := 
-		map (N2Bv_sized COUNTER_WIDTH) (counter_spec rst).
-
-	Fixpoint counter_val_ (rst : list bool) c : nat :=
-		match rst with
-			| [] => c
-			| b :: t => 
-				if (Bool.eqb b false) then 
-					(if (c + 1 < WAIT) then counter_val_ t (c + 1) else counter_val_ t 0)
-				else
-					counter_val_ t 0 
-		end.
-
-	Functional Scheme counter_val_ind := Induction for counter_val_ Sort Prop.
-	Check counter_val_ind.
-
-	Lemma counter_val_bounded rst c:
-		List.length rst > 0 ->
-		counter_val_ rst c < WAIT.
-	Proof.
-		pattern rst, (counter_val_ rst c);
-		apply counter_val_ind; intros; clear rst c.
-			1: discriminate.
-		all: destruct (Datatypes.length t > 0) eqn:Hbug; try by apply H.
-		all: try (
-			rewrite lt0n in Hbug; move: Hbug => /eqP Hbug; apply length_zero_iff_nil in Hbug;
-			rewrite Hbug //=
-		).
-		all: exact WAIT_pos.
-	Qed.
-
-	Lemma counter_val_last_true (l : list bool) c (def : bool) :
-		List.length l > 0 -> List.last l def = true ->
-		counter_val_ l c = 0.
-	Proof.
-		pattern l, (counter_val_ l c);
-		apply counter_val_ind; intros; clear l c.
-			1: discriminate.
-		all: destruct (Datatypes.length t > 0) eqn:Hbug.
-		all: try (
-			rewrite lt0n in Hbug; move: Hbug => /eqP Hbug;
-			apply length_zero_iff_nil in Hbug; rewrite Hbug in H1;
-			rewrite Hbug //=
-		).
-		all: try (
-			contradict e0; simpl in H1; rewrite H1 //=
-		).
-		all: apply H; try done; destruct t; (discriminate || exact H1).
-	Qed.
-
-	Lemma aux l c:
-		Datatypes.length l > 0 ->
-		counter_val_ (removelast l) (c + 1) = counter_val_ (removelast (false :: l)) c.
-	Proof.
-	Admitted.
-
-		(* pattern c, (counter_val_ t c); apply counter_val_ind; intros.
-			1: discriminate.
-			{ apply eqb_prop in e0; subst b rst; clear c; simpl; by rewrite e1. }
-			{	apply eqb_prop in e0; subst b rst; clear c; simpl; rewrite e1.
-				rewrite add0n WAIT_gt_one.
-				destruct (c0 + 1 + 1 < WAIT) eqn:Hcont.
-				{ contradict e1; apply not_false_iff_true.
-					apply ltn_trans with (m := c0 + 1) in Hcont.
-						1: exact Hcont.
-					apply nat_ltn_add; done. }
-				{ admit. }
-			}
-			{ admit. }
-	Admitted. *)
-
-	Lemma counter_val_last_false (l : list bool) c (def : bool) :
-		List.length l > 1 -> List.last l def = false ->
-		let l0 := removelast l in
-		if (List.last l0 def == true) then counter_val_ l c = 1 
-			else counter_val_ l c = (counter_val_ l0 c).+1.
-	Proof.
-		pattern l,(counter_val_ l c); apply counter_val_ind; intros.
-			1: simpl in H; discriminate.
-		{ apply eqb_prop in e0; subst b rst; unfold l0 in *; clear l0.
-			destruct (Datatypes.length t > 1) eqn:Hbug.
-			{ admit. }
-			{ clear H.
-				destruct t eqn:Ht.
-				{ subst t; simpl in *; inversion H0. }
-				{ rewrite cons_length in Hbug.
-					rewrite ltnS lt0n in Hbug.
-					move: Hbug => /eqP Hbug; apply length_zero_iff_nil in Hbug; subst l0; simpl in *.
-					subst b; simpl; rewrite e1.
-					destruct (c0 + 1 + 1 < WAIT) eqn:Hwait.
-					{ rewrite addn1; reflexivity. }
-					{  admit. }
-				}
-			}
-		}
-		all: admit.
-	Admitted.
-	
-	Definition counter_invariant
-		(input : list bool)
-		(t : nat)
-		(loop_state : unit * combType (Vec Bit COUNTER_WIDTH))
-		(output_accumulator : list (combType (Vec Bit COUNTER_WIDTH))) : Prop :=
-		loop_state = (tt, N2Bv_sized COUNTER_WIDTH (N.of_nat (counter_val_ (firstn t input) 0)))
-		/\ output_accumulator = counter_spec_vec (firstn t input).
-
-	Check counter_invariant.
-	
-	Lemma last_app l d (b : bool):
-		List.last (app l [b]) d = b.
-	Proof.
-		induction l.
-			{ simpl; reflexivity. }
-		simpl.
-		destruct (app l [b]) eqn:Hseq.
-			{ apply app_eq_nil in Hseq; destruct Hseq as [_ Hbug]; discriminate. }
-		exact IHl.
-	Qed.
-
-	(* Variable asy_rst : list (combType Bit).
-
-	Check counter_invariant asy_rst.
-
-	Check fold_left_accumulate_invariant_seq.
-
-	Check fold_left_accumulate_invariant_seq (counter_invariant asy_rst). *)
-
-	Lemma counter_correct (asy_rst : list (combType Bit)) : 
-		simulate CavaCounter_t asy_rst = counter_spec_vec asy_rst.
-	Proof.
-		cbv [CavaCounter_t]; autorewrite with push_simulate; simpl_ident.
-		(* apply fold_left_accumulate_invariant_seq with (I := counter_invariant asy_rst). *)
-		eapply fold_left_accumulate_invariant_seq with (I := counter_invariant asy_rst).
-		{ (* prove that the invariant holds at the start of the loop *)
-			cbv [counter_invariant]; cbn; split; reflexivity. }
-		{ (* prove that, if the invariant holds at the beginning of the loop body for t, it should hold for t + 1*)
-			cbv [counter_invariant step]. intros. logical_simplify. subst.
-			split.
-			{ unfold fst; rewrite mux2_correct; destruct (t > 0) eqn:Ht.
-				{ destruct (List.nth t asy_rst d) eqn:H; apply firstn_succ_snoc with (d0 := d) in H1 as Hx; rewrite H in Hx; rewrite Hx.
-					{ specialize last_app with (l := firstn t asy_rst) (d := d) (b := true) as HH.
-						apply counter_val_last_true with (c := 0) in HH.
-							2: by rewrite app_length addn_gt0 ltnS leqnn orbT.
-						rewrite HH; reflexivity. }
-					{	rewrite incrN_correct Bv2N_N2Bv_sized.
-							2: admit.
-						specialize last_app with (l := firstn t asy_rst) (d := d) (b := false) as HH.
-						apply counter_val_last_false with (c := 0) in HH.
-							2: admit. 
-							(* 2: by rewrite app_length addn_gt0 //= ltnS leqnn orbT. *)
-						rewrite removelast_app //= app_nil_r in HH.
-						destruct (List.last (firstn t asy_rst) d == true) eqn:Hy; rewrite Hy in HH; rewrite HH.
-							{ move: Hy => /eqP Hy.
-								apply counter_val_last_true with (c := 0) in Hy.
-									2: { 
-										rewrite firstn_length min_l.
-											2: by apply Nat.lt_le_incl.
-										exact Ht.
-									}
-								rewrite Hy; reflexivity. }
-							{ specialize Nat2N.inj_add with (n := counter_val_ (firstn t asy_rst) O) (n' := 1) as Hinj.
-								rewrite -Hinj Nat.add_1_r; reflexivity. }}
-				}
-				{ rewrite lt0n in Ht; move: Ht => /eqP Ht; rewrite Ht //=.
-					destruct (List.nth 0 asy_rst d) eqn:H; rewrite H //=; try rewrite incrN_correct;
-					destruct (asy_rst) eqn:Hasy; try (by simpl).
-					all: try (simpl; simpl in H; rewrite H //=).
-					all: try (by simpl in H1; rewrite Ht in H1; inversion H1).
-					rewrite add0n WAIT_gt_one; rewrite Bv2N_Bvect_false; reflexivity. 
-				}
-			}
-			{ admit. }
-		}
-		{ admit. }
-	Admitted.
-
-End CavaCounterProperties.
\ No newline at end of file
diff --git a/framework/CavaDRAM/Core/CavaDemux.v b/framework/CavaDRAM/Core/CavaDemux.v
deleted file mode 100644
index 0eac003..0000000
--- a/framework/CavaDRAM/Core/CavaDemux.v
+++ /dev/null
@@ -1,69 +0,0 @@
-From Cava Require Export Cava CavaProperties.
-From CavaDRAM Require Import CavaSystem.
-From mathcomp Require Export ssreflect ssrnat ssrbool seq eqtype.
-
-Import Vec.BitVecNotations.
-Open Scope bitvec_scope.
-
-Section CavaDemux.
-
-	Context {signal : SignalType -> Type} {semantics : Cava signal}.
-
-	Definition ext_const {n} (input : signal Bit) : cava (signal (Vec Bit n)) :=
-		t0 <- Vec.const zero n ;; t1 <- Vec.const one n ;;
-		mux2 input (t0,t1).
-
-	Definition demux2 {n} : Circuit (signal Bit * signal (Vec Bit n))
-		(signal (Vec (Vec Bit n) 2)) :=
-		Comb (fun '(sel,F) =>
-			sel_ext <- ext_const sel ;;
-			inv_sel <- inv sel ;; 
-			inv_sel_ext <- ext_const inv_sel ;;
-			A <- Vec.and(F,inv_sel_ext) ;; AV <- unpackV A ;;
-			B <- Vec.and(F,sel_ext) ;; BV <- unpackV B ;;
-			Vec.packV2([AV;BV])
-		).
-
-	Definition demux2' {n} : Circuit (signal (Vec Bit 1) * signal (Vec Bit n))
-		(signal (Vec (Vec Bit n) 2)) :=
-		Comb (fun '(sel,F) =>
-			sel <- indexConst sel 0 ;;
-			sel_ext <- ext_const sel ;;
-			inv_sel <- inv sel ;; 
-			inv_sel_ext <- ext_const inv_sel ;;
-			A <- Vec.and(F,inv_sel_ext) ;; AV <- unpackV A ;;
-			B <- Vec.and(F,sel_ext) ;; BV <- unpackV B ;;
-			Vec.packV2([AV;BV])
-		).
-
-	Definition demux2_ {n} (inputs: signal Bit * signal (Vec Bit n))
-		: cava (signal (Vec (Vec Bit n) 2)) :=
-		let '(sel,F) := inputs in
-		sel_ext <- ext_const sel ;;
-		inv_sel <- inv sel ;; 
-		inv_sel_ext <- ext_const inv_sel ;;
-		A <- Vec.and(F,inv_sel_ext) ;; AV <- unpackV A ;;
-		B <- Vec.and(F,sel_ext) ;; BV <- unpackV B ;;
-		Vec.packV2([AV;BV]).
-
-	Definition demux4 {n} : Circuit (signal (Vec Bit 2) * signal (Vec Bit n))
-		(signal (Vec (Vec Bit n) 4)) :=
-		Comb (fun '(sel,F) =>
-			(* first bit of sel *)
-			bit0_sel <- Vec.const zero 1 ;; sel0 <- indexAt sel bit0_sel ;; 
-			inv_sel0 <- inv sel0 ;; 
-			inv_sel0_ext <- ext_const inv_sel0 ;;
-			sel0_ext <- ext_const sel0 ;;
-			(* second bit of sel *)
-			bit1_sel <- Vec.const one 1 ;; sel1 <- indexAt sel bit1_sel ;; 
-			inv_sel1 <- inv sel1 ;; inv_sel1_ext <- ext_const inv_sel1 ;;
-			sel1_ext <- ext_const sel1 ;;
-			(* Outputs *)
-			A <- F & inv_sel0_ext & inv_sel1_ext ;; AV <- unpackV A ;;
-			B <- F & sel0_ext & inv_sel1_ext ;; BV <- unpackV B ;;
-			C <- F & inv_sel0_ext & sel1_ext ;; CV <- unpackV C ;;
-			D <- F & sel0_ext & sel1_ext ;; DV <- unpackV D ;;
-			Vec.packV2 [AV;BV;CV;DV]
-		).
-
-End CavaDemux.
\ No newline at end of file
diff --git a/framework/CavaDRAM/Core/CavaMemory.v b/framework/CavaDRAM/Core/CavaMemory.v
deleted file mode 100644
index 67220d3..0000000
--- a/framework/CavaDRAM/Core/CavaMemory.v
+++ /dev/null
@@ -1,66 +0,0 @@
-From Cava Require Import Cava CavaProperties Lib.Multiplexers Lib.Vec.
-
-(* From Coq Require Import Vectors.Fin Bool.Bool Program.Basics. *)
-
-From CavaDRAM Require Import CavaSystem.
-
-Import Circuit.Notations.
-Import Init.Logic.EqNotations.
-
-Section CavaMemory.
-  Context {signal} `{Cava' : Cava signal}.
-  (* write data * write address * write enable -> write data * write enable * read enable *)
-  Definition isN T W N (input : signal T * signal (Vec Bit W) * signal Bit) 
-		: cava (signal T * signal Bit * signal Bit) :=
-    let '(wd, wa, we) := input in
-      ca <- (Vec.of_N (N.of_nat N));;   (* current address *)
-      re <- eqb (ca, wa);;              (*  check if N matches wa *)
-      t <- and2 (re, we);;
-      ret (wd, t, re).
-
-	Definition isN_ext T W N (input : signal T * signal (Vec Bit W) * signal (Vec Bit W) * signal Bit) 
-		: cava (signal T * signal Bit * signal Bit) := 
-		let '(wd,wa,ra,we) := input in
-			ca <- (Vec.of_N (N.of_nat N));;
-			re <- eqb(ca,ra) ;;
-			we_ <- eqb(ca,wa) ;;
-			we <- and2 (we,we_) ;;
-			ret (wd,we,re).
-
-  (* write data * write enable -> read data*)
-  Definition mem_cell T :=
-    DelayCE (t := T).
-
-  (* read data A * read data B * select -> read data *)
-  Definition mem_select T (input : signal T * (signal T * signal Bit)) : cava (signal T) :=
-    let '(rdA, (rdB, sel)) := input in
-    v <- mux2 sel (rdA, rdB);;
-    ret v.
-  
-  Fixpoint memory T W N :=
-    match N with
-     | 0    => Comb (isN T W 0) >==> First (mem_cell T) >==> Comb(dropr)
-     | S N' => Comb(fork2)
-                 >==> First (memory T W N')
-                 >==> Second (Comb (isN T W N) >==> First (mem_cell T))
-                 >==> Comb (mem_select T)
-    end.
-
-	(* inputs : write data, write address, read address, write enable *)
-	(* output : read data *)
-	(* T : data type, W : address size, N : memory size *)
-	Fixpoint memory_dp T W N
-		: Circuit (signal T * signal (Vec Bit W) * signal (Vec Bit W) * signal Bit)
-							(signal T) :=
-		match N with
-			| 0    => Comb (isN_ext T W 0) >==> First (mem_cell T) >==> Comb(dropr)
-			| S N' => Comb(fork2)
-									>==> First (memory_dp T W N')
-									>==> Second (Comb (isN_ext T W N) >==> First (mem_cell T))
-									>==> Comb (mem_select T)
-		end.
-		
-End CavaMemory.
-
-
-
diff --git a/framework/CavaDRAM/Core/CavaReqQueue.v b/framework/CavaDRAM/Core/CavaReqQueue.v
index 8200b90..ba5e888 100644
--- a/framework/CavaDRAM/Core/CavaReqQueue.v
+++ b/framework/CavaDRAM/Core/CavaReqQueue.v
@@ -1,7 +1,7 @@
 
 From Cava Require Import Cava CavaProperties.
 From Coq Require Import Vectors.Fin Bool.Bool Program BinaryString HexString NArith.
-From CavaDRAM Require Import CavaSystem CavaMemory CavaSubtractor Memory.
+From CavaDRAM Require Import CavaSystem CavaSubtractor Memory.
 From mathcomp Require Import ssreflect.
 
 Export Circuit.Notations.
@@ -65,8 +65,9 @@ Section CavaReqQueue.
 		type <- packV (slice_default defaultSignal rV (ROW_ADDR_WIDTH + COL_ADDR_WIDTH + BANK_ADDR_WIDTH) FE_CMD_WIDTH) ;;
 		ReqType type.
 
-	Definition memqueue :=
-	 memory_dp (Vec Bit REQUEST_WIDTH) ADDR_WIDTH (QUEUE_MAX_SIZE - 1).
+	(* 
+		Definition memqueue := memory_dp (Vec Bit REQUEST_WIDTH) ADDR_WIDTH (QUEUE_MAX_SIZE - 1). 
+	*)
 
 	Definition InitMem (n : nat) := Bvect_false REQUEST_WIDTH.
 
diff --git a/framework/CavaDRAM/Core/CavaSM.v b/framework/CavaDRAM/Core/CavaSM.v
deleted file mode 100644
index 6577229..0000000
--- a/framework/CavaDRAM/Core/CavaSM.v
+++ /dev/null
@@ -1,51 +0,0 @@
-From CavaDRAM Require Import CavaReqQueue.
-From DRAM Require Import System.
-From Coq Require Import BinaryString HexString NArith.
-
-Module DataNotation.
-Declare Scope data_scope.
-Delimit Scope data_scope with ds.
-Infix "++" := Vector.append.
-Notation "'#B' n '|' w" := (N2Bv_sized w (BinaryString.Raw.to_N n 0)) (at level 0) : data_scope.
-Notation "'#D' n '|' w" := (N2Bv_sized w n) (at level 0) : data_scope.
-Notation "'#H' n '|' w" := (N2Bv_sized w (HexString.Raw.to_N n 0)) (at level 0) : data_scope.
-End DataNotation.
-
-Section CavaSM.
-
-	Context {CAVA_SYS : CavaSystem}.
-	Context {signal : SignalType -> Type} {semantics : Cava signal}.
-	Context {SYS_CFG : System_configuration}.
-
-	Definition powerOfTwo (n : nat) : bool :=
-		N.eqb (N.land (N.of_nat n) (N.of_nat (n - 1))) 0.
-
-	Import DataNotation.
-	Open Scope data_scope.
-	Definition request := Vec Bit REQUEST_WIDTH.
-	Definition request_t := signal request.
-	Definition REQUEST_NIL   := Vec.bitvec_literal (#D 0 | REQUEST_WIDTH).
-	Definition READ_REQUEST  := Vec.bitvec_literal (#D 1 | FE_CMD_WIDTH).
-	Definition WRITE_REQUEST := Vec.bitvec_literal (#D 0 | FE_CMD_WIDTH).
-
-	Definition command := Vec Bit DRAM_CMD_WIDTH.
-	Definition command_t := signal command.
-
-	Definition ReqType (input : signal (Vec Bit FE_CMD_WIDTH)) : cava (signal Bit) := 
-		CavaPrelude.eqb (input,WRITE_REQUEST).
-
-	Definition RequestType (r : request_t) : cava (signal Bit) :=
-		rV <- unpackV r ;;
-		r_type' <- packV (slice_default defaultSignal rV FE_ID_WIDTH FE_CMD_WIDTH) ;; (* 1 bit vector *)
-		ReqType r_type'.
-
-	Class CavaSMImplementation := 
-	{
-		STATE_WIDTH : N;
-
-		SM : Circuit (signal Bit * request_t)
-			(signal Bit * request_t * command_t);
-	}.
-
-End CavaSM.
-
diff --git a/framework/CavaDRAM/Core/CavaSMExtraction.v b/framework/CavaDRAM/Core/CavaSMExtraction.v
deleted file mode 100644
index e9e8a0f..0000000
--- a/framework/CavaDRAM/Core/CavaSMExtraction.v
+++ /dev/null
@@ -1,25 +0,0 @@
-Set Warnings "-notation-overridden,-parsing".
-
-Require Import CavaFIFOREF.
-
-Require Import Extraction.
-Require Import ExtrHaskellBasic.
-Require Import ExtrHaskellNatInt.
-Require Import ExtrHaskellNatInteger.
-Require Import ExtrHaskellNatNum.
-Require Import ExtrHaskellString.
-Require Import ExtrHaskellZInt.
-Require Import ExtrHaskellZInteger.
-Require Import ExtrHaskellZNum.
-
-Extraction Language Haskell.
-
-Cd "fifo_gencode".
-Recursive Extraction Library CavaFIFOREF.
-Cd "..".
-
-(* 
-Cd "tdm_gencode".
-Recursive Extraction Library CavaTDMREF.
-Cd "..". 
-*)
diff --git a/framework/CavaDRAM/Core/CavaSMProperties.v b/framework/CavaDRAM/Core/CavaSMProperties.v
deleted file mode 100644
index 73da64b..0000000
--- a/framework/CavaDRAM/Core/CavaSMProperties.v
+++ /dev/null
@@ -1,666 +0,0 @@
-Require Import CavaSM.
-Require Import CavaSubtractorProperties.
-Require Import Program.
-
-Section CavaSMProperties.
-
-	(* Cava silveroak *)
-	Existing Instance CombinationalSemantics.
-
-	(* CavaDRAM *)
-	Context {CAVA_SYS : CavaSystem}.
-
-	(* DRAM *)
-	Existing Instance REQESTOR_CFG.
-
-  Context {SYS_CFG      : System_configuration}.
-	Context {FIFO_CFG     : FIFO_configuration}.
-	Context {AF						: Arrival_function_t}.
-
-	Existing Instance FIFO_implementation.
-	Existing Instance FIFO_arbiter.
-
-	Definition ACT_vec :=
-		N2Bv_sized COUNTER_WIDTH (N.of_nat Cava_ACT_date).
-
-	Definition PRE_vec :=
-		N2Bv_sized COUNTER_WIDTH (N.of_nat 0).
-
-	Definition CAS_vec :=
-		N2Bv_sized COUNTER_WIDTH (N.of_nat Cava_CAS_date).
-
-	Definition Command_Eq (cmd : Command_kind_t) (cava_cmd : combType (Vec Bit DRAM_CMD_WIDTH)) : bool :=
-		match cmd with
-			| ACT => Vector.eqb bool eqb cava_cmd ACT_vec
-			| PRE => Vector.eqb bool eqb cava_cmd PRE_vec
-			| CRD => Vector.eqb bool eqb cava_cmd CAS_vec
-			| CWR => Vector.eqb bool eqb cava_cmd CAS_vec
-			| _ => false
-		end.
-
-	Definition CavaFIFO_state := circuit_state CavaFIFO_NextState.
-
-	Definition CavaFIFO_state2tuple (state : CavaFIFO_state) := 
-		let '(_,(_,(_,(_,cnt),s),p)) := state in (p,(s,cnt))%type.
-	
-	Definition cnt2Bv (cnt : Counter_t) := 
-		N2Bv_sized COUNTER_WIDTH (N.of_nat (nat_of_ord cnt)) .
-
-	Definition State_Eq (fram_state : FIFO_state_t) (cava_state : CavaFIFO_state) 
-		(ar_req : Requests_t) : bool :=
-		let '(p,(s,cnt)) := CavaFIFO_state2tuple cava_state in
-		match fram_state with
-			| IDLE c P => (s == false) && (Vector.eqb bool Bool.eqb (cnt2Bv c) cnt)
-					&& (p == (P != cat [::] ar_req))
-			| RUNNING c P r => (s == true) && (Vector.eqb bool Bool.eqb (cnt2Bv c) cnt)
-					&& (p == ((P != cat [::] ar_req) && (nat_of_ord c == WAIT.-1)))
-		end.
-
-	Definition State_Eq_ (fram_state : FIFO_state_t) (state : CavaFIFO_state) (ar_req : Requests_t) : bool :=
-		let '(_,(_,(_,(_,(_,(_,(_, (_, (_, (_, _, _), _)), _, memory_state, _, 
-      (_, _), (_, (_, (_, _, _), _)), _, wra), rda)), _,
-      (_, (_, creq)), _, _, _, _, _, cnt), s), p)) := state in
-		match fram_state with
-			| IDLE c P => 
-					(s == false) && 
-					(Vector.eqb bool Bool.eqb (cnt2Bv c) cnt) && 
-					(p == (P != cat [::] ar_req)) && 
-					((P == [::]) == (Vector.eqb bool Bool.eqb wra rda))
-			| RUNNING c P r => 
-					(s == true) && 
-					(Vector.eqb bool Bool.eqb (cnt2Bv c) cnt) && 
-					(p == ((P != cat [::] ar_req) && (nat_of_ord c == WAIT.-1))) && 
-					((P == [::]) == (Vector.eqb bool Bool.eqb wra rda))
-		end.
-
-	(* in the Cava implementation only one request can arrive at a time *)
-	Definition Request_Eq (f_req : Request_t) (c_req : combType (Vec Bit REQUEST_WIDTH)) : bool.
-	Admitted.
-
-	Ltac destruct_products :=
-		repeat match goal with
-		| p: _ * _  |- _ => destruct p
-		| H: _ /\ _ |- _ => let Hl := fresh H "l" in let Hr := fresh H "r" in destruct H as [Hl Hr]
-		| E: exists y, _ |- _ => let yf := fresh y in destruct E as [yf E]
-		end.
-
-	Local Ltac simplify_step :=
-    first [ destruct_pair_let
-          | rewrite eqb_nat_to_bitvec_sized; by Lia.lia
-          | rewrite nat_to_bitvec_to_nat;  by Lia.lia
-          | progress simpl_ident
-          | progress autorewrite with to_spec
-				| progress cbn [fst snd map] ].
-  Local Ltac simplify := repeat simplify_step.
-
-	(* to prove : 
-		 - fullAdder_cin (CavaSubtractorProperties)
-		 - N2Bv ADDR_WIDTH 0 <> FullVEC (d       epends on P2Bv_sized_neq_iff)
-	*)
-
-	Lemma P2Bv_sized_neq_iff (n : nat) (x y : positive) :
-		(Pos.size_nat x <= n) ->
-		(Pos.size_nat y <= n) ->
-		(P2Bv_sized n x <> P2Bv_sized n y) <-> x <> y.
-	Proof.
-		revert x y; induction n; intros.
-		{ split; intros.
-			{ simpl in H1. contradict H1. reflexivity. }
-			{ pose proof (Pos_size_nat_nonzero x).
-				contradict H. apply /negP. rewrite -ltnNge.
-				apply /ltP; exact H2. }}
-		{ split; try congruence; [].
-			cbn [P2Bv_sized].
-			destruct x,y; try congruence; [ | | | ].
-			all: cbn [Pos.size_nat] in *.
-			all: admit.
-		}
-	Admitted.
-
-	Lemma N2Bv_sized_neq_if: forall (n : nat) (x y : N),
-		N2Bv_sized n x <> N2Bv_sized n y -> x <> y.
-	Proof.
-		destruct x, y; cbn [N.size_nat N2Bv_sized]; intros.
-		all: try discriminate.
-		all: try (cbv [Bvect_false] in H; done).
-		congruence.
-	Qed.
-
-	Lemma N2Bv_sized_neq_iff: forall (n : nat) (x y : N),
-		(N.size_nat x <= n)%coq_nat ->
-  	(N.size_nat y <= n)%coq_nat -> N2Bv_sized n x <> N2Bv_sized n y <-> x <> y.
-	Proof.
-		destruct x, y; cbn [N.size_nat N2Bv_sized]; intros; split; intros.
-		8: { 
-			rewrite P2Bv_sized_neq_iff; try congruence. 
-			all: apply /leP; try (exact H || exact H0).
-		}
-		all: try discriminate.
-		all: try (cbv [Bvect_false] in H1; done).
-		all: try (apply P2Bv_nonzero in H0; apply ssrfun.nesym in H0).
-		all: try exact H0.
-		all: try by apply P2Bv_nonzero in H.
-		all: try (congruence).
-	Qed.
-
-	Lemma FullEmptyLogic_equiv c wra rda:
-		Vector.eqb bool Bool.eqb wra rda -> exists cs',
-		step FullEmptyLogic c (rda,wra) = (cs',(false,true)).
-	Proof.
-		intros; evar (cs : circuit_state FullEmptyLogic); exists cs.
-		assert (wra = rda).
-		{ apply VectorEq.eqb_eq with (A_beq := Bool.eqb) in H.
-				2: exact Bool.eqb_true_iff.
-			exact H. 
-		}
-		rewrite H0.
-		cbv [FullEmptyLogic FullLogic EmptyLogic Subtractor dropr EqFULL subtractor]; cbn [step].
-		simplify.
-		rewrite CavaPreludeProperties.eqb_refl.
-		rewrite fullAdder_cin leqnn N.sub_diag CavaPreludeProperties.eqb_neq.
-			2: admit.
-		instantiate (cs := (tt, (tt, tt, tt), tt)); unfold cs.
-		reflexivity.
-	Admitted.
-
-	(* QUEUE_MAX_SIZE = 2, memory instantiated with N = 1 -> 2 elements *)
-	(* 1 el -> 2 prods *)
-	(* 2 el -> 6 prods *)
-	(* 3 el -> 10 prods *)
-	(* 4 el -> 14 prods *)
-	(* n * 4 - 2 *)
-	(* Example test (a b c d : nat) : ((a,b),(c,d))%type. *)
-
-	(* Check match c with
-		| (tt,tt) => true
-		| _ => false
-	end. *)
-
-	(* Fixpoint memory_fetch {n} ad
-		(c : circuit_state (memory_dp (Vec Bit REQUEST_WIDTH) ADDR_WIDTH n)) : bool :=
-		match c with
-			| unit => true
-			| pair a b => false
-		end.
-
-	Fixpoint memory_at_ {A B : Type} (c : prod A B) i cnt ad req 
-		: (combType (Bit) * combType (Vec Bit REQUEST_WIDTH)):=
-		match i with
-			| 0 => (true,req)
-			| S n => match c with
-								 | (tt,Vector.cons bool a REQUEST_WIDTH) =>
-								 	 if (cnt == ad) then (true,Vector.cons bool a REQUEST_WIDTH) 
-									 else (false,Vector.const false REQUEST_WIDTH)
-								 | ((a,b),(c,d)) =>
-								 	 let '(b,found_req) := (memory_at_ (prod c d) n cnt ad req) in
-									 if b then memory_at_ (prod unit unit) 0 cnt ad found_req
-									 else memory_at_ (prod a b) n cnt.+1 ad req
-								 | (tt,(a,b)) => memory_at_ (prod a b) n cnt ad req
-								 | ((a,b),tt) => memory_at_ (prod a b) n cnt ad req
-			end
-		end. *)
-
-	Lemma fifo_memory_equiv (c : circuit_state fifo_memory) c_req ad :
-		exists (cs' : circuit_state fifo_memory) req,
-		step fifo_memory c (c_req,ad,ad,true) =
-		(cs',req).
-	Proof.
-		cbv [fifo_memory] in *.
-		induction (QUEUE_MAX_SIZE - 1).
-		{ simpl in c.
-			destruct_products; rename t into reg.
-			evar (cs : circuit_state (memory_dp (Vec Bit REQUEST_WIDTH) ADDR_WIDTH 0)); exists (cs).
-			cbv [memory_dp isN_ext mem_cell DelayCE]. cbn [step].
-			simplify. rewrite andTb.
-			exists (reg).
-			instantiate (cs := (
-			tt,
-			if CavaPrelude.eqb (N2Bv_sized ADDR_WIDTH (N.of_nat 0), ad)
-			then c_req
-			else reg, tt
-			)); unfold cs.
-			reflexivity.
-		}
-		(* evar (cs : circuit_state (memory_dp (Vec Bit REQUEST_WIDTH) ADDR_WIDTH n.+1)); exists (cs). *)
-		(* evar (req : combType (Vec Bit REQUEST_WIDTH)); exists (req). *)
-		rewrite {4}/memory_dp. 
-		cbn [step]. fold memory_dp.
-		specialize IHn with (c := (snd (fst (fst c)))).
-		destruct IHn as [cs' [req_ IH]].
-		rewrite IH.
-		cbv [fork2 mem_cell isN_ext DelayCE]. cbn [step].
-		simplify. rewrite andTb.
-		cbv [mem_select].
-		simplify.
-		destruct (CavaPrelude.eqb (N2Bv_sized ADDR_WIDTH (N.of_nat n.+1), ad)) eqn:H.
-		{ exists (tt, cs', (tt, c_req), tt); exists (snd (snd (fst c))). }
-		admit.
-	Admitted.
-
-	Lemma incrn_pointr_en_correct (c : circuit_state incr_pointr) ad :
-		step incr_pointr c (ad,true) =
-		(tt,N2Bv_sized ADDR_WIDTH (Bv2N ad + 1)).
-	Admitted.
-
-	Lemma incrn_pointr_keep_correct (c : circuit_state incr_pointr) ad :
-		step incr_pointr c (ad,false) =
-		(tt,ad).
-	Admitted.
-
-	Lemma FullEmptyLogic_plusone (c : circuit_state FullEmptyLogic) ad:
-		exists cs' future_full_o,
-		step FullEmptyLogic c (N2Bv_sized ADDR_WIDTH (Bv2N ad + 1), ad) =
-		(cs',(future_full_o,false)).
-	Admitted.
-
-	Lemma CavaFIFO_equiv_ (c : circuit_state CavaFifoQueue_t_NF_RD) c_req :
-		let '((_,(_,(_, (_, (_, (_, _, _), _)), _, mem_state, _, 
-		(_, _), (_, (_, (_, _, _), _)), _, wra), rda))) := c in
-		Vector.eqb bool Bool.eqb wra rda -> exists cs' data_o, 
-		step CavaFifoQueue_t_NF_RD c (true,c_req,false) =
-		(cs',(false,data_o,true)).
-	Proof.
-		simpl in c; destruct_products; intros.
-		rename t into rda, t0 into wra.
-		assert (wra = rda) as Haddr_eq.
-		{ apply VectorEq.eqb_eq with (A_beq := Bool.eqb) in H.
-				2: exact Bool.eqb_true_iff.
-			exact H. 
-		}
-		(* rewrite Haddr_eq. *)
-		evar (cs : circuit_state CavaFifoQueue_t_NF_RD); exists cs.
-		(* evar (future_full_o : combType Bit); exists future_full_o. *)
-		evar (data_o : combType (Vec Bit REQUEST_WIDTH)); exists (data_o).
-
-		cbv [CavaFifoQueue_t_NF_RD Loop]. cbn [step]. cbv [fst snd fork2].
-		simpl_ident.
-
-		apply FullEmptyLogic_equiv with (c := (u15, (u17, u18, u16), u14)) in H.
-		destruct H as [fel_cs' H].
-		rewrite H; simpl (true && ~~ false); simpl (false && ~~ true).
-
-		specialize fifo_memory_equiv with (c_req := c_req) (c := c) (ad := rda) as Hfifo.
-		destruct Hfifo as [c' [cr_out Hfifo]].
-		rewrite Haddr_eq.
-		rewrite Hfifo.
-
-		specialize incrn_pointr_en_correct with (c := u8) as Hincr.
-		rewrite Hincr.
-
-		specialize incrn_pointr_keep_correct with (c := u9) as Hincr_.
-		rewrite Hincr_.
-
-		specialize FullEmptyLogic_plusone with (c := (u4, (u6, u7, u5), u3)) (ad := rda) as HH.
-		destruct HH as [u_fodase [future_full_o' HH]]. simpl in u_fodase.
-		rewrite HH.
-
-	Admitted.
-
-
-		(* assert (step incr_pointr u8 (rda,true) = )
-
-		cbv [incr_pointr incrN]. cbn [step].
-		simplify.
-		cbn [step].
-		simplify.
-
-		repeat destruct_pair_let. 
-		rewrite 
-
-		apply EmptyLogic_equiv with (c := (u15, (u17, u18, u16), u14)) in H.
-		destruct H as [cs' [full_o' H]].
-		rewrite H. 
-		rewrite andTb andb_false_l.
-		simplify.
-		(* when rda = wra -> read nil, state that with a Lemma *)
-	Admitted. *)
-
-	Lemma CavaFIFO_equiv (f_state : FIFO_state_t) (c : circuit_state CavaFifoQueue_t_NF_RD) c_req :
-		FIFO_pending (f_state) == [::] -> exists cs' full_o data_o, 
-		step CavaFifoQueue_t_NF_RD c (true,c_req,false) =
-		(cs',(full_o,data_o,true)).
-	Admitted.
-
-	Lemma NextCR_equiv (c : circuit_state NextCR) c0 d0 :
-		exists cs', step NextCR c (false,c0,true,d0) = (cs',null_req).
-	Proof.
-		destruct c. simpl in c1. simpl in c.
-		evar (cs : circuit_state NextCR); exists cs.
-		cbv [NextCR LoopInit]. cbn [step]. simplify.
-		rewrite andTb negb_false orbT.
-		instantiate (cs := (tt,(tt,null_req))); by unfold cs.
-	Qed.
-
-	Lemma CmdGen_equiv (c : circuit_state CmdGen) c0 :
-		exists cs', step CmdGen c (false, c0, true) = (cs',N2Bv_sized DRAM_CMD_WIDTH 0).
-	Proof.
-		evar (cs : circuit_state UpdateState); exists cs.
-		cbv [CmdGen]. cbn [step]. simplify.
-		simpl. by instantiate (cs := tt).
-	Qed.
-
-	Lemma UpdateState_equiv (c0 : Counter_t) (c : circuit_state UpdateState):
-		exists cs',
-		step UpdateState c (false,(N2Bv_sized COUNTER_WIDTH (N.of_nat c0)),true) = 
-		(cs',(false,(cnt2Bv (Next_cycle c0)),false)).
-	Proof.
-		evar (cs : circuit_state UpdateState); exists cs.
-		cbv [UpdateState]. cbn [step]. simplify.
-		rewrite andTb andb_false_l negb_false orTb negb_true andb_false_r orb_false_r /WaitVEC.
-		simplify.
-		destruct (nat_of_ord c0 == WAIT - 1) eqn:H.
-		{ move: H => /eqP H; rewrite H.
-			set (x := N2Bv_sized COUNTER_WIDTH (N.of_nat (WAIT - 1))); fold x.
-			rewrite CavaPreludeProperties.eqb_refl /Next_cycle.
-			set (Hc := c0.+1 < WAIT). dependent destruction Hc.
-			{ rewrite H subn1 prednK in x; try (exact WAIT_pos || by rewrite ltnn in x). }
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; intro; clear e.
-			rewrite /cnt_nil; simplify. 
-			rewrite /cnt2Bv /OCycle0 //=.
-			instantiate (cs := ()); by unfold cs. }
-		{	rewrite CavaPreludeProperties.eqb_neq.
-				2: { admit. }
-			rewrite /cnt2Bv Bv2N_N2Bv_sized.
-				2: { 
-					rewrite /COUNTER_WIDTH.
-					admit.
-					(* apply N.log2_lt_pow2. *)
-				}
-			rewrite /Next_cycle.
-			set (Hc := c0.+1 < WAIT); dependent destruction Hc.
-			all: apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; intro; clear x.
-			2: { (* contradiction *)
-				destruct c0; simpl in *.
-				apply ltn_gt in e; rewrite leq_eqVlt in e; move: e => /orP [/eqP e | e].
-				{ by rewrite e subn1 -pred_Sn eq_refl in H. }
-				contradict e; apply /negP; by rewrite -leqNgt.
-			}
-			simpl; rewrite /N2Bv_sized.
-			destruct ((N.of_nat (nat_of_ord c0) + 1)%num) eqn:HH.
-			{ rewrite N.add_1_r in HH.
-				specialize N.neq_succ_0 with (n := N.of_nat c0) as Hsuc.
-				by rewrite HH in Hsuc. }
-			assert (Pos.of_succ_nat c0 = p).
-			{ admit. }
-			rewrite H0.
-			reflexivity.
-		} 
-	Admitted.
-
-	
-	Proof.
-		intros f_state arriving_req Hfreq H Hreq; cbv [CavaFIFO_state] in *.
-		simpl in c_state. destruct_products.
-		rename b into p, b0 into s, t0 into cnt, t1 into current_req, t2 into rda, t3 into wra.
-		cbv [State_Eq_] in H. destruct (f_state) eqn:Hf_state.
-		{ destruct r eqn:HP.
-			{ destruct arriving_req eqn:Har0; simpl in H.
-				2: { (* cannot happen *)
-					specialize FIFO_arrival with (t := t) (r0 := r0) (r1 := r1) as HH.
-					fold arriving_req in HH; apply HH in Har0.
-					rewrite /FIFO_pending in Har0.
-					fold f_state in Har0; by rewrite Hf_state in Har0.
-				}
-				simpl in H; move: H => /andP [/andP [/andP [/eqP Hs Hc] /eqP Hp] Haddr]; rewrite eq_refl in Haddr.
-				specialize VectorEq.eqb_eq with (A_beq := Bool.eqb) (v1 := cnt2Bv c0) (v2 := cnt) as HH.
-				apply HH in Hc; clear HH; try exact Bool.eqb_true_iff.
-				subst s cnt p.
-
-				cbv [CavaFIFO_NextState LoopInit]. cbn [step fst snd].
-				cbv [ret monad CombinationalSemantics Identity.Monad_ident].
-				cbv [fst snd].
-
-				assert (Vector.eqb bool Bool.eqb wra rda) as Haddr_eq.
-				{ done. }
-
-				apply CavaFIFO_equiv_ with (c_req := c_req) (c := (u11,(u12,
-				(u24, (u25, (u27, (u29, u30, u28), u26)), u23, c, u22, (u20, u21),
-				(u14, (u16, (u18, u19, u17), u15)), u13, wra), rda))) in Haddr_eq as H.
-				destruct H as [cs' [future_full_o [future_req H]]].
-
-				rewrite H; clear H.
-
-				specialize NextCR_equiv with (c := (u7, (u8, current_req))) (c0 := cnt2Bv c0) (d0 := future_req) as H. 
-				destruct H as [ncr_cs' H].
-				rewrite H; clear H.
-
-				specialize CmdGen_equiv with (c := u5) (c0 := cnt2Bv c0) as H. 
-				destruct H as [cmd_cs' H].
-				rewrite H. clear H.
-
-				specialize UpdateState_equiv with (c := u3) (c0 := c0) as H.
-				destruct H as [ups_cs' H]. 
-				rewrite H.
-
-				unfold State_Eq_.
-				repeat destruct_pair_let.
-
-				rewrite /Next_state //=.
-				simpl in cs'. destruct_products; cbv [fst snd].
-				admit.
-			}
-		}
-		admit.
-	Admitted.
-
-	(* ----------------------------------------------------------- *)
-
-	Theorem SM_Eq_ (t : nat) (c_state : CavaFIFO_state)
-		(f_req: Request_t) (c_req : combType (Vec Bit REQUEST_WIDTH)) :
-		let f_state := (Default_arbitrate t).(Implementation_State) in
-		let arriving_req := Arrival_at t in
-		f_req \in Arrival_at t.+1 ->
-		State_Eq f_state c_state arriving_req -> Request_Eq f_req c_req ->
-		let '(f_nextstate,_) := Next_state [:: f_req] f_state in
-		let '(c_nextstate,_) := step CavaFIFO_NextState c_state (true,c_req) in
-		State_Eq f_nextstate c_nextstate [:: f_req].
-	Proof.
-		intros f_state arriving_req Hfreq H Hreq; cbv [CavaFIFO_state] in *.
-		simpl in c_state. destruct_products.
-		rename b into p, b0 into s, t0 into cnt.
-		cbv [State_Eq] in H. destruct (f_state) eqn:Hf_state.
-		{ destruct r eqn:HP.
-			{ destruct arriving_req eqn:Har0; simpl in H.
-					2: { (* cannot happen *)
-						specialize FIFO_arrival with (t := t) (r0 := r0) (r1 := r1) as HH.
-						fold arriving_req in HH; apply HH in Har0.
-						rewrite /FIFO_pending in Har0.
-						fold f_state in Har0; by rewrite Hf_state in Har0.
-					}
-					simpl in H; move: H => /andP [/andP [/eqP Hs Hc] /eqP Hp].
-					specialize VectorEq.eqb_eq with (A_beq := Bool.eqb) (v1 := cnt2Bv c0) (v2 := cnt) as HH.
-					apply HH in Hc; clear HH; try exact Bool.eqb_true_iff.
-					subst s cnt p.
-
-					cbv [CavaFIFO_NextState LoopInit].
-					cbn [step fst snd].
-					simpl_ident.
-
-					specialize CavaFIFO_equiv_ with (c := 
-					(u11,(u12,(u24, (u25, (u27, (u29, u30, u28), u26)), u23, c, u22,
-					(u20, u21), (u14, (u16, (u18, u19, u17), u15)), u13, t3),t2))) (c_req := c_req) as H.
-					(* assert (FIFO_pending f_state == [::]) as H0; try by rewrite /FIFO_pending Hf_state eq_refl. *)
-					apply H in H0. destruct H0 as [cs' [full_o [data_o H0]]].
-					rewrite H0; clear H H0.
-
-					specialize NextCR_equiv with (c := (u7, (u8, t1))) (c0 := cnt2Bv c0) (d0 := data_o) as H. 
-					destruct H as [ncr_cs' H]. 
-					rewrite H; clear H.
-
-					specialize CmdGen_equiv with (c := u5) (c0 := cnt2Bv c0) as H. 
-					destruct H as [cmd_cs' H].
-					rewrite H. clear H.
-
-					specialize UpdateState_equiv with (c := u3) (c0 := c0) as H.
-					destruct H as [ups_cs' H]. 
-					rewrite H //=.
-					
-					rewrite /State_Eq /CavaFIFO_state2tuple eq_refl andTb //=.
-					assert ([:: f_req] != [:: f_req] = false); try by apply /eqP.
-					rewrite H0 eq_refl andbT.
-
-					apply Vector.eqb_eq; try exact Bool.eqb_true_iff.
-					reflexivity.
-			}
-			{ (* now in IDLE but queue is not empty *)
-
-			}
-
-	Admitted.
-
-	(* write something to get rid of the x *)
-	Theorem SM_Eq_ (t : nat)
-		(f_state : FIFO_state_t) 
-		(f_req : Request_t) 
-		(arriving_req : Requests_t)
-		(c_state : CavaFIFO_state)
-		(c_req : combType (Vec Bit REQUEST_WIDTH)) :
-		arriving_req = Arrival_at t -> f_req \in Arrival_at t.+1 ->
-		State_Eq f_state c_state arriving_req -> Request_Eq f_req c_req ->
-		let '(f_nextstate,_) := Next_state [:: f_req] f_state in
-		let '(c_nextstate,_) := step CavaFIFO_NextState c_state (true,c_req) in
-		State_Eq f_nextstate c_nextstate [:: f_req].
-	Proof.
-		intros Hart Hart1 H Hreq; unfold CavaFIFO_state in *.
-		simpl in c_state. destruct_products.
-		rename b into p, b0 into s, t0 into cnt. 
-		cbv [State_Eq] in H; destruct (f_state) eqn:Hf_state.
-		{ destruct r eqn:HP.
-			{ destruct arriving_req eqn:Har0.
-				{	simpl in H; move: H => /andP [/andP [/eqP Hs Hc] /eqP Hp].
-					specialize VectorEq.eqb_eq with (A_beq := Bool.eqb) (v1 := cnt2Bv c0) (v2 := cnt) as HH.
-					apply HH in Hc; clear HH; try exact Bool.eqb_true_iff.
-					subst s cnt p.
-
-					cbv [CavaFIFO_NextState LoopInit].
-					cbn [step].
-					cbn [fst snd].
-					simpl_ident.
-					specialize CavaFIFO_equiv_ with (f_state := f_state) (c := 
-					(u11,
-					(u12,
-					(u24, (u25, (u27, (u29, u30, u28), u26)), u23, c, u22,
-					(u20, u21), (u14, (u16, (u18, u19, u17), u15)), u13, t3),
-					t2))
-					) (c_req := c_req) as H.
-					assert (FIFO_pending f_state == [::]) as H0; try by rewrite /FIFO_pending Hf_state eq_refl.
-					apply H in H0. destruct H0 as [cs' [full_o [data_o H0]]].
-					rewrite H0; clear H H0.
-					cbv [fst snd].
-
-					specialize NextCR_equiv with (c := (u7, (u8, t1))) (c0 := cnt2Bv c0) (d0 := data_o) as H. 
-					destruct H as [ncr_cs' H]. 
-					rewrite H; clear H.
-
-					specialize CmdGen_equiv with (c := u5) (c0 := cnt2Bv c0) as H. 
-					destruct H as [cmd_cs' H].
-					rewrite H. clear H.
-
-					destruct (c0.+1 < WAIT) eqn:Hwait.
-					{ specialize UpdateState_equiv with (c := u3) (f_state := f_state) as H.
-						rewrite /FIFO_counter Hf_state in H. 
-						apply H in Hwait as HH. clear H. destruct HH as [ups_cs' H].
-						rewrite H.
-
-						rewrite /Next_state /Next_cycle.
-						set (Hc := c0.+1 < WAIT). dependent destruction Hc; try by rewrite Hwait in x.
-						apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-						rewrite /State_Eq /CavaFIFO_state2tuple eq_refl andTb.
-						simpl.
-						assert ([:: f_req] != [:: f_req] = false); try by apply /eqP.
-						rewrite H0 eq_refl andbT.
-						admit. 
-					}
-					{ specialize UpdateState_equiv_border with (c := u3) (f_state := f_state) as H.
-						rewrite /FIFO_counter Hf_state in H.
-						assert (c0.+1 == WAIT). { admit. }
-						apply H in H0. clear H. destruct H0 as [ups_cs' H].
-						rewrite H.
-
-						rewrite /Next_state /Next_cycle.
-						set (Hc := c0.+1 < WAIT). dependent destruction Hc; try by rewrite Hwait in x.
-						apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-						rewrite /State_Eq /CavaFIFO_state2tuple eq_refl andTb.
-						simpl.
-						assert ([:: f_req] != [:: f_req] = false); try by apply /eqP.
-						rewrite H0 eq_refl andbT.
-						admit.
-					}} 
-				{ (* now arriving_req is not empty *)
-					(* has to be wrong because if P = [::] then no one can have arrived *)
-					(* P = Enqueue (Arrival_at t)*)
-					simpl in H; move: H => /andP [/andP [/eqP Hs Hc] /eqP Hp].
-					specialize VectorEq.eqb_eq with (A_beq := Bool.eqb) (v1 := cnt2Bv c0) (v2 := cnt) as HH.
-					apply HH in Hc; clear HH; try exact Bool.eqb_true_iff.
-					subst s cnt p.
-
-					cbv [CavaFIFO_NextState LoopInit].
-					cbn [step].
-					cbn [fst snd].
-					simpl_ident.
-
-					specialize CavaFIFO_equiv_ with (f_state := f_state) (c := 
-					(u11,
-					(u12,
-					(u24, (u25, (u27, (u29, u30, u28), u26)), u23, c, u22,
-					(u20, u21), (u14, (u16, (u18, u19, u17), u15)), u13, t3),
-					t2))
-					) (c_req := c_req) as H.
-					assert (FIFO_pending f_state == [::]) as H0; try by rewrite /FIFO_pending Hf_state eq_refl.
-					apply H in H0. destruct H0 as [cs' [full_o [data_o H0]]].
-					rewrite H0; clear H H0.
-					cbv [fst snd].
-
-
-							contradict Hwait.
-							rewrite leq_eqVlt.
-							rewrite -ltn_predRL.
-							rewrite leq_eqVlt.
-							(* rewrite -ltn_predRL in Hwait. *)
-							assert (m < WAIT) as icp. { exact i. }
-							contradict icp.
-							apply /negP.
-							rewrite -leqNgt.
-
-							rewrite -ltnS in i.
-							rewr
-							assert (m.+1 >= WAIT). {
-								apply leq_eqVlt
-							}
-							rewrite -ltn_predRL in Hwait.
-							move: Hwait => /eqP Hwait.
-							apply ltn_trans with (n := WAIT.-1) in i as iii.
-							rewrite leq_eqVlt in Hwait.
-							apply ltnW in i as ii.
-							rewrite ii in Hwait.
-							(* rewrite addn1 in ii. *)
-							apply leq_gtF in ii.
-							(* rewrite -addn1 in Hwait. *)
-							rewrite -leq_gtF in Hwait
-						} 
-
-
-					}
-					specialize UpdateState_equiv with (c := u3) (f_state := f_state) as H.
-				
-					destruct (c0.+1 < WAIT) eqn:Hwait.
-					{ rewrite /FIFO_counter Hf_state in H. 
-						apply H in Hwait as HH. clear H. destruct HH as [ups_cs' H].
-						rewrite H.
-
-						rewrite /Next_state /Next_cycle.
-						set (Hc := c0.+1 < WAIT). dependent destruction Hc; try by rewrite Hwait in x.
-						apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-						rewrite /State_Eq /CavaFIFO_state2tuple eq_refl andTb.
-						simpl.
-						assert ([:: f_req] != [:: f_req] = false); try by apply /eqP.
-						rewrite H0 eq_refl andbT.
-						admit. 
-					}
-					{ rewrite /FIFO_counter Hf_state in H. 
-
-					}
-	Admitted.
-
-	(* Default arbitrate should be equal to the simulate function *)
-End EquivalenceProof.
\ No newline at end of file
diff --git a/framework/CavaDRAM/Core/CavaSMProperties2.v b/framework/CavaDRAM/Core/CavaSMProperties2.v
deleted file mode 100644
index 5a637c9..0000000
--- a/framework/CavaDRAM/Core/CavaSMProperties2.v
+++ /dev/null
@@ -1,843 +0,0 @@
-Require Import CavaSM.
-Require Import CavaSubtractorProperties.
-Require Import CavaTactics.
-Require Import Program.
-
-Ltac destruct_products :=
-			repeat match goal with
-			| p: _ * _  |- _ => destruct p
-			| H: _ /\ _ |- _ => let Hl := fresh H "l" in let Hr := fresh H "r" in destruct H as [Hl Hr]
-			| E: exists y, _ |- _ => let yf := fresh y in destruct E as [yf E]
-			end.
-
-Ltac simplify_step :=
-	first [ destruct_pair_let
-			| rewrite eqb_nat_to_bitvec_sized; by Lia.lia
-			| rewrite nat_to_bitvec_to_nat;  by Lia.lia
-			| progress simpl_ident
-			| progress autorewrite with to_spec
-			| progress cbn [fst snd map] ].
-
-Ltac simplify := repeat simplify_step.
-
-Ltac simpl_ret := cbv [ret monad CombinationalSemantics Identity.Monad_ident].
-
-Section CavaSMProperties2.
-
-	(* Cava silveroak *)
-	Existing Instance CombinationalSemantics.
-
-	(* CavaDRAM *)
-	Context {CAVA_SYS : CavaSystem}.
-
-	(* DRAM *)
-	Existing Instance REQESTOR_CFG.
-
-  Context {SYS_CFG      : System_configuration}.
-	Context {FIFO_CFG     : FIFO_configuration}.
-	Context {AF						: Arrival_function_t}.
-
-	Existing Instance FIFO_implementation.
-	Existing Instance FIFO_arbiter.
-
-	Definition ACT_vec :=
-		N2Bv_sized COUNTER_WIDTH (N.of_nat Cava_ACT_date).
-
-	Definition PRE_vec :=
-		N2Bv_sized COUNTER_WIDTH (N.of_nat 0).
-
-	Definition CAS_vec :=
-		N2Bv_sized COUNTER_WIDTH (N.of_nat Cava_CAS_date).
-
-	Definition Command_Eq (cmd : Command_kind_t) (cava_cmd : combType (Vec Bit DRAM_CMD_WIDTH)) : bool :=
-		match cmd with
-			| ACT => Vector.eqb bool eqb cava_cmd ACT_vec
-			| PRE => Vector.eqb bool eqb cava_cmd PRE_vec
-			| CRD => Vector.eqb bool eqb cava_cmd CAS_vec
-			| CWR => Vector.eqb bool eqb cava_cmd CAS_vec
-			| _ => false
-		end.
-
-	Definition CavaFIFO_state := circuit_state CavaFIFO_NextState : Type.
-
-	(* tuplize_state *)
-	Definition tuplize_state (state : CavaFIFO_state) := 
-		let '(_,(_,(_,(_,(_,(_,(_, (_, (_, (_, _, _), _)), _, memory_state, _, 
-      (_, _), (_, (_, (_, _, _), _)), _, wra), rda)), _,
-      (_, (_, creq)), _, _, _, _, _, cnt), s), p)) := state in 
-			(memory_state,wra,rda,creq,cnt,s,p)%type.
-	
-	Definition cnt2Bv (cnt : Counter_t) := 
-		N2Bv_sized COUNTER_WIDTH (N.of_nat (nat_of_ord cnt)) .
-
-	Definition State_Eq (fram_state : FIFO_state_t) (state : CavaFIFO_state) (ar_req : Requests_t) : bool :=
-		let '(mem_state,wra,rda,creq,cnt,s,p) := tuplize_state state in
-		match fram_state with
-			| IDLE c P => 
-					(s == false) && 
-					(Vector.eqb bool Bool.eqb (cnt2Bv c) cnt) && 
-					(p == (P != cat [::] ar_req)) && 
-					((P == [::]) == (Vector.eqb bool Bool.eqb wra rda))
-			| RUNNING c P r => 
-					(s == true) && 
-					(Vector.eqb bool Bool.eqb (cnt2Bv c) cnt) && 
-					(p == ((P != cat [::] ar_req) && (nat_of_ord c == WAIT.-1))) && 
-					((P == [::]) == (Vector.eqb bool Bool.eqb wra rda))
-		end.
-
-	(* in the Cava implementation only one request can arrive at a time *)
-	Definition Request_Eq (f_req : Request_t) (c_req : combType (Vec Bit REQUEST_WIDTH)) : bool.
-	Admitted.
-
-	Lemma eqb_eq_rewrite (wra rda : combType (Vec Bit ADDR_WIDTH)):
-		Vector.eqb bool Bool.eqb wra rda -> wra = rda.
-	Proof.
-		intros.
-		apply VectorEq.eqb_eq with (A_beq := Bool.eqb) in H.
-			2: exact Bool.eqb_true_iff.
-		exact H.
-	Qed.
-
-	Lemma FullEmptyLogic_equiv c wra rda:
-		Vector.eqb bool Bool.eqb wra rda -> exists cs',
-		step FullEmptyLogic c (rda,wra) = (cs',(false,true)).
-	Proof.
-		intros; evar (cs : circuit_state FullEmptyLogic); exists cs.
-		apply eqb_eq_rewrite in H as H0.
-		rewrite H0.
-		cbv [FullEmptyLogic FullLogic EmptyLogic Subtractor dropr EqFULL subtractor]; cbn [step].
-		simplify.
-		rewrite CavaPreludeProperties.eqb_refl.
-		rewrite fullAdder_cin leqnn N.sub_diag CavaPreludeProperties.eqb_neq.
-			2: { rewrite /FullVEC; simplify. admit. }
-		instantiate (cs := (tt, (tt, tt, tt), tt)); unfo(CavaPrelude.eqb
-		(let (x, _) :=
-			 not_b <- Vec.inv rda;;
-			 aV <- unpackV rda;; bV <- unpackV not_b;; col fullAdder one (vcombine aV bV) in
-		 x, Vec.bitvec_literal (N2Bv_sized ADDR_WIDTH (N.of_nat QUEUE_MAX_SIZE - 1)))ld cs.
-		reflexivity.
-	Admitted.
-
-	Lemma fifo_memory_equiv (c : circuit_state fifo_memory) c_req ad :
-		exists (cs' : circuit_state fifo_memory) req,
-		step fifo_memory c (c_req,ad,ad,true) =
-		(cs',req).
-	Admitted.
-
-	Lemma incrn_pointr_true_equiv (c : circuit_state incr_pointr) ad :
-		step incr_pointr c (ad,true) =
-		(tt,N2Bv_sized ADDR_WIDTH (Bv2N ad + 1)).
-	Admitted.
-
-	Lemma incrn_pointr_false_equiv (c : circuit_state incr_pointr) ad :
-		step incr_pointr c (ad,false) =
-		(tt,ad).
-	Admitted.
-
-	Lemma FullEmptyLogic_plusone_equiv (c : circuit_state FullEmptyLogic) ad:
-		exists cs' future_full_o,
-		step FullEmptyLogic c (N2Bv_sized ADDR_WIDTH (Bv2N ad + 1), ad) =
-		(cs',(future_full_o,false)).
-	Admitted.
-
-	(* has to produce a side condition that address will be different *)
-	Lemma CavaFIFO_equiv_ (c : circuit_state CavaFifoQueue_t_NF_RD) c_req :
-		let '((_,(_,(_, (_, (_, (_, _, _), _)), _, mem_state, _, 
-		(_, _), (_, (_, (_, _, _), _)), _, wra), rda))) := c in
-		Vector.eqb bool Bool.eqb wra rda -> exists cs' future_full_o data_o, 
-		step CavaFifoQueue_t_NF_RD c (true,c_req,false) =
-		(cs',(future_full_o,data_o,true)).
-	Proof.
-		simpl in c; destruct_products; intros.
-		rename t into rda, t0 into wra.
-
-		evar (cs : circuit_state CavaFifoQueue_t_NF_RD); exists cs.
-		evar (future_full_o : combType Bit); exists future_full_o.
-		evar (data_o : combType (Vec Bit REQUEST_WIDTH)); exists (data_o).
-
-		cbv [CavaFifoQueue_t_NF_RD Loop]. cbn [step]. cbv [fst snd fork2].
-		simpl_ident.
-
-		apply FullEmptyLogic_equiv with (c := (u15, (u17, u18, u16), u14)) in H as Hr. 
-		destruct Hr as [fel_cs' Hr].
-		rewrite Hr; simpl (true && ~~ false); simpl (false && ~~ true); clear Hr.
-
-		apply eqb_eq_rewrite in H as Haddr_eq.
-		specialize fifo_memory_equiv with (c := c) (c_req := c_req) (ad := rda) as [cs' [req' Hr]].
-		rewrite Haddr_eq Hr.
-		rewrite incrn_pointr_true_equiv incrn_pointr_false_equiv. clear Hr.
-
-		specialize FullEmptyLogic_plusone_equiv with (c := (u4, (u6, u7, u5), u3)) (ad := rda) as Hr.
-		destruct Hr as [fel_cs'' [future_full_o' Hr]].
-		rewrite Hr.
-	Admitted.
-
-	Lemma NextCR_equiv (c : circuit_state NextCR) c0 d0 :
-		exists cs', step NextCR c (false,c0,true,d0) = (cs',null_req).
-	Proof.
-		destruct c. simpl in c1. simpl in c.
-		evar (cs : circuit_state NextCR); exists cs.
-		cbv [NextCR LoopInit]. cbn [step]. simplify.
-		rewrite andTb negb_false orbT.
-		instantiate (cs := (tt,(tt,null_req))); by unfold cs.
-	Qed.
-
-	Lemma CmdGen_equiv (c : circuit_state CmdGen) c0 :
-		exists cs', step CmdGen c (false, c0, true) = (cs',N2Bv_sized DRAM_CMD_WIDTH 0).
-	Proof.
-		evar (cs : circuit_state UpdateState); exists cs.
-		cbv [CmdGen]. cbn [step]. simplify.
-		simpl. by instantiate (cs := tt).
-	Qed.
-
-	Lemma UpdateState_equiv (c0 : Counter_t) (c : circuit_state UpdateState):
-		exists cs',
-		step UpdateState c (false,(N2Bv_sized COUNTER_WIDTH (N.of_nat c0)),true) = 
-		(cs',(false,(cnt2Bv (Next_cycle c0)),false)).
-	Proof.
-		evar (cs : circuit_state UpdateState); exists cs.
-		cbv [UpdateState]. cbn [step]. simplify.
-		rewrite andTb andb_false_l negb_false orTb negb_true andb_false_r orb_false_r /WaitVEC.
-		simplify.
-		destruct (nat_of_ord c0 == WAIT - 1) eqn:H.
-		{ move: H => /eqP H; rewrite H.
-			set (x := N2Bv_sized COUNTER_WIDTH (N.of_nat (WAIT - 1))); fold x.
-			rewrite CavaPreludeProperties.eqb_refl /Next_cycle.
-			set (Hc := c0.+1 < WAIT). dependent destruction Hc.
-			{ rewrite H subn1 prednK in x; try (exact WAIT_pos || by rewrite ltnn in x). }
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; intro; clear e.
-			rewrite /cnt_nil; simplify. 
-			rewrite /cnt2Bv /OCycle0 //=.
-			instantiate (cs := ()); by unfold cs. }
-		{	rewrite CavaPreludeProperties.eqb_neq.
-				2: { admit. }
-			rewrite /cnt2Bv Bv2N_N2Bv_sized.
-				2: { 
-					rewrite /COUNTER_WIDTH.
-					admit.
-					(* apply N.log2_lt_pow2. *)
-				}
-			rewrite /Next_cycle.
-			set (Hc := c0.+1 < WAIT); dependent destruction Hc.
-			all: apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; intro; clear x.
-			2: { (* contradiction *)
-				destruct c0; simpl in *.
-				apply ltn_gt in e; rewrite leq_eqVlt in e; move: e => /orP [/eqP e | e].
-				{ by rewrite e subn1 -pred_Sn eq_refl in H. }
-				contradict e; apply /negP; by rewrite -leqNgt.
-			}
-			simpl; rewrite /N2Bv_sized.
-			destruct ((N.of_nat (nat_of_ord c0) + 1)%num) eqn:HH.
-			{ rewrite N.add_1_r in HH.
-				specialize N.neq_succ_0 with (n := N.of_nat c0) as Hsuc.
-				by rewrite HH in Hsuc. }
-			assert (Pos.of_succ_nat c0 = p).
-			{ admit. }
-			rewrite H0.
-			reflexivity.
-		} 
-	Admitted.
-
-	Theorem SM_Eq (t : nat) (c_state : CavaFIFO_state)
-		(f_req: Request_t) (c_req : combType (Vec Bit REQUEST_WIDTH)) :
-		let f_state := (Default_arbitrate t).(Implementation_State) in
-		let arriving_req := Arrival_at t in
-		f_req \in Arrival_at t.+1 ->
-		State_Eq f_state c_state arriving_req -> Request_Eq f_req c_req ->
-		let '(f_nextstate,_) := Next_state [:: f_req] f_state in
-		let '(c_nextstate,_) := step CavaFIFO_NextState c_state (true,c_req) in
-		State_Eq f_nextstate c_nextstate [:: f_req].
-	Proof.
-		intros f_state arriving_req Hfreq H Hreq; cbv [CavaFIFO_state] in *.
-		simpl in c_state; destruct_products.
-		rename b into p, b0 into s, t0 into cnt, t1 into current_req, t2 into rda, t3 into wra.
-		cbv [State_Eq tuplize_state] in H; destruct (f_state) eqn:Hf_state.
-		{ destruct r eqn:HP.
-			{ destruct arriving_req eqn:Har0; simpl in H.
-				2: { (* cannot happen *)
-					specialize FIFO_arrival with (t := t) (r0 := r0) (r1 := r1) as HH.
-					fold arriving_req in HH; apply HH in Har0.
-					rewrite /FIFO_pending in Har0.
-					fold f_state in Har0; by rewrite Hf_state in Har0.
-				}
-
-				simpl in H; move: H => /andP [/andP [/andP [/eqP Hs Hc] /eqP Hp] Haddr]; rewrite eq_refl in Haddr.
-				specialize VectorEq.eqb_eq with (A_beq := Bool.eqb) (v1 := cnt2Bv c0) (v2 := cnt) as HH.
-				apply HH in Hc; clear HH; try exact Bool.eqb_true_iff.
-				subst s cnt p.
-
-				cbv [CavaFIFO_NextState LoopInit]. cbn [step fst snd].
-				simpl_ret.
-				cbv [ret monad CombinationalSemantics Identity.Monad_ident].
-				cbv [fst snd].
-
-				assert (Vector.eqb bool Bool.eqb wra rda); [done | ].
-
-				apply CavaFIFO_equiv_ with (c := (u11,(u12,
-				(u24, (u25, (u27, (u29, u30, u28), u26)), u23, c, u22,
-				(u20, u21), (u14, (u16, (u18, u19, u17), u15)), u13, wra),
-				rda))) (c_req := c_req) in H as [fifo_cs' [full_o [cr_o Hr]]].
-				rewrite Hr. clear Hr.
-
-				specialize NextCR_equiv with (c := (u7, (u8, current_req))) (c0 := cnt2Bv c0) (d0 := cr_o) as [ncr_cs' Hr].
-				rewrite Hr. clear Hr.
-
-				specialize CmdGen_equiv with (c := u5) (c0 := cnt2Bv c0) as [cmd_cs' Hr].
-				rewrite Hr. clear Hr.
-
-				specialize UpdateState_equiv with (c := u3) (c0 := c0) as [ups_cs' Hr].
-				rewrite Hr.
-
-				simpl in fifo_cs'; destruct_products.
-				rewrite /Next_state. 
-				simpl (CavaClass.constant true); simpl.
-				rewrite /State_Eq /tuplize_state.
-				repeat destruct_pair_let.
-				cbv [fst snd].
-
-				unfold State_Eq, tuplize_state; simpl.
-
-
-
-
-
-		}
-
-
-	Lemma P2Bv_sized_neq_iff (n : nat) (x y : positive) :
-		(Pos.size_nat x <= n) ->
-		(Pos.size_nat y <= n) ->
-		(P2Bv_sized n x <> P2Bv_sized n y) <-> x <> y.
-	Proof.
-		revert x y; induction n; intros.
-		{ split; intros.
-			{ simpl in H1. contradict H1. reflexivity. }
-			{ pose proof (Pos_size_nat_nonzero x).
-				contradict H. apply /negP. rewrite -ltnNge.
-				apply /ltP; exact H2. }}
-		{ split; try congruence; [].
-			cbn [P2Bv_sized].
-			destruct x,y; try congruence; [ | | | ].
-			all: cbn [Pos.size_nat] in *.
-			all: admit.
-		}
-	Admitted.
-
-	Lemma N2Bv_sized_neq_if: forall (n : nat) (x y : N),
-		N2Bv_sized n x <> N2Bv_sized n y -> x <> y.
-	Proof.
-		destruct x, y; cbn [N.size_nat N2Bv_sized]; intros.
-		all: try discriminate.
-		all: try (cbv [Bvect_false] in H; done).
-		congruence.
-	Qed.
-
-	Lemma N2Bv_sized_neq_iff: forall (n : nat) (x y : N),
-		(N.size_nat x <= n)%coq_nat ->
-  	(N.size_nat y <= n)%coq_nat -> N2Bv_sized n x <> N2Bv_sized n y <-> x <> y.
-	Proof.
-		destruct x, y; cbn [N.size_nat N2Bv_sized]; intros; split; intros.
-		8: { 
-			rewrite P2Bv_sized_neq_iff; try congruence. 
-			all: apply /leP; try (exact H || exact H0).
-		}
-		all: try discriminate.
-		all: try (cbv [Bvect_false] in H1; done).
-		all: try (apply P2Bv_nonzero in H0; apply ssrfun.nesym in H0).
-		all: try exact H0.
-		all: try by apply P2Bv_nonzero in H.
-		all: try (congruence).
-	Qed.
-
-	Lemma FullEmptyLogic_equiv c wra rda:
-		Vector.eqb bool Bool.eqb wra rda -> exists cs',
-		step FullEmptyLogic c (rda,wra) = (cs',(false,true)).
-	Proof.
-		intros; evar (cs : circuit_state FullEmptyLogic); exists cs.
-		assert (wra = rda).
-		{ apply VectorEq.eqb_eq with (A_beq := Bool.eqb) in H.
-				2: exact Bool.eqb_true_iff.
-			exact H. 
-		}
-		rewrite H0.
-		cbv [FullEmptyLogic FullLogic EmptyLogic Subtractor dropr EqFULL subtractor]; cbn [step].
-		simplify.
-		rewrite CavaPreludeProperties.eqb_refl.
-		rewrite fullAdder_cin leqnn N.sub_diag CavaPreludeProperties.eqb_neq.
-			2: admit.
-		instantiate (cs := (tt, (tt, tt, tt), tt)); unfold cs.
-		reflexivity.
-	Admitted.
-
-	Lemma fifo_memory_equiv (c : circuit_state fifo_memory) c_req ad :
-		exists (cs' : circuit_state fifo_memory) req,
-		step fifo_memory c (c_req,ad,ad,true) =
-		(cs',req).
-	Proof.
-		cbv [fifo_memory] in *.
-		induction (QUEUE_MAX_SIZE - 1).
-		{ simpl in c.
-			destruct_products; rename t into reg.
-			evar (cs : circuit_state (memory_dp (Vec Bit REQUEST_WIDTH) ADDR_WIDTH 0)); exists (cs).
-			cbv [memory_dp isN_ext mem_cell DelayCE]. cbn [step].
-			simplify. rewrite andTb.
-			exists (reg).
-			instantiate (cs := (
-			tt,
-			if CavaPrelude.eqb (N2Bv_sized ADDR_WIDTH (N.of_nat 0), ad)
-			then c_req
-			else reg, tt
-			)); unfold cs.
-			reflexivity.
-		}
-		(* evar (cs : circuit_state (memory_dp (Vec Bit REQUEST_WIDTH) ADDR_WIDTH n.+1)); exists (cs). *)
-		(* evar (req : combType (Vec Bit REQUEST_WIDTH)); exists (req). *)
-		rewrite {4}/memory_dp. 
-		cbn [step]. fold memory_dp.
-		specialize IHn with (c := (snd (fst (fst c)))).
-		destruct IHn as [cs' [req_ IH]].
-		rewrite IH.
-		cbv [fork2 mem_cell isN_ext DelayCE]. cbn [step].
-		simplify. rewrite andTb.
-		cbv [mem_select].
-		simplify.
-		destruct (CavaPrelude.eqb (N2Bv_sized ADDR_WIDTH (N.of_nat n.+1), ad)) eqn:H.
-		{ exists (tt, cs', (tt, c_req), tt); exists (snd (snd (fst c))). }
-		admit.
-	Admitted.
-
-	Lemma incrn_pointr_en_correct (c : circuit_state incr_pointr) ad :
-		step incr_pointr c (ad,true) =
-		(tt,N2Bv_sized ADDR_WIDTH (Bv2N ad + 1)).
-	Admitted.
-
-	Lemma incrn_pointr_keep_correct (c : circuit_state incr_pointr) ad :
-		step incr_pointr c (ad,false) =
-		(tt,ad).
-	Admitted.
-
-	Lemma FullEmptyLogic_plusone (c : circuit_state FullEmptyLogic) ad:
-		exists cs' future_full_o,
-		step FullEmptyLogic c (N2Bv_sized ADDR_WIDTH (Bv2N ad + 1), ad) =
-		(cs',(future_full_o,false)).
-	Admitted.
-
-	Lemma CavaFIFO_equiv_ (c : circuit_state CavaFifoQueue_t_NF_RD) c_req :
-		let '((_,(_,(_, (_, (_, (_, _, _), _)), _, mem_state, _, 
-		(_, _), (_, (_, (_, _, _), _)), _, wra), rda))) := c in
-		Vector.eqb bool Bool.eqb wra rda -> exists cs' future_full_o data_o, 
-		step CavaFifoQueue_t_NF_RD c (true,c_req,false) =
-		(cs',(future_full_o,data_o,true)).
-	Proof.
-		simpl in c; destruct_products; intros.
-		rename t into rda, t0 into wra.
-		assert (wra = rda) as Haddr_eq.
-		{ apply VectorEq.eqb_eq with (A_beq := Bool.eqb) in H.
-				2: exact Bool.eqb_true_iff.
-			exact H. 
-		}
-		(* rewrite Haddr_eq. *)
-		evar (cs : circuit_state CavaFifoQueue_t_NF_RD); exists cs.
-		evar (future_full_o : combType Bit); exists future_full_o.
-		evar (data_o : combType (Vec Bit REQUEST_WIDTH)); exists (data_o).
-
-		cbv [CavaFifoQueue_t_NF_RD Loop]. cbn [step]. cbv [fst snd fork2].
-		simpl_ident.
-
-		apply FullEmptyLogic_equiv with (c := (u15, (u17, u18, u16), u14)) in H.
-		destruct H as [fel_cs' H].
-		rewrite H; simpl (true && ~~ false); simpl (false && ~~ true).
-
-		specialize fifo_memory_equiv with (c_req := c_req) (c := c) (ad := rda) as Hfifo.
-		destruct Hfifo as [c' [cr_out Hfifo]].
-		rewrite Haddr_eq.
-		rewrite Hfifo.
-
-		specialize incrn_pointr_en_correct with (c := u8) as Hincr.
-		rewrite Hincr.
-
-		specialize incrn_pointr_keep_correct with (c := u9) as Hincr_.
-		rewrite Hincr_.
-
-		specialize FullEmptyLogic_plusone with (c := (u4, (u6, u7, u5), u3)) (ad := rda) as HH.
-		destruct HH as [u_fodase [future_full_o' HH]]. simpl in u_fodase.
-		rewrite HH.
-
-	Admitted.
-
-
-		(* assert (step incr_pointr u8 (rda,true) = )
-
-		cbv [incr_pointr incrN]. cbn [step].
-		simplify.
-		cbn [step].
-		simplify.
-
-		repeat destruct_pair_let. 
-		rewrite 
-
-		apply EmptyLogic_equiv with (c := (u15, (u17, u18, u16), u14)) in H.
-		destruct H as [cs' [full_o' H]].
-		rewrite H. 
-		rewrite andTb andb_false_l.
-		simplify.
-		(* when rda = wra -> read nil, state that with a Lemma *)
-	Admitted. *)
-
-	Lemma CavaFIFO_equiv (f_state : FIFO_state_t) (c : circuit_state CavaFifoQueue_t_NF_RD) c_req :
-		FIFO_pending (f_state) == [::] -> exists cs' full_o data_o, 
-		step CavaFifoQueue_t_NF_RD c (true,c_req,false) =
-		(cs',(full_o,data_o,true)).
-	Admitted.
-
-	Lemma NextCR_equiv (c : circuit_state NextCR) c0 d0 :
-		exists cs', step NextCR c (false,c0,true,d0) = (cs',null_req).
-	Proof.
-		destruct c. simpl in c1. simpl in c.
-		evar (cs : circuit_state NextCR); exists cs.
-		cbv [NextCR LoopInit]. cbn [step]. simplify.
-		rewrite andTb negb_false orbT.
-		instantiate (cs := (tt,(tt,null_req))); by unfold cs.
-	Qed.
-
-	Lemma CmdGen_equiv (c : circuit_state CmdGen) c0 :
-		exists cs', step CmdGen c (false, c0, true) = (cs',N2Bv_sized DRAM_CMD_WIDTH 0).
-	Proof.
-		evar (cs : circuit_state UpdateState); exists cs.
-		cbv [CmdGen]. cbn [step]. simplify.
-		simpl. by instantiate (cs := tt).
-	Qed.
-
-	Lemma UpdateState_equiv (c0 : Counter_t) (c : circuit_state UpdateState):
-		exists cs',
-		step UpdateState c (false,(N2Bv_sized COUNTER_WIDTH (N.of_nat c0)),true) = 
-		(cs',(false,(cnt2Bv (Next_cycle c0)),false)).
-	Proof.
-		evar (cs : circuit_state UpdateState); exists cs.
-		cbv [UpdateState]. cbn [step]. simplify.
-		rewrite andTb andb_false_l negb_false orTb negb_true andb_false_r orb_false_r /WaitVEC.
-		simplify.
-		destruct (nat_of_ord c0 == WAIT - 1) eqn:H.
-		{ move: H => /eqP H; rewrite H.
-			set (x := N2Bv_sized COUNTER_WIDTH (N.of_nat (WAIT - 1))); fold x.
-			rewrite CavaPreludeProperties.eqb_refl /Next_cycle.
-			set (Hc := c0.+1 < WAIT). dependent destruction Hc.
-			{ rewrite H subn1 prednK in x; try (exact WAIT_pos || by rewrite ltnn in x). }
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; intro; clear e.
-			rewrite /cnt_nil; simplify. 
-			rewrite /cnt2Bv /OCycle0 //=.
-			instantiate (cs := ()); by unfold cs. }
-		{	rewrite CavaPreludeProperties.eqb_neq.
-				2: { admit. }
-			rewrite /cnt2Bv Bv2N_N2Bv_sized.
-				2: { 
-					rewrite /COUNTER_WIDTH.
-					admit.
-					(* apply N.log2_lt_pow2. *)
-				}
-			rewrite /Next_cycle.
-			set (Hc := c0.+1 < WAIT); dependent destruction Hc.
-			all: apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; intro; clear x.
-			2: { (* contradiction *)
-				destruct c0; simpl in *.
-				apply ltn_gt in e; rewrite leq_eqVlt in e; move: e => /orP [/eqP e | e].
-				{ by rewrite e subn1 -pred_Sn eq_refl in H. }
-				contradict e; apply /negP; by rewrite -leqNgt.
-			}
-			simpl; rewrite /N2Bv_sized.
-			destruct ((N.of_nat (nat_of_ord c0) + 1)%num) eqn:HH.
-			{ rewrite N.add_1_r in HH.
-				specialize N.neq_succ_0 with (n := N.of_nat c0) as Hsuc.
-				by rewrite HH in Hsuc. }
-			assert (Pos.of_succ_nat c0 = p).
-			{ admit. }
-			rewrite H0.
-			reflexivity.
-		} 
-	Admitted.
-
-	Theorem SM_Eq (t : nat) (c_state : CavaFIFO_state)
-		(f_req: Request_t) (c_req : combType (Vec Bit REQUEST_WIDTH)) :
-		let f_state := (Default_arbitrate t).(Implementation_State) in
-		let arriving_req := Arrival_at t in
-		f_req \in Arrival_at t.+1 ->
-		State_Eq_ f_state c_state arriving_req -> Request_Eq f_req c_req ->
-		let '(f_nextstate,_) := Next_state [:: f_req] f_state in
-		let '(c_nextstate,_) := step CavaFIFO_NextState c_state (true,c_req) in
-		State_Eq_ f_nextstate c_nextstate [:: f_req].
-	Proof.
-		intros f_state arriving_req Hfreq H Hreq; cbv [CavaFIFO_state] in *.
-		simpl in c_state. destruct_products.
-		rename b into p, b0 into s, t0 into cnt, t1 into current_req, t2 into rda, t3 into wra.
-		cbv [State_Eq_] in H. destruct (f_state) eqn:Hf_state.
-		{ destruct r eqn:HP.
-			{ destruct arriving_req eqn:Har0; simpl in H.
-				2: { (* cannot happen *)
-					specialize FIFO_arrival with (t := t) (r0 := r0) (r1 := r1) as HH.
-					fold arriving_req in HH; apply HH in Har0.
-					rewrite /FIFO_pending in Har0.
-					fold f_state in Har0; by rewrite Hf_state in Har0.
-				}
-				simpl in H; move: H => /andP [/andP [/andP [/eqP Hs Hc] /eqP Hp] Haddr]; rewrite eq_refl in Haddr.
-				specialize VectorEq.eqb_eq with (A_beq := Bool.eqb) (v1 := cnt2Bv c0) (v2 := cnt) as HH.
-				apply HH in Hc; clear HH; try exact Bool.eqb_true_iff.
-				subst s cnt p.
-
-				cbv [CavaFIFO_NextState LoopInit]. cbn [step fst snd].
-				cbv [ret monad CombinationalSemantics Identity.Monad_ident].
-				cbv [fst snd].
-
-				assert (Vector.eqb bool Bool.eqb wra rda) as Haddr_eq.
-				{ done. }
-
-				apply CavaFIFO_equiv_ with (c_req := c_req) (c := (u11,(u12,
-				(u24, (u25, (u27, (u29, u30, u28), u26)), u23, c, u22, (u20, u21),
-				(u14, (u16, (u18, u19, u17), u15)), u13, wra), rda))) in Haddr_eq as H.
-				destruct H as [cs' [future_full_o [future_req H]]].
-
-				rewrite H; clear H.
-
-				specialize NextCR_equiv with (c := (u7, (u8, current_req))) (c0 := cnt2Bv c0) (d0 := future_req) as H. 
-				destruct H as [ncr_cs' H].
-				rewrite H; clear H.
-
-				specialize CmdGen_equiv with (c := u5) (c0 := cnt2Bv c0) as H. 
-				destruct H as [cmd_cs' H].
-				rewrite H. clear H.
-
-				specialize UpdateState_equiv with (c := u3) (c0 := c0) as H.
-				destruct H as [ups_cs' H]. 
-				rewrite H.
-
-				unfold State_Eq_.
-				repeat destruct_pair_let.
-
-				rewrite /Next_state //=.
-				simpl in cs'. destruct_products; cbv [fst snd].
-				admit.
-			}
-		}
-		admit.
-	Admitted.
-
-	(* ----------------------------------------------------------- *)
-
-	Theorem SM_Eq_ (t : nat) (c_state : CavaFIFO_state)
-		(f_req: Request_t) (c_req : combType (Vec Bit REQUEST_WIDTH)) :
-		let f_state := (Default_arbitrate t).(Implementation_State) in
-		let arriving_req := Arrival_at t in
-		f_req \in Arrival_at t.+1 ->
-		State_Eq f_state c_state arriving_req -> Request_Eq f_req c_req ->
-		let '(f_nextstate,_) := Next_state [:: f_req] f_state in
-		let '(c_nextstate,_) := step CavaFIFO_NextState c_state (true,c_req) in
-		State_Eq f_nextstate c_nextstate [:: f_req].
-	Proof.
-		intros f_state arriving_req Hfreq H Hreq; cbv [CavaFIFO_state] in *.
-		simpl in c_state. destruct_products.
-		rename b into p, b0 into s, t0 into cnt.
-		cbv [State_Eq] in H. destruct (f_state) eqn:Hf_state.
-		{ destruct r eqn:HP.
-			{ destruct arriving_req eqn:Har0; simpl in H.
-					2: { (* cannot happen *)
-						specialize FIFO_arrival with (t := t) (r0 := r0) (r1 := r1) as HH.
-						fold arriving_req in HH; apply HH in Har0.
-						rewrite /FIFO_pending in Har0.
-						fold f_state in Har0; by rewrite Hf_state in Har0.
-					}
-					simpl in H; move: H => /andP [/andP [/eqP Hs Hc] /eqP Hp].
-					specialize VectorEq.eqb_eq with (A_beq := Bool.eqb) (v1 := cnt2Bv c0) (v2 := cnt) as HH.
-					apply HH in Hc; clear HH; try exact Bool.eqb_true_iff.
-					subst s cnt p.
-
-					cbv [CavaFIFO_NextState LoopInit].
-					cbn [step fst snd].
-					simpl_ident.
-
-					specialize CavaFIFO_equiv_ with (c := 
-					(u11,(u12,(u24, (u25, (u27, (u29, u30, u28), u26)), u23, c, u22,
-					(u20, u21), (u14, (u16, (u18, u19, u17), u15)), u13, t3),t2))) (c_req := c_req) as H.
-					(* assert (FIFO_pending f_state == [::]) as H0; try by rewrite /FIFO_pending Hf_state eq_refl. *)
-					apply H in H0. destruct H0 as [cs' [full_o [data_o H0]]].
-					rewrite H0; clear H H0.
-
-					specialize NextCR_equiv with (c := (u7, (u8, t1))) (c0 := cnt2Bv c0) (d0 := data_o) as H. 
-					destruct H as [ncr_cs' H]. 
-					rewrite H; clear H.
-
-					specialize CmdGen_equiv with (c := u5) (c0 := cnt2Bv c0) as H. 
-					destruct H as [cmd_cs' H].
-					rewrite H. clear H.
-
-					specialize UpdateState_equiv with (c := u3) (c0 := c0) as H.
-					destruct H as [ups_cs' H]. 
-					rewrite H //=.
-					
-					rewrite /State_Eq /CavaFIFO_state2tuple eq_refl andTb //=.
-					assert ([:: f_req] != [:: f_req] = false); try by apply /eqP.
-					rewrite H0 eq_refl andbT.
-
-					apply Vector.eqb_eq; try exact Bool.eqb_true_iff.
-					reflexivity.
-			}
-			{ (* now in IDLE but queue is not empty *)
-
-			}
-
-	Admitted.
-
-	(* write something to get rid of the x *)
-	Theorem SM_Eq_ (t : nat)
-		(f_state : FIFO_state_t) 
-		(f_req : Request_t) 
-		(arriving_req : Requests_t)
-		(c_state : CavaFIFO_state)
-		(c_req : combType (Vec Bit REQUEST_WIDTH)) :
-		arriving_req = Arrival_at t -> f_req \in Arrival_at t.+1 ->
-		State_Eq f_state c_state arriving_req -> Request_Eq f_req c_req ->
-		let '(f_nextstate,_) := Next_state [:: f_req] f_state in
-		let '(c_nextstate,_) := step CavaFIFO_NextState c_state (true,c_req) in
-		State_Eq f_nextstate c_nextstate [:: f_req].
-	Proof.
-		intros Hart Hart1 H Hreq; unfold CavaFIFO_state in *.
-		simpl in c_state. destruct_products.
-		rename b into p, b0 into s, t0 into cnt. 
-		cbv [State_Eq] in H; destruct (f_state) eqn:Hf_state.
-		{ destruct r eqn:HP.
-			{ destruct arriving_req eqn:Har0.
-				{	simpl in H; move: H => /andP [/andP [/eqP Hs Hc] /eqP Hp].
-					specialize VectorEq.eqb_eq with (A_beq := Bool.eqb) (v1 := cnt2Bv c0) (v2 := cnt) as HH.
-					apply HH in Hc; clear HH; try exact Bool.eqb_true_iff.
-					subst s cnt p.
-
-					cbv [CavaFIFO_NextState LoopInit].
-					cbn [step].
-					cbn [fst snd].
-					simpl_ident.
-					specialize CavaFIFO_equiv_ with (f_state := f_state) (c := 
-					(u11,
-					(u12,
-					(u24, (u25, (u27, (u29, u30, u28), u26)), u23, c, u22,
-					(u20, u21), (u14, (u16, (u18, u19, u17), u15)), u13, t3),
-					t2))
-					) (c_req := c_req) as H.
-					assert (FIFO_pending f_state == [::]) as H0; try by rewrite /FIFO_pending Hf_state eq_refl.
-					apply H in H0. destruct H0 as [cs' [full_o [data_o H0]]].
-					rewrite H0; clear H H0.
-					cbv [fst snd].
-
-					specialize NextCR_equiv with (c := (u7, (u8, t1))) (c0 := cnt2Bv c0) (d0 := data_o) as H. 
-					destruct H as [ncr_cs' H]. 
-					rewrite H; clear H.
-
-					specialize CmdGen_equiv with (c := u5) (c0 := cnt2Bv c0) as H. 
-					destruct H as [cmd_cs' H].
-					rewrite H. clear H.
-
-					destruct (c0.+1 < WAIT) eqn:Hwait.
-					{ specialize UpdateState_equiv with (c := u3) (f_state := f_state) as H.
-						rewrite /FIFO_counter Hf_state in H. 
-						apply H in Hwait as HH. clear H. destruct HH as [ups_cs' H].
-						rewrite H.
-
-						rewrite /Next_state /Next_cycle.
-						set (Hc := c0.+1 < WAIT). dependent destruction Hc; try by rewrite Hwait in x.
-						apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-						rewrite /State_Eq /CavaFIFO_state2tuple eq_refl andTb.
-						simpl.
-						assert ([:: f_req] != [:: f_req] = false); try by apply /eqP.
-						rewrite H0 eq_refl andbT.
-						admit. 
-					}
-					{ specialize UpdateState_equiv_border with (c := u3) (f_state := f_state) as H.
-						rewrite /FIFO_counter Hf_state in H.
-						assert (c0.+1 == WAIT). { admit. }
-						apply H in H0. clear H. destruct H0 as [ups_cs' H].
-						rewrite H.
-
-						rewrite /Next_state /Next_cycle.
-						set (Hc := c0.+1 < WAIT). dependent destruction Hc; try by rewrite Hwait in x.
-						apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-						rewrite /State_Eq /CavaFIFO_state2tuple eq_refl andTb.
-						simpl.
-						assert ([:: f_req] != [:: f_req] = false); try by apply /eqP.
-						rewrite H0 eq_refl andbT.
-						admit.
-					}} 
-				{ (* now arriving_req is not empty *)
-					(* has to be wrong because if P = [::] then no one can have arrived *)
-					(* P = Enqueue (Arrival_at t)*)
-					simpl in H; move: H => /andP [/andP [/eqP Hs Hc] /eqP Hp].
-					specialize VectorEq.eqb_eq with (A_beq := Bool.eqb) (v1 := cnt2Bv c0) (v2 := cnt) as HH.
-					apply HH in Hc; clear HH; try exact Bool.eqb_true_iff.
-					subst s cnt p.
-
-					cbv [CavaFIFO_NextState LoopInit].
-					cbn [step].
-					cbn [fst snd].
-					simpl_ident.
-
-					specialize CavaFIFO_equiv_ with (f_state := f_state) (c := 
-					(u11,
-					(u12,
-					(u24, (u25, (u27, (u29, u30, u28), u26)), u23, c, u22,
-					(u20, u21), (u14, (u16, (u18, u19, u17), u15)), u13, t3),
-					t2))
-					) (c_req := c_req) as H.
-					assert (FIFO_pending f_state == [::]) as H0; try by rewrite /FIFO_pending Hf_state eq_refl.
-					apply H in H0. destruct H0 as [cs' [full_o [data_o H0]]].
-					rewrite H0; clear H H0.
-					cbv [fst snd].
-
-
-							contradict Hwait.
-							rewrite leq_eqVlt.
-							rewrite -ltn_predRL.
-							rewrite leq_eqVlt.
-							(* rewrite -ltn_predRL in Hwait. *)
-							assert (m < WAIT) as icp. { exact i. }
-							contradict icp.
-							apply /negP.
-							rewrite -leqNgt.
-
-							rewrite -ltnS in i.
-							rewr
-							assert (m.+1 >= WAIT). {
-								apply leq_eqVlt
-							}
-							rewrite -ltn_predRL in Hwait.
-							move: Hwait => /eqP Hwait.
-							apply ltn_trans with (n := WAIT.-1) in i as iii.
-							rewrite leq_eqVlt in Hwait.
-							apply ltnW in i as ii.
-							rewrite ii in Hwait.
-							(* rewrite addn1 in ii. *)
-							apply leq_gtF in ii.
-							(* rewrite -addn1 in Hwait. *)
-							rewrite -leq_gtF in Hwait
-						} 
-
-
-					}
-					specialize UpdateState_equiv with (c := u3) (f_state := f_state) as H.
-				
-					destruct (c0.+1 < WAIT) eqn:Hwait.
-					{ rewrite /FIFO_counter Hf_state in H. 
-						apply H in Hwait as HH. clear H. destruct HH as [ups_cs' H].
-						rewrite H.
-
-						rewrite /Next_state /Next_cycle.
-						set (Hc := c0.+1 < WAIT). dependent destruction Hc; try by rewrite Hwait in x.
-						apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-						rewrite /State_Eq /CavaFIFO_state2tuple eq_refl andTb.
-						simpl.
-						assert ([:: f_req] != [:: f_req] = false); try by apply /eqP.
-						rewrite H0 eq_refl andbT.
-						admit. 
-					}
-					{ rewrite /FIFO_counter Hf_state in H. 
-
-					}
-	Admitted.
-
-	(* Default arbitrate should be equal to the simulate function *)
-End EquivalenceProof.
\ No newline at end of file
diff --git a/framework/CavaDRAM/Core/CavaSM_.v b/framework/CavaDRAM/Core/CavaSM_.v
deleted file mode 100644
index 77f01b7..0000000
--- a/framework/CavaDRAM/Core/CavaSM_.v
+++ /dev/null
@@ -1,115 +0,0 @@
-From CavaDRAM Require Import CavaReqQueue CavaUtil.
-From CoqDRAM Require Import System.
-From Coq Require Import BinaryString HexString NArith.
-
-Module DataNotation.
-Declare Scope data_scope.
-Delimit Scope data_scope with ds.
-Infix "++" := Vector.append.
-Notation "'#B' n '|' w" := (N2Bv_sized w (BinaryString.Raw.to_N n 0)) (at level 0) : data_scope.
-Notation "'#D' n '|' w" := (N2Bv_sized w n) (at level 0) : data_scope.
-Notation "'#H' n '|' w" := (N2Bv_sized w (HexString.Raw.to_N n 0)) (at level 0) : data_scope.
-End DataNotation.
-
-Section CavaSM.
-
-	Context {signal : SignalType -> Type} {semantics : Cava signal}.
-	Context {CAVA_SYS : CavaSystem}.
-	Context {SYS_CFG : System_configuration}.
-
-	(* Program Instance CAVA_SYS : CavaSystem := {
-		DRAM_CMD_WIDTH := 5;
-		FE_ADDR_WIDTH := 32;
-		FE_CMD_WIDTH := 1;
-		FE_ID_WIDTH := 16;
-		QUEUE_MAX_SIZE := 512;
-	}. *)
-
-	Import DataNotation.
-	Open Scope data_scope.
-
-	(* REQUEST_WIDTH is defined in CavaReqQueue *)
-
-	Class CavaSMImplementation {f : SignalType -> Type} {CAVA_SYS : CavaSystem} :=
-	{
-		STATE_WIDTH : N ;
-
-		SM : Circuit (signal Bit * request_t) 
-			(signal Bit * command_t * signal Bit)
-	}.
-
-	Definition powerOfTwo (n : nat) : bool :=
-		N.eqb (N.land (N.of_nat n) (N.of_nat (n - 1))) 0.
-
-	(* DDR4 SDRAM MT40A 1G8 075E *)
-	(* tCK = 0.75ns, CL = 19 *)
-	(* Program Instance SYS_CFG : System_configuration := {
-		BANKGROUPS := 4; 
-		BANKS := 8;
-		T_BURST := 4; (* 4*)
-		T_WL := 5; (* 5*)
-		T_RRD_s := 4; (*4*)
-		T_RRD_l := 6; (*6*)
-		T_FAW := 16; (*16*)
-		T_RC := 20; (* Most constraining, dividing by 2 for test purposes, orig 64 *)
-		T_RP := 6; (* orig: 6 *)
-		T_RCD := 6; (* orig: 6*)
-		T_RAS := 15; (*15*)
-		T_RTP := 4; (*4*)
-		T_WR := 6; (*6*)
-		T_RTW := 12; (*12*)
-		T_WTR_s := 4; (*4*)
-		T_WTR_l := 6; (*6*)
-		T_CCD_s := 4; (*4*)
-		T_CCD_l := 5; (*5*)
-		T_REFI := 2880; (*orig: 2880, 7.8 us*)
-		T_RFC := 44; (* orig: 44, 1Gb 110 ns *)
-	}. *)
-
-	Context {SMImp : CavaSMImplementation (f := signal)}.
-
-	(* Output formating *)
-	Definition SM_out := (bool * Vector.t bool DRAM_CMD_WIDTH * Vector.t bool REQUEST_WIDTH)%type.
-
-	Definition cmd2string (cmd : Vector.t bool DRAM_CMD_WIDTH) : string :=
-		let eq := Vector.eqb bool eqb cmd in if eq NOP_VEC then "NOP"
-		else if eq PRE_VEC then "PRE"
-		else if eq ACT_VEC then "ACT" 
-		else if eq RD_VEC then "RD"
-		else if eq WR_VEC then "WR"
-		else if eq PREA_VEC then "PREA"
-		else if eq REF_VEC then "REF"
-		else "INVALID".
-
-	Declare Scope string_scope.
-	Infix "+s+" := String.append (at level 0).
-	Open Scope string_scope.
-
-	Definition tuple2string (e : SM_out) : (string) :=
-		let '(full,cmd,req) := e in
-		let full_str := if full then "FULL, " else "NOT FULL, " in
-		let cmd_str := cmd2string cmd in
-		let req_N := HexString.of_N (Bv2N req) in (full_str +s+ cmd_str +s+ " ," +s+ req_N).
-	
-		Close Scope string_scope.
-
-	Fixpoint index_ {T} (e : seq T) : seq nat :=
-		match e with
-		| [::] => [0]
-		| x :: s => [length e] ++ (index_ s)
-		end.
-
-	Definition map_out (input : seq (bool * Vector.t bool DRAM_CMD_WIDTH * Vector.t bool REQUEST_WIDTH))
-		:= zip (rev (index_ input)) (map (tuple2string) input).
-
-	(* Definition state2string (s : Vector.t bool STATE_WIDTH) : string := 
-		let eq := Vector.eqb bool eqb s in if eq STATE_IDLE_VEC then "IDLE"
-		else if eq STATE_RUN_VEC then "RUNNING"
-		else if eq STATE_REF_VEC then "REFRESHING"
-		else "STATE INVALID".
-		
-		Definition map_update_out (e : seq (Vector.t bool STATE_WIDTH * bool * Vector.t bool COUNTER_WIDTH *
-			Vector.t bool COUNTER_REF_WIDTH)) 
-			:= map (fun '(s,e,cnt,cref) => (state2string s,e,Bv2N cnt,Bv2N cref)) e. *)
-
-End CavaSM.
diff --git a/framework/CavaDRAM/Core/CavaSMbackup.v b/framework/CavaDRAM/Core/CavaSMbackup.v
deleted file mode 100644
index 8275535..0000000
--- a/framework/CavaDRAM/Core/CavaSMbackup.v
+++ /dev/null
@@ -1,424 +0,0 @@
-From Cava Require Export Cava CavaProperties Util.List BitArithmeticProperties.
-
-From Coq Require Export Vectors.Fin Bool.Bool Program.Basics.
-
-From CavaDRAM Require Export CavaReqQueue.
-
-From CoqDRAM Require Export FIFO.
-
-Section CavaSM.
-
-	Context {CAVA_SYS : CavaSystem}.
-	Context {signal : SignalType -> Type} {semantics : Cava signal}.
-
-	Context {SYS_CFG : System_configuration}.
-	Context {FIFO_CFG : FIFO_configuration}.
-
-	(* Have to change such that COUNTER_WIDTH is defined by the right number of bits *)
-	Definition COUNTER_WIDTH := Nat.log2 WAIT.
-
-	Definition Cava_ACT_date := T_RP.-1.
-	Definition Cava_CAS_date := ACT_date + T_RCD.
-
-	Definition NOP := Vec.bitvec_literal (N2Bv_sized DRAM_CMD_WIDTH 0).
-	Definition null_req := Vec.bitvec_literal (N2Bv_sized REQUEST_WIDTH 0).
-
-	Definition cnt_nil_combType := Vector.const false COUNTER_WIDTH.
-	Definition cnt_nil := Vec.bitvec_literal (N2Bv_sized COUNTER_WIDTH 0).
-
-	Definition WaitVEC := Vec.bitvec_literal (N2Bv_sized COUNTER_WIDTH (N.of_nat (WAIT - 1))).
-
-	(* Definition WaitVECm1 := Vec.bitvec_literal (N2Bv_sized COUNTER_WIDTH (N.of_nat (WAIT - 2))). *)
-
-	Definition EqWAIT : Circuit (signal (Vec Bit COUNTER_WIDTH)) (signal Bit) :=
-		Comb (fun x => CavaPrelude.eqb (x,WaitVEC)). 	
-
-	Definition NextCR : Circuit 
-		( signal Bit											(* SM state *)
-		* signal (Vec Bit COUNTER_WIDTH) 	(* counter *)
-		* signal Bit 											(* empty *)
-		* signal (Vec Bit REQUEST_WIDTH)) (* top request *)
-		( signal (Vec Bit REQUEST_WIDTH)) 
-		:= let state_init : combType (Vec Bit REQUEST_WIDTH) := Vector.const zero (REQUEST_WIDTH) in
-		LoopInit state_init (
-			Comb ( fun '(s,c,e,tr,cr) =>
-				ns <- inv s ;; ne <- inv e ;;
-				c_eq <- CavaPrelude.eqb (c,WaitVEC) ;;
-				w1 <- or2 (c_eq,ns) ;;
-				mux1_sel <- and2 (ne,w1) ;;
-				mux1_out <- mux2 mux1_sel (cr,tr) ;;		
-				(* if (empty && (c == w-1 || state = idle)) then cr' = nullreq 
-					 else if (!empty && (c == w-1 || state = idle)) then cr' = tr (from the fifo)
-					 else cr' = cr *) 
-				mux2_sel <- and2 (e,w1) ;;
-				mux2_out <- mux2 mux2_sel (mux1_out,null_req) ;;
-				ret (mux2_out,mux2_out)
-			)
-		).
-
-	(* definitely not optimzed, just 5 muxes in a row *)
-	(* state * counter * pop -> command *)
-	Definition CmdGen : Circuit 
-			( signal Bit 												(* SM state *)
-			* signal (Vec Bit COUNTER_WIDTH)		(* counter *)
-			* signal Bit )											(* empty *) 
-			( signal (Vec Bit DRAM_CMD_WIDTH))	(* command *)	:=
-			let act_vec := Vec.bitvec_literal (N2Bv_sized COUNTER_WIDTH (N.of_nat Cava_ACT_date)) in
-			let cas_vec := Vec.bitvec_literal (N2Bv_sized COUNTER_WIDTH (N.of_nat Cava_CAS_date)) in
-			let NOP := Vec.bitvec_literal (N2Bv_sized DRAM_CMD_WIDTH 0) in
-			let ACT := Vec.bitvec_literal (N2Bv_sized DRAM_CMD_WIDTH 1) in
-			let CAS := Vec.bitvec_literal (N2Bv_sized DRAM_CMD_WIDTH 2) in
-			let PRE := Vec.bitvec_literal (N2Bv_sized DRAM_CMD_WIDTH 3) in
-			Comb (fun '(s,c,e) =>
-				eq_wait <- CavaPrelude.eqb (c,WaitVEC) ;;
-				eq_act <- CavaPrelude.eqb (c,act_vec) ;;
-				eq_cas <- CavaPrelude.eqb (c,cas_vec) ;;
-				ne <- inv e ;; 	ns <- inv s ;;
-				mux0_sel <- and2 (eq_wait,ne) ;; mux0_out <- mux2 mux0_sel (NOP,PRE) ;;
-				mux1_out <- mux2 eq_cas (mux0_out,CAS) ;;
-				mux2_out <- mux2 eq_act (mux1_out,ACT) ;;
-				mux3_sel <-	and2 (ns,ne) ;; mux3_out <- mux2 mux3_sel (mux2_out,PRE) ;;
-				mux4_sel <- and2 (ns,e) ;; mux4_out <- mux2 mux4_sel (mux3_out,NOP) ;; 
-				ret (mux4_out)
-			).
-
-	(* s, c == w.-1, e -> *)
-	Definition UpdateState 
-		: Circuit 
-		( signal Bit 											(* SM state *)
-		* signal (Vec Bit COUNTER_WIDTH)  (* Counter *)
-		* signal Bit)                     (* Empty *)
-		( signal Bit 											(* SM state *)
-		* signal (Vec Bit COUNTER_WIDTH)  (* Counter *)
-		* signal Bit) :=                  (* Empty *)
-		Comb (fun '(s,cnt,e) =>
-			c <- CavaPrelude.eqb (cnt,WaitVEC) ;;
-			(* cm1 <- CavaPrelude.eqb (cnt,WaitVECm1) ;; *)
-			ns <- inv s ;; 
-			ne <- inv e ;;
-			t <- or2 (ns,c) ;; 
-			t0 <- and2 (ns,ne) ;;
-			(* t1 <- or2 (ns,cm1) ;; *)
-			(* new s *)
-			new_s_sel <- and2(e,t);;
-			new_s <- mux2 new_s_sel (one,zero) ;;
-			(* new counter *)
-			cntp1 <- incrN cnt ;;
-			new_cnt_sel <- or2 (c,t0) ;;
-			new_cnt <- mux2 new_cnt_sel (cntp1,cnt_nil) ;;
-			(* new pop *)
-			new_p_sel <- and2(ne,t) ;;
-			new_p <- mux2 new_p_sel (zero,one) ;;
-			(* end *)
-			ret (new_s,new_cnt,new_p)
-		).
-	
-	(* read data * read pending -> full * command * current request *)
-	Definition CavaFIFO_NextState 
-		: Circuit
-			( signal Bit 											(* request pending *)
-			* signal (Vec Bit REQUEST_WIDTH) 	(* request data *) 
-			)
-			( signal Bit 											(* queue is full *)
-			* signal (Vec Bit DRAM_CMD_WIDTH) (* command *)
-			* signal (Vec Bit REQUEST_WIDTH) 	(* current request *)
-			) :=
-		let pop_init : combType (Bit) := false in
-		let s_init : combType (Bit) := false in
-		let cnt_init : combType (Vec Bit COUNTER_WIDTH) := cnt_nil_combType in
-		LoopInit pop_init ( (* Rp, Rd, p *)
-			LoopInit s_init ( (* (Rp, Rd, p), s *)
-				LoopInit cnt_init ( (* (Rp, Rd, p), s, cnt *)
-					Comb (fun '(Rp,Rd,p,s,cnt) => ret (s,cnt,(Rp,Rd,p)))
-					>==> Second (RequestQueue)
-						>==> Comb (fun '(s,cnt,(full_o,tr,empty_o)) => ret (full_o,s,cnt,empty_o,(s,cnt,empty_o,tr)))
-					>==> Second (NextCR)
-						>==> Comb (fun '(full_o,s,cnt,empty_o,(cr)) => ret (full_o,cr,s,cnt,empty_o,(s,cnt,empty_o)))
-					>==> Second (CmdGen)
-						>==> Comb (fun '(full_o,cr,s,cnt,empty_o,cmd) => ret(full_o,cmd,cr,(s,cnt,empty_o)))
-					>==> Second (UpdateState)
-						>==> Comb (fun '(full_o,cmd,cr,(ns,nc,ne)) => ret (full_o,cmd,cr,ne,ns,nc))
-				)
-			)
-		).
-
-End CavaSM.
-
-Section CodeGeneration.
-
-	Existing Instance CavaCombinationalNet.
-
-	Program Instance CAVA_SYS : CavaSystem := {
-
-		(* Defines Request Size *)
-		FE_CMD_WIDTH := 1;
-		FE_ADDR_WIDTH := 28;
-		FE_ID_WIDTH := 2;
-
-		ROW_ADDR_WIDTH := 16;
-		BANK_ADDR_WIDTH := 2;
-		DRAM_BUS_WIDTH := 2;
-		DRAM_BANKS := 8;
-		DRAM_CMD_WIDTH := 2;
-		BL := 4;
-		CLK_RATIO := 2;
-
-		(* Defines Memory Size *)
-		QUEUE_MAX_SIZE := 4;
-
-		(* not used*)
-		MEM_ADDR_WIDTH := 4;
-	}.
-
-	(* Values from DDR3-1600K *)
-	Program Instance SYS_CFG : System_configuration :=
-  {
-    BANKGROUPS := 1;
-    BANKS := 8;
-
-    T_BURST := 2;
-    T_WL    := 2;
-
-    T_RRD_s := 2;
-    T_RRD_l := 3;
-
-    T_FAW := 2;
-
-    T_RC  := 2;
-    T_RP  := 2;
-    T_RCD := 2;
-    T_RAS := 2;
-    T_RTP := 2;
-    T_WR  := 2;
-
-    T_RTW := 2;
-    T_WTR_s := 2;
-    T_WTR_l := 3;
-    T_CCD_s := 2;
-    T_CCD_l := 3;
-
-		T_REFI := 50;
-		T_RFC := 10
-  }.
-
-	Program Instance FIFO_CFG : FIFO_configuration :=
-  {
-    WAIT := 25
-	}.
-
-	Definition test_req := N2Bv_sized REQUEST_WIDTH 3.
-
-	Locate defaultSignal.
-	
-	Check slice_default (stest_req.
-
-	(* problem is that WAIT = 10 is represented with 3 bits only *)
-	(* COUNTER_WIDTH should be using a ceiling function *)
-	Compute Nat.log2 WAIT. (* COUNTER_WIDTH = 3 *)
-	Compute simulate EqWAIT [(N2Bv_sized COUNTER_WIDTH 15)].
-
-	(* Definition sm_interface
-		:= sequentialInterface "sm_interface"
-		"clk" PositiveEdge "rst" PositiveEdge
-		[mkPort "Rp" Bit; mkPort "Rd" (Vec Bit REQUEST_WIDTH)]
-		[mkPort "full_o" Bit; mkPort "cmd_o" (Vec Bit DRAM_CMD_WIDTH); mkPort "CR" (Vec Bit REQUEST_WIDTH)]. *)
-
-	(* Definition sm_netlist :=
-		(makeCircuitNetlist sm_interface CavaFIFO_NextState). *)
-
-	(* Definition SM_out := (bool * Vector.t bool DRAM_CMD_WIDTH * Vector.t bool REQUEST_WIDTH)%type.
-
-	Definition cmd2string (cmd : Vector.t bool DRAM_CMD_WIDTH) : string :=
-		if (Vector.eqb bool eqb cmd [true;false]) then "ACT"
-		else if (Vector.eqb bool eqb cmd [true;true]) then "PRE" 
-		else if (Vector.eqb bool eqb cmd [false;true]) then "CAS"
-		else "NOP".
-	
-	Definition tuple2string (e : SM_out) : (string * N) :=
-		let '(full,cmd,req) := e in
-		let full_str := if full then "FULL, " else "NOT FULL, " in
-		let cmd_str := cmd2string cmd in
-		let req_N := Bv2N req in ((append full_str cmd_str), req_N).
-
-	Definition map_out (input : seq (bool * Vector.t bool DRAM_CMD_WIDTH * Vector.t bool REQUEST_WIDTH))
-		:= map (tuple2string) input. *)
-
-	(* Compute (map_FIFO_out (simulate RequestQueue [
-		(true, N2Bv_sized REQUEST_WIDTH 1, false);
-		(true, N2Bv_sized REQUEST_WIDTH 2, false);
-		(true, N2Bv_sized REQUEST_WIDTH 3, true);
-		(true, N2Bv_sized REQUEST_WIDTH 4, false)
-	])).
-
-	Compute (simulate NextCR [
-		(false,cnt_nil_combType, true, null_req);
-		(false,N2Bv_sized COUNTER_WIDTH 1,false,N2Bv_sized REQUEST_WIDTH 1);
-		(true,cnt_nil_combType,false,N2Bv_sized REQUEST_WIDTH 1);
-		(true,N2Bv_sized COUNTER_WIDTH 1,false,N2Bv_sized REQUEST_WIDTH 2)
-	]).
-
-	Compute (map cmd2string (simulate CmdGen [
-		(false,cnt_nil_combType,true);
-		(false,N2Bv_sized COUNTER_WIDTH 1,false);
-		(true,cnt_nil_combType,false)
-	])).
-
-	Compute (simulate UpdateState [
-		(false,cnt_nil_combType,true);
-		(false,N2Bv_sized COUNTER_WIDTH 1, false);
-		(true,cnt_nil_combType,false)
-	]). *)
-
-	Definition sm_inputs := [
-		(true, N2Bv_sized REQUEST_WIDTH 1);
-		(true, N2Bv_sized REQUEST_WIDTH 2);
-		(true, N2Bv_sized REQUEST_WIDTH 3);
-		(true, N2Bv_sized REQUEST_WIDTH 4)] 
-		++ (repeat (false, N2Bv_sized REQUEST_WIDTH 1) 30)
-		++ [(true, N2Bv_sized REQUEST_WIDTH 5)]
-		++ (repeat (false, null_req) 30).
-
-	(* Definition sm_expected_outputs :=
-		simulate CavaFIFO_NextState sm_inputs.
-
-	Definition sm_tb := testBench "sm_tb" (sm_interface) sm_inputs sm_expected_outputs. *)
-
-	(* will actually fit just 3 requests in the queue
-	Compute (map_out (simulate CavaFIFO_NextState ([
-		(true, N2Bv_sized REQUEST_WIDTH 1);
-		(* R1 : 1 -> queue: [r1], cnt = 1, wa = 1, rda = 0 *)
-		(true, N2Bv_sized REQUEST_WIDTH 2);
-		(* R2 : 2 -> queue: [r2], cnt = 0, wa = 2, rda = 1, R1 PRE*)
-		(true, N2Bv_sized REQUEST_WIDTH 3);
-		(* R3 : 3 -> queue: [r3,r2], cnt = 1, wa = 3, rda = 1 *)
-		(true, N2Bv_sized REQUEST_WIDTH 4);
-		(* R4 : 4 -> queue: [r4,r3,r2], cnt = 2, wa = 0, rda = 1 (FULL), *)
-		(false,N2Bv_sized REQUEST_WIDTH 0);
-		(* cnt = 3 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0); 
-		(* cnt = 4 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0);
-		(* cnt = 5 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0);
-		(* cnt = 6 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0);
-		(* cnt = 7 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0);
-		(* cnt = 8 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0); 
-		(* cnt = 9 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0); 
-		(* cnt = 10 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0); 
-		(* cnt = 11 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0); 
-		(* cnt = 12 *)
-		(true,N2Bv_sized REQUEST_WIDTH 5);
-		(* cnt = 13, R5 arrival fails, queue is full *)
-		(false,N2Bv_sized REQUEST_WIDTH 0);
-		(* cnt = 14 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0);
-		(* cnt = 15 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0);
-		(* cnt = 0, RUNNING, R2 PRE *)
-		(false,N2Bv_sized REQUEST_WIDTH 0)
-		(* (false,N2Bv_sized REQUEST_WIDTH 0); *)
-		(* (false,N2Bv_sized REQUEST_WIDTH 0); *)
-		(* (false,N2Bv_sized REQUEST_WIDTH 0) *)
-	] ++ (repeat (false,N2Bv_sized REQUEST_WIDTH 0) 20))
-	)). *)
-	
-End CodeGeneration.
-
-(* Section Test.
-
-	Existing Instance CombinationalSemantics.
-
-	(* Instance already defined in CavaFIFO.v *)
-	Existing Instance CAVA_SYS.
-
-	Program Instance SYS_CFG : System_configuration :=
-  {
-    BANKGROUPS := 1;
-    BANKS := 4;
-
-    T_BURST := 1;
-    T_WL    := 1;
-
-    T_RRD_s := 1;
-    T_RRD_l := 3;
-
-    T_FAW := 20;
-
-    T_RC  := 3;
-    T_RP  := 4;
-    T_RCD := 2;
-    T_RAS := 4;
-    T_RTP := 4;
-    T_WR  := 1;
-
-    T_RTW := 10;
-    T_WTR_s := 1;
-    T_WTR_l := 10;
-    T_CCD_s := 1;
-    T_CCD_l := 12;
-  }.
-
-  Program Instance FIFO_CFG : FIFO_configuration :=
-  {
-    WAIT := 13
-  }.
-
-	Definition SM_out := (bool * Vector.t bool DRAM_CMD_WIDTH * Vector.t bool REQUEST_WIDTH)%type.
-
-	Definition cmd2string (cmd : Vector.t bool DRAM_CMD_WIDTH) : string :=
-		if (Vector.eqb bool eqb cmd [true;false]) then "ACT"
-		else if (Vector.eqb bool eqb cmd [true;true]) then "PRE" 
-		else if (Vector.eqb bool eqb cmd [false;true]) then "CAS"
-		else "NOP".
-	
-	Definition tuple2string (e : SM_out) : (string * N) :=
-		let '(full,cmd,req) := e in
-		let full_str := if full then "FULL, " else "NOT FULL, " in
-		let cmd_str := cmd2string cmd in
-		let req_N := Bv2N req in ((append full_str cmd_str), req_N).
-
-	Definition map_out (input : seq (bool * Vector.t bool DRAM_CMD_WIDTH * Vector.t bool REQUEST_WIDTH))
-		:= map (tuple2string) input.
-
-	(* the full signal relates to the current state of the fifo *)
-	(* if there is only one space in the fifo *)
-
-	(* current state of the fifo is calculated through write and read addresses *)
-	(* operation is performed on clock edge and fifo should output signals regarding the new state *)
-	(* full should really be the result of the fifo after writing *)
-
-	(* Check repeat (false,N2Bv_sized REQUEST_WIDTH 0) 5. *)
-
-	Compute (map_out (simulate CavaFIFO_NextState [
-		(true, N2Bv_sized REQUEST_WIDTH 1);
-		(* R1 : 1 -> queue: [r1], cnt = 1, wa = 1, rda = 0 *)
-
-		(true, N2Bv_sized REQUEST_WIDTH 2);
-		(* R2 : 2 -> queue: [r2], cnt = 0, wa = 2, rda = 1, R1 PRE*)
-
-		(true, N2Bv_sized REQUEST_WIDTH 3);
-		(* R3 : 3 -> queue: [r3,r2], cnt = 1, wa = 3, rda = 1 *)
-
-		(true, N2Bv_sized REQUEST_WIDTH 4);
-		(* R4 : 4 -> queue: [r4,r3,r2], cnt = 2, wa = 0, rda = 1 (FULL), R1 ACT *)
-
-		(false,N2Bv_sized REQUEST_WIDTH 0); (* cnt = 3 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0); (* cnt = 4 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0); (* cnt = 5 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0); (* cnt = 6 *)
-		(false,N2Bv_sized REQUEST_WIDTH 0); (* cnt = 7 *)
-
-		(* this write will not work because the FIFO is still full, R2 PRE *)
-		(true,N2Bv_sized REQUEST_WIDTH 5);
-
-		(* now it works, cnt = 1, wa = 1, rda = 2 (FULL), NOP *)
-		(true,N2Bv_sized REQUEST_WIDTH 5)
-	])).
-
-End Test. *)
\ No newline at end of file
diff --git a/framework/CavaDRAM/Core/CavaSubtractor.v b/framework/CavaDRAM/Core/CavaSubtractor.v
deleted file mode 100644
index ff7b196..0000000
--- a/framework/CavaDRAM/Core/CavaSubtractor.v
+++ /dev/null
@@ -1,117 +0,0 @@
-Require Import Cava.Cava.
-Require Import Cava.CavaProperties.
-Require Import Cava.Util.Vector.
-
-From mathcomp Require Import ssreflect ssrnat ssrbool seq eqtype ssrZ zify ring.
-From Coq Require Import NArith.
-
-From CavaDRAM Require Import CavaSystem UtilSM.
-From CoqDRAM Require Import Util.
-
-Import Circuit.Notations.
-
-Section CavaSubtractor.
-
-	Context {signal : SignalType -> Type} {semantics : Cava signal}.
-
-	Definition subtractor {n : nat}
-	(inputs : signal (Vec Bit n) * signal (Vec Bit n))
-	: cava (signal (Vec Bit n) * signal Bit)
-	:= let '(a,b) := inputs in
-			not_b <- Vec.inv b ;;
-			aV <- unpackV a ;;
-			bV <- unpackV not_b ;;
-			col fullAdder one (vcombine aV bV).
-
-	Definition Subtractor {n : nat}
-		: Circuit _ (signal (Vec Bit n) * signal Bit)
-		:= Comb subtractor.
-
-End CavaSubtractor.
-
-Section CavaSubtractorProperties.
-
-	Lemma case1 (x y : N) (z : nat) :
-		N.to_nat x < z -> 
-		N.to_nat y < z ->
-		(y < x) = false ->
-		let t := N.of_nat z in
-		(2 * (t - (y - x) - 1) + 1)%N =
-		(2 * t - (2 * y + 1 - (2 * x + 1)) - 1)%N.
-	Proof.
-		lia.
-	Qed.
-
-	Lemma case2 (x y : N) (z : nat) :
-		N.to_nat x < z -> 
-		N.to_nat y < z ->
-		(y <= x) = false ->
-		let t := N.of_nat z in
-		(2 * (t - (y - x)) + 1)%N =
-		(2 * t - (2 * y - (2 * x + 1)))%N.
-	Proof.
-		lia.
-	Qed.
-
-	Lemma case3 (x y : N) (z : nat) :
-		N.to_nat x < z -> 
-		N.to_nat y < z ->
-		(y < x) = false ->
-		let t := N.of_nat z in
-		(2 * (t - (y - x) - 1) + 1)%N =
-		(2 * t - (2 * y + 1 - 2 * x))%N.
-	Proof.
-		lia.
-	Qed.
-
-	Lemma case4 (x y : N) (z : nat) :
-		N.to_nat x < z -> 
-		N.to_nat y < z ->
-		(y < x) = false ->
-		let t := N.of_nat z in
-		(2 * (t - (y - x) - 1) + 1)%N =
-		(2 * t - (2 * y - 2 * x) - 1)%N.
-	Proof.
-		lia.
-	Qed.
-
-	Lemma fullAdder_cin {n} (x y : Vector.t bool n) cin:
-		let xN := Bv2N x in
-		let yN := Bv2N y in
-		let out := if cin
-			then (if (yN <= xN)%nat then (xN - yN)%N else ((N.of_nat (Nat.pow 2 n)) - (yN - xN))%N)
-			else (if (yN < xN)%nat then (xN - yN - 1)%N else ((N.of_nat (Nat.pow 2 n)) - (yN - xN) - 1)%N) in
-		fst (col fullAdder cin (vcombine x (Vector.map negb y))) = N2Bv_sized n out. 
-	Proof.
-		intros out; unfold out; clear out.
-		revert x y cin.
-		induction n; intros;
-		[ apply Vector.case0 with (v:=x); apply Vector.case0 with (v:=y);
-      destruct cin; reflexivity | ].
-		rewrite col_step fullAdder_correct; cbn [fst snd].
-		rewrite (Vector.eta x) (Vector.eta y); simpl; rewrite IHn; clear IHn;
-		destruct (Vector.hd x) eqn:Hx, (Vector.hd y) eqn:Hy, cin eqn:Hcin; simpl;
-		repeat match goal with
-			| |- context [?y <= ?x] => 
-				let H := fresh "x" in destruct (y <= x) eqn:H
-			| |- context [?y < ?x] =>
-				let H := fresh "x" in destruct (y < x) eqn:H
-		end;
-		set xx := Bv2N (Vector.tl x); set yy := Bv2N (Vector.tl y); fold xx yy in x0, x1.
-		all: try (rewrite -N2Bv_sized_double || rewrite -N2Bv_sized_succ_double); apply f_equal.
-		all: try (rewrite Nat.add_0_r; 
-		match goal with 
-		| |- context [Nat.pow 2 ?n] => set z := Nat.pow 2 n
-		end; rewrite of_nat_add_double).
-		all: try (rewrite !N.double_spec); try (rewrite !N.succ_double_spec); try lia.
-		all: try (rewrite !N.succ_double_spec in x1); try (rewrite !N.double_spec in x1).
-		all: try (contradict x1; lia);
-		specialize (@Bv2N_upper_bound_nat n (Vector.tl x)) as Hxb; fold xx in Hxb;
-		specialize (@Bv2N_upper_bound_nat n (Vector.tl y)) as Hyb; fold yy in Hyb.
-		all: try apply case1; try done.
-		all: try apply case2; try done.
-		all: try apply case3; try done.
-		all: try apply case4; try done.
-	Qed.
-
-End CavaSubtractorProperties.
diff --git a/framework/CavaDRAM/Core/CavaSubtractorProperties.v b/framework/CavaDRAM/Core/CavaSubtractorProperties.v
deleted file mode 100644
index 471d25e..0000000
--- a/framework/CavaDRAM/Core/CavaSubtractorProperties.v
+++ /dev/null
@@ -1,72 +0,0 @@
-Require Import CavaSubtractor.
-Require Import Coq.micromega.Lia.
-
-From CoqDRAM Require Import Util.
-
-Section CavaSubtractorProperties.
-
-	Existing Instance CombinationalSemantics.
-
-	Compute map (fun '(a,b) => (Bv2N a, b)) (simulate Subtractor [
-		((N2Bv_sized 3 6),(N2Bv_sized 3 6))
-	]).
-
-	(* poid faible *)
-	Definition test_vec1 := (N2Bv_sized 4 1).
-	Compute test_vec1.
-	Compute VectorDef.hd test_vec1.
-
-	Local Ltac simplify_step :=
-    first [ destruct_pair_let
-          | rewrite eqb_nat_to_bitvec_sized; by Lia.lia
-          | rewrite nat_to_bitvec_to_nat;  by Lia.lia
-          | progress simpl_ident
-          | progress autorewrite with to_spec
-				| progress cbn [fst snd map] ].
-  Local Ltac simplify := repeat simplify_step.
-
-	Lemma fullAdder_cin {n} (x y : Vector.t bool n) cin:
-		let c := N.to_nat (Bv2N y) <= N.to_nat (Bv2N x) in 
-		let out := if cin
-			then (if c then (N.sub (Bv2N x) (Bv2N y)) else Bv2N (Vec.xor (x,y)))
-			else (if c then Bv2N (Vector.map negb (Vec.xor (x,y))) else N.add (Bv2N x) (Bv2N (Vector.map negb y))) in
-		fst (col fullAdder cin (vcombine x (Vector.map negb y))) = N2Bv_sized n out.
-	Proof.
-		intros c out; unfold out. clear out. unfold c. clear c.
-		revert x y cin.
-		induction n; intros;
-			[ apply Vector.case0 with (v:=x); apply Vector.case0 with (v:=y);
-      	destruct cin; reflexivity | ].
-		rewrite col_step fullAdder_correct. cbn [fst snd].
-		rewrite (Vector.eta x) (Vector.eta y); simpl. rewrite IHn. clear IHn.
-		destruct (VectorDef.hd x) eqn:Hx, (VectorDef.hd y) eqn:Hy, cin eqn:Hcin; simpl;
-		repeat match goal with
-			| |- context [N.to_nat ?y <= N.to_nat ?x] => 
-				let H := fresh "x" in destruct (N.to_nat y <= N.to_nat x) eqn:H
-		end;
-		set (xx := Bv2N (VectorDef.tl x)); (set yy := Bv2N (VectorDef.tl y)); fold xx yy in x0, x1.
-		all: try (rewrite N2Bv_sized_double !N2Bv_sized_Bv2N; reflexivity).
-		all: try (rewrite -N2Bv_sized_double).
-		all: try (rewrite !N.succ_double_spec N.double_spec).
-		all: try (repeat apply f_equal).
-		1: { (* the actual deal *)
-			rewrite leq_eqVlt in x0. apply orb_prop in x0 as [x0 | x0].
-			{ move: x0 => /eqP x0; apply N2Nat.inj_iff in x0; rewrite x0.
-				by rewrite N.mul_sub_distr_l !N.sub_diag.
-			}
-			rewrite N.mul_sub_distr_l N.add_sub_swap.
-				2: { 
-					rewrite N.add_1_r. apply N.le_succ_l. apply N.mul_lt_mono_pos_l. 
-						1: exact N.lt_0_2.
-					specialize N2Nat.inj_ltb with (x := yy) (y := xx) as HH.
-					apply N.ltb_lt.
-					rewrite HH.
-					apply /Nat.ltb_spec0.
-					admit.
-				}
-			admit.
-		}
-		all: admit.
-	Admitted.
-
-End CavaSubtractorProperties.
\ No newline at end of file
diff --git a/framework/CavaDRAM/Core/CavaSystem.v b/framework/CavaDRAM/Core/CavaSystem.v
index f487878..be7cc9a 100644
--- a/framework/CavaDRAM/Core/CavaSystem.v
+++ b/framework/CavaDRAM/Core/CavaSystem.v
@@ -1,5 +1,6 @@
 Set Warnings "-notation-overridden,-parsing". 
-Require Import Coq.NArith.NArith.
+
+From Coq Require Import NArith.
 
 From mathcomp Require Import ssreflect ssrnat ssrbool seq eqtype.
 
diff --git a/framework/CavaDRAM/Core/Memory.v b/framework/CavaDRAM/Core/Memory.v
deleted file mode 100644
index 1582b4c..0000000
--- a/framework/CavaDRAM/Core/Memory.v
+++ /dev/null
@@ -1,296 +0,0 @@
-From Coq Require Import String NArith PeanoNat Bvector.
-From mathcomp Require Import ssreflect.
-
-Require BinaryString Vectors.VectorDef Coq.Arith.Compare.
-Global Open Scope string_scope.
-
-Require Import ExtLib.Structures.Monad.
-
-From Cava Require Import Core Semantics.Simulation Semantics.Combinational Util.Tactics.
-From Cava.Lib Require Vec.
-From Cava.Lib Require Import CavaPrelude Combinators Multiplexers Decoder DecoderProperties CombinatorsProperties.
-
-Import MonadNotation Circuit.Notations Init.Logic.EqNotations.
-Global Open Scope monad_scope.
-
-Require Import CavaDRAM.Util CavaDRAM.Step.
-
-Section WithCava.
-  Context `{semantics : Cava}.
-
-  (* write data * write enable -> read data*)
-  Definition mem_cell T I :=
-    DelayInitCE (t := T) I.
-
-  (* read data vector * write data * write enable * read data -> read data vector *)
-  Definition mem_combine {M N} T (H : S M = N) :=
-    Comb (
-      fun (input : signal (Vec T M) * (signal T * signal Bit * signal T)) =>
-        let '(rdV, (wd, we, rd)) := input in
-          v <- mux2 we (rd, wd);;
-          x <- Vec.shiftin v rdV;;
-          r <- Util.vec_cast T H x;;
-          ret r
-    ).
-
-  (* write data * write enable vector -> write data * write enable *)
-  Definition mem_we T W N :=
-    Comb (
-      fun input : signal T * signal (Vec Bit (2^W))  =>
-        let '(wd, weV) := input in
-          we <- indexConst weV (N-1);;
-          ret (wd, we)
-    ).
-
-  (* write data * write enable vector -> read data vector *)
-  Fixpoint mem_cells T W N I: (Circuit (signal T * signal (Vec Bit (2^W))) (signal (Vec T N))) :=
-    match N as X return X = N -> _ with
-     | 0 => 
-        fun H => 
-          Comb (fun x => 
-            r <- Vec.nil;; 
-            x <- (Util.vec_cast T H r);;
-            ret x
-          )
-     | S N' => 
-        fun H =>
-          Comb(fork2)
-            >==> First (mem_cells T W N' I)
-            >==> Second (mem_we T W N >==> Comb(fork2) >==> Second (mem_cell T (I N')))
-            >==> mem_combine T H
-    end Logic.eq_refl.
-
-  (* write data * write address * write enable -> write data * write enable vector *)
-  Definition mem_write T W :=
-    Comb (
-      fun input : signal T * signal (Vec Bit W) * signal Bit =>
-      let '(wd, wa, we) := input in
-        weV <- Util.decode we wa;;
-        ret (wd, weV)
-    ).
-
-  (* read address * read data vecor -> read data *)
-  Definition mem_read T W N P (PP : nat) :=
-    Comb (
-      fun input : signal (Vec (Vec Bit W) P) * signal (Vec T N) => 
-        '(rdAV, rdV) <- input;;
-        rdA <- indexConst rdAV PP;;
-        indexAt rdV rdA
-    ).
-
-  Definition mem_read_combine {M N} T (H : S M = N) :=
-    Comb (
-      fun (input : signal (Vec T M) * (signal T)) =>
-        let '(rdV, rd) := input in
-          x <- Vec.shiftin rd rdV;;
-          r <- Util.vec_cast T H x;;
-          ret r
-    ).
-
-  Fixpoint mem_reads T W N P PP : (Circuit (signal (Vec (Vec Bit W) P) * signal (Vec T N)) (signal (Vec T PP))) :=
-    match PP as X return X = PP -> _ with
-     | 0 => 
-        fun H => 
-          Comb (fun x => 
-            r <- Vec.nil;; 
-            x <- (Util.vec_cast T H r);;
-            ret x
-          )
-     | S PP' => 
-        fun H =>
-          Comb(fork2)
-            >==> First (mem_reads T W N P PP')
-            >==> Second (mem_read T W N P PP')
-            >==> mem_read_combine T H
-    end Logic.eq_refl.
-
-  (* read addresses * write data * write address * write enable -> read data 
-     T: type of memory cell contents (Vec 32)
-     W: address width in bits
-     P: number of read ports
-     I: initial content of memory
-   *)
-  (* Second (mem_write T W >==> mem_cells T W (2^W) I). >==> mem_read T W (2^W) P 1). *)
-
-  Definition Memory T W P I :=
-    Second (mem_write T W >==> mem_cells T W (2^W) I) >==> mem_reads T W (2^W) P P.
-
-	Definition Memory' T W P I :=
-		Second (mem_write T W >==> mem_cells T W (2^W) I) >==> mem_read T W (2^W) P 0.
-
-End WithCava.
-
-Module Test.
-  Import ListNotations Vector.VectorNotations.
-  Import Cava.Semantics.Simulation.
-
-  Definition Test_input1 := [
-      ([N2Bv_sized 3 0; N2Bv_sized 3 2]%vector, (N2Bv_sized 2 0, N2Bv_sized 3 0, false));
-      ([N2Bv_sized 3 1; N2Bv_sized 3 3]%vector, (N2Bv_sized 2 0, N2Bv_sized 3 0, false));
-      ([N2Bv_sized 3 2; N2Bv_sized 3 0]%vector, (N2Bv_sized 2 0, N2Bv_sized 3 0, false));
-      ([N2Bv_sized 3 3; N2Bv_sized 3 1]%vector, (N2Bv_sized 2 0, N2Bv_sized 3 0, false))
-    ]%list.
-
-  Definition Test_result1 := 
-    [
-      [0%N; 2%N]%vector; 
-      [1%N; 3%N]%vector; 
-      [2%N; 0%N]%vector;
-      [3%N; 1%N]%vector
-    ]%list.
-
-	(* Initializes the memory content with the address *)
-  Definition Init1 (n : nat):= 
-    N2Bv_sized 2 (N.of_nat n).
-
-  Definition Test_run1 := 
-    map (Vector.map Bv2N) (simulate (Memory (Vec Bit 2) 3 2 Init1) Test_input1).
-  
-  Lemma Test: Test_run1 = Test_result1.
-  Proof.
-    reflexivity.
-  Qed.
-
-  Definition Test_input2 := 
-    [
-			(* writes 0 at @0, reads @0 := 0 and @3 := 0 *)
-      ([N2Bv_sized 3 0; N2Bv_sized 3 3]%vector, (N2Bv_sized 2 0, N2Bv_sized 3 0, true));
-			(* writes 1 at @1, reads @1 := 1 and @2 := 1 *)
-      ([N2Bv_sized 3 1; N2Bv_sized 3 2]%vector, (N2Bv_sized 2 1, N2Bv_sized 3 1, true));
-			(* writes 2 at @2, reads @2 := 2 and @1 := 1*)
-      ([N2Bv_sized 3 2; N2Bv_sized 3 1]%vector, (N2Bv_sized 2 2, N2Bv_sized 3 2, true));
-      ([N2Bv_sized 3 3; N2Bv_sized 3 0]%vector, (N2Bv_sized 2 3, N2Bv_sized 3 3, true));
-      ([N2Bv_sized 3 0; N2Bv_sized 3 3]%vector, (N2Bv_sized 2 2, N2Bv_sized 3 1, false));
-      ([N2Bv_sized 3 1; N2Bv_sized 3 2]%vector, (N2Bv_sized 2 2, N2Bv_sized 3 1, false));
-      ([N2Bv_sized 3 2; N2Bv_sized 3 1]%vector, (N2Bv_sized 2 2, N2Bv_sized 3 1, false));
-      ([N2Bv_sized 3 3; N2Bv_sized 3 0]%vector, (N2Bv_sized 2 2, N2Bv_sized 3 1, false))
-    ]%list.
-
-  Definition Init2 (n : nat):= 
-    N2Bv_sized 2 (N.of_nat (3-n)).
-
-  Definition Test_run2 :=
-    map (Vector.map Bv2N) (simulate (Memory (Vec Bit 2) 3 2 Init2) Test_input2).
-
-  Definition Test_result2 :=
-    [
-      [0%N; 0%N]%vector; 
-      [1%N; 1%N]%vector; 
-      [2%N; 1%N]%vector;
-      [3%N; 0%N]%vector; 
-      [0%N; 3%N]%vector; 
-      [1%N; 2%N]%vector;
-      [2%N; 1%N]%vector; 
-      [3%N; 0%N]%vector
-    ]%list.
-
-  Lemma Test2 : Test_run2 = Test_result2.
-    reflexivity.
-  Qed.
-End Test.
-
-Module Properties.
-
-  Definition Cells_state_prod {T W N M I} (H :  N = S M) (r : circuit_state (mem_cells T W N I)) : 
-    (unit * circuit_state (mem_cells T W M I) * (unit * unit * circuit_state (mem_cell T (I N))) * unit)%type.
-  Proof.
-    destruct N.
-    - discriminate H.
-    - rewrite H in r; simpl in r; exact r.
-  Defined.
-
-  Fixpoint Cells_data {T W N I} (S : circuit_state (mem_cells T W N I)) : Vector.t (combType T) N :=
-    match N as X return N = X -> X = N -> _ with
-      | 0%nat => 
-          fun H H' => 
-            Vector.nil (combType T)
-      | S N'  =>  
-        fun H H'=>
-          let '(_, s', (_, _, v), _) := Cells_state_prod H S in
-            let r := Cells_data s' in
-              Vector.shiftin v r
-    end Logic.eq_refl Logic.eq_refl.
-
-	Fixpoint Cells_read {T W N I} we wa wd (S : circuit_state (mem_cells T W N I)) : Vector.t (combType T) N :=
-    match N as X return N = X -> X = N -> _ with
-      | 0%nat => 
-          fun H H' => 
-            Vector.nil (combType T)
-      | S N'  =>  
-        fun H H'=>
-          let '(_, s', (_, _, v), _) := Cells_state_prod H S in
-            let r := Cells_read we wa wd s' in
-              if ((wa =? N') && we)%nat then Vector.shiftin wd r
-              else Vector.shiftin v r
-    end Logic.eq_refl Logic.eq_refl.
-
-	(* cells data won't change if not writing *)
-  Lemma Cells_const {T W N I} (S : circuit_state (mem_cells T W N I)) wd we:
-    (forall n, indexConst we n = constant false) ->
-    Cells_data S = Cells_data (fst (step (mem_cells T W N I) S (wd, we))).
-  Proof.
-    intros Hwe.
-    induction N.
-    - reflexivity.
-    - unfold mem_cells; fold mem_cells; unfold mem_cell.
-      repeat step_destruct.
-      rewrite (surjective_pairing (step (mem_cells _ _ _ _) SC3 _)) /=.
-      rewrite Hwe (surjective_pairing SC2) (surjective_pairing (fst SC2)) IHN.
-      reflexivity.
-  Qed.
-
-	(* Other parts of the memory do not change *)
-  Lemma Cells_match {T W N I} (S : circuit_state (mem_cells T W N I)) wd wa we wev:
-    (forall n, (wa =? n)%nat = false -> 
-		indexConst wev n = constant false) ->
-    indexConst wev wa = constant we ->
-    Cells_read we wa wd S = Cells_read we wa wd (fst (step (mem_cells T W N I) S (wd, wev))).
-  Proof.
-    intros Hwde Hwe.
-    induction N.
-    - reflexivity.
-    - unfold mem_cells; fold mem_cells; unfold mem_cell.
-      repeat step_destruct.
-      rewrite (surjective_pairing (step (mem_cells _ _ _ _) SC3 _)) /=.
-      rewrite (surjective_pairing SC2) (surjective_pairing (fst SC2)) IHN.
-      destruct (wa =? N)%nat eqn:Hwa, we.
-      + move : Hwa => /Nat.eqb_eq Hwa; subst N; reflexivity.
-      + move : Hwa => /Nat.eqb_eq Hwa; subst N; rewrite Nat.sub_0_r Hwe; reflexivity.
-      + rewrite Nat.sub_0_r (Hwde N Hwa); reflexivity.
-      + rewrite Nat.sub_0_r (Hwde N Hwa); reflexivity.
-  Qed.
-
-  Lemma Cells_matchX {T W N I} (S : circuit_state (mem_cells T W N I)) wd wa we wev:
-    (forall n, (wa =? n)%nat = false -> indexConst wev n = constant false) ->
-    indexConst wev wa = constant we ->
-    Cells_read we wa wd S = Cells_data (fst (step (mem_cells T W N I) S (wd, wev))).
-  Proof.
-    intros Hwde Hwe.
-    induction N.
-    - reflexivity.
-    - unfold mem_cells; fold mem_cells; unfold mem_cell.
-      repeat step_destruct.
-      rewrite (surjective_pairing (step (mem_cells _ _ _ _) SC3 _)) /=.
-      rewrite (surjective_pairing SC2) (surjective_pairing (fst SC2)) IHN.
-      destruct (wa =? N)%nat eqn:Hwa, we.
-      + move : Hwa => /Nat.eqb_eq Hwa; subst N; rewrite Nat.sub_0_r Hwe; reflexivity.
-      + move : Hwa => /Nat.eqb_eq Hwa; subst N; rewrite Nat.sub_0_r Hwe; reflexivity.
-      + rewrite Nat.sub_0_r (Hwde N Hwa); reflexivity.
-      + rewrite Nat.sub_0_r (Hwde N Hwa); reflexivity.
-  Qed.
-
-  (* Fixpoint Mem_read {T W PP} (md : Vector.t (combType T) (2^W)) (rav : VectorDef.t (Bvector W) PP) :=
-    match PP as X return PP = X -> _ with
-      | 0 => 
-        fun H =>
-          Vector.nil (combType T)
-     | S PP' => 
-        fun H =>
-          let rav := Vector.cast rav H in
-            let r := Mem_read md (Vector.tl rav) in 
-              let i := Bv2Fin (Vector.hd rav) in
-                let v := Vector.nth md i in
-                  Vector.shiftin v r
-		end Logic.eq_refl. *)
-		
-End Properties.
diff --git a/framework/CavaDRAM/Lib/CavaTactics.v b/framework/CavaDRAM/Lib/CavaTactics.v
deleted file mode 100644
index e9f52c4..0000000
--- a/framework/CavaDRAM/Lib/CavaTactics.v
+++ /dev/null
@@ -1,26 +0,0 @@
-Require Import CavaSM.
-Require Import Lia.
-From mathcomp Require Export ssreflect ssrnat ssrbool seq eqtype div.
-
-Ltac destruct_products :=
-	repeat match goal with
-	| p: _ * _  |- _ => destruct p
-	| H: _ /\ _ |- _ => let Hl := fresh H "l" in let Hr := fresh H "r" in destruct H as [Hl Hr]
-	| E: exists y, _ |- _ => let yf := fresh y in destruct E as [yf E]
-	end.
-
-Ltac simplify_step :=
-	first [ destruct_pair_let
-			| rewrite eqb_nat_to_bitvec_sized; by Lia.lia
-			| rewrite nat_to_bitvec_to_nat;  by Lia.lia
-			| progress simpl_ident
-			| progress autorewrite with to_spec
-			| progress cbn [fst snd map] ].
-
-Ltac simplify := repeat simplify_step.
-
-Ltac destruct_pair_let_ H :=
-  match goal with
-  | |- context [ match ?p with pair _ _ => _ end ] =>
-    rewrite (surjective_pairing p)
-  end.
\ No newline at end of file
diff --git a/framework/CavaDRAM/Lib/CavaUtil.v b/framework/CavaDRAM/Lib/CavaUtil.v
deleted file mode 100644
index 3354b07..0000000
--- a/framework/CavaDRAM/Lib/CavaUtil.v
+++ /dev/null
@@ -1,59 +0,0 @@
-Require Import Cava.Cava.
-Require Import Cava.CavaProperties.
-
-From CavaDRAM Require Import CavaSystem.
-Import Circuit.Notations.
-
-Section CavaUtil.
-
-	Context {signal : SignalType -> Type} {semantics : Cava signal}.
-
-	Definition powerOfTwo (n : nat) : bool :=
-		N.eqb (N.land (N.of_nat n) (N.of_nat (n - 1))) 0.
-
-	Definition get_width x :=
-		if (powerOfTwo x) then Nat.log2 x else (Nat.log2 x + 1).
-
-	(* Inverses a bit vector *)
-	Definition xor_1 {n : nat}
-	: Circuit (signal (Vec Bit n)) (* N-bit Minued *)
-						(signal (Vec Bit n))
-	:= let bvN_1 := Vec.bitvec_literal (N2Bv_sized n (N.of_nat (Nat.pow 2 n) - 1)) in
-	 Comb (fun '(a) => Vec.xor (a,bvN_1)).
-
-	Definition xor_1_alt {n : nat} (inputs : signal (Vec Bit n))
-		: cava (signal (Vec Bit n))
-		:= let bvN_1 := Vec.bitvec_literal (N2Bv_sized n (N.of_nat (Nat.pow 2 n) - 1)) in
-		Vec.xor (inputs,bvN_1).
-
-	(* Different subtractor versions : trying different things to falicitate proofs *)
-	Definition Subtractor_v1 {n : nat}
-	: Circuit (signal (Vec Bit n) * (* N-bit Minued *)
-						 signal (Vec Bit n))  (* N-bit Subtrahend *)
-						(signal (Vec Bit n) * (* N-bit Difference*)
-						 signal Bit)
-	:= Second (xor_1) >==>
-		 Comb (fun '(a,b) =>
-			a <- unpackV a ;;
-			b <- unpackV b ;;
-			col fullAdder one (vcombine a b)
-		).
-
-	Definition subtractor_v2 {n : nat}
-		(inputs : signal (Vec Bit n) * signal (Vec Bit n))
-		: cava (signal (Vec Bit n) * signal Bit)
-		:= let '(a,b) := inputs in
-			 aV <- unpackV a ;;
-			 nb <- xor_1_alt b ;;
-			 nbV <- unpackV nb ;;
-			 col fullAdder one (vcombine aV nbV).
-
-	Definition Subtractor_v2 {n : nat}
-		: Circuit (signal (Vec Bit n) * (* N-bit Minued *)
-							 signal (Vec Bit n))  (* N-bit Subtrahend *)
-							(signal (Vec Bit n) * (* N-bit Difference*)
-							 signal Bit)
-		:= Comb (subtractor_v2).
-
-End CavaUtil.
-
diff --git a/framework/CavaDRAM/Lib/Step.v b/framework/CavaDRAM/Lib/Step.v
index ddde91f..44c2295 100644
--- a/framework/CavaDRAM/Lib/Step.v
+++ b/framework/CavaDRAM/Lib/Step.v
@@ -1,18 +1,18 @@
 Set Printing Projections.
-Require Import String NArith PeanoNat Bvector Vectors.Vector ssreflect.
-Require BinaryString  Vectors.Vector Coq.Arith.Compare ZArith.BinInt.
-Global Open Scope string_scope.
 
-Require Import ExtLib.Structures.Monad.
-Require Import Cava.Core.Core Cava.Semantics.Simulation Cava.Semantics.Combinational Cava.Util.Tactics.
-From Cava.Lib Require Vec.
-From Cava.Lib Require Import CavaPrelude Combinators.
+From Coq Require Import String NArith Arith ZArith PeanoNat Bvector Vectors.Vector Arith BinaryString.
+From mathcomp Require ssreflect.
+From ExtLib Require Import Monad.
+From Cava Require Import Cava Lib Semantics.Combinational.
 
 Import MonadNotation Circuit.Notations Init.Logic.EqNotations.
-Open Scope monad_scope.
 
+Global Open Scope string_scope.
+Open Scope monad_scope.
 Open Scope vector_scope.
 
+#[global] Existing Instance CombinationalSemantics.
+
 Lemma step_compose {I M O} (c1 : Circuit I M) (c2 : Circuit M O) i cs :
   step (Compose c1 c2) cs i = let (sc1, o1) := (step c1 (fst cs) i) in
                               let (sc2, o2) := (step c2 (snd cs) o1) in (sc1, sc2, o2).
diff --git a/framework/CavaDRAM/Lib/Util.v b/framework/CavaDRAM/Lib/Util.v
index 7573b02..5a0ac5c 100644
--- a/framework/CavaDRAM/Lib/Util.v
+++ b/framework/CavaDRAM/Lib/Util.v
@@ -2,18 +2,17 @@ Set Printing Projections.
 Set Warnings "-notation-overridden,-parsing".
  
 From Coq Require Import String NArith PeanoNat Bvector ssreflect.
-Require BinaryString Vectors.Vector Coq.Arith.Compare.
-Global Open Scope string_scope.
+From Coq Require BinaryString Vectors.Vector Arith.Compare.
+From ExtLib Require Import Structures.Monad.
+From Cava Require Import Cava Lib. 
 
-Require Import ExtLib.Structures.Monad.
-Require Import Cava.Core.Core Cava.Semantics.Simulation.
-From Cava.Lib Require Vec.
-From Cava.Lib Require Import CavaPrelude Combinators Multiplexers Decoder Adders.
-Import MonadNotation Circuit.Notations Init.Logic.EqNotations.
-Global Open Scope monad_scope.
+Import Init.Logic.EqNotations.
 
 Section WithCava.
-	Context `{semantics : Cava}.
+
+	Context {signal : SignalType -> Type}.
+	Context {semantics : Cava signal}.
+
   Definition bin_constant w (s : String.string) : signal (Vec Bit w) :=
     Vec.of_N (n := w) (BinaryString.Raw.to_N s 0).
 
@@ -131,9 +130,9 @@ Section WithCava.
     { simpl. rewrite !Nat.add_0_r; destruct h.
 		 	{ rewrite -Nat.add_succ_r. apply Nat.add_lt_le_mono.
         { exact IHbv. }
-        { apply Lt.lt_le_S;exact IHbv. }
+        { apply Nat.le_succ_l;exact IHbv. }
 			}
-      { apply Plus.plus_lt_compat; exact IHbv. }
+      { apply Nat.add_lt_mono; exact IHbv. }
 		}
   Qed.
     
@@ -142,13 +141,4 @@ Section WithCava.
     exact (Fin.of_nat_lt H).
   Defined.
 	
-End WithCava.
-
-(* get rid of the reverse *)
-(* Section Properties.
-
-	Context `{semantics : Cava}.
-
-	Print Instances Cava.
-	Lemma test (n : nat) (t : cava (signal (Vec Bit n))):
-	indexConst (decode one t) n = zero. *)
+End WithCava.
\ No newline at end of file
diff --git a/framework/CavaDRAM/Lib/backup.v b/framework/CavaDRAM/Lib/backup.v
deleted file mode 100644
index afe832f..0000000
--- a/framework/CavaDRAM/Lib/backup.v
+++ /dev/null
@@ -1,1256 +0,0 @@
-Set Printing Projections.
-Set Warnings "-notation-overridden,-parsing". 
-
-From CavaDRAM Require Import CavaFIFOREF CavaSM CavaReqQueue CavaCommonInstances CavaSubtractor Step CavaSystem Memory Util UtilSM.
-From CoqDRAM Require Import FIFO.
-From Coq Require Import Program BinaryString HexString NArith.
-From Cava Require Import Cava CavaProperties Util.Vector Util.Tactics.
-From mathcomp Require Import fintype ssrZ zify ring.
-
-Section CavaFIFOREFProperties.
-	(* From Cava *)
-	Existing Instance CombinationalSemantics.
-	(* From CavaDRAM*)
-	Context {CAVA_SYS : CavaSystem}.
-	(* From CoqDRAM *)
-	Existing Instance REQESTOR_CFG.
-  Context {SYS_CFG      : System_configuration}.
-	Context {FIFO_CFG     : FIFO_configuration}.
-	Context {HAF					: HW_Arrival_function_t}.
-	Existing Instance ARBITER_CFG.
-	Existing Instance FIFO_implementation.
-
-	Import Memory.Properties BvectorNotations.
-	Open Scope Bvector_scope.
-
-	Lemma leq_Nle (a b : N) :
-		leq (nat_of_bin a) (nat_of_bin b) -> (a <= b)%N.
-	Proof.
-		lia.
-	Qed.
-
-	Lemma ltn_Ntn (a b : N) :
-		leq (S (nat_of_bin a)) (nat_of_bin b) -> (a < b)%N.
-	Proof.
-		lia.
-	Qed.
-
-	Lemma Bv2N_upper_bound {n : nat} (bv : Bvector n) :
-		(N.to_nat (Bv2N bv) < (Nat.pow 2 n)).
-	Proof.
-		induction bv; [ by simpl | ]; destruct h; rewrite Bv2N_cons.
-		{ rewrite N.succ_double_spec.
-			set z := Bv2N _; fold z in IHbv.
-			rewrite N2Nat.inj_add N2Nat.inj_mul.
-			vm_compute (N.to_nat 1); vm_compute (N.to_nat 2).
-			assert ((2 * N.to_nat z)%coq_nat = (2 * N.to_nat z)%nat); try done; rewrite H; clear H.
-			assert ((2 * N.to_nat z + 1)%coq_nat = (2 * N.to_nat z + 1)%nat); try done; rewrite H; clear H.
-			apply ltn_mul_add1 in IHbv.
-			rewrite Nat.pow_succ_r; [ | apply /leP; by rewrite leq0n ].
-			assert ((2 * (2 ^ n))%coq_nat = (2 * (2 ^ n))%nat); try done; rewrite H; clear H. }
-		{ rewrite N.double_spec N2Nat.inj_mul; set z := Bv2N _; fold z in IHbv; vm_compute (N.to_nat 2).
-			assert ((2 * N.to_nat z)%coq_nat = (2 * N.to_nat z)%nat); try done; rewrite H; clear H.
-			have aux : (0 < 2); [ done | ].
-			have H := (ltn_pmul2l aux); rewrite -H in IHbv.
-			rewrite Nat.pow_succ_r; [ | apply /leP; by rewrite leq0n ]; clear H.
-			assert ((2 * (2 ^ n))%coq_nat = (2 * (2 ^ n))%nat); try done; rewrite H; clear H.
-		}
-	Qed.
-
-	Lemma N2Bv_sized_queuemax_neq0 :
-		N2Bv_sized ADDR_WIDTH 0 <> N2Bv_sized ADDR_WIDTH (N.of_nat QUEUE_MAX_SIZE - 1).
-	Proof.
-		apply N2Bv_sized_neq_iff; unfold ADDR_WIDTH.
-		{ rewrite /N.size_nat /Nat.log2 //=. }
-		{ rewrite -N.pred_sub -Nat2N.inj_pred.
-			apply /leP; apply N.size_nat_le_nat.
-			rewrite QUEUE_MAX_SIZE_PW2; apply /leP.
-			rewrite ltn_predL; apply /leP.
-			exact QUEUE_MAX_SIZE_GT_0. }
-		{ rewrite -N.pred_sub -Nat2N.inj_pred.
-			specialize QUEUE_MAX_SIZE_DIFF_0 as HH.
-			move: HH => /N.eqb_spec HH.
-			by apply /N.eqb_spec.
-		}
-	Qed.
-
-	Definition mem_cells_ := 
-		mem_cells (Vec Bit REQUEST_WIDTH) ADDR_WIDTH (Nat.pow 2 ADDR_WIDTH) InitMem.
-
-	(* Check VectorDef.nth. *)
-	Lemma nth_cells_read {T W I} (ad : Bvector W) c_req 
-		(c : circuit_state (mem_cells T W (2 ^ W) I)) :
-		VectorDef.nth (Cells_read true (N.to_nat (Bv2N ad)) c_req c) (Bv2Fin ad) = c_req.
-	Proof.
-		(* Induction had to be on N *)
-		induction W.
-		{ simpl in c; destruct_products; simpl.
-			apply Vector.case0 with (v := ad); rewrite //=. }
-		{ specialize (Vector.eta ad) as HH; rewrite HH //=.
-			simpl in c.
-			destruct (Vector.hd ad).
-			{ specialize (IHW (Vector.tl ad)).
-				rewrite /Bv2Fin //=.
-				set Hc := Nat.add _ _. 
-				dependent destruction Hc; admit.
-			}
-		}
-	Admitted.
-
-	Lemma memcell_nch (c: circuit_state mem_cells_) wra rda c_req:
-		wra <> rda ->
-		(Cells_data c)[@(Bv2Fin rda)] = (Cells_read true (N.to_nat (Bv2N wra)) c_req c)[@(Bv2Fin rda)].
-	Proof.
-		intros Hdiff.
-		unfold mem_cells_ in c.
-		set Hc := 2 ^ ADDR_WIDTH; dependent induction Hc.
-		{ apply Logic.eq_sym in x; simpl in x.
-			admit. (* can't happen *)
-		}
-		specialize (IHHc HAF0 FIFO_CFG0 CAVA_SYS c wra rda c_req).
-		apply Logic.eq_sym in x.
-	Admitted.
-
-	Lemma to_nat_lt_of_nat (a : N) (n : nat) :
-		N.to_nat a < n -> (a < N.of_nat n)%N.
-	Proof.
-		intros.
-		induction n; [ discriminate | ].
-		rewrite leq_eqVlt in H; move: H => /orP [/eqP H | H].
-		{ rewrite -H Nat2N.inj_succ N2Nat.id; by specialize (N.lt_succ_diag_r a). }
-		assert (N.to_nat a < n).
-		{ specialize (ltn_add2r 1 (N.to_nat a) n) as S; rewrite !addn1 in S; by rewrite S in H. }
-		apply IHn in H0.
-		apply N.lt_trans with (m := N.of_nat n); [ done | ].
-		rewrite Nat2N.inj_succ; by specialize (N.lt_succ_diag_r (N.of_nat n)).
-	Qed.
-
-	Lemma to_nat_lt_pow a b:
-		N.to_nat a < Nat.pow 2 b -> (a < 2 ^ N.of_nat b)%N.
-	Proof.
-		intros; apply to_nat_lt_of_nat in H.
-		rewrite -Nat2N.inj_pow in H.
-		by simpl (N.of_nat 2) in H.
-	Qed.
-
-	Lemma size_nat_sub_leq {n} (a b : Bvector n):
-		(Bv2N b <= Bv2N a)%N ->
-		N.size_nat (Bv2N a - Bv2N b) <= n.
-	Proof.
-		intros; apply /leP; apply N.size_nat_le. 
-		specialize (@Bv2N_upper_bound n a) as Ha.
-		specialize (@Bv2N_upper_bound n b) as Hb.
-		destruct (Bv2N b) eqn:Hb0, (Bv2N a) eqn:Ha0; try discriminate.
-		{ simpl in *; by apply to_nat_lt_pow. }
-		{ rewrite N.sub_0_r; by apply to_nat_lt_pow in Ha. }
-		{ by contradict H. }
-		{ apply to_nat_lt_pow in Ha,Hb.
-			apply (N.lt_trans (N.pos p0 - N.pos p) (N.pos p0) (2 ^ N.of_nat n)%N); [ | done].
-			apply N.sub_lt; done.
-		}
-	Qed.
-
-	(* Need a to be bigger than b  *)
-	Lemma size_nat_qms_sub (a b: Bvector ADDR_WIDTH) :
-		(Bv2N b < Bv2N a)%N ->
-		N.size_nat (N.of_nat QUEUE_MAX_SIZE - (Bv2N a - Bv2N b)) <= ADDR_WIDTH.
-	Proof.
-		intros Hlt; apply /leP.
-		destruct (Bv2N b) eqn:Hb0, (Bv2N a) eqn:Ha0; try done;
-		apply N.size_nat_le; unfold ADDR_WIDTH; rewrite QUEUE_MAX_SIZE_PW2_N; try rewrite N.sub_0_r.
-		{ apply N.sub_lt; [ | done].
-			unfold ADDR_WIDTH in a,b.
-			specialize (@Bv2N_upper_bound (Nat.log2 QUEUE_MAX_SIZE) a) as Ha.
-			rewrite QUEUE_MAX_SIZE_PW2 in Ha.
-			rewrite Ha0 in Ha.
-			apply to_nat_lt_of_nat in Ha.
-			apply N.le_lteq; left; exact Ha.
-		}
-		{ apply N.sub_lt; [ | apply N.lt_add_lt_sub_l; by rewrite N.add_0_r ].
-			unfold ADDR_WIDTH in a,b.
-			specialize (@Bv2N_upper_bound (Nat.log2 QUEUE_MAX_SIZE) a) as Ha.
-			rewrite QUEUE_MAX_SIZE_PW2 in Ha.	
-			specialize (@Bv2N_upper_bound (Nat.log2 QUEUE_MAX_SIZE) b) as Hb.
-			rewrite QUEUE_MAX_SIZE_PW2 in Hb.
-			apply to_nat_lt_of_nat in Ha,Hb; rewrite Ha0 in Ha; rewrite Hb0 in Hb.
-			apply N.le_sub_le_add_l; rewrite N.add_comm.
-			apply N.lt_trans with (m := N.of_nat (@QUEUE_MAX_SIZE CAVA_SYS)) (n := N.pos p0)
-			(p := N.add (N.of_nat (@QUEUE_MAX_SIZE CAVA_SYS)) (N.pos p)) in Ha as H;
-			[ apply N.le_lteq; by left | ].
-			apply N.lt_add_pos_r; done.
-		}
-	Qed.
-	
-	Lemma size_nat_qms :
-		N.size_nat (N.of_nat QUEUE_MAX_SIZE - 1) <= Nat.log2 QUEUE_MAX_SIZE.
-	Proof.
-		rewrite N.sub_1_r -Nat2N.inj_pred.
-		apply /leP; apply N.size_nat_le_nat.
-		rewrite QUEUE_MAX_SIZE_PW2.
-		apply /ltP; rewrite ltn_predL; apply /ltP.
-		exact QUEUE_MAX_SIZE_GT_0.
-	Qed.
-
-	Lemma N2Bv_sized_eq_p1_false {W} (v : Bvector W):
-		W > 0 -> (N2Bv_sized W (Bv2N v + 1) =? v) = false.
-	Proof.
-		intros; apply BVEq_iff_neq.
-		rewrite N.add_1_r.
-		specialize (N2Bv_sized_Bv2N W v) as H0; rewrite -{2}H0.
-		by apply N2Bv_sized_neq_succ.
-	Qed.
-
-	Definition State_t := circuit_state FIFOSM.
-
-	Definition get_mem (s : State_t) : circuit_state memqueue' := 
-	let '(_,(_,(_,(_,_,_,memqueue_state,_,_,_,_,_),_),_,_)) := s in memqueue_state.
-
-	Definition get_pop (s : State_t) :=
-	let '(_,(_,_,_,pop)) := s in pop.
-
-	Definition get_st (s : State_t) :=
-	let '(_,(_,_,(_,(_,_,st)),_)) := s in st.
-
-	Definition get_cnt (s : State_t) :=
-	let '(_,(_,_,(_,(_,(_,_,cnt),_)),_)) := s in cnt.
-
-	Definition get_cref (s : State_t) :=
-	let '(_,(_,_,(_,(_,(_,(_,_,_,_,_,_,_,cref),_),_)),_)) := s in cref.
-
-	Definition get_cr (s : State_t) :=
-	let '(_,(_,_,(_,(_,(_,(_,(_,(_,cr)),_,_,_,_,_,_),_),_)),_)) := s in cr.
-
-	Definition get_wra (s : State_t) :=
-	let '(_,(_,(_,_,wra),_,_)) := s in wra.
-
-	Definition get_rda (s : State_t) :=
-	let '(_,(_,(_,(_,_,_,_,_,_,_,_,rda),_),_,_)) := s in rda.
-
-	Definition get_reqqueue (s : State_t) : circuit_state RequestQueue' :=
-	let '(_,(cs_requeue,_,_)) := s in cs_requeue.
-
-	Definition get_mem_RequestQueue (c : circuit_state RequestQueue') :=
-		let '(_,(_,(_,_, _,memqueue_state,_,_,_,_,_),_)) := c in memqueue_state.
-	
-	Definition get_addr_RequestQueue (c : circuit_state RequestQueue') :=
-	let '(_,(_,(_,_, _,_,_,_,_,_,rda),wra)) := c in (wra,rda).
-
-	Definition get_memcells (s : circuit_state memqueue') :=
-		let '(_,memcells_state,_) := s in memcells_state.
-
-	Definition get_memcells_RequestQueue (c : circuit_state RequestQueue') :=
-	get_memcells (get_mem_RequestQueue c).
-
-	(* --------------------------Bounding the counter ------------------- *)
-	Lemma cnt_bounded (cnt : Bvector COUNTER_WIDTH) :
-		N.to_nat (Bv2N cnt) < WAIT.
-	Proof.
-		specialize @Bv2N_upper_bound with (bv := cnt) as H.
-		by rewrite /COUNTER_WIDTH WAIT_PW_2 in H.
-	Qed.
-
-	Definition Bv2cnt (cnt : Bvector COUNTER_WIDTH) : Counter_t :=
-		Ordinal (cnt_bounded cnt).
-
-	Definition cnt2Bv (cnt : Counter_t) := 
-		N2Bv_sized COUNTER_WIDTH (N.of_nat (nat_of_ord cnt)).
-	(* ------------------------------------------------------------------ *)
-
-	(* --------------------------Bounding cref counter ------------------- *)
-	Lemma cref_bounded (cref : Bvector COUNTER_REF_WIDTH) :
-		N.to_nat (Bv2N cref) < WAIT_REF.
-	Proof.
-		specialize @Bv2N_upper_bound with (bv := cref) as H.
-		by rewrite /COUNTER_REF_WIDTH WAIT_REF_PW2 in H.
-	Qed.
-
-	Definition Bv2cref (cnt : Bvector COUNTER_REF_WIDTH) : Counter_ref_t :=
-		Ordinal (cref_bounded cnt).
-
-	Definition cref2Bv (cref : Counter_ref_t) := 
-		N2Bv_sized COUNTER_REF_WIDTH (N.of_nat (nat_of_ord cref)).
-	(* ------------------------------------------------------------------ *)
-
-	Lemma cref_preadate_false (c : Counter_ref_t) :
-		(cref2Bv c =? CNT_REF_PREA) = false ->
-		(nat_of_ord c == PREA_date - 1) = false.
-	Proof.
-		unfold cref2Bv, CNT_REF_PREA; intros.
-		apply BVEq_iff_neq in H; rewrite bitvec_literal_correct in H.
-		apply N2Bv_sized_neq_if in H.
-		apply of_nat_neq in H.
-		by apply /eqP.
-	Qed.
-
-	Lemma cref_preadate_true (c : Counter_ref_t) :
-		(cref2Bv c =? CNT_REF_PREA) = true ->
-		(nat_of_ord c == PREA_date - 1) = true.
-	Proof.
-		unfold cref2Bv, CNT_REF_PREA; intros.
-		apply BVEq_iff_eq in H; rewrite bitvec_literal_correct in H.
-		apply N2Bv_sized_eq_iff in H.
-		{ apply Nat2N.inj in H; rewrite H; by apply /eqP. }
-		{ apply N.size_nat_le_nat. 
-			destruct c; simpl in *; rewrite /COUNTER_REF_WIDTH; apply /ltP.
-			by rewrite WAIT_REF_PW2. }
-		{ apply N.size_nat_le_nat; unfold COUNTER_REF_WIDTH.
-			rewrite WAIT_REF_PW2 subn1; apply /ltP.
-			specialize WAIT_REF_PREA_date as HH.
-			apply ltn_trans with (m := PREA_date.-1) in HH; [ exact HH | ].
-			by rewrite ltn_predL PREA_date_pos.
-		}
-	Qed.
-
-	Definition fullQueue (wa ra : Bvector ADDR_WIDTH) : bool :=
-		let waN := Bv2N wa in
-		let raN := Bv2N ra in
-		let qms := N.sub (N.of_nat QUEUE_MAX_SIZE) 1 in
-		if (raN <= waN)%nat then ((Bv2N wa - Bv2N ra)%N == qms)
-		else (((N.add qms 1) - (raN - waN))%N == qms).
-
-	Hypothesis HaltIfFull : forall t c,
-		let wra := get_wra c in
-		let rda := get_rda c in
-		if (HW_Arrival_at t != []) then ~~ fullQueue wra rda else true.
-
-	Program Definition EqReq (r : Request_t) (r' : Bvector REQUEST_WIDTH) : bool.
-	Admitted.
-
-	Lemma EqReqNil : EqReq nullreq REQUEST_NIL = true.
-	Admitted.
-
-	(* Change FIFO implememtation: set of requests of max size 1,
-		so it could either have a request or a non arriving request,
-		that way, eveyr request in P is a valid request
-		would have to change lots of things here:
-		- HaltIfFull
-		- EqQueue
-		- EqMem	
-	*)
-
-	(* Manually force push to be false *)
-
-	(* Definition EqArrival r r' push c : bool :=
-		let wra := get_wra c in
-		let rda := get_rda c in
-		if r == nullreq 
-			(* If the arriving request is nullreq, either the fifo is full or there are no arriving requests *)
-			then (r' =? REQUEST_NIL) && (push == false)
-			(* If a request did arrive indeed than the fifo is not full *)
-			else (EqReq r r') && (push == true) && (~~ fullQueue wra rda). *)
-
-	Definition EqCmd (f_cmd : Command_kind_t) (c_cmd : Bvector DRAM_CMD_WIDTH) : bool :=
-		match f_cmd with
-			| ACT => (c_cmd =? ACT_VEC)
-			| PRE => (c_cmd =? PRE_VEC)
-			| PREA => (c_cmd =? PREA_VEC)
-			| CRD => (c_cmd =? RD_VEC)
-			| CWR => (c_cmd =? WR_VEC)
-			| REF => (c_cmd =? REF_VEC)
-			| NOP => (c_cmd =? NOP_VEC)
-		end.
-
-	Fixpoint EqQueue (P : Requests_t) (wra rda : Bvector ADDR_WIDTH) :=
-		match P with
-			| [::] => (wra =? rda)
-			| x :: x0 => 
-				if (x0 == []) then
-					(N2Bv_sized ADDR_WIDTH (Bv2N rda + 1) =? wra)
-				else
-					negb (wra =? rda) && (EqQueue x0 wra (N2Bv_sized ADDR_WIDTH (Bv2N rda + 1)))
-		end.
-
-
-				if (x == nullreq) then (EqQueue x0 wra rda) 
-				else (if (x0 == []) then 
-						(N2Bv_sized ADDR_WIDTH (Bv2N rda + 1) =? wra) (* only one non-null addres in the queue *)
-					else 
-						negb (wra =? rda) && (EqQueue x0 wra (N2Bv_sized ADDR_WIDTH (Bv2N rda + 1)))
-				)
-		end.
-
-	Fixpoint EqMem_ {W} (P : Requests_t) (rda : Bvector W)
-		(memcells_vec : Vector.t (Bvector REQUEST_WIDTH) (Nat.pow 2 W)) : bool :=
-		match P with
-			| [::] => true
-			| x :: x0 => let nrda := N2Bv_sized W (Bv2N rda + 1) in
-				if (x == nullreq) then 
-					(EqMem_ x0 rda memcells_vec) 
-				else 
-					(EqReq x memcells_vec[@(Bv2Fin rda)]) && (EqMem_ x0 nrda memcells_vec)
-		end.
-
-	Lemma EqMem_rcons r1 (rda wra : Bvector ADDR_WIDTH) c R (c_req : combType (Vec Bit REQUEST_WIDTH)) :
-		EqQueue r1 wra rda -> r1 != [::] ->
-		EqMem_ r1 rda (@Cells_data (Vec Bit REQUEST_WIDTH) ADDR_WIDTH (Nat.pow 2 ADDR_WIDTH) InitMem c) -> 
-		EqReq R c_req ->
-		EqMem_ (r1 ++ [R])%SEQ rda (Cells_read true (N.to_nat (Bv2N wra)) c_req c).
-	Proof.
-		intros HQ Hnot_nil Mem EqR; fold mem_cells_ in c; rewrite cats1.
-		revert Mem HQ Hnot_nil; generalize wra rda; induction r1; try discriminate; intros.
-		simpl in Mem,HQ; simpl; destruct (a == _) eqn:Hanull.
-		{ destruct r1 eqn:Hr1; simpl in Mem,HQ.
-			{ clear IHr1 Mem.
-				simpl; destruct (R == _); [trivial | rewrite andb_true_r].
-				apply BVEq_iff_eq in HQ; rewrite -HQ.
-				by rewrite (@nth_cells_read (Vec Bit REQUEST_WIDTH) ADDR_WIDTH InitMem wra0 c_req c).
-			}
-			{ apply IHr1 with (wra := wra0) (rda := rda0) in HQ; done. }
-		}
-		move: Mem => /andP [EqR_ Mem]; apply /andP; split.
-		{ destruct r1 eqn:hr1; simpl in HQ,Mem; simpl.
-			{ destruct (wra0 =? rda0) eqn:Heq.
-				{ apply BVEq_iff_eq in Heq; rewrite Heq in HQ.
-					specialize ADDR_WIDTH_pos as H0; move: H0 => /ltP H0.
-					apply N2Bv_sized_eq_p1_false with (v := rda0) in H0; by rewrite H0 in HQ.
-				}
-				{ apply BVEq_iff_neq in Heq.
-					rewrite -memcell_nch; done. }}
-			{ move: HQ => /andP [neq HQ].
-				destruct (r == _),l.
-				all: move: neq => /negPf neq; apply BVEq_iff_neq in neq; rewrite -memcell_nch; done. }}
-		{ destruct r1 eqn:hr1; simpl in HQ,Mem; simpl.
-			{ destruct (R == _); [trivial | rewrite andb_true_r].
-				apply BVEq_iff_eq in HQ; rewrite HQ.
-				by rewrite (@nth_cells_read (Vec Bit REQUEST_WIDTH) ADDR_WIDTH InitMem wra0 c_req c).
-			}
-			{	move: HQ => /andP [neq HQ].
-				specialize (IHr1 wra0 (N2Bv_sized ADDR_WIDTH (Bv2N rda0 + 1))); apply IHr1; try done. }
-		}
-	Qed.
-
-	(* Just use the circuit directly <-> circuit does the work directly *)
-	Definition EqMem (P : Requests_t) rda (mem : circuit_state RequestQueue') :=
-		let memcells_vec := Cells_data (get_memcells_RequestQueue mem) in
-		EqMem_ P rda memcells_vec.
-		
-	Definition State_Eq (fram_state : FIFO_state_t) (cava_state : State_t) : bool :=
-		let s 		:= get_st cava_state 	 in
-		let c' 		:= get_cnt cava_state  in  
-		let cref' := get_cref cava_state in
-		let r' 		:= get_cr cava_state 	 in
-		let RQ		:= get_reqqueue cava_state in
-		let wra 	:= fst (get_addr_RequestQueue RQ) in
-		let rda 	:= snd (get_addr_RequestQueue RQ) in
-		let pop 	:= get_pop cava_state  in
-		match fram_state with
-			| IDLE c cref P =>
-				(s =? STATE_IDLE_VEC) && (c' =? cnt2Bv c) && (cref' =? cref2Bv cref) && (EqMem P rda RQ) &&
-				(EqQueue P wra rda) && (pop == false)
-			| RUNNING c cref P r => 
-  			(s =? STATE_RUN_VEC) && (c' =? cnt2Bv c) && (cref' =? cref2Bv cref) && (EqMem P rda RQ) && 
-				(EqQueue P wra rda) && (EqReq r r') && (pop == (c == OCycle0))
-			| REFRESHING cref P =>
-				(s =? STATE_REF_VEC) && (cref' =? cref2Bv cref) && (EqMem P rda RQ) && 
-				(EqQueue P wra rda) && (pop == false)
-		end.
-
-	(* -------------- Proofs about CmdGen ------------------------------- *)
-	Lemma CmdGen_equiv_idle_to_idle (c : circuit_state CmdGen) cnt cref:
-		(cref =? CNT_REF_PREA) = false ->
-		exists c', step CmdGen c (STATE_IDLE_VEC,true,cnt,cref,REQUEST_NIL) =
-		(c',NOP_VEC).
-	Proof.
-		intros H; simpl in c; destruct_products.
-		eapply ex_intro.
-		cbv [CmdGen]; cbn [step fst snd].
-		simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		fast_simpl_bool; simpl.
-		cbv [CrefPREA_eq].
-		apply BVEq_iff_neq in H.
-		specialize @CavaPreludeProperties.eqb_neq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		apply HH in H; rewrite H VectorSpec.map_id; reflexivity.
-	Qed.
-
-	Lemma CrefPREA_lt_CNT_REF_PREA:
-		CrefPREA_lt CNT_REF_PREA = false.
-	Proof.
-		cbv [CrefPREA_lt]; simpl_ident.
-		unfold greaterThanOrEqual; simpl_ident; unfold greaterThanOrEqualBool.
-		apply /negbF.
-		rewrite {1}/CNT_REF_PREA; rewrite !bitvec_literal_correct.
-		apply /N.leb_spec0; rewrite /CNT_REF_PREA /CNT_REF_WAIT !bitvec_literal_correct.
-		rewrite !Bv2N_N2Bv_sized. { apply N.le_add_r. }
-		all: rewrite /COUNTER_REF_WIDTH WAIT_REF_PW_N.
-		all: try apply N_lt_inj.
-		all: specialize WAIT_REF_PREA_date_WAIT as H; lia.
-	Qed.
-
-	Lemma CmdGen_equiv_idle_to_ref (c : circuit_state CmdGen) cnt cref e:
-		(cref =? CNT_REF_PREA) = true ->
-		exists c', step CmdGen c (STATE_IDLE_VEC,e,cnt,cref,REQUEST_NIL) = (c',PREA_VEC).
-	Proof.
-		intros; simpl in c; destruct_products; eapply ex_intro.
-		cbv [CmdGen]; cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		fast_simpl_bool; simpl; rewrite VectorSpec.map_id.
-		apply BVEq_iff_eq in H; subst cref; rewrite CrefPREA_lt_CNT_REF_PREA !VectorSpec.map_id.
-		rewrite andb_false_r; rewrite /CrefPREA_eq.
-		specialize @CavaPreludeProperties.eqb_eq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		assert (CNT_REF_PREA = CNT_REF_PREA); [done | ]; apply HH in H; by rewrite H.
-	Qed.
-	(* ------------------------------------------------------------------ *)
-
-	(* -------------- Proofs about NextCR ------------------------------- *)
-	Lemma NextCR_equiv (c : circuit_state NextCR) cnt cref tr:
-		exists c', step NextCR c (STATE_IDLE_VEC,true,cnt,cref,tr) = 
-		(c',REQUEST_NIL).
-	Proof.
-		simpl in c; destruct_products.
-		eapply ex_intro.
-		cbv [NextCR LoopInit]; cbn [step fst snd].
-		simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		fast_simpl_bool; by simpl.
-	Qed.
-
-	Lemma NextCR_equiv_IDLE_NE_PREA c cnt cref tr:
-		(cref =? CNT_REF_PREA) = true ->
-		exists c', step NextCR c (STATE_IDLE_VEC,false,cnt,cref,tr) =
-		(c',REQUEST_NIL).
-	Proof.
-		intros; simpl in c; destruct_products; eapply ex_intro.
-		cbv [NextCR LoopInit]; cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		rewrite negb_false andb_true_l; rewrite /Srun //= VectorSpec.map_id.
-		apply BVEq_iff_eq in H; subst cref.
-		by rewrite CrefPREA_lt_CNT_REF_PREA.
-	Qed.
-	(* ------------------------------------------------------------------ *)
-
-	Create HintDb update.
-	Lemma Sidle_true :
-		Sidle STATE_IDLE_VEC = true.
-	Proof.
-		apply CavaPreludeProperties.eqb_refl.
-	Qed.
-	Hint Rewrite @Sidle_true : update.
-
-	Lemma Sref_idle_false :
-		Sref STATE_IDLE_VEC = false.
-	Proof.
-		by apply CavaPreludeProperties.eqb_neq.
-	Qed.
-	Hint Rewrite @Sref_idle_false : update.
-
-	Lemma cnt_equiv (cnt : Bvector COUNTER_WIDTH) :
-		(if CeqWAIT cnt then Bvect_false COUNTER_WIDTH
-		else N2Bv_sized COUNTER_WIDTH (Bv2N cnt + 1)) = cnt2Bv (Next_cycle (Bv2cnt cnt)).
-	Proof.
-		cbv [CeqWAIT].
-		destruct (CavaPrelude.eqb (cnt, CNT_WAIT)) eqn:Heq; rewrite Heq.
-		{ specialize @CavaPreludeProperties.eqb_eq with (t := Vec Bit COUNTER_WIDTH) (x := cnt) as H.
-			apply H in Heq; clear H.
-			unfold Next_cycle; set (Hc := (Bv2cnt cnt).+1 < WAIT); dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-			{ rewrite /CNT_WAIT bitvec_literal_correct in Heq. 
-				rewrite Heq /Bv2cnt //= Bv2N_N2Bv_sized in x.
-					2: { 
-						rewrite /COUNTER_WIDTH; have id := (N2Nat.id 2).
-						rewrite -id Nat2N.inj_pow //= /Pos.to_nat //= WAIT_PW_2.
-						apply: N_lt_inj; apply /ltP; by rewrite subn1 ltn_predL WAIT_pos. 
-					}
-				rewrite Nat2N.id subn1 prednK in x; [ | exact WAIT_pos ]; by rewrite ltnn in x.
-			}
-			{ unfold cnt2Bv,OCycle0; by simpl. }}
-		{ unfold Next_cycle; set (Hc := (Bv2cnt cnt).+1 < WAIT); dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-			{ unfold cnt2Bv; apply f_equal; simpl.
-				rewrite N.add_1_r -(N.succ_pos_pred (Pos.of_succ_nat (N.to_nat (Bv2N cnt)))).
-				apply f_equal; by rewrite predN_of_succ_nat. }
-			{ apply ltn_gt in e,x.
-				rewrite leq_eqVlt in e; move: e => /orP [/eqP e | e].
-				{	have HH := (@eqb_iff_neq (Vec Bit (@COUNTER_WIDTH SYS_CFG FIFO_CFG))).
-					apply HH in Heq. rewrite /CNT_WAIT bitvec_literal_correct in Heq;
-					rewrite -(N2Bv_sized_Bv2N (@COUNTER_WIDTH SYS_CFG FIFO_CFG) cnt) in Heq.
-					apply N2Bv_sized_neq_if in Heq.
-					by rewrite e subn1 -pred_Sn N2Nat.id in Heq. }
-				{ specialize ltn_ord with  (n := @WAIT SYS_CFG FIFO_CFG) (i := Ordinal (cnt_bounded cnt)) as H.
-					rewrite //= in H.
-					contradict H; apply /negP; by rewrite -ltnNge. 
-				}
-			}
-		}
-	Qed.
-
-	Lemma cref_equiv (cref : Bvector COUNTER_REF_WIDTH) :
-		(if CrefPREA_eq cref then Bvect_false COUNTER_REF_WIDTH
-		 else N2Bv_sized COUNTER_REF_WIDTH (Bv2N cref + 1)) = cref2Bv (Next_cycle_ref (Bv2cref cref)).
-	Admitted.
-	(* Proof.
-		cbv [CrefPREA_eq].
-		destruct (CavaPrelude.eqb (cref, CNT_REF_PREA)) eqn:Hcref; rewrite Hcref.
-		{ specialize @CavaPreludeProperties.eqb_eq with (t := Vec Bit COUNTER_REF_WIDTH) (x := cref) as H.
-			apply H in Hcref; clear H.
-			unfold Next_cycle_ref; set (Hc := (Bv2cref cref).+1 < WAIT_REF); dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-			{ rewrite /CNT_REF_PREA bitvec_literal_correct in Hcref.
-				rewrite Hcref /Bv2cref //= Bv2N_N2Bv_sized in x.
-					2: { 
-						rewrite /COUNTER_REF_WIDTH; have id := (N2Nat.id 2).
-						rewrite WAIT_REF_PW_N.
-						(* rewrite -id Nat2N.inj_pow //=.  *)
-						(* rewrite /Pos.to_nat //=. WAIT_REF_PW_N. *)
-						apply: N_lt_inj; apply /ltP. 
-						rewrite subn1.
-						specialize WAIT_REF_PREA_date as H.
-						apply ltn_trans with (n := PREA_date); [ | exact WAIT_REF_PREA_date].
-						by rewrite ltn_predL PREA_date_pos.
-					}
-				rewrite Nat2N.id subn1 prednK in x; [ | exact PREA_date_pos ]; by rewrite ltnn in x.
-			}
-			{ unfold cref2Bv,OCycle0; by simpl. }}
-		{ unfold Next_cycle_ref; set (Hc := (Bv2cref cref).+1 < PREA_date); dependent destruction Hc;
-			apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro.
-			{ unfold cref2Bv; apply f_equal; simpl.
-				rewrite N.add_1_r -(N.succ_pos_pred (Pos.of_succ_nat (N.to_nat (Bv2N cref)))).
-				f_equal; by rewrite predN_of_succ_nat. }
-			{ apply ltn_gt in e,x.
-				rewrite leq_eqVlt in e; move: e => /orP [/eqP e | e].
-				{	have HH := (@eqb_iff_neq (Vec Bit (@COUNTER_REF_WIDTH SYS_CFG))).
-					apply HH in Hcref. rewrite /CNT_REF_PREA bitvec_literal_correct in Hcref;
-					rewrite -(N2Bv_sized_Bv2N (@COUNTER_REF_WIDTH SYS_CFG) cref) in Hcref.
-					apply N2Bv_sized_neq_if in Hcref.
-					by rewrite e subn1 -pred_Sn N2Nat.id in Hcref. }
-				{ specialize ltn_ord with (n := PREA_date) (i := Ordinal (cref_bounded cref)) as H.
-					rewrite //= in H.
-					contradict H; apply /negP; by rewrite -ltnNge. 
-				}
-			}
-		}
-	Qed. *)
-
-	(* -------------- Proofs about Update ------------------------------- *)
-	(* Don't try to match it with the next_cycle_ref, but rather something else *)
-	Lemma Update_equiv_idle_idle (c : circuit_state Update) cnt cref :
-		(cref =? CNT_REF_PREA) = false ->
-		let nc := cnt2Bv (Next_cycle (Bv2cnt cnt)) in
-		let ncref := N2Bv_sized COUNTER_REF_WIDTH (Bv2N cref + 1) in
-		snd (step Update c (STATE_IDLE_VEC,true,cnt,cref)) =
-		(STATE_IDLE_VEC,false,nc,ncref).
-	Proof.
-		intros Hcref Hcnt; simpl in c.
-		cbv [cnt2Bv]; unfold Hcnt; clear Hcnt.
-		cbv [Update Update_s Update_e Update_c Update_cref].
-		cbn [step fst snd]; simpl_ident.
-		autorewrite with update; vm_compute (false && _).
-		apply BVEq_iff_neq in Hcref.
-		specialize @CavaPreludeProperties.eqb_neq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		apply pair_equal_spec; split.
-		2: { 
-			rewrite orb_false_l andb_true_l.
-			rewrite /CrefPREA_eq; apply HH in Hcref; by rewrite Hcref.
-		}
-		cbv [CrefPREA_eq]; apply HH in Hcref as Hcref'; rewrite Hcref';
-		vm_compute (false || true && false); simpl; rewrite !VectorSpec.map_id andb_false_r.
-		apply pair_equal_spec; split; [
-			apply pair_equal_spec; split; [ by unfold STATE_IDLE_VEC | reflexivity] | ].
-		vm_compute (orb false false); rewrite orb_false_r; by specialize (cnt_equiv cnt).
-	Qed.
-	
-	Lemma Update_equiv_idle_ref (c : circuit_state Update) cnt cref e:
-		(cref =? CNT_REF_PREA) = true ->
-		let nc := cnt2Bv (Next_cycle (Bv2cnt cnt)) in
-		let ncref := CNT_REF_NIL in
-		exists c', (step Update c (STATE_IDLE_VEC,e,cnt,cref)) = 
-		(c',(STATE_REF_VEC,false,nc,ncref)).
-	Proof.
-		intros Hcref Hcnt; simpl in c; eapply ex_intro.
-		cbv [cnt2Bv]; unfold Hcnt; clear Hcnt.
-		cbv [Update Update_s Update_e Update_c Update_cref].
-		cbn [step fst snd]; simpl_ident.
-		apply pair_equal_spec; split; [reflexivity | ].
-		autorewrite with update; vm_compute (false && _).
-		apply BVEq_iff_eq in Hcref.
-		specialize @CavaPreludeProperties.eqb_eq with (t := Vec Bit (@COUNTER_REF_WIDTH SYS_CFG FIFO_CFG)) as HH.
-		apply pair_equal_spec; split. 
-		2: {
-			rewrite orb_false_l andb_true_l.
-			rewrite /CrefPREA_eq; apply HH in Hcref; by rewrite Hcref. 
-		}
-		cbv [CrefPREA_eq]; apply HH in Hcref as Hcref'; rewrite Hcref';
-		vm_compute (false || true && false); simpl; rewrite !VectorSpec.map_id.
-		apply pair_equal_spec; split.
-		2: {	
-			vm_compute (orb false false); rewrite orb_false_r. 
-			destruct e; [rewrite negb_true | rewrite negb_false].
-			{ rewrite andb_false_r orb_false_r; by specialize (cnt_equiv cnt). }
-			{ rewrite andb_true_r.
-				destruct (CrefPREA_lt cref) eqn:Hbug.
-				{ by rewrite Hcref CrefPREA_lt_CNT_REF_PREA in Hbug. }
-				{ rewrite orb_false_r; by specialize (cnt_equiv cnt). }
-			}
-		}
-		apply pair_equal_spec; split; [ done | ].
-		rewrite Hcref CrefPREA_lt_CNT_REF_PREA; by rewrite andb_false_l.
-	Qed.
-	(* ------------------------------------------------------------------ *)
-	
-	(* -------------- Proofs about FullEmptyLogic ------------------------------- *)
-	Lemma FEL_emp_equiv (c : circuit_state FullEmptyLogic) wra rda :
-		wra = rda -> exists c', step FullEmptyLogic c (wra,rda) = (c',(false,true)).
-	Proof.
-		intros H; eapply ex_intro.
-		cbv [FullEmptyLogic FullLogic EmptyLogic Subtractor subtractor dropr EqFULL FullVEC unpackV]; 
-		cbn [step]; simpl_ret; cbn [fst snd].
-		apply pair_equal_spec; split; [ reflexivity | ].
-		apply pair_equal_spec; split; [ | by rewrite H CavaPreludeProperties.eqb_refl ].
-		rewrite inv_correct; cbv [bind].
-		rewrite fullAdder_cin; cbv [unpackV]; simpl_ret.
-		destruct (one) eqn:Hone; [ | discriminate].
-		destruct ((Bv2N rda) <= (Bv2N wra)) eqn:Hleq;
-		[ | by rewrite H leqnn in Hleq ].
-		assert (N.sub (Bv2N wra) (Bv2N rda) = 0%N); [ by rewrite H N.sub_diag | ].
-		rewrite H0 !bitvec_literal_correct.
-		set (N := N.sub _ _).
-		specialize N2Bv_sized_queuemax_neq0 as H2.
-		specialize @CavaPreludeProperties.eqb_neq with (t := Vec Bit (@ADDR_WIDTH CAVA_SYS)) 
-			(x := N2Bv_sized ADDR_WIDTH 0) (y := N2Bv_sized ADDR_WIDTH N) as HH.
-		by apply HH in H2.
-	Qed.
-
-	Lemma FEL_nemp_wrap1_equiv (c : circuit_state FullEmptyLogic) (wra rda : Bvector ADDR_WIDTH) :
-		let wrap1 := N2Bv_sized ADDR_WIDTH (Bv2N wra + 1) in
-		wra = rda -> exists c' f', step FullEmptyLogic c (wrap1,rda) = (c',(f',false)).
-	Proof.
-		intros; repeat eapply ex_intro; unfold wrap1.
-		cbv [FullEmptyLogic FullLogic EmptyLogic Subtractor subtractor dropr EqFULL FullVEC unpackV]; 
-		cbn [step]; simpl_ret; cbn [fst snd].
-		apply pair_equal_spec; split; [ reflexivity | ].
-		apply pair_equal_spec; split; [ reflexivity | ].
-		apply CavaPreludeProperties.eqb_neq; rewrite H.
-		apply N2Bv_sized_plusone_diff; unfold ADDR_WIDTH.
-		specialize QUEUE_MAX_SIZE_GT_1 as HQ; apply Nat.log2_pos in HQ.
-		by move: HQ => /ltP HQ.
-	Qed.
-
-	Lemma FEL_nemp_NF_equiv (c : circuit_state FullEmptyLogic) (wra rda : Bvector ADDR_WIDTH) :
-		~~ (fullQueue wra rda) ->
-		wra <> rda -> exists c', step FullEmptyLogic c (wra,rda) = (c',(false,false)).
-	Proof.
-		intros NF H; eapply ex_intro.
-		rewrite /fullQueue in NF.
-		cbv [FullEmptyLogic FullLogic EmptyLogic Subtractor subtractor dropr EqFULL FullVEC unpackV]; 
-		cbn [step]; simpl_ret; cbn [fst snd].
-		apply pair_equal_spec; split; [ reflexivity | ].
-		apply pair_equal_spec; split; [  | by apply CavaPreludeProperties.eqb_neq ].
-		rewrite bitvec_literal_correct. 
-		rewrite fullAdder_cin; destruct (one) eqn:Hbug; try discriminate; clear Hbug.
-		cbv [unpackV].
-		destruct (_ <= _) eqn:Hleq; apply CavaPreludeProperties.eqb_neq.
-		{ set (xx := (Bv2N wra - Bv2N rda)%N); fold xx in NF.
-			set (yy := ((N.of_nat QUEUE_MAX_SIZE - 1)%N)); fold yy in NF.
-			assert (N.size_nat xx <= ADDR_WIDTH);
-			[ apply size_nat_sub_leq; by apply leq_Nle in Hleq | ].
-			assert (N.size_nat yy <= ADDR_WIDTH);
-			[ unfold ADDR_WIDTH, yy; by apply size_nat_qms | ].
-			apply N2Bv_sized_neq_iff; try done; by apply /eqP.	
-		}
-		{	rewrite {3}/ADDR_WIDTH QUEUE_MAX_SIZE_PW2; apply N2Bv_sized_neq_iff.
-			{ assert (Bv2N rda > Bv2N wra); [ lia | ].
-				apply size_nat_qms_sub; by apply ltn_Ntn in H0. 
-			}
-			{ unfold ADDR_WIDTH; by apply size_nat_qms. }
-			specialize add_1_sub1 with (x := N.of_nat (@QUEUE_MAX_SIZE CAVA_SYS)) as HH.
-			rewrite HH in NF; [ | exact QUEUE_MAX_SIZE_GT_0_N].
-			apply /eqP; exact NF.
-		}
-	Qed.
-
-	Lemma FEL_NF_equiv (c : circuit_state FullEmptyLogic) (wra rda : Bvector ADDR_WIDTH) :
-		~~ (fullQueue wra rda) -> 
-		exists c' e', step FullEmptyLogic c (wra,rda) = (c',(false,e')).
-	Proof.
-		intros NF; unfold fullQueue in NF; repeat eapply ex_intro.
-		cbv [FullEmptyLogic]; cbn [step]; simpl_ret; cbn [fst snd].
-		apply pair_equal_spec; split; [reflexivity |  ].
-		apply pair_equal_spec; split; [ | reflexivity ].
-		cbv [dropr subtractor EqFULL FullVEC unpackV]; simpl_ident.
-		destruct ((Bv2N rda) <= (Bv2N wra)) eqn:Hleq;
-		destruct (one) eqn:Hone; try discriminate;
-		rewrite fullAdder_cin Hleq;
-		apply CavaPreludeProperties.eqb_neq; move: NF => /eqP NF.
-		{ set (xx := (Bv2N wra - Bv2N rda)%N); fold xx in NF.
-			set (yy := ((N.of_nat QUEUE_MAX_SIZE - 1)%N)); fold yy in NF.
-			assert (N.size_nat xx <= ADDR_WIDTH);
-			[ apply size_nat_sub_leq; by apply leq_Nle in Hleq | ].
-			assert (N.size_nat yy <= ADDR_WIDTH);
-			[ unfold ADDR_WIDTH, yy; by apply size_nat_qms | ].
-			apply N2Bv_sized_neq_iff; try done; by apply /eqP.	
-		}
-		{	rewrite {3}/ADDR_WIDTH QUEUE_MAX_SIZE_PW2; apply N2Bv_sized_neq_iff.
-			{ assert (Bv2N rda > Bv2N wra) as H; [ lia | ].
-				apply size_nat_qms_sub; by apply ltn_Ntn in H.
-			}
-			{ unfold ADDR_WIDTH; by apply size_nat_qms. }
-			specialize add_1_sub1 with (x := N.of_nat (@QUEUE_MAX_SIZE CAVA_SYS)) as HH.
-			by rewrite HH in NF; [ | exact QUEUE_MAX_SIZE_GT_0_N].
-		}
-	Qed.
-	(* ------------------------------------------------------------------ *)
-
-	Lemma incrn_pointr_true_equiv (c : circuit_state incr_pointr) ad :
-		step incr_pointr c (ad,true) =
-		(tt,N2Bv_sized ADDR_WIDTH (Bv2N ad + 1)).
-	Proof.
-		cbv [incr_pointr step] ; by simpl_ident.
-	Qed.
-
-	Lemma incrn_pointr_false_equiv (c : circuit_state incr_pointr) ad :
-		step incr_pointr c (ad,false) = (tt,ad).
-	Proof.
-		cbv [incr_pointr step] ; by simpl_ident.
-	Qed.
-
-	Create HintDb get_state.
-	Hint Unfold get_memcells : get_state.
-	Hint Unfold get_addr_RequestQueue : get_state.
-	Hint Unfold get_mem_RequestQueue : get_state.
-	Hint Unfold get_memcells_RequestQueue : get_state.
-	Hint Unfold get_mem : get_state.
-
-	(* the not full could come either be satisfies from the not full hypothesis 
-		 or from wra = rda *)
-	Lemma RQ_fst_pushT_popF_NF (c : circuit_state RequestQueue') c_req :
-		let '(wra,rda)     := get_addr_RequestQueue c in
-		let S 				 	   := get_memcells_RequestQueue c in 
-		let wra_idx 			 := N.to_nat (Bv2N wra) in
-		let memcells_spec  := Cells_read true wra_idx c_req S in
-		~~ (fullQueue wra rda) -> exists c',
-		((Cells_data (get_memcells_RequestQueue c') = memcells_spec) /\
-		(fst (get_addr_RequestQueue c')) = (N2Bv_sized ADDR_WIDTH (Bv2N wra + 1)) /\ 
-		(snd (get_addr_RequestQueue c')) = rda) /\
-		fst (step RequestQueue' c (true,c_req,false)) = c'.
-	Admitted.
-		(* simpl in c; destruct_products.
-		unfold get_addr_RequestQueue; intros Hfull; eapply ex_intro; split; [ | reflexivity].
-		set (p := step RequestQueue' _ _).
-		cbv [RequestQueue' LoopInit fork2] in p.
-		cbn [step] in p; cbn [fst snd] in p; simpl_ret_H p;z cbv [fst snd] in p.
-		specialize FEL_NF_equiv with (c := (u17, (u19, u20, u18), u16)) 
-		(rda := t0) (wra := t) as H; apply H in Hfull; clear H.
-		destruct Hfull as [cs_FEL' [empty_o Hfull]].
-		unfold p; clear p; rewrite Hfull.
-		cbn [fst snd bind inv and2 or2]; fast_simpl_bool.
-		rewrite (surjective_pairing (step memqueue' _ _)).
-		rewrite incrn_pointr_true_equiv incrn_pointr_false_equiv.
-		rewrite (surjective_pairing (step FullEmptyLogic _ _)).
-		set (fel := step FullEmptyLogic _ _).
-		split.
-		{ simpl in fel; unfold fel; cbv [snd fst].
-			cbv [get_memcells_RequestQueue get_mem_RequestQueue get_memcells].
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end.
-			cbv [memqueue' Memory' mem_write mem_read]; cbn [step fst snd]; simpl_ident; cbv [fst snd].
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end.
-			cbv [fst snd].
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end.
-			fold mem_cells_.
-			specialize @Cells_matchX with (T := Vec Bit (@REQUEST_WIDTH CAVA_SYS)) 
-			(W := @ADDR_WIDTH CAVA_SYS) (N := (Nat.pow 2 (@ADDR_WIDTH CAVA_SYS))) (I := InitMem) 
-			(S0 := c) (we := true) (wd := c_req) (wa := (N.to_nat (Bv2N t))) as HH.
-			rewrite -HH; [reflexivity | | ].
-			all: admit. 
-		}
-		split; by simpl.
-	Admitted. *)
-
-	(* Ignoring the full signal because it just goes to the output *)
-	Lemma RQ_snd_pushT_empty (c : circuit_state RequestQueue') c_req pop :
-		let '(wra,rda) := get_addr_RequestQueue c in
-		let S := get_memcells_RequestQueue c in 
-		let rda_idx := N.to_nat (Bv2N rda) in
-		let wra_idx := N.to_nat (Bv2N wra) in
-		let memcells' := Cells_read true wra_idx c_req S in
-		let mem_val := nth_default (req_null) rda_idx memcells' in
-		wra = rda -> exists f',
-		snd (step RequestQueue' c (true,c_req,pop)) = (f',mem_val,true).
-	Admitted.
-		(* simpl in c; destruct_products; rename t0 into rda, t into wra.
-		autounfold with get_state; intros.
-		cbv [RequestQueue' LoopInit fork2]; simpl_ret; cbn [step fst snd].
-		eapply FEL_emp_equiv with (c := (u17,(u19,u20,u18), u16)) in H as HH.
-		destruct HH as [cs_FEL HH]; rewrite HH.
-		cbn [fst snd bind inv and2 or2].
-		rewrite (surjective_pairing (step memqueue' (u12,c,u11) _)).
-		cbv [fst snd]; fast_simpl_bool.
-		rewrite incrn_pointr_true_equiv if_same incrn_pointr_false_equiv; clear HH.
-		eapply FEL_nemp_wrap1_equiv with (c := (u4, (u6, u7, u5), u3)) in H as HH.
-		destruct HH as [cs_FELL [full_o HH]]; rewrite HH; clear HH.
-		eapply ex_intro.
-		apply pair_equal_spec; split; [ | reflexivity ].
-		apply pair_equal_spec; split; [ reflexivity | ].
-		cbv [memqueue' Memory' mem_write mem_read].
-		cbn [step fst snd]; simpl_ret.
-		rewrite (surjective_pairing (step (mem_cells _ _ _ _) c _)).
-		specialize @Cells_data_match with (T := Vec Bit (@REQUEST_WIDTH CAVA_SYS)) 
-		(W := @ADDR_WIDTH CAVA_SYS) (N := (Nat.pow 2 (@ADDR_WIDTH CAVA_SYS))) (I := InitMem) 
-		(S0 := c) (we := true) (wa := (N.to_nat (Bv2N wra))) (wd := c_req) as HH.
-		rewrite -HH.
-		{	cbv [indexAt indexConst defaultCombValue].
-			cbv [unpackV bind]; simpl_ret.
-			rewrite nth_0; simpl; unfold req_null.
-			reflexivity. 
-		}
-		all: admit.
-	Admitted. *)
-
-	Lemma RQ_snd_pushT_popF_NF_nempty (c : circuit_state RequestQueue') c_req:
-		let '(wra,rda) := get_addr_RequestQueue c in
-		let S := get_memcells_RequestQueue c in 
-		let rda_idx := N.to_nat (Bv2N rda) in
-		let wra_idx := N.to_nat (Bv2N wra) in
-		let memcells' := Cells_read true wra_idx c_req S in
-		let mem_val := nth_default (req_null) rda_idx memcells' in
-		~~ (fullQueue wra rda) -> wra <> rda -> exists full_o,
-		snd (step RequestQueue' c (true,c_req,false)) = (full_o,mem_val,false).
-	Admitted.
-		(* simpl in c; destruct_products; rename t0 into rda, t into wra.
-		autounfold with get_state; intros.
-		cbv [RequestQueue' LoopInit fork2]; simpl_ret; cbn [step fst snd].
-		apply FEL_nemp_NF_equiv with (c := (u17,(u19,u20,u18), u16)) in H as HH; [ | done].
-		destruct HH as [cs_FEL HH]. 
-		rewrite HH.
-		cbn [fst snd bind inv and2 or2]; fast_simpl_bool.
-		rewrite (surjective_pairing (step memqueue' (u12,c,u11) _)).
-		cbv [fst snd]; fast_simpl_bool.
-		rewrite incrn_pointr_true_equiv.
-		rewrite incrn_pointr_false_equiv; clear HH.
-		(* The second logic doesn't really matter much *)
-		rewrite (surjective_pairing (step FullEmptyLogic _ _)).
-		eapply ex_intro.
-		apply pair_equal_spec; split; [ | reflexivity].
-		apply pair_equal_spec; split; [ reflexivity | ].
-		destruct_pair_let.
-		cbv [memqueue' Memory' mem_write mem_read].
-		cbn [step fst snd]; simpl_ret.
-		rewrite (surjective_pairing (step (mem_cells _ _ _ _) c _)).
-		specialize @Cells_data_match with (T := Vec Bit (@REQUEST_WIDTH CAVA_SYS)) 
-		(W := @ADDR_WIDTH CAVA_SYS) (N := (Nat.pow 2 (@ADDR_WIDTH CAVA_SYS))) (I := InitMem) 
-		(S0 := c) (we := true) (wa := (N.to_nat (Bv2N wra))) (wd := c_req) as HH.
-		rewrite -HH //=.
-		all: admit.
-	Admitted. *)
-
-	(* For the queue part *)
-	Lemma NF_ad_diff wra rda:
-		~~ (fullQueue wra rda) -> wra <> rda ->
-		N2Bv_sized ADDR_WIDTH (Bv2N wra + 1) <> rda.
-	Admitted.
-
-	Theorem SM_Eq_1b (t : nat) (c_state : State_t) c0 c1 (c_req : Bvector REQUEST_WIDTH) r0 r1:
-		(nat_of_ord c1 == PREA_date - 1) = true ->
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in 
-		R != nullreq -> EqReq R c_req -> State_Eq (IDLE c0 c1 (r0 :: r1)) c_state ->
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 (r0 :: r1)) in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Proof.
-		intros Href_prea f_state R NF EqR H; unfold FIFOSM.
-		unfold R in NF; specialize (HaltIfFull t c_state) as NFULL.
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		cbv [get_wra get_rda] in NFULL; rewrite NF in NFULL.
-		rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda, b into pop.
-		rewrite /State_Eq in H.
-		cbv [get_st get_cnt get_cref get_reqqueue get_addr_RequestQueue get_pop] in H.
-		unfold EqMem in H; cbv [get_memcells_RequestQueue get_mem_RequestQueue get_memcells get_cr] in H.
-		(* unfold EqQueue in H; cbn [fst snd] in H. *)
-		move: H => /andP [/andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] Hadr] /eqP EqPop].
-		cbn [fst snd] in Hadr.
-		simpl in Hadr.
-
-		destruct r1 eqn:Hr1; simpl in Hadr.
-		destruct (r0 == nullreq) eqn:Hr0.
-
-		(* apply negb_true_iff in Hadr; apply BVEq_iff_neq in Hadr. *)
-		apply BVEq_iff_eq in EqS, EqCnt, EqCref; subst s cnt cref pop.
-		cbv [LoopInit]; cbn [step fst snd]; simpl_ret.
-
-		rewrite (surjective_pairing (step RequestQueue' _ _)).
-		specialize (RQ_snd_pushT_popF_NF_nempty ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req) as S.
-		cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S.
-		apply S in NFULL as S'; [ | done]; clear S; destruct S' as [full_o H].
-		rewrite H. clear H; cbn [fst snd].
-
-		set tr := nth_default req_null (N.to_nat (Bv2N rda)) _.
-		specialize (NextCR_equiv_IDLE_NE_PREA (u9, (u10, cr)) (cnt2Bv c0) (cref2Bv c1) tr) as S.
-		assert ((cref2Bv c1 =? CNT_REF_PREA) = true) as Href_prea_.
-		{ move: Href_prea => /eqP Href_prea; apply BVEq_iff_eq.
-			rewrite /cref2Bv /CNT_REF_PREA bitvec_literal_correct; f_equal.
-			by rewrite Href_prea. 
-		}
-		apply S in Href_prea_ as S'; clear S; destruct S' as [cs_nextcr H].
-		rewrite H.
-
-		cbn [fst snd]; clear H.
-		apply (CmdGen_equiv_idle_to_ref u6 (cnt2Bv c0) (cref2Bv c1) false) in Href_prea_ as H.
-		destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd].
-
-		apply (Update_equiv_idle_ref u4 (cnt2Bv c0) (cref2Bv c1) false) in Href_prea_ as H.
-		destruct H as [cs_update H]; rewrite H; clear H; cbn [fst snd].
-
-		rewrite /Next_state Href_prea /State_Eq.
-		specialize RQ_fst_pushT_popF_NF with (c := (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra))) (c_req := c_req) as S.
-		apply S in NFULL as H; clear S.
-		destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']].
-		cbv [get_st get_cref get_reqqueue get_addr_RequestQueue get_pop].
-
-		apply /andP; split.
-		2 : exact EqReqNil.
-		apply /andP; split.
-		2 : unfold EqCmd; by apply BVEq_iff_eq.
-		apply /andP; split.
-		2: { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)); cbv [get_pop];
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end; simpl; trivial. }
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H Hwra' Hrda'.
-			cbv [EqQueue Enqueue]; simpl.
-			apply NF_ad_diff in NFULL; [ | done].
-			apply /negPf; by apply BVEq_iff_neq.
-		}
-		apply /andP; split.
-		2 : {
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H Hwra' Hrda'.
-			cbn [fst snd]; unfold EqMem, Enqueue; simpl; rewrite Hrw.
-			cbv [get_memcells_RequestQueue get_mem_RequestQueue get_memcells].
-			unfold EqMem_ in Mem.
-			destruct (r0 == _); fold @EqMem_ in Mem.
-			{
-				admit.
-			}
-			{ assert (((size (r1 ++ [R])).+1 == 1) = false); [ admit | ].
-				rewrite H0.
-				destruct (size (r0 :: r1) == 1).
-				{ simpl.
-
-				}
-				move: Mem => /andP [EqR_ Mem].
-				apply /andP; split.
-				{ admit. }
-				{ admit. }
-			}
-
-			destruct (N2Bv_sized ADDR_WIDTH (Bv2N rda + 1) =? wra) eqn:HH.
-			{ apply BVEq_iff_eq in HH; rewrite HH.
-				assert ((wra =? N2Bv_sized ADDR_WIDTH (Bv2N wra + 1)) = false) as H0; [admit | ].
-				rewrite H0.
-				destruct (r0 == _).
-				{ fold @EqMem_ in Mem.
-					admit. }
-				{ apply /andP; split.
-					{ admit. (* (Cells_data c)[@rda] = (Cells_read ...)[@rda] *) }
-					{ admit. }}}
-			{ assert ((N2Bv_sized ADDR_WIDTH (Bv2N rda + 1) =? N2Bv_sized ADDR_WIDTH (Bv2N wra + 1)) = false) as H0; [admit | ].
-				rewrite H0.
-				destruct (r0 == _); fold @EqMem_ in Mem.
-				{ admit. }
-				{ }
-
-			}
-			assert ((N2Bv_sized ADDR_WIDTH (Bv2N rda + 1) =? N2Bv_sized ADDR_WIDTH (Bv2N wra + 1)) = false). { admit. }
-			rewrite H0.
-			destruct (N2Bv_sized ADDR_WIDTH (Bv2N rda + 1) =? wra) eqn:HH.
-			{ destruct (r0 == _).
-				{ 
-
-				}
-
-			}
-			destruct (N2Bv_sized ADDR_WIDTH (Bv2N rda + 1) =? _).
-			unfold EqMem_ in Mem.
-			destruct (r0 == nullreq).
-			2: {
-				move: Mem => /andP [EqR_ Mem]. 
-				apply /andP; split. { (* EqR_ *) admit. }
-				fold @EqMem_ in Mem.
-				assert (EqMem_)
-				rewrite cats1 /rcons.
-				admit.
-			}
-			fold @EqMem_ in Mem.
-			admit.
-		}
-		apply /andP; split.
-		2 : { 
-			cbv [get_cref].
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H //= VectorSpec.map_id.
-			destruct_pair_let.
-			rewrite /cref2Bv /OCycle0REF //=; by apply BVEq_iff_eq.
-		}
-		cbv [get_st]; rewrite (surjective_pairing (step RequestQueue' _ _)) H //=; destruct_pair_let.
-		by [].
-	Admitted.
-
-	Theorem SM_Eq_1a (t : nat) (c_state : State_t) c0 c1 (c_req : Bvector REQUEST_WIDTH) :
-		(nat_of_ord c1 == PREA_date - 1) = true ->
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in 
-		R != nullreq -> EqReq R c_req -> State_Eq (IDLE c0 c1 []) c_state ->
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 []) in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Proof.
-		intros Href_prea f_state R NF EqR H; unfold FIFOSM.
-		unfold R in NF; specialize (HaltIfFull t c_state) as NFULL.
-		unfold State_t in c_state; simpl in c_state; destruct_products.
-		cbv [get_wra get_rda] in NFULL; rewrite NF in NFULL.
-		rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda, b into pop.
-		rewrite /State_Eq in H.
-		cbv [get_st get_cnt get_cref get_reqqueue get_addr_RequestQueue get_pop] in H.
-		unfold EqMem in H; cbv [get_memcells_RequestQueue get_mem_RequestQueue get_memcells get_cr] in H.
-		unfold EqQueue in H; cbn [fst snd] in H.
-		move: H => /andP [/andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] Hadr] /eqP EqPop].
-		apply BVEq_iff_eq in EqS, EqCnt, EqCref, Hadr; subst s cnt cref pop.
-		cbv [LoopInit]; cbn [step fst snd]; simpl_ret.
-
-		rewrite (surjective_pairing (step RequestQueue' _ _)).
-		specialize (RQ_snd_pushT_empty ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req false) as S.
-		cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S.
-		apply S in Hadr as H; clear S.
-		destruct H as [full_o H]; rewrite H.
-		clear H; cbn [fst snd].
-
-		set tr := nth_default req_null (N.to_nat (Bv2N rda)) _.
-		specialize NextCR_equiv with (c := (u9, (u10, cr))) (cnt := cnt2Bv c0) 
-		(cref := cref2Bv c1) (tr := tr) as [cs_nextcr H].
-		rewrite H; cbv [fst]; clear H.
-
-		cbn [snd].
-		assert ((cref2Bv c1 =? CNT_REF_PREA) = true) as Href_prea_.
-		{ move: Href_prea => /eqP Href_prea; apply BVEq_iff_eq.
-			rewrite /cref2Bv /CNT_REF_PREA bitvec_literal_correct; f_equal.
-			by rewrite Href_prea. 
-		}
-		apply (CmdGen_equiv_idle_to_ref u6 (cnt2Bv c0)) in Href_prea_ as H.
-		destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd].
-
-		apply (Update_equiv_idle_ref u4 (cnt2Bv c0) (cref2Bv c1)) in Href_prea_ as H.
-		destruct H as [cs_update H]; rewrite H; clear H.
-
-		rewrite /Next_state Href_prea /State_Eq.
-		specialize RQ_fst_pushT_popF_NF with (c := (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, 
-		(u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra))) (c_req := c_req) as S.
-		apply S in NFULL as H; clear S.
-		destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']].
-		cbv [get_st get_cref get_reqqueue get_addr_RequestQueue get_pop].
-
-		apply /andP; split.
-		2 : exact EqReqNil.
-		apply /andP; split.
-		2 : unfold EqCmd; by apply BVEq_iff_eq.
-		apply /andP; split.
-		2: { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)); cbv [get_pop];
-			repeat lazymatch goal with
-			| |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p)
-			end; simpl; trivial. }
-		apply /andP; split.
-		2 : { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H Hwra' Hrda'.
-			cbv [EqQueue Enqueue]; simpl.
-			unfold R; rewrite NF.
-			apply /negPf; apply BVEq_iff_neq; rewrite Hadr N.add_1_r.
-			specialize N2Bv_sized_neq_succ with (n := @ADDR_WIDTH CAVA_SYS) (x := Bv2N rda) as HH.
-			rewrite N2Bv_sized_Bv2N in HH; specialize ADDR_WIDTH_pos as H0; move: H0 => /ltP H0.
-			by apply HH in H0. }
-		apply /andP; split.
-		2 : { 
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H Hrda'.
-			unfold EqMem, Enqueue; simpl; rewrite andb_true_r.
-			destruct (R == _) eqn:HH; [ trivial | ].
-			rewrite Hrw; cbv [get_memcells_RequestQueue get_mem_RequestQueue get_memcells].
-			specialize (@nth_cells_read (Vec Bit REQUEST_WIDTH) ADDR_WIDTH InitMem rda c_req c) as H'.
-			rewrite Hadr H'; exact EqR.
-		}
-		apply /andP; split.
-		2 : { 
-			cbv [get_cref].
-			rewrite (surjective_pairing (step RequestQueue' _ _)) H //= VectorSpec.map_id.
-			destruct_pair_let.
-			rewrite /cref2Bv /OCycle0REF //=; by apply BVEq_iff_eq.
-		}
-		cbv [get_st]; rewrite (surjective_pairing (step RequestQueue' _ _)) H //=; destruct_pair_let.
-		by [].
-	Qed.	
-
-	(* Have to add the full case *)
-	(* REF bounded with PREA_date or arbitrary parameter *)
-	(* if REF is bounded with PREA_date, a problem with cref + WAIT *)
-	(* try bound with random parameter, but will not be correspondent to Next_cycle *)
-	Theorem SM_Eq_NFULL (t : nat) (c_state : State_t) (f_req: Request_t) 
-		(c_req : Bvector REQUEST_WIDTH) (push : bool) :
-		let f_state := (HW_Default_arbitrate t).(Implementation_State) in
-		let R := HW_Arrival_at t in
-		R != nullreq -> EqReq R c_req -> State_Eq f_state c_state -> 
-		let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R f_state in
-		let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM c_state (true,c_req) in
-		(State_Eq f_nextstate c_nextstate) &&
-		(EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o).
-	Proof.
-		destruct (f_state) eqn:Hf_state. 
-		{ destruct (nat_of_ord c0 == PREA_date - 1) eqn:Hcref_prea; move: Hcref_prea.
-			{ destruct r eqn:HR.
-				{ apply SM_Eq_1a. }
-				{ admit. (* Case 1b: IDLE -> REFRESHING (non-empty queue)*) }
-			}
-			{ destruct (c1 + WAIT < PREA_date) eqn:Hcref_service.
-				{ destruct r eqn:HR.
-					{ admit. (* Case 2a: IDLE -> IDLE (empty queue) *)}
-					{ admit. (* Case 2b: IDLE -> RUNNING (non-empty queue) *)}
-				}
-				{ destruct r eqn:HR.
-					{ admit. (* Case 3a: IDLE -> IDLE (empty queue )*)}
-					{ admit. (* Case 3b: IDLE -> IDLE (non empty queue) *) }
-				}
-			}
-		}
-		{ destruct (nat_of_ord c0 == OACT_date) eqn:Hact_date.
-			{ destruct r eqn:HR.
-				{ admit. (* Case 4a : RUNNING -> RUNNING (ACT) (empty queue) *) }
-				{ admit. (* Case 4b : RUNNING -> RUNNING (ACT) (non empty queue) *)}
-			}
-			{ destruct (nat_of_ord c0 == OCAS_date) eqn:Hcas_date.
-				{ destruct r eqn:HR.
-					{ admit. (* Case 5a : RUNNING -> RUNNING (CAS) (empty queue )*) }
-					{ admit. (* Case 5b : RUNNING -> RUNNING (CAS) (non-empty queue) *)}	 
-				}
-				{ destruct (nat_of_ord c0 == WAIT.-1) eqn:Hend_date.
-					{ destruct r eqn:HR.
-						{ admit. (* Case 6a : RUNNING -> IDLE (empty queue) *) }
-						{ admit. (* Case 6b : RUNNING -> IDLE (non empty queue) *)}
-					}
-					{ destruct r eqn:HR.
-						{ admit. (* Case 7a : RUNNING -> RUNNING (empty queue) *) } 
-						{ admit. (* Case 7b : RUNNING -> RUNNING (non empty queue) *) }
-					}
-				}
-			}
-		}
-		{ destruct (nat_of_ord c0 == OREF_date) eqn:Href_date.
-			{ destruct r eqn:HR. 
-				{ admit. }
-				{ admit. }
-			}
-			{ destruct (nat_of_ord c0 == OENDREF_date) eqn:Hendref_date.
-
-			}
-
-		}
-
-End EquivalenceProof.
\ No newline at end of file
diff --git a/framework/CavaDRAM/_CoqProject b/framework/CavaDRAM/_CoqProject
index e49a740..fb83b19 100644
--- a/framework/CavaDRAM/_CoqProject
+++ b/framework/CavaDRAM/_CoqProject
@@ -1,20 +1,20 @@
 INSTALLDEFAULTROOT = CavaDRAM
 -R . CavaDRAM
 -R /home/felipe/PHD/repository/cleanup/sdram/framework/DRAM DRAM
--R /home/felipe/PHD/tools/cava/silveroakrecompiled/cava/Cava Cava
--R /home/felipe/PHD/tools/cava/silveroakrecompiled/third_party/coq-ext-lib/theories ExtLib
--R /home/felipe/PHD/tools/cava/silveroakrecompiled/third_party/bedrock2/deps/coqutil/src/coqutil coqutil
+-R /home/felipe/PHD/tools/cava/silveroakrecompiled_coq817/silveroak/cava/Cava Cava
+-R /home/felipe/PHD/tools/cava/silveroakrecompiled_coq817/silveroak/third_party/coq-ext-lib/theories ExtLib
+-R /home/felipe/PHD/tools/cava/silveroakrecompiled_coq817/silveroak/third_party/bedrock2/deps/coqutil/src/coqutil coqutil
 
-Lib/UtilSM.v
 Lib/Util.v
 Lib/Step.v
+Lib/Memories/Memory.v
+Lib/UtilSM.v
+Lib/Subtractor/CavaSubtractor.v
 
-Core/Memory.v
 Core/CavaSystem.v
-Core/CavaSubtractor.v
-Core/CavaMemory.v
-Core/CavaReqQueue.v
-Core/CavaReqQueueProperties.v
 Core/CavaCommonInstances.v
+Core/CavaReqQueue.v
+
+Implementations/CavaFIFOREF/CavaFIFOREF.v
+
 
-CavaFIFOREF/CavaFIFOREF.v
diff --git a/framework/CavaDRAM/gencode/fifo_gencode/CavaFIFOSV.hs b/framework/CavaDRAM/gencode/fifo_gencode/CavaFIFOSV.hs
deleted file mode 100644
index 6a4d71d..0000000
--- a/framework/CavaDRAM/gencode/fifo_gencode/CavaFIFOSV.hs
+++ /dev/null
@@ -1,14 +0,0 @@
-module Main where
-
-import Cava2SystemVerilog
-import CavaMemory
-import CavaReqQueue
-import CavaFIFOREF
-
-main :: IO ()
-main = do
-	writeSystemVerilog sm_netlist ;;
-	-- writeTestBench sm_tb
-	-- 
-	-- writeTestBench queue_tb ;;
-	-- writeSystemVerilog queue_netlist
\ No newline at end of file
diff --git a/framework/CavaDRAM/gencode/fifo_gencode/cava2sv.sh b/framework/CavaDRAM/gencode/fifo_gencode/cava2sv.sh
deleted file mode 100755
index ae53342..0000000
--- a/framework/CavaDRAM/gencode/fifo_gencode/cava2sv.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-
-cava_src_dir="/home/felipe/PHD/tools/cava/silveroak/cava"
-cava_hdl_dir=${cava_src_dir}/Cava2HDL
-
-echo "Import missing haskell libraries"
-sed -i '3iimport qualified Data.Bits' Ascii.hs ByteVector.hs
-sed -i '3iimport qualified Data.Char' Ascii.hs ByteVector.hs 
-
-echo "Generating SV files..."
-ghc -i${cava_src_dir}:${cava_hdl_dir} CavaFIFOSV.hs
-./CavaFIFOSV
diff --git a/framework/CavaDRAM/gencode/tdm_gencode/CavaTDMSV.hs b/framework/CavaDRAM/gencode/tdm_gencode/CavaTDMSV.hs
deleted file mode 100644
index 00ae1dc..0000000
--- a/framework/CavaDRAM/gencode/tdm_gencode/CavaTDMSV.hs
+++ /dev/null
@@ -1,14 +0,0 @@
-module Main where
-
-import Cava2SystemVerilog
-import CavaMemory
-import CavaReqQueue
-import CavaTDMREF
-
-main :: IO ()
-main = do
-	writeSystemVerilog tdm_netlist ;;
-	-- writeTestBench sm_tb
-	-- 
-	-- writeTestBench queue_tb ;;
-	-- writeSystemVerilog queue_netlist
\ No newline at end of file
diff --git a/framework/CavaDRAM/gencode/tdm_gencode/cava2sv.sh b/framework/CavaDRAM/gencode/tdm_gencode/cava2sv.sh
deleted file mode 100755
index f0079b4..0000000
--- a/framework/CavaDRAM/gencode/tdm_gencode/cava2sv.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-
-cava_src_dir="/home/felipe/PHD/tools/cava/silveroak/cava"
-cava_hdl_dir=${cava_src_dir}/Cava2HDL
-
-echo "Import missing haskell libraries"
-sed -i '3iimport qualified Data.Bits' Ascii.hs ByteVector.hs
-sed -i '3iimport qualified Data.Char' Ascii.hs ByteVector.hs 
-
-echo "Generating SV files..."
-ghc -i${cava_src_dir}:${cava_hdl_dir} CavaTDMSV.hs
-./CavaTDMSV
diff --git a/framework/DRAM/Core/ImplementationInterface.v b/framework/DRAM/Core/ImplementationInterface.v
index a4f52b7..a8c9207 100644
--- a/framework/DRAM/Core/ImplementationInterface.v
+++ b/framework/DRAM/Core/ImplementationInterface.v
@@ -5,14 +5,13 @@ From DRAM Require Export Arbiter.
 
 Section ImplementationInterface.
 
-  Class Arbiter_configuration :=
-  {
+  Class Arbiter_configuration := {
     State_t : Type;
   }.
 
-	Context {SYS_CFG      : System_configuration}.
-  Context {REQUESTOR_CFG : Requestor_configuration}.
-  Context {ARBITER_CFG  : Arbiter_configuration}.
+	Context {SYS_CFG      	: System_configuration}.
+  Context {REQUESTOR_CFG 	: Requestor_configuration}.
+  Context {ARBITER_CFG  	: Arbiter_configuration}.
 
   Class Implementation_t := mkImplementation
   {
@@ -52,11 +51,30 @@ Section ImplementationInterface.
     apply /eqP; apply Default_arbitrate_time_match.
   Qed.
 
-	Definition Enqueue (R P : Requests_t) :=
-    P ++ R.
+	Definition Enqueue (R P : Requests_t) := P ++ R.
+
+  Definition Dequeue r (P : Requests_t) := rem r P.
+
+	(* ------------ Hardware constrained versions -------------------- *)
+
+	Class HW_Implementation_t := mkHWImplementation
+  {
+    HWInit : Request_t -> State_t;
+    HWNext : Request_t -> State_t -> State_t * Command_kind_t;
+  }.
 
-  Definition Dequeue r (P : Requests_t) :=
-    rem r P.
+	Fixpoint HW_Default_arbitrate 
+		{HAF : HW_Arrival_function_t} 
+		{HIM : HW_Implementation_t} t {struct t} : Arbiter_state_t :=
+    let R := HW_Arrival_at t in 
+    match t with
+      | 0     => mkArbiterState [::] t (HWInit R)
+      | S(t') => let old_state := HW_Default_arbitrate t' in
+                 let (new_state,new_cmd_kind) := HWNext R old_state.(Implementation_State) in
+                 let new_cmd := mkCmd t new_cmd_kind in
+                 let cmd_list := (new_cmd :: old_state.(Arbiter_Commands)) in
+                 mkArbiterState cmd_list t new_state
+    end.
 
 End ImplementationInterface.
 
diff --git a/framework/DRAM/Implementations/TS/FIFOREF/FIFOREF.v b/framework/DRAM/Implementations/TS/FIFOREF/FIFOREF.v
index 4fc378d..52cd486 100644
--- a/framework/DRAM/Implementations/TS/FIFOREF/FIFOREF.v
+++ b/framework/DRAM/Implementations/TS/FIFOREF/FIFOREF.v
@@ -6,7 +6,7 @@ From mathcomp Require Import ssrnat fintype div ssrZ zify ring.
 From DRAM Require Export ImplementationInterface.
 From Coq Require Import Program NArith.
 
-Section FIFO.
+Section FIFOREF.
 
   Context {SYS_CFG : System_configuration}.
 
@@ -128,45 +128,45 @@ Section FIFO.
 
   Definition Enqueue (R : Request_t) (P : Requests_t) := P ++ [:: R].
   Definition Dequeue r (P : Requests_t) := rem r P.
-	(* Definition Init_state R := IDLE OCycle0 0 (Enqueue R [::]). *)
-  Definition Init_state R := IDLE OCycle0 OCycle0REF [:: R].
-  Definition nullreq := mkReq tt 0 RD (Nat_to_bankgroup 0) (Nat_to_bank 0) 0.
+	Definition Init_state R := IDLE OCycle0 OCycle0REF [:: R].
+  Definition nullreq := mkReq tt 0 RD 
+		(mkAddress (Nat_to_bankgroup 0) (Nat_to_bank 0) 0).
 
 	(* check if there's enough time to proc another req *)
 	Definition Next_state (R : Request_t) (AS : FIFO_state_t) 
-		: (FIFO_state_t * (Command_kind_t * Request_t)) :=
-    match AS return FIFO_state_t * (Command_kind_t * Request_t) with
+		: (FIFO_state_t * Command_kind_t ) :=
+    match AS return FIFO_state_t * Command_kind_t with
       | IDLE c cref P =>	
 				let P' := Enqueue R P in
 				let c' := Next_cycle c in
 				let cref' := Next_cycle_ref cref in
-				if (nat_of_ord cref == (PREA_date - 1)) then (REFRESHING OCycle0REF P',(PREA,nullreq))
+				if (nat_of_ord cref == (PREA_date - 1)) then (REFRESHING OCycle0REF P', PREA)
 				else if (cref + WAIT < PREA_date) then
 					match P with
-						| [::]    => (IDLE c' cref' P', (NOP,nullreq))
-						| r :: PP => (RUNNING OCycle0 cref' (Enqueue R (Dequeue r P)) r, (PRE,r))
+						| [::]    => (IDLE c' cref' P', NOP)
+						| r :: PP => (RUNNING OCycle0 cref' (Enqueue R (Dequeue r P)) r, (PRE r))
 					end
-				else (IDLE c' cref' P', (NOP,nullreq))  
+				else (IDLE c' cref' P', NOP)  
       | RUNNING c cref P r =>
         let P' := Enqueue R P in
         let c' := Next_cycle c in
 				let cref' := Next_cycle_ref cref in
-        if nat_of_ord c == OACT_date then (RUNNING c' cref' P' r, (ACT,r))
-        else if nat_of_ord c == OCAS_date then (RUNNING c' cref' P' r, ((Kind_of_req r), r))
-        else if nat_of_ord c == WAIT.-1 then (IDLE OCycle0 cref' P', (NOP,nullreq))
-        else (RUNNING c' cref' P' r, (NOP,r))
+        if nat_of_ord c == OACT_date then (RUNNING c' cref' P' r, (ACT r))
+        else if nat_of_ord c == OCAS_date then (RUNNING c' cref' P' r, ((Kind_of_req r) r))
+        else if nat_of_ord c == WAIT.-1 then (IDLE OCycle0 cref' P', NOP)
+        else (RUNNING c' cref' P' r, NOP)
 			| REFRESHING cref P =>
 				let P' := Enqueue R P in
 				let cref' := Next_cycle_ref cref in
-				if (nat_of_ord cref == OREF_date) then (REFRESHING cref' P', (REF,nullreq))
-				else if (cref == OENDREF_date) then (IDLE OCycle0 OCycle0REF P', (NOP, nullreq))
-				else (REFRESHING cref' P', (NOP,nullreq))
+				if (nat_of_ord cref == OREF_date) then 
+					(REFRESHING cref' P', REF)
+				else if (cref == OENDREF_date) then 
+					(IDLE OCycle0 OCycle0REF P', NOP)
+				else 
+					(REFRESHING cref' P', NOP)
     end.
 
-	(* Global Instance FIFO_implementation : Implementation_t := 
-    mkImplementation Init_state Next_state. *)
-
-  Global Instance FIFO_implementation : HWImplementation_t := 
+  #[global] Instance FIFO_implementation : HW_Implementation_t := 
     mkHWImplementation Init_state Next_state.
 
-End FIFO.
\ No newline at end of file
+End FIFOREF.
\ No newline at end of file
diff --git a/framework/DRAM/_CoqProject b/framework/DRAM/_CoqProject
index 3044567..15ed225 100644
--- a/framework/DRAM/_CoqProject
+++ b/framework/DRAM/_CoqProject
@@ -14,6 +14,7 @@ Core/InterfaceSubLayer.v
 
 Implementations/TS/FIFO/FIFO.v
 Implementations/TS/TDM/TDM.v
+Implementations/TS/FIFOREF/FIFOREF.v
 
 Implementations/BM/FIFOimpSL/FIFOimpSL.v
 Implementations/BM/RRimpSL/RRimpSL.v
-- 
GitLab